/[PAMELA software]/DarthVader/CalorimeterLevel2/src/CaloCore.cpp
ViewVC logotype

Contents of /DarthVader/CalorimeterLevel2/src/CaloCore.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.32 - (show annotations) (download)
Sun Sep 9 18:57:26 2007 UTC (17 years, 2 months ago) by mocchiut
Branch: MAIN
CVS Tags: v4r00
Changes since 1.31: +11 -4 lines
Changed core routines to open themselves the DB connection

1 //
2 // Given a calibration and a data file this program create an ntuple with LEVEL2 calorimeter variables - Emiliano Mocchiutti
3 //
4 // CaloCore.cxx version 3.05 (2006-05-30)
5 //
6 // The only input needed is the path to the directory created by YODA for the data file you want to analyze.
7 //
8 // Changelog:
9 //
10 // 3.08 (2006-11-13): Added high energy nuclei capability and "process all events" capability.
11 //
12 // 3.04 - 3.05 (2006-05-30): Qlast and nlast are now calculated using 4 (not 8) strips aournd the shower axis. Small bug fixed.
13 //
14 // 3.03 - 3.04 (2006-05-23): Forgot to put impx and impy in the PAMELA reference system, fixed.
15 //
16 // 3.02 - 3.03 (2006-05-18): updated to be called in DarthVader. Output dimension are now in cm and in the PAMELA reference system.
17 //
18 // 3.01 - 3.02 (2006-04-21): when copying entries get size of caclone and not of ca... (shouldn't matter). Fixed increasing file dimension bug when reprocessing.
19 // Added variable planemax[2], plane of maximum energy release (x and y) in final output. Use ItoRunInfo instead of RunInfo.
20 //
21 // 3.00 - 3.01 (2006-04-14): fixed small bug in tagging the track used to determine track-related variables, put in caloprocessing the opening of parameters files, fixed
22 // small bug in fortran routines
23 //
24 // 2.01 - 3.00 (2006-04-14): almost everything has changed. Now it can process one, all or some runs, introduced the final CaloLevel2 class+methods and the
25 // working class "CaloProcessing", linked to the preliminary tracker flight software v0r00, reads YODA unique output files,
26 // reduced the number of installed libraries, F77 programs splitted depending on the function contained, introduced the readout and
27 // processing of self-trigger events, if the tracker provides more than one track all calorimeter track-related variables are saved
28 // as many times as the number of tracks (via the TClonesArray object in the level2 rootple) and many other small changes.
29 //
30 // 2.00 - 2.01 (2006-01-26): bug: wrong calculation of baselines in some cases, fixed.
31 //
32 // 1.00 - 2.00 (2006-01-11): use TSQL ROOT classes instead of directly calling MySQL.
33 //
34 // 0.00 - 1.00 (2005-09-14): seems working.
35 //
36 // 0.00 (2005-09-09): clone of CaloLEVEL2.c .
37 //
38 // C/C++ headers
39 //
40 #include <fstream>
41 #include <string.h>
42 //
43 // ROOT headers
44 //
45 #include <TTree.h>
46 #include <TClassEdit.h>
47 #include <TObject.h>
48 #include <TList.h>
49 #include <TArrayI.h>
50 #include <TSystem.h>
51 #include <TSystemDirectory.h>
52 #include <TString.h>
53 #include <TFile.h>
54 #include <TClass.h>
55 #include <TCanvas.h>
56 #include <TH1.h>
57 #include <TH1F.h>
58 #include <TH2D.h>
59 #include <TLatex.h>
60 #include <TPad.h>
61 #include <TSQLServer.h>
62 #include <TSQLRow.h>
63 #include <TSQLResult.h>
64 #include <TClonesArray.h>
65 #include <TStreamerInfo.h>
66 //
67 // This program headers
68 //
69 #include <RunInfo.h>
70 //
71 // YODA headers
72 //
73 #include <PamelaRun.h>
74 #include <physics/trigger/TriggerEvent.h>
75 //
76 // This program headers
77 //
78 #include <CaloCore.h>
79 #include <CaloLevel1.h>
80 #include <CaloLevel2.h>
81 #include <CaloLevel0.h>
82 #include <CaloVerl2.h>
83 //
84 // Tracker classes headers and definitions
85 //
86 #include <TrkLevel2.h>
87 //
88 using namespace std;
89 //
90 // CORE ROUTINE
91 //
92 int CaloCore(UInt_t run, TFile *file, GL_TABLES *glt, Int_t calargc, char *calargv[]){
93 //
94 // Set these to true to have a very verbose output.
95 //
96 Bool_t verbose = false;
97 Bool_t debug = false;
98 //
99 Bool_t crosst = true;
100 //
101 Bool_t trackanyway = true;
102 //
103 Float_t rigdefault = 50.;
104 //
105 Bool_t hZn = true;
106 //
107 Bool_t withtrk = true;
108 //
109 Bool_t st = true;
110 //
111 Bool_t getl1 = true;
112 //
113 Bool_t mechal = false;
114 //
115 Bool_t checksimu = true;
116 //
117 // Output directory is the working directoy.
118 //
119 const char* outdir = gSystem->DirName(gSystem->DirName(file->GetPath()));
120 //
121 Int_t ri = 0;
122 TString processFolder = Form("calorimeterFolder_%u",run);
123 if ( calargc > 0 ){
124 ri = 0;
125 while ( ri < calargc ){
126 if ( !strcmp(calargv[ri],"-processFolder") ) {
127 if ( calargc < ri+1 ){
128 throw -3;
129 };
130 processFolder = (TString)calargv[ri+1];
131 ri++;
132 };
133 if ( !strcmp(calargv[ri],"-v") || !strcmp(calargv[ri],"--verbose") ) {
134 verbose = true;
135 };
136 if ( !strcmp(calargv[ri],"-g") || !strcmp(calargv[ri],"--debug") ) {
137 verbose = true;
138 debug = true;
139 };
140 if ( !strcmp(calargv[ri],"--alltracks") ) {
141 trackanyway = true;
142 };
143 if ( !strcmp(calargv[ri],"--use-default-alig") ) {
144 mechal = true;
145 };
146 if ( !strcmp(calargv[ri],"--no-crosstalk") ) {
147 crosst = false;
148 };
149 if ( !strcmp(calargv[ri],"--no-tracker") ) {
150 withtrk = false;
151 };
152 if ( !strcmp(calargv[ri],"--with-tracker") ) {
153 withtrk = true;
154 };
155 if ( !strcmp(calargv[ri],"--defrig") ) {
156 if ( calargc < ri+1 ){
157 throw -3;
158 };
159 rigdefault = atof(calargv[ri+1]);
160 ri++;
161 };
162 if ( !strcmp(calargv[ri],"--no-alltracks") ) {
163 trackanyway = false;
164 };
165 if ( !strcmp(calargv[ri],"--highZnuclei") ) {
166 hZn = true;
167 };
168 if ( !strcmp(calargv[ri],"--no-highZnuclei") ) {
169 hZn = false;
170 };
171 if ( !strcmp(calargv[ri],"--selftrigger") ) {
172 st = true;
173 };
174 if ( !strcmp(calargv[ri],"--no-selftrigger") ) {
175 st = false;
176 };
177 if ( !strcmp(calargv[ri],"--no-level1") ) {
178 getl1 = false;
179 };
180 if ( !strcmp(calargv[ri],"--ignore-h20") ) {
181 checksimu = false;
182 };
183 if ( !strcmp(calargv[ri],"--help") ) {
184 printf("\n\n CALORIMETER HELP CALLED\n\n");
185 printf(" CaloCore options: \n");
186 printf(" -v | --verbose be verbose\n");
187 printf(" -g | --debug be really verbose\n");
188 printf(" --defrig rig rig is the default rigidity in GV to be used to\n");
189 printf(" obtain calorimeter variables in the routines\n");
190 printf(" \"alltracks\" and \"higZnuclei\" [default = 50]\n");
191 printf(" --alltracks fill the track related variables even in the case\n");
192 printf(" of no tracks from tracker and no selftrigger event\n");
193 printf(" when we have a calorimeter fit for both views [default]\n");
194 printf(" --no-alltracks fill the track related variables only in the case\n");
195 printf(" of a good track from tracker or selftrigger\n");
196 printf(" --highZnuclei call the routine to analyze high Z nuclei\n");
197 printf(" selftrigger events [default]\n");
198 printf(" --no-highZnuclei do not call the routine to analyze high Z nuclei\n");
199 printf(" selftrigger events\n");
200 printf(" --no-tracker do not use tracker level2\n");
201 printf(" --with-tracker use tracker level2 [default]\n");
202 printf(" --no-crosstalk do not apply crosstalk corrections\n");
203 printf(" --selftrigger process selftrigger events [default]\n");
204 printf(" --no-selftrigger skip selftrigger events\n");
205 printf(" --no-level1 do not save Level1 TBranch\n");
206 printf(" --ignore-h20 do not check if it is a file from simulations\n");
207 printf(" --use-default-alig use default mechanical alignement (defined in CaloLevel1.h)\n");
208 throw -114;
209 };
210 ri++;
211 };
212 };
213 //
214 if ( verbose ){
215 printf("\n");
216 if ( getl1 ) printf(" Saving calorimeter level1 data \n");
217 if ( st ) printf(" Calling selftrigger subroutine \n");
218 if ( hZn ) printf(" Calling high energy nuclei subroutine \n");
219 if ( trackanyway ) printf(" Filling track related variables for all the possible tracks \n");
220 if ( hZn || trackanyway ) printf(" => default assumed rigidity %f \n",rigdefault);
221 if ( withtrk ) printf(" Using tracker level2 data \n");
222 if ( mechal ) printf(" Using default mechanical alignement (defined in CaloLevel1.h)\n");
223 printf("\n");
224 };
225 //
226 // Working filename
227 //
228 TString outputfile;
229 stringstream name;
230 name.str("");
231 name << outdir << "/";
232 //
233 // Variables.
234 //
235 TTree *tracker = 0;
236 TTree *calo = 0;
237 TTree *caloclone = 0;
238 Bool_t reproc = false;
239 Bool_t reprocall = false;
240 UInt_t nevents = 0;
241 UInt_t nobefrun = 0;
242 UInt_t noaftrun = 0;
243 UInt_t numbofrun = 0;
244 UInt_t totnorun = 0;
245 //
246 Int_t code = 0;
247 Int_t sgnl;
248 //
249 // calorimeter level2 classes
250 //
251 CaloLevel1 *c1 = 0;
252 CaloLevel1 *c1clone = 0;
253 if ( getl1 ){
254 c1 = new CaloLevel1();
255 c1clone = new CaloLevel1();
256 };
257 //
258 // calorimeter level2 classes
259 //
260 CaloLevel2 *ca = new CaloLevel2();
261 CaloLevel2 *caclone = new CaloLevel2();
262 //
263 TrkLevel2 *trk = new TrkLevel2();
264 Int_t nevtrkl2 = 0;
265 //
266 UInt_t procev = 0;
267 //
268 // define variables where to store the absolute run header and run trailer times (unsigned long long integers, when set to a number use to store the correct number).
269 //
270 UInt_t runheadtime = 0;
271 UInt_t runtrailtime = 0;
272 UInt_t evfrom = 0;
273 UInt_t evto = 0;
274 UInt_t totfileentries = 0;
275 UInt_t idRun = 0;
276 Int_t id_reg_run=-1;
277 stringstream ftmpname;
278 TString fname;
279 //
280 // define variables for opening and reading level0 file
281 //
282 TFile *l0File = 0;
283 TTree *l0tr = 0;
284 TTree *softinfo = 0;
285 TBranch *l0head = 0;
286 TBranch *l0calo = 0;
287 TBranch *l0trig = 0;
288 pamela::EventHeader *eh = 0;
289 pamela::PscuHeader *ph = 0;
290 pamela::trigger::TriggerEvent *trig = 0;
291 Int_t yodaver = 0;
292 //
293 // Define some basic variables
294 //
295 CaloLevel0 *event = new CaloLevel0(); // NOTICE: very important to call here the constructor!
296 event->SetCrossTalk(crosst);
297 stringstream file2;
298 stringstream file3;
299 stringstream qy;
300 // Bool_t imtrack = false;
301 Bool_t filled = false;
302 //
303 UInt_t caloevents = 0;
304 stringstream calfile;
305 stringstream aligfile;
306 //
307 Int_t i = -1;
308 Int_t itr = -1;
309 Int_t badevent = 0;
310 Int_t totevent = 0;
311 //
312 UInt_t atime = 0;
313 //
314 Int_t S3 = 0;
315 Int_t S2 = 0;
316 Int_t S12 = 0;
317 Int_t S11 = 0;
318 UInt_t re = 0;
319 UInt_t jumped = 0;
320 //
321 TString caloversion;
322 ItoRunInfo *runinfo = 0;
323 TArrayI *runlist = 0;
324 //
325 Float_t tmptrigty = -1.;
326 Int_t ntrkentry = 0;
327 GL_PARAM *q4 = new GL_PARAM();
328 UInt_t tttrkpar1 = 0;
329 Bool_t trkpar1 = true;
330 GL_ROOT *glroot = new GL_ROOT();
331 GL_TIMESYNC *dbtime = 0;
332 //
333 Long64_t maxsize = 10000000000LL;
334 TTree::SetMaxTreeSize(maxsize);
335 //
336 //
337 TFile *tempfile = 0;
338 TTree *tempcalo = 0;
339 Bool_t myfold = false;
340 stringstream tempname;
341 stringstream calofolder;
342 tempname.str("");
343 tempname << outdir;
344 tempname << "/" << processFolder.Data();
345 calofolder.str("");
346 calofolder << tempname.str().c_str();
347 tempname << "/calotree_run";
348 tempname << run << ".root";
349 //
350 // As a first thing we must check what we have to do: if run = -1 we must process all events in the file has been passed
351 // if run != -1 we must process only that run but first we have to check if the branch calorimeter already exist in the file
352 // if it exists we are reprocessing data and we must delete that entries, if not we must create it.
353 //
354 if ( run == 0 ) reproc = true;
355 //
356 //
357 //
358 if ( !file->IsOpen() ){
359 if ( verbose ) printf(" CALORIMETER - ERROR: cannot open file for writing\n");
360 throw -101;
361 };
362 //
363 if ( withtrk ){
364 //
365 // Does it contain the Tracker tree?
366 //
367 tracker = (TTree*)file->Get("Tracker");
368 if ( !tracker ) {
369 if ( verbose ) printf(" CALORIMETER - ERROR: no tracker tree\n");
370 code = -102;
371 goto closeandexit;
372 };
373 tracker->SetBranchAddress("TrkLevel2",&trk);
374 nevtrkl2 = tracker->GetEntries();
375 };
376 //
377 // Is it a file from simulations?
378 //
379 if ( checksimu ){
380 TTree *h20 = (TTree*)file->Get("h20");
381 if ( h20 ){
382 //
383 // yes!
384 //
385 crosst = false;
386 mechal = true;
387 if ( verbose ) printf("\n\n SIMULATION!!! Setting --use-default-alig and --no-crosstalk flags!\n\n");
388 h20->Delete();
389 };
390 };
391 //
392 // Call runinfo
393 //
394 sgnl = 0;
395 runinfo = new ItoRunInfo(file);
396 //
397 // update versioning information and retrieve informations about the run to be processed
398 //
399 caloversion = CaloInfo(false);
400 sgnl = runinfo->Update(run,"CALO",caloversion);
401 //
402 if ( sgnl ){
403 if ( verbose ) printf(" CALORIMETER - ERROR: RunInfo exited with non-zero status\n");
404 code = sgnl;
405 goto closeandexit;
406 } else {
407 sgnl = 0;
408 };
409 //
410 // number of events in the file BEFORE the first event of our run
411 //
412 nobefrun = runinfo->GetFirstEntry();
413 //
414 // total number of events in the file
415 //
416 totfileentries = runinfo->GetFileEntries();
417 //
418 // first file entry AFTER the last event of our run
419 //
420 noaftrun = runinfo->GetLastEntry() + 1;
421 //
422 // number of run to be processed
423 //
424 numbofrun = runinfo->GetNoRun();
425 //
426 // number of runs in the file
427 //
428 totnorun = runinfo->GetRunEntries();
429 //
430 // Does it contain already a Calorimeter branch? if so we are reprocessing data, if not we must create it.
431 //
432 caloclone = (TTree*)file->Get("Calorimeter");
433 //
434 if ( !caloclone ){
435 reproc = false;
436 if ( run == 0 && verbose ) printf(" CALORIMETER - WARNING: you are reprocessing data but calorimeter tree does not exist!\n");
437 if ( runinfo->IsReprocessing() && run != 0 && verbose ) printf(" CALORIMETER - WARNING: it seems you are not reprocessing data but calorimeter\n versioning information already exists in RunInfo.\n");
438 //
439 } else {
440 //
441 caloclone->SetAutoSave(900000000000000LL);
442 reproc = true;
443 //
444 if ( verbose ) printf("\n Preparing the pre-processing...\n");
445 //
446 if ( run == 0 || totnorun == 1 ){
447 //
448 // if we are reprocessing everything we don't need to copy any old event and we can just create a new branch in the clone tree and jump steps 4/5/7.
449 //
450 if ( verbose ) printf("\n CALORIMETER - WARNING: Reprocessing all runs in the file\n");
451 reprocall = true;
452 //
453 } else {
454 //
455 // we are reprocessing a single run
456 //
457 if ( verbose ) printf("\n CALORIMETER - WARNING: Reprocessing run number %u \n",run);
458 reprocall = false;
459 //
460 //
461 //
462 gSystem->MakeDirectory(calofolder.str().c_str());
463 myfold = true;
464 tempfile = new TFile(tempname.str().c_str(),"RECREATE");
465 tempcalo = caloclone->CloneTree(-1,"fast");
466 tempcalo->SetName("Calorimeter-old");
467 tempfile->Write();
468 tempfile->Close();
469 };
470 //
471 // delete old tree
472 //
473 caloclone->Delete("all");
474 //
475 if ( verbose ) printf("\n ...done!\n");
476 //
477 };
478 //
479 // create calorimeter tree calo
480 //
481 file->cd();
482 calo = new TTree("Calorimeter-new","PAMELA Level2 calorimeter data");
483 calo->SetAutoSave(900000000000000LL);
484 ca->Set();
485 calo->Branch("CaloLevel2","CaloLevel2",&ca);
486 if ( getl1 ) calo->Branch("CaloLevel1","CaloLevel1",&c1);
487 //
488 if ( reproc && !reprocall ){
489 //
490 //
491 //
492 tempfile = new TFile(tempname.str().c_str(),"READ");
493 caloclone = (TTree*)tempfile->Get("Calorimeter-old");
494 caloclone->SetAutoSave(900000000000000LL);
495 caloclone->SetBranchAddress("CaloLevel2",&caclone);
496 TBranch *havel1 = caloclone->GetBranch("CaloLevel1");
497 if ( !havel1 && getl1 ) throw -117;
498 if ( havel1 && !getl1 ) throw -118;
499 if ( getl1 ) caloclone->SetBranchAddress("CaloLevel1",&c1clone);
500 //
501 if ( nobefrun > 0 ){
502 if ( verbose ) printf("\n Pre-processing: copying events from the old tree before the processed run\n");
503 if ( verbose ) printf(" Copying %u events in the file which are before the beginning of the run %u \n",nobefrun,run);
504 if ( verbose ) printf(" Start copying at event number 0, end copying at event number %u \n",nobefrun);
505 for (UInt_t j = 0; j < nobefrun; j++){
506 //
507 caloclone->GetEntry(j);
508 //
509 // copy caclone to ca
510 //
511 if ( getl1 ) memcpy(&c1,&c1clone,sizeof(c1clone));
512 memcpy(&ca,&caclone,sizeof(caclone));
513 //
514 // Fill entry in the new tree
515 //
516 calo->Fill();
517 //
518 if ( getl1 ) c1->Clear();
519 ca->Clear();
520 //
521 };
522 if ( verbose ) printf(" Finished successful copying!\n");
523 };
524 };
525 //
526 // Get the list of run to be processed
527 //
528 runlist = runinfo->GetRunList();
529 //
530 // Loop over the run to be processed
531 //
532 for (UInt_t irun=0; irun < numbofrun; irun++){
533 //
534 badevent = 0;
535 //
536 idRun = runlist->At(irun);
537 if ( verbose ) printf("\n\n\n ####################################################################### \n");
538 if ( verbose ) printf(" PROCESSING RUN NUMBER %u \n",idRun);
539 if ( verbose ) printf(" ####################################################################### \n\n\n");
540 //
541 sgnl = runinfo->GetRunInfo(idRun);
542 if ( sgnl ){
543 if ( verbose ) printf(" CALORIMETER - ERROR: RunInfo exited with non-zero status\n");
544 code = sgnl;
545 goto closeandexit;
546 } else {
547 sgnl = 0;
548 };
549 id_reg_run = runinfo->ID_ROOT_L0;
550 runheadtime = runinfo->RUNHEADER_TIME;
551 runtrailtime = runinfo->RUNTRAILER_TIME;
552 evfrom = runinfo->EV_FROM;
553 evto = runinfo->EV_TO;
554 //
555 if ( id_reg_run == -1 ){
556 if ( verbose ) printf("\n CALORIMETER - ERROR: no run with ID_RUN = %u \n\n Exiting... \n\n",idRun);
557 code = -5;
558 goto closeandexit;
559 };
560 //
561 // prepare the timesync for the db
562 //
563 TString host = glt->CGetHost();
564 TString user = glt->CGetUser();
565 TString psw = glt->CGetPsw();
566 TSQLServer *dbc = TSQLServer::Connect(host.Data(),user.Data(),psw.Data());
567 if ( !dbc->IsConnected() ) throw -116;
568 //
569 // if ( !dbc->IsConnected() ) throw -116;
570 dbtime = new GL_TIMESYNC(runinfo->ID_ROOT_L0,"ID",dbc);
571 //
572 // Search in the DB the path and name of the LEVEL0 file to be processed.
573 //
574 // if ( !dbc->IsConnected() ) throw -116;
575 glroot->Query_GL_ROOT(runinfo->ID_ROOT_L0,dbc);
576 //
577 ftmpname.str("");
578 ftmpname << glroot->PATH.Data() << "/";
579 ftmpname << glroot->NAME.Data();
580 fname = ftmpname.str().c_str();
581 //
582 // print out informations
583 //
584 totevent = runinfo->NEVENTS;
585 if ( verbose ) printf("\n LEVEL0 data file: %s \n",fname.Data());
586 if ( verbose ) printf(" RUN HEADER absolute time is: %u \n",runheadtime);
587 if ( verbose ) printf(" RUN TRAILER absolute time is: %u \n",runtrailtime);
588 if ( verbose ) printf(" %i events to be processed for run %u: from %i to %i (reg entries)\n\n",totevent,idRun,evfrom,evfrom+totevent);
589 //
590 // Open Level0 file
591 //
592 l0File = new TFile(fname.Data());
593 if ( !l0File ) {
594 if ( verbose ) printf(" CALORIMETER - ERROR: problems opening Level0 file\n");
595 code = -6;
596 goto closeandexit;
597 };
598 l0tr = (TTree*)l0File->Get("Physics");
599 if ( !l0tr ) {
600 if ( verbose ) printf(" CALORIMETER - ERROR: no Physics tree in Level0 file\n");
601 l0File->Close();
602 code = -7;
603 goto closeandexit;
604 };
605 l0head = l0tr->GetBranch("Header");
606 if ( !l0head ) {
607 if ( verbose ) printf(" CALORIMETER - ERROR: no Header branch in Level0 tree\n");
608 l0File->Close();
609 code = -8;
610 goto closeandexit;
611 };
612 l0calo = l0tr->GetBranch("Calorimeter");
613 if ( !l0calo ) {
614 if ( verbose ) printf(" CALORIMETER - ERROR: no Calorimeter branch in Level0 tree\n");
615 l0File->Close();
616 code = -103;
617 goto closeandexit;
618 };
619 l0trig = l0tr->GetBranch("Trigger");
620 if ( !l0trig ) {
621 if ( verbose ) printf(" CALORIMETER - ERROR: no Trigger branch in Level0 tree\n");
622 l0File->Close();
623 code = -104;
624 goto closeandexit;
625 };
626 //
627 l0tr->SetBranchAddress("Trigger", &trig);
628 l0tr->SetBranchAddress("Header", &eh);
629 //
630 softinfo = (TTree*)l0File->Get("SoftInfo");
631 if ( softinfo ){
632 softinfo->SetBranchAddress("SoftInfo",&yodaver);
633 softinfo->GetEntry(0);
634 };
635 if ( debug ) printf(" LEVEL0 FILE GENERATED WITH YODA VERSION %i \n",yodaver);
636 //
637 // Construct the event object, look for the calibration which include the first header
638 //
639 sgnl = 0;
640 if ( verbose ) printf(" Check for calorimeter calibrations and initialize event object \n");
641 // if ( !dbc->IsConnected() ) throw -116;
642 event->ProcessingInit(glt,runheadtime,sgnl,l0tr,debug,verbose);
643 if ( verbose ) printf("\n");
644 if ( sgnl == 100 ) {
645 code = sgnl;
646 if ( verbose ) printf(" CALORIMETER - WARNING: run header not included in any calibration interval\n");
647 sgnl = 0;
648 };
649 if ( sgnl ){
650 l0File->Close();
651 code = sgnl;
652 goto closeandexit;
653 };
654 //
655 qy.str("");
656 //
657 nevents = l0head->GetEntries();
658 caloevents = l0calo->GetEntries();
659 //
660 if ( nevents < 1 ) {
661 if ( verbose ) printf(" CALORIMETER - ERROR: Level0 file is empty\n\n");
662 l0File->Close();
663 code = -11;
664 goto closeandexit;
665 };
666 //
667 if ( evto > nevents-1 ) {
668 if ( verbose ) printf(" CALORIMETER - ERROR: too few entries in the registry tree\n");
669 l0File->Close();
670 code = -12;
671 goto closeandexit;
672 };
673 //
674 // Check if we have to load parameter files
675 //
676 sgnl = 0;
677 // if ( !dbc->IsConnected() ) throw -116;
678 sgnl = event->ChkParam(glt,runheadtime,mechal); // calorimeter parameter files
679 if ( sgnl < 0 ){
680 code = sgnl;
681 l0File->Close();
682 goto closeandexit;
683 };
684 //
685 if ( withtrk ){
686 if ( trkpar1 || ( tttrkpar1 != 0 && tttrkpar1 < runheadtime ) ){
687 trkpar1 = false;
688 // if ( !dbc->IsConnected() ) throw -116;
689 Int_t glpar = q4->Query_GL_PARAM(runinfo->RUNHEADER_TIME,1,dbc);
690 if ( glpar < 0 ){
691 code = glpar;
692 goto closeandexit;
693 };
694 tttrkpar1 = q4->TO_TIME;
695 // ----------------------------
696 // Read the magnetic field
697 // ----------------------------
698 if ( verbose ) printf(" Reading magnetic field maps at %s\n",(q4->PATH+q4->NAME).Data());
699 trk->LoadField(q4->PATH+q4->NAME);
700 if ( verbose ) printf("\n");
701 };
702 };
703 //
704 // run over all the events of the run
705 //
706 if ( verbose ) printf("\n Ready to start! \n\n Processed events: \n\n");
707 //
708 if ( dbc ){
709 dbc->Close();
710 delete dbc;
711 };
712 //
713 for ( re = runinfo->EV_FROM; re < (runinfo->EV_FROM+runinfo->NEVENTS); re++){
714 //for ( re = 46438+200241; re < 46441+200241; re++){
715 // printf(" i = %i \n",re-200241);
716 //
717 if ( procev%1000 == 0 && procev > 0 && verbose ) printf(" %iK \n",procev/1000);
718 //
719 l0head->GetEntry(re);
720 //
721 // absolute time of this event
722 //
723 ph = eh->GetPscuHeader();
724 atime = dbtime->DBabsTime(ph->GetOrbitalTime());
725 //
726 //
727 //
728 if ( re > caloevents-1 ){
729 if ( verbose ) printf(" CALORIMETER - ERROR: no physics events with entry = %i in Level0 file\n",i);
730 l0File->Close();
731 code = -112;
732 goto closeandexit;
733 };
734 //
735 if ( atime > runtrailtime || atime < runheadtime ) {
736 if ( verbose ) printf(" CALORIMETER - WARNING: event at time outside the run time window, skipping it\n");
737 jumped++;
738 goto jumpev;
739 };
740 //
741 // retrieve tracker informations
742 //
743 if ( !reprocall ){
744 itr = nobefrun + (re - evfrom - jumped);
745 //itr = re-(46438+200241);
746 } else {
747 itr = runinfo->GetFirstEntry() + (re - evfrom - jumped);
748 };
749 //
750 if ( withtrk ){
751 if ( itr > nevtrkl2 ){
752 if ( verbose ) printf(" CALORIMETER - ERROR: no tracker events with entry = %i in Level2 file\n",itr);
753 l0File->Close();
754 code = -113;
755 goto closeandexit;
756 };
757 //
758 trk->Clear();
759 //
760 tracker->GetEntry(itr);
761 //
762 };
763 //
764 procev++;
765 //
766 // start processing
767 //
768 if ( getl1 ) c1->Clear();
769 ca->Clear();
770 //
771 // determine who generate the trigger for this event (TOF, S4/PULSER, CALO)
772 //
773 l0trig->GetEntry(re);
774 S3 = 0;
775 S2 = 0;
776 S12 = 0;
777 S11 = 0;
778 S3 = trig->patterntrig[2];
779 S2 = trig->patterntrig[3];
780 S12 = trig->patterntrig[4];
781 S11 = trig->patterntrig[5];
782 if ( trig->patterntrig[1] & (1<<0) ) tmptrigty = 1.;
783 if ( trig->patterntrig[0] ) tmptrigty = 2.;
784 if ( S3 || S2 || S12 || S11 ) tmptrigty = 0.;
785 if ( !(trig->patterntrig[1] & (1<<0)) && !trig->patterntrig[0] && !S3 && !S2 && !S12 && !S11 ) tmptrigty = 1.;
786 event->clevel2->trigty = tmptrigty;
787 //
788 // check if the calibration we are using is still good, if not load another calibration
789 //
790 sgnl = 0;
791 sgnl = event->ChkCalib(glt,atime);
792 if ( sgnl < 0 ){
793 code = sgnl;
794 goto closeandexit;
795 };
796 if ( sgnl == 100 ){
797 code = sgnl;
798 if ( verbose ) printf(" CALORIMETER - WARNING: data not associated to any calibration interval\n");
799 badevent++;
800 sgnl = 0;
801 };
802 //
803 // do we have at least one track from the tracker? this check has been disabled
804 //
805 event->clevel1->good2 = 1;
806 //
807 // use the whole calorimeter, 22 W planes
808 //
809 event->clevel1->npla = 22;
810 //
811 // Use the standard silicon planes shifting
812 //
813 event->clevel1->reverse = 0;
814 //
815 //
816 // Calibrate calorimeter event "re" and store output in the two structures that will be passed to fortran routine
817 //
818 event->Calibrate(re);
819 //
820 // Here we have calibrated data, ready to be passed to the FORTRAN routine which will extract topological variables.
821 //
822 //
823 // Calculate variables common to all tracks (qtot, nstrip, etc.)
824 //
825 event->GetCommonVar();
826 //
827 // Fill common variables
828 //
829 event->FillCommonVar(c1,ca);
830 //
831 // Calculate variables related to tracks only if we have at least one track (from selftrigger and/or tracker)
832 //
833 ntrkentry = 0;
834 //
835 filled = false;
836 //
837 // Run over tracks (tracker or calorimeter )
838 //
839 if ( withtrk ){
840 for(Int_t nt=0; nt < trk->ntrk(); nt++){
841 //
842 event->clevel1->good2 = 1;
843 //
844 TrkTrack *ptt = trk->GetStoredTrack(nt);
845 //
846 event->clevel1->trkchi2 = 0;
847 //
848 // Copy the alpha vector in the input structure
849 //
850 for (Int_t e = 0; e < 5 ; e++){
851 event->clevel1->al_p[e][0] = ptt->al[e];
852 };
853 //
854 // Get tracker related variables for this track
855 //
856 event->GetTrkVar();
857 //
858 // Save tracker track sequence number
859 //
860 event->trkseqno = nt;
861 //
862 // Copy values in the class ca from the structure clevel2
863 //
864 event->FillTrkVar(ca,ntrkentry);
865 ntrkentry++;
866 filled = true;
867 //
868 }; // loop on all the tracks
869 };
870 //
871 // if no tracks found but there is the possibility to have a good track we should try to calculate anyway the track related variables using the calorimeter
872 // fit of the track (to be used for example when TRK is off due to any reason like IPM3/5 off).
873 // here we make an event selection so it must be done very carefully...
874 //
875 // conditions are: 0) no track from the tracker 1) we have a track fit both in x and y 2) no problems with calo for this event 3) no selftrigger event
876 //
877 if ( trackanyway && !filled && event->clevel2->npcfit[0] >= 2 && event->clevel2->npcfit[1] >= 2 && event->clevel2->good != 0 && event->clevel2->trigty < 2. ){
878 if ( debug ) printf(" Event with a track not fitted by the tracker at entry %i \n",itr);
879 //
880 // Disable "track mode" in the fortran routine
881 //
882 event->clevel1->good2 = 0;
883 event->clevel1->riginput = rigdefault;
884 if ( debug ) printf(" Using as default rigidity: %f \n",event->clevel1->riginput);
885 //
886 // We have a selftrigger event to analyze.
887 //
888 for (Int_t e = 0; e < 5 ; e++){
889 event->clevel1->al_p[e][0] = 0.;
890 event->clevel1->al_p[e][1] = 0.;
891 };
892 event->clevel1->trkchi2 = 0;
893 //
894 event->GetTrkVar();
895 //
896 // if we had no problem (clevel1->good2 = 0, NOTICE zero, not one in this mode!), fill and go on
897 //
898 if ( event->clevel1->good2 == 0 ) {
899 //
900 // In selftrigger mode the trkentry variable is set to -1
901 //
902 event->trkseqno = -3;
903 //
904 // Copy values in the class ca from the structure clevel2
905 //
906 event->FillTrkVar(ca,ntrkentry);
907 ntrkentry++;
908 filled = true;
909 //
910 } else {
911 if ( verbose ) printf(" Selftrigger: problems with event at entry %i \n",itr);
912 };
913 //
914 };
915 //
916 // Call high energy nuclei routine
917 //
918 if ( hZn && event->clevel2->trigty >= 2. ){
919 if ( debug ) printf(" Calling selftrigger high energy nuclei routine for entry %i \n",itr);
920 //
921 // Disable "track mode" in the fortran routine
922 //
923 event->clevel1->good2 = 0;
924 //
925 // Set high energy nuclei flag to one
926 //
927 event->clevel1->hzn = 1;
928 event->clevel1->riginput = rigdefault;
929 //
930 // We have a selftrigger event to analyze.
931 //
932 for (Int_t e = 0; e < 5 ; e++){
933 event->clevel1->al_p[e][0] = 0.;
934 event->clevel1->al_p[e][1] = 0.;
935 };
936 event->clevel1->trkchi2 = 0;
937 //
938 event->GetTrkVar();
939 //
940 // if we had no problem (clevel1->good2 = 0, NOTICE zero, not one in this mode!), fill and go on
941 //
942 if ( event->clevel1->good2 == 0 ) {
943 //
944 // In selftrigger mode the trkentry variable is set to -1
945 //
946 event->trkseqno = -2;
947 //
948 // Copy values in the class ca from the structure clevel2
949 //
950 event->FillTrkVar(ca,ntrkentry);
951 ntrkentry++;
952 filled = true;
953 //
954 } else {
955 if ( verbose ) printf(" Selftrigger: problems with event at entry %i \n",itr);
956 };
957 //
958 };
959 //
960 // self trigger event
961 //
962 if ( st && event->clevel2->trigty >= 2. ){
963 if ( verbose ) printf(" Selftrigger event at entry %i \n",itr);
964 //
965 // Disable "track mode" in the fortran routine
966 //
967 event->clevel1->good2 = 0;
968 //
969 // disable high enery nuclei flag;
970 //
971 event->clevel1->hzn = 0;
972 //
973 // We have a selftrigger event to analyze.
974 //
975 for (Int_t e = 0; e < 5 ; e++){
976 event->clevel1->al_p[e][0] = 0.;
977 event->clevel1->al_p[e][1] = 0.;
978 };
979 event->clevel1->trkchi2 = 0;
980 //
981 event->GetTrkVar();
982 //
983 // if we had no problem (clevel2->good = 0, NOTICE zero, not one in selftrigger mode!), fill and go on
984 //
985 if ( event->clevel1->good2 == 0 ) {
986 //
987 // In selftrigger mode the trkentry variable is set to -1
988 //
989 event->trkseqno = -1;
990 //
991 // Copy values in the class ca from the structure clevel2
992 //
993 event->FillTrkVar(ca,ntrkentry);
994 ntrkentry++;
995 filled = true;
996 //
997 } else {
998 if ( verbose ) printf(" Selftrigger: problems with event at entry %i \n",itr);
999 };
1000 };
1001 //
1002 if ( !filled ) badevent++;
1003 //
1004 // Clear structures used to communicate with fortran
1005 //
1006 event->ClearStructs();
1007 //
1008 // Fill the rootple
1009 //
1010 calo->Fill();
1011 //
1012 // delete ca;
1013 //
1014 jumpev:
1015 if ( !debug ) debug = false;
1016 //
1017 };
1018 //
1019 if ( verbose ) printf("\n SUMMARY:\n");
1020 if ( verbose ) printf(" Total number of events: %i \n",totevent);
1021 if ( verbose ) printf(" Events with at least one track: %i \n",totevent-badevent);
1022 if ( verbose ) printf(" Events without tracks: %i \n",badevent);
1023 //
1024 if ( badevent == totevent ){
1025 if ( verbose ) printf("\n CALORIMETER - WARNING no tracks or good events in run %u \n",idRun);
1026 code = 101;
1027 };
1028 //
1029 delete dbtime;
1030 //
1031 // Clear variables before processing another run (needed to have always the same result when reprocessing data with the same software).
1032 //
1033 event->RunClose();
1034 if ( l0File ) l0File->Close();
1035 //
1036 }; // process all the runs
1037 //
1038 if ( verbose ) printf("\n Finished processing data \n");
1039 //
1040 closeandexit:
1041 //
1042 if ( !reprocall && reproc && code >= 0 ){
1043 if ( totfileentries > noaftrun ){
1044 if ( verbose ) printf("\n Post-processing: copying events from the old tree after the processed run\n");
1045 if ( verbose ) printf(" Copying %u events in the file which are after the end of the run %u \n",(totfileentries-noaftrun),run);
1046 if ( verbose ) printf(" Start copying at event number %u end copying at event number %u \n",noaftrun,totfileentries);
1047 for (UInt_t j = noaftrun; j < totfileentries; j++ ){
1048 //
1049 // Get entry from old tree
1050 //
1051 caloclone->GetEntry(j);
1052 //
1053 // copy caclone to ca
1054 //
1055 if ( getl1 ) c1->Clear();
1056 ca->Clear();
1057 //
1058 if ( getl1 ) memcpy(&c1,&c1clone,sizeof(c1clone));
1059 memcpy(&ca,&caclone,sizeof(caclone));
1060 //
1061 // Fill entry in the new tree
1062 //
1063 calo->Fill();
1064 //
1065 };
1066 if ( verbose ) printf(" Finished successful copying!\n");
1067 };
1068 };
1069 //
1070 // Case of no errors: close files, delete old tree(s), write and close level2 file
1071 //
1072 if ( l0File ) l0File->Close();
1073 if ( tempfile ) tempfile->Close();
1074 if ( myfold ) gSystem->Unlink(tempname.str().c_str());
1075 if ( tracker ) tracker->Delete();
1076 //
1077 if ( code < 0 ) printf("\n CALORIMETER - ERROR: an error occurred, try to save anyway...\n");
1078 if ( verbose ) printf("\n Writing and closing rootple\n");
1079 if ( runinfo ) runinfo->Close();
1080 if ( calo ) calo->SetName("Calorimeter");
1081 if ( file ){
1082 file->cd();
1083 file->Write();
1084 };
1085 if ( calo ) calo->Delete();
1086 //
1087 if ( myfold ) gSystem->Unlink(calofolder.str().c_str());
1088 //
1089 if ( ca ) delete ca;
1090 if ( caclone ) delete caclone;
1091 if ( c1 ) delete c1;
1092 if ( c1clone ) delete c1clone;
1093 if ( trk ) delete trk;
1094 if ( q4 ) delete q4;
1095 if ( glroot ) delete glroot;
1096 if ( runinfo ) delete runinfo;
1097 //
1098 // the end
1099 //
1100 if ( verbose ) printf("\n Exiting...\n");
1101 if ( code < 0 ) throw code;
1102 return(code);
1103 }
1104
1105
1106

  ViewVC Help
Powered by ViewVC 1.1.23