#include #include #include #include "input_files.h" #include "TFile.h" #include "TTree.h" #include "EventMetaData.h" #include "TriggerData.h" using namespace std; //---------------------------------------------------------------------------------------------------- void PrintUsage() { printf("USAGE: recombine \n"); } //---------------------------------------------------------------------------------------------------- int main(int argc, char **argv) { // parse command line if (argc != 2) { printf("ERROR: missing.\n"); PrintUsage(); return 1; } unsigned int mapping_index = atoi(argv[1]); // init list of input files InitInputFiles(); // open input file char buf[100]; sprintf(buf, "workdir/mapping_%u", mapping_index); FILE *f_map = fopen(buf, "r"); if (f_map == NULL) { printf("ERROR: file '%s' cannot be opened.\n", buf); return 2; } // get input trees, associate branches vector trees_in; EventMetaData *metaData = new EventMetaData(); TriggerData *triggerData = new TriggerData(); printf("* opening input ntuples\n"); for (unsigned int fi = 0; fi < input_files.size(); fi++) { TFile *f_in = TFile::Open(input_files[fi].c_str()); TTree *tree = (TTree *) f_in->Get("TotemNtuple"); if (!tree) { printf("ERROR: get get TotemNtuple from file idx %u.\n", fi); return 3; } printf(" file idx %u: %llu entries\n", fi, tree->GetEntries()); // associate branches tree->SetBranchStatus("*", 0); tree->SetBranchStatus("event_info.*", 1); tree->SetBranchAddress("event_info.", &metaData); tree->SetBranchStatus("trigger_data.*", 1); tree->SetBranchAddress("trigger_data.", &triggerData); trees_in.push_back(tree); } // prepare output sprintf(buf, "workdir/recombined_ntuple_%u.root", mapping_index); TFile *f_out = TFile::Open(buf, "recreate"); TTree* tree_out = new TTree("TotemNtuple", "TotemNtuple recombined"); tree_out->Branch("event_info.", &metaData); tree_out->Branch("trigger_data.", &triggerData); // event loop unsigned int row = 0; while (!feof(f_map)) { row++; // TODO: remove if (row > 50) break; printf("* row = %u\n", row); unsigned int file_daq, file_trigger; unsigned long idx_daq, idx_trigger; int items_read = fscanf(f_map, "%u,%lu,%u,%lu", &file_daq, &idx_daq, &file_trigger, &idx_trigger); if (items_read != 4) continue; // load event corresponding to DAQ indeces trees_in[file_daq]->SetBranchStatus("*", 1); trees_in[file_daq]->SetBranchStatus("trigger_data.*", 0); trees_in[file_daq]->GetEntry(idx_daq); printf(" daq_event_number=%8lu\n", metaData->daq_event_number); // overwrite trigger block from another event //trees_in[file_trigger]->SetBranchStatus("*", 0); trees_in[file_trigger]->SetBranchStatus("trigger_data.*", 1); trees_in[file_trigger]->GetEntry(idx_daq); printf(" daq_event_number=%8lu, trigger_event_number=%8i\n", metaData->daq_event_number, triggerData->event_num); signed int offset = triggerData->event_num - metaData->daq_event_number; if (offset != 1) { printf("ERROR: offset != 1 in row = %u\n", row); continue; } // save to output tree_out->Fill(); } tree_out->Write(); delete f_out; return 0; }