/[PAMELA software]/DarthVader/TriggerLevel2/src/TrigCore.cpp
ViewVC logotype

Contents of /DarthVader/TriggerLevel2/src/TrigCore.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.11 - (show annotations) (download)
Thu Apr 19 08:12:41 2007 UTC (17 years, 10 months ago) by mocchiut
Branch: MAIN
CVS Tags: v3r04, v3r05, v3r03
Changes since 1.10: +1 -1 lines
New XXXFolder bug fixed

1 //
2 // C/C++ headers
3 //
4 #include <fstream>
5 #include <string.h>
6 //
7 // ROOT headers
8 //
9 #include <TTree.h>
10 #include <TClassEdit.h>
11 #include <TObject.h>
12 #include <TList.h>
13 #include <TArrayL.h>
14 #include <TSystem.h>
15 #include <TSystemDirectory.h>
16 #include <TString.h>
17 #include <TFile.h>
18 #include <TClass.h>
19 #include <TCanvas.h>
20 #include <TH1.h>
21 #include <TH1F.h>
22 #include <TH2D.h>
23 #include <TLatex.h>
24 #include <TPad.h>
25 #include <TSQLServer.h>
26 #include <TSQLRow.h>
27 #include <TSQLResult.h>
28 #include <TClonesArray.h>
29 //
30 // RunInfo header
31 //
32 #include <RunInfo.h>
33 //
34 // YODA headers
35 //
36 #include <PamelaRun.h>
37 #include <physics/trigger/TriggerEvent.h>
38 //
39 // This program headers
40 //
41 #include <TrigCore.h>
42 #include <TrigLevel2.h>
43 #include <TrigVerl2.h>
44 //
45 using namespace std;
46 //
47 //
48 // CORE ROUTINE
49 //
50 //
51 int TrigCore(UInt_t run, TFile *file, TSQLServer *dbc, Int_t Trigargc, char *Trigargv[]){
52 //
53 TString processFolder = Form("TrigFolder_%u",run);
54 //
55 // Set these to true to have a very verbose output.
56 //
57 Bool_t verbose = false;
58 Bool_t debug = false;
59 //
60 if ( Trigargc > 0 ){
61 Int_t i = 0;
62 while ( i < Trigargc ){
63 if ( !strcmp(Trigargv[i],"-processFolder") ) {
64 if ( Trigargc < i+1 ){
65 throw -3;
66 };
67 processFolder = (TString)Trigargv[i+1];
68 i++;
69 };
70 if ( !strcmp(Trigargv[i],"-v") || !strcmp(Trigargv[i],"--verbose") ) {
71 verbose = true;
72 };
73 if ( !strcmp(Trigargv[i],"-g") || !strcmp(Trigargv[i],"--debug") ) {
74 verbose = true;
75 debug = true;
76 };
77 i++;
78 };
79 };
80 //
81 //
82 // Output directory is the working directoy.
83 //
84 const char* outdir = gSystem->DirName(gSystem->DirName(file->GetPath()));
85 //
86 // Variables for level2
87 //
88 Long64_t maxsize = 10000000000LL;
89 TTree::SetMaxTreeSize(maxsize);
90 //
91 TTree *trigt = 0;
92 UInt_t nevents = 0;
93 //
94 // variables needed to reprocess data
95 //
96 TString trigversion;
97 ItoRunInfo *runinfo = 0;
98 TArrayI *runlist = 0;
99 TTree *trigtclone = 0;
100 Bool_t reproc = false;
101 Bool_t reprocall = false;
102 UInt_t nobefrun = 0;
103 UInt_t noaftrun = 0;
104 UInt_t numbofrun = 0;
105 stringstream ftmpname;
106 TString fname;
107 UInt_t totfileentries = 0;
108 UInt_t idRun = 0;
109 //
110 // variables needed to handle error signals
111 //
112 Int_t code = 0;
113 Int_t sgnl;
114 //
115 // trigger level2 classes
116 //
117 TrigLevel2 *trig = new TrigLevel2();
118 TrigLevel2 *trigclone = new TrigLevel2();
119 //
120 // define variables for opening and reading level0 file
121 //
122 TFile *l0File = 0;
123 TTree *l0tr = 0;
124 TBranch *l0head = 0;
125 TBranch *l0trig = 0;
126 pamela::EventHeader *eh = 0;
127 pamela::PscuHeader *ph = 0;
128 pamela::trigger::TriggerEvent *triggerEvent = 0;
129 //
130 // Define other basic variables
131 //
132 UInt_t procev = 0;
133 stringstream file2;
134 stringstream file3;
135 stringstream qy;
136 Int_t totevent = 0;
137 UInt_t atime = 0;
138 UInt_t re = 0;
139 //
140 // Working filename
141 //
142 TString outputfile;
143 stringstream name;
144 name.str("");
145 name << outdir << "/";
146 //
147 // temporary file and folder
148 //
149 TFile *tempfile = 0;
150 TTree *temptrig = 0;
151 stringstream tempname;
152 stringstream Trigfolder;
153 tempname.str("");
154 tempname << outdir;
155 tempname << "/" << processFolder.Data();
156 Trigfolder.str("");
157 Trigfolder << tempname.str().c_str();
158 gSystem->MakeDirectory(Trigfolder.str().c_str());
159 tempname << "/trigtree_run";
160 tempname << run << ".root";
161 //
162 // DB classes
163 //
164 GL_ROOT *glroot = new GL_ROOT();
165 GL_TIMESYNC *dbtime = 0;
166 //
167 // Let's start!
168 //
169 //
170 // As a first thing we must check what we have to do: if run = 0 we must process all events in the file has been passed
171 // if run != 0 we must process only that run but first we have to check if the tree Trigger already exist in the file
172 // if it exists we are reprocessing data and we must delete that entries, if not we must create it.
173 //
174 if ( run == 0 ) reproc = true;
175 //
176 //
177 // Output file is "outputfile"
178 //
179 if ( !file->IsOpen() ){
180 if ( verbose ) printf(" Trigger - ERROR: cannot open file for writing\n");
181 throw -401;
182 };
183 //
184 // Retrieve GL_RUN variables from the level2 file
185 //
186 trigversion = TrigInfo(false); // we should decide how to handle versioning system
187 //
188 // create an interface to RunInfo called "runinfo"
189 //
190 runinfo = new ItoRunInfo(file);
191 //
192 // open "Run" tree in level2 file, if not existing return an error (sngl != 0)
193 //
194 sgnl = 0;
195 sgnl = runinfo->Update(run,"TRIG",trigversion);
196 if ( sgnl ){
197 if ( verbose ) printf(" Trigger - ERROR: RunInfo exited with non-zero status\n");
198 code = sgnl;
199 goto closeandexit;
200 } else {
201 sgnl = 0;
202 };
203 //
204 // number of events in the file BEFORE the first event of our run
205 //
206 nobefrun = runinfo->GetFirstEntry();
207 //
208 // total number of events in the file
209 //
210 totfileentries = runinfo->GetFileEntries();
211 //
212 // first file entry AFTER the last event of our run
213 //
214 noaftrun = runinfo->GetLastEntry() + 1;
215 //
216 // number of run to be processed
217 //
218 numbofrun = runinfo->GetNoRun();
219 //
220 // Try to access the Trigger tree in the file, if it exists we are reprocessing data if not we are processing a new run
221 //
222 trigtclone = (TTree*)file->Get("Trigger");
223 //
224 if ( !trigtclone ){
225 //
226 // tree does not exist, we are not reprocessing
227 //
228 reproc = false;
229 if ( run == 0 && verbose ) printf(" Trigger - WARNING: you are reprocessing data but Trigger tree does not exist!\n");
230 if ( runinfo->IsReprocessing() && run != 0 && verbose ) printf(" Trigger - WARNING: it seems you are not reprocessing data but Trigger\n versioning information already exists in RunInfo.\n");
231
232 } else {
233 //
234 // tree exists, we are reprocessing data. Are we reprocessing a single run or all the file?
235 //
236 trigtclone->SetAutoSave(900000000000000LL);
237 reproc = true;
238 //
239 // update versioning information
240 //
241 if ( verbose ) printf("\n Preparing the pre-processing...\n");
242 //
243 if ( run == 0 ){
244 //
245 // we are reprocessing all the file
246 // if we are reprocessing everything we don't need to copy any old event and we can just work with the new tree and delete the old one immediately
247 //
248 reprocall = true;
249 //
250 if ( verbose ) printf("\n Trigger - WARNING: Reprocessing all runs\n");
251 //
252 } else {
253 //
254 // we are reprocessing a single run, we must copy to the new tree the events in the file which preceed the first event of the run
255 //
256 reprocall = false;
257 //
258 if ( verbose ) printf("\n Trigger - WARNING: Reprocessing run number %u \n",run);
259 //
260 // copying old tree to a new file
261 //
262 tempfile = new TFile(tempname.str().c_str(),"RECREATE");
263 temptrig = trigtclone->CloneTree(-1,"fast");
264 temptrig->SetName("Trigger-old");
265 tempfile->Write();
266 tempfile->Close();
267 }
268 //
269 // Delete the old tree from old file and memory
270 //
271 trigtclone->Delete("all");
272 //
273 if ( verbose ) printf(" ...done!\n");
274 //
275 };
276 //
277 // create Trigger tree trigt
278 //
279 file->cd();
280 trigt = new TTree("Trigger-new","PAMELA Level2 Trigger data");
281 trigt->SetAutoSave(900000000000000LL);
282 trigt->Branch("TrigLevel2","TrigLevel2",&trig);
283 //
284 if ( reproc && !reprocall ){
285 //
286 // open new file and retrieve alo tree informations
287 //
288 tempfile = new TFile(tempname.str().c_str(),"READ");
289 trigtclone = (TTree*)tempfile->Get("Trigger-old");
290 trigtclone->SetAutoSave(900000000000000LL);
291 trigtclone->SetBranchAddress("TrigLevel2",&trigclone);
292 //
293 if ( nobefrun > 0 ){
294 if ( verbose ) printf("\n Pre-processing: copying events from the old tree before the processed run\n");
295 if ( verbose ) printf(" Copying %u events in the file which are before the beginning of the run %u \n",nobefrun,run);
296 if ( verbose ) printf(" Start copying at event number 0, end copying at event number %u \n",nobefrun);
297 for (UInt_t j = 0; j < nobefrun; j++){
298 //
299 trigtclone->GetEntry(j);
300 //
301 // copy trigclone to trig
302 //
303 // trig = new TrigLevel2();
304 trig->Clear();
305 memcpy(&trig,&trigclone,sizeof(trigclone));
306 //
307 // Fill entry in the new tree
308 //
309 trigt->Fill();
310 //
311 };
312 if ( verbose ) printf(" Finished successful copying!\n");
313 };
314 };
315 //
316 // Get the list of run to be processed, if only one run has to be processed the list will contain one entry only.
317 //
318 runlist = runinfo->GetRunList();
319 //
320 // Loop over the run to be processed
321 //
322 for (UInt_t irun=0; irun < numbofrun; irun++){
323 //
324 // retrieve the first run ID to be processed using the RunInfo list
325 //
326 idRun = runlist->At(irun);
327 if ( verbose ) printf("\n\n\n ####################################################################### \n");
328 if ( verbose ) printf(" PROCESSING RUN NUMBER %u \n",idRun);
329 if ( verbose ) printf(" ####################################################################### \n\n\n");
330 //
331 runinfo->ID_ROOT_L0 = 0;
332 //
333 // store in the runinfo class the GL_RUN variables for our run
334 //
335 sgnl = 0;
336 sgnl = runinfo->GetRunInfo(idRun);
337 if ( sgnl ){
338 if ( verbose ) printf(" Trigger - ERROR: RunInfo exited with non-zero status\n");
339 code = sgnl;
340 goto closeandexit;
341 } else {
342 sgnl = 0;
343 };
344 //
345 // now you can access that variables using the RunInfo class this way runinfo->ID_ROOT_L0
346 //
347 if ( runinfo->ID_ROOT_L0 == 0 ){
348 if ( verbose ) printf("\n Trigger - ERROR: no run with ID_RUN = %u \n\n Exiting... \n\n",idRun);
349 code = -5;
350 goto closeandexit;
351 };
352 //
353 // prepare the timesync for the db
354 //
355 if ( !dbc->IsConnected() ) throw -403;
356 dbtime = new GL_TIMESYNC(runinfo->ID_ROOT_L0,"ID",dbc);
357 //
358 // Search in the DB the path and name of the LEVEL0 file to be processed.
359 //
360 if ( !dbc->IsConnected() ) throw -403;
361 glroot->Query_GL_ROOT(runinfo->ID_ROOT_L0,dbc);
362 //
363 ftmpname.str("");
364 ftmpname << glroot->PATH.Data() << "/";
365 ftmpname << glroot->NAME.Data();
366 fname = ftmpname.str().c_str();
367 //
368 // print out informations
369 //
370 totevent = runinfo->NEVENTS;
371 if ( verbose ) printf("\n LEVEL0 data file: %s \n",fname.Data());
372 if ( verbose ) printf(" RUN HEADER absolute time is: %u \n",runinfo->RUNHEADER_TIME);
373 if ( verbose ) printf(" RUN TRAILER absolute time is: %u \n",runinfo->RUNTRAILER_TIME);
374 if ( verbose ) printf(" %i events to be processed for run %u: from %i to %i \n\n",totevent,idRun,runinfo->EV_FROM,runinfo->EV_FROM+totevent);
375 //
376 // Open Level0 file
377 //
378 l0File = new TFile(fname.Data());
379 if ( !l0File ) {
380 if ( verbose ) printf(" Trigger - ERROR: problems opening Level0 file\n");
381 code = -6;
382 goto closeandexit;
383 };
384 l0tr = (TTree*)l0File->Get("Physics");
385 if ( !l0tr ) {
386 if ( verbose ) printf(" Trigger - ERROR: no Physics tree in Level0 file\n");
387 l0File->Close();
388 code = -7;
389 goto closeandexit;
390 };
391 l0head = l0tr->GetBranch("Header");
392 if ( !l0head ) {
393 if ( verbose ) printf(" Trigger - ERROR: no Header branch in Level0 tree\n");
394 l0File->Close();
395 code = -8;
396 goto closeandexit;
397 };
398 l0trig = l0tr->GetBranch("Trigger");
399 if ( !l0trig ) {
400 if ( verbose ) printf(" Trigger - ERROR: no Trigger branch in Level0 tree\n");
401 l0File->Close();
402 code = -402;
403 goto closeandexit;
404 };
405 //
406 l0tr->SetBranchAddress("Trigger", &triggerEvent);
407 l0tr->SetBranchAddress("Header", &eh);
408 //
409 nevents = l0trig->GetEntries();
410 //
411 if ( nevents < 1 ) {
412 if ( verbose ) printf(" Trigger - ERROR: Level0 file is empty\n\n");
413 l0File->Close();
414 code = -11;
415 goto closeandexit;
416 };
417 //
418 if ( runinfo->EV_TO > nevents-1 ) {
419 if ( verbose ) printf(" Trigger - ERROR: too few entries in the tree\n");
420 l0File->Close();
421 code = -12;
422 goto closeandexit;
423 };
424 //
425 // run over all the events of the run
426 //
427 if ( verbose ) printf("\n Ready to start! \n\n Processed events: \n\n");
428 //
429 for ( re = runinfo->EV_FROM; re < (runinfo->EV_FROM+runinfo->NEVENTS); re++){
430 //
431 if ( procev%1000 == 0 && procev > 0 && verbose ) printf(" %iK \n",procev/1000);
432 //
433 l0head->GetEntry(re);
434 //
435 // absolute time of this event
436 //
437 ph = eh->GetPscuHeader();
438 atime = dbtime->DBabsTime(ph->GetOrbitalTime());
439 //
440 // paranoid check
441 //
442 if ( atime > runinfo->RUNTRAILER_TIME || atime < runinfo->RUNHEADER_TIME ) {
443 if ( verbose ) printf(" Trigger - WARNING: event at time outside the run time window, skipping it\n");
444 goto jumpev;
445 };
446 ///
447 l0trig->GetEntry(re);
448 ///
449 //
450 procev++;
451 //
452 // start processing
453 //
454 trig->Clear();
455 // trig = new TrigLevel2();
456 //
457 // now we must copy from the output structure to the level2 class:
458 //
459 trig->evcount = triggerEvent->evcount;
460 for (Int_t kk=0; kk<3;kk++){
461 trig->pmtpl[kk] = triggerEvent->pmtpl[kk];
462 trig->patternbusy[kk] = triggerEvent->patternbusy[kk];
463 }
464
465 for (Int_t kk=0; kk<6;kk++){
466 trig->trigrate[kk] = triggerEvent->trigrate[kk];
467 trig->patterntrig[kk] = triggerEvent->patterntrig[kk];
468 }
469
470 for (Int_t kk=0; kk<2;kk++){
471 trig->dltime[kk] = triggerEvent->dltime[kk];
472 trig->s4calcount[kk] = triggerEvent->s4calcount[kk];
473 }
474
475 for (Int_t kk=0; kk<24;kk++){
476 trig->pmtcount1[kk] = triggerEvent->pmtcount1[kk];
477 trig->pmtcount2[kk] = triggerEvent->pmtcount2[kk];
478 }
479
480 trig->trigconf = triggerEvent->trigconf;
481
482 trig->unpackError = triggerEvent->unpackError;
483
484 trigt->Fill();
485 //
486 //
487 jumpev:
488 debug = false;
489 //
490 };
491 //
492 // Here you may want to clear some variables before processing another run
493 //
494 delete dbtime;
495 }; // process all the runs
496 //
497 if ( verbose ) printf("\n Finished processing data \n");
498 //
499 closeandexit:
500 //
501 // we have finished processing the run(s). If we processed a single run now we must copy all the events after our run from the old tree to the new one and delete the old tree.
502 //
503 if ( !reprocall && reproc && code >= 0 ){
504 if ( totfileentries > noaftrun ){
505 if ( verbose ) printf("\n Post-processing: copying events from the old tree after the processed run\n");
506 if ( verbose ) printf(" Copying %i events in the file which are after the end of the run %i \n",(int)(totfileentries-noaftrun),(int)run);
507 if ( verbose ) printf(" Start copying at event number %i end copying at event number %i \n",(int)noaftrun,(int)totfileentries);
508 for (UInt_t j = noaftrun; j < totfileentries; j++ ){
509 //
510 // Get entry from old tree
511 //
512 trigtclone->GetEntry(j);
513 //
514 // copy trigclone to trig
515 //
516 trig->Clear();
517 //
518 memcpy(&trig,&trigclone,sizeof(trigclone));
519 //
520 // Fill entry in the new tree
521 //
522 trigt->Fill();
523 };
524 if ( verbose ) printf(" Finished successful copying!\n");
525 };
526 };
527 //
528 // Close files, delete old tree(s), write and close level2 file
529 //
530 if ( l0File ) l0File->Close();
531 if ( tempfile ) tempfile->Close();
532 gSystem->Unlink(tempname.str().c_str());
533 //
534 if ( code < 0 && verbose ) printf("\n Trigger - ERROR: an error occurred, try to save anyway...\n");
535 if ( verbose ) printf("\n Writing and closing rootple\n");
536 if ( runinfo ) runinfo->Close();
537 if ( trigt ) trigt->SetName("Trigger");
538 if ( file ){
539 file->cd();
540 file->Write();
541 // file->Write("Trigger");
542 };
543 //
544 gSystem->Unlink(Trigfolder.str().c_str());
545 //
546 // the end
547 //
548 if ( verbose ) printf("\n Exiting...\n");
549 if ( trigt ) trigt->Delete();
550 //
551 if ( trig ) delete trig;
552 if ( trigclone ) delete trigclone;
553 if ( glroot ) delete glroot;
554 if ( runinfo ) delete runinfo;
555 //
556 if ( code < 0 ) throw code;
557 return(code);
558 }
559
560
561

  ViewVC Help
Powered by ViewVC 1.1.23