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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.33 - (hide annotations) (download)
Wed Oct 10 16:01:29 2007 UTC (17 years, 4 months ago) by mocchiut
Branch: MAIN
Changes since 1.32: +4 -0 lines
Bug in ToFPMT fixed, set zerofill option as defatult, DV exit code changed, set time 0 on each DB connection

1 mocchiut 1.1 //
2     // Given a calibration and a data file this program create an ntuple with LEVEL2 calorimeter variables - Emiliano Mocchiutti
3     //
4 mocchiut 1.3 // CaloCore.cxx version 3.05 (2006-05-30)
5 mocchiut 1.1 //
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 mocchiut 1.3 //
10 mocchiut 1.11 // 3.08 (2006-11-13): Added high energy nuclei capability and "process all events" capability.
11     //
12 mocchiut 1.4 // 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 mocchiut 1.2 //
14     // 3.03 - 3.04 (2006-05-23): Forgot to put impx and impy in the PAMELA reference system, fixed.
15 mocchiut 1.1 //
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 mocchiut 1.8 #include <TArrayI.h>
50 mocchiut 1.1 #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 mocchiut 1.20 // This program headers
68     //
69     #include <RunInfo.h>
70     //
71 mocchiut 1.1 // YODA headers
72     //
73     #include <PamelaRun.h>
74     #include <physics/trigger/TriggerEvent.h>
75     //
76     // This program headers
77     //
78     #include <CaloCore.h>
79 mocchiut 1.13 #include <CaloLevel1.h>
80 mocchiut 1.1 #include <CaloLevel2.h>
81 mocchiut 1.22 #include <CaloLevel0.h>
82 mocchiut 1.1 #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 mocchiut 1.32 int CaloCore(UInt_t run, TFile *file, GL_TABLES *glt, Int_t calargc, char *calargv[]){
93 mocchiut 1.1 //
94     // Set these to true to have a very verbose output.
95     //
96     Bool_t verbose = false;
97     Bool_t debug = false;
98     //
99 mocchiut 1.21 Bool_t crosst = true;
100     //
101 mocchiut 1.11 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 mocchiut 1.13 Bool_t getl1 = true;
112     //
113 mocchiut 1.23 Bool_t mechal = false;
114     //
115 mocchiut 1.30 Bool_t checksimu = true;
116     //
117 mocchiut 1.1 // Output directory is the working directoy.
118     //
119     const char* outdir = gSystem->DirName(gSystem->DirName(file->GetPath()));
120     //
121     Int_t ri = 0;
122 mocchiut 1.26 TString processFolder = Form("calorimeterFolder_%u",run);
123 mocchiut 1.1 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 mocchiut 1.13 verbose = true;
138 mocchiut 1.1 debug = true;
139     };
140 mocchiut 1.11 if ( !strcmp(calargv[ri],"--alltracks") ) {
141     trackanyway = true;
142     };
143 mocchiut 1.23 if ( !strcmp(calargv[ri],"--use-default-alig") ) {
144     mechal = true;
145     };
146 mocchiut 1.21 if ( !strcmp(calargv[ri],"--no-crosstalk") ) {
147     crosst = false;
148     };
149 mocchiut 1.11 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 mocchiut 1.13 if ( !strcmp(calargv[ri],"--no-level1") ) {
178     getl1 = false;
179     };
180 mocchiut 1.30 if ( !strcmp(calargv[ri],"--ignore-h20") ) {
181     checksimu = false;
182     };
183 mocchiut 1.11 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 mocchiut 1.14 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 mocchiut 1.11 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 mocchiut 1.21 printf(" --no-crosstalk do not apply crosstalk corrections\n");
203 mocchiut 1.11 printf(" --selftrigger process selftrigger events [default]\n");
204     printf(" --no-selftrigger skip selftrigger events\n");
205 mocchiut 1.13 printf(" --no-level1 do not save Level1 TBranch\n");
206 mocchiut 1.30 printf(" --ignore-h20 do not check if it is a file from simulations\n");
207 mocchiut 1.27 printf(" --use-default-alig use default mechanical alignement (defined in CaloLevel1.h)\n");
208 mocchiut 1.11 throw -114;
209     };
210 mocchiut 1.1 ri++;
211     };
212     };
213     //
214 mocchiut 1.13 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 mocchiut 1.27 if ( mechal ) printf(" Using default mechanical alignement (defined in CaloLevel1.h)\n");
223 mocchiut 1.13 printf("\n");
224     };
225 mocchiut 1.11 //
226 mocchiut 1.1 // 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 mocchiut 1.8 UInt_t nevents = 0;
241 mocchiut 1.1 UInt_t nobefrun = 0;
242     UInt_t noaftrun = 0;
243     UInt_t numbofrun = 0;
244 mocchiut 1.8 UInt_t totnorun = 0;
245 mocchiut 1.1 //
246     Int_t code = 0;
247     Int_t sgnl;
248     //
249     // calorimeter level2 classes
250     //
251 mocchiut 1.13 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 mocchiut 1.1 CaloLevel2 *ca = new CaloLevel2();
261     CaloLevel2 *caclone = new CaloLevel2();
262     //
263     TrkLevel2 *trk = new TrkLevel2();
264 mocchiut 1.8 Int_t nevtrkl2 = 0;
265 mocchiut 1.1 //
266     UInt_t procev = 0;
267     //
268 mocchiut 1.8 // 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 mocchiut 1.1 //
270 mocchiut 1.8 UInt_t runheadtime = 0;
271     UInt_t runtrailtime = 0;
272 mocchiut 1.1 UInt_t evfrom = 0;
273     UInt_t evto = 0;
274 mocchiut 1.8 UInt_t totfileentries = 0;
275     UInt_t idRun = 0;
276 mocchiut 1.1 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 mocchiut 1.24 TTree *softinfo = 0;
285 mocchiut 1.1 TBranch *l0head = 0;
286     TBranch *l0calo = 0;
287     TBranch *l0trig = 0;
288 mocchiut 1.8 pamela::EventHeader *eh = 0;
289     pamela::PscuHeader *ph = 0;
290 mocchiut 1.1 pamela::trigger::TriggerEvent *trig = 0;
291 mocchiut 1.24 Int_t yodaver = 0;
292 mocchiut 1.1 //
293     // Define some basic variables
294     //
295 mocchiut 1.22 CaloLevel0 *event = new CaloLevel0(); // NOTICE: very important to call here the constructor!
296 mocchiut 1.21 event->SetCrossTalk(crosst);
297 mocchiut 1.1 stringstream file2;
298     stringstream file3;
299     stringstream qy;
300     // Bool_t imtrack = false;
301     Bool_t filled = false;
302     //
303 mocchiut 1.8 UInt_t caloevents = 0;
304 mocchiut 1.1 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 mocchiut 1.8 UInt_t atime = 0;
313 mocchiut 1.1 //
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 mocchiut 1.9 UInt_t jumped = 0;
320 mocchiut 1.1 //
321     TString caloversion;
322     ItoRunInfo *runinfo = 0;
323 mocchiut 1.8 TArrayI *runlist = 0;
324 mocchiut 1.1 //
325     Float_t tmptrigty = -1.;
326     Int_t ntrkentry = 0;
327     GL_PARAM *q4 = new GL_PARAM();
328 mocchiut 1.8 UInt_t tttrkpar1 = 0;
329 mocchiut 1.1 Bool_t trkpar1 = true;
330     GL_ROOT *glroot = new GL_ROOT();
331 mocchiut 1.8 GL_TIMESYNC *dbtime = 0;
332 mocchiut 1.1 //
333 mocchiut 1.15 Long64_t maxsize = 10000000000LL;
334     TTree::SetMaxTreeSize(maxsize);
335 mocchiut 1.1 //
336     //
337     TFile *tempfile = 0;
338     TTree *tempcalo = 0;
339 mocchiut 1.30 Bool_t myfold = false;
340 mocchiut 1.1 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 mocchiut 1.8 if ( run == 0 ) reproc = true;
355 mocchiut 1.1 //
356     //
357     //
358     if ( !file->IsOpen() ){
359     if ( verbose ) printf(" CALORIMETER - ERROR: cannot open file for writing\n");
360     throw -101;
361     };
362     //
363 mocchiut 1.11 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 mocchiut 1.1 };
376     //
377 mocchiut 1.30 // 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 mocchiut 1.1 // 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 mocchiut 1.8 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 mocchiut 1.1 //
439     } else {
440     //
441 mocchiut 1.15 caloclone->SetAutoSave(900000000000000LL);
442 mocchiut 1.1 reproc = true;
443     //
444     if ( verbose ) printf("\n Preparing the pre-processing...\n");
445     //
446 mocchiut 1.28 if ( run == 0 || totnorun == 1 ){
447 mocchiut 1.1 //
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 mocchiut 1.8 if ( verbose ) printf("\n CALORIMETER - WARNING: Reprocessing run number %u \n",run);
458 mocchiut 1.1 reprocall = false;
459     //
460     //
461     //
462 mocchiut 1.30 gSystem->MakeDirectory(calofolder.str().c_str());
463     myfold = true;
464 mocchiut 1.1 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 mocchiut 1.15 calo->SetAutoSave(900000000000000LL);
484 pam-fi 1.16 ca->Set();
485 mocchiut 1.1 calo->Branch("CaloLevel2","CaloLevel2",&ca);
486 mocchiut 1.13 if ( getl1 ) calo->Branch("CaloLevel1","CaloLevel1",&c1);
487 mocchiut 1.1 //
488     if ( reproc && !reprocall ){
489     //
490     //
491     //
492     tempfile = new TFile(tempname.str().c_str(),"READ");
493     caloclone = (TTree*)tempfile->Get("Calorimeter-old");
494 mocchiut 1.15 caloclone->SetAutoSave(900000000000000LL);
495 mocchiut 1.1 caloclone->SetBranchAddress("CaloLevel2",&caclone);
496 mocchiut 1.13 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 mocchiut 1.1 //
501     if ( nobefrun > 0 ){
502     if ( verbose ) printf("\n Pre-processing: copying events from the old tree before the processed run\n");
503 mocchiut 1.8 if ( verbose ) printf(" Copying %u events in the file which are before the beginning of the run %u \n",nobefrun,run);
504 mocchiut 1.1 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 mocchiut 1.13 if ( getl1 ) memcpy(&c1,&c1clone,sizeof(c1clone));
512 mocchiut 1.1 memcpy(&ca,&caclone,sizeof(caclone));
513     //
514     // Fill entry in the new tree
515     //
516     calo->Fill();
517     //
518 mocchiut 1.13 if ( getl1 ) c1->Clear();
519 mocchiut 1.6 ca->Clear();
520     //
521 mocchiut 1.1 };
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 mocchiut 1.8 if ( verbose ) printf(" PROCESSING RUN NUMBER %u \n",idRun);
539 mocchiut 1.1 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 mocchiut 1.8 id_reg_run = runinfo->ID_ROOT_L0;
550 mocchiut 1.1 runheadtime = runinfo->RUNHEADER_TIME;
551     runtrailtime = runinfo->RUNTRAILER_TIME;
552 mocchiut 1.8 evfrom = runinfo->EV_FROM;
553     evto = runinfo->EV_TO;
554 mocchiut 1.1 //
555     if ( id_reg_run == -1 ){
556 mocchiut 1.8 if ( verbose ) printf("\n CALORIMETER - ERROR: no run with ID_RUN = %u \n\n Exiting... \n\n",idRun);
557 mocchiut 1.1 code = -5;
558     goto closeandexit;
559     };
560     //
561 mocchiut 1.8 // prepare the timesync for the db
562     //
563 mocchiut 1.32 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 mocchiut 1.33 stringstream myquery;
569     myquery.str("");
570     myquery << "SET time_zone='+0:00'";
571     dbc->Query(myquery.str().c_str());
572 mocchiut 1.32 //
573 mocchiut 1.31 // if ( !dbc->IsConnected() ) throw -116;
574 mocchiut 1.8 dbtime = new GL_TIMESYNC(runinfo->ID_ROOT_L0,"ID",dbc);
575     //
576 mocchiut 1.1 // Search in the DB the path and name of the LEVEL0 file to be processed.
577     //
578 mocchiut 1.31 // if ( !dbc->IsConnected() ) throw -116;
579 mocchiut 1.8 glroot->Query_GL_ROOT(runinfo->ID_ROOT_L0,dbc);
580 mocchiut 1.1 //
581     ftmpname.str("");
582     ftmpname << glroot->PATH.Data() << "/";
583     ftmpname << glroot->NAME.Data();
584     fname = ftmpname.str().c_str();
585     //
586     // print out informations
587     //
588 mocchiut 1.8 totevent = runinfo->NEVENTS;
589 mocchiut 1.1 if ( verbose ) printf("\n LEVEL0 data file: %s \n",fname.Data());
590 mocchiut 1.8 if ( verbose ) printf(" RUN HEADER absolute time is: %u \n",runheadtime);
591     if ( verbose ) printf(" RUN TRAILER absolute time is: %u \n",runtrailtime);
592     if ( verbose ) printf(" %i events to be processed for run %u: from %i to %i (reg entries)\n\n",totevent,idRun,evfrom,evfrom+totevent);
593 mocchiut 1.1 //
594     // Open Level0 file
595     //
596     l0File = new TFile(fname.Data());
597     if ( !l0File ) {
598     if ( verbose ) printf(" CALORIMETER - ERROR: problems opening Level0 file\n");
599     code = -6;
600     goto closeandexit;
601     };
602     l0tr = (TTree*)l0File->Get("Physics");
603     if ( !l0tr ) {
604     if ( verbose ) printf(" CALORIMETER - ERROR: no Physics tree in Level0 file\n");
605     l0File->Close();
606     code = -7;
607     goto closeandexit;
608     };
609     l0head = l0tr->GetBranch("Header");
610     if ( !l0head ) {
611     if ( verbose ) printf(" CALORIMETER - ERROR: no Header branch in Level0 tree\n");
612     l0File->Close();
613     code = -8;
614     goto closeandexit;
615     };
616     l0calo = l0tr->GetBranch("Calorimeter");
617     if ( !l0calo ) {
618     if ( verbose ) printf(" CALORIMETER - ERROR: no Calorimeter branch in Level0 tree\n");
619     l0File->Close();
620     code = -103;
621     goto closeandexit;
622     };
623     l0trig = l0tr->GetBranch("Trigger");
624     if ( !l0trig ) {
625     if ( verbose ) printf(" CALORIMETER - ERROR: no Trigger branch in Level0 tree\n");
626     l0File->Close();
627     code = -104;
628     goto closeandexit;
629     };
630     //
631     l0tr->SetBranchAddress("Trigger", &trig);
632 mocchiut 1.8 l0tr->SetBranchAddress("Header", &eh);
633 mocchiut 1.1 //
634 mocchiut 1.24 softinfo = (TTree*)l0File->Get("SoftInfo");
635     if ( softinfo ){
636     softinfo->SetBranchAddress("SoftInfo",&yodaver);
637     softinfo->GetEntry(0);
638     };
639     if ( debug ) printf(" LEVEL0 FILE GENERATED WITH YODA VERSION %i \n",yodaver);
640     //
641 mocchiut 1.1 // Construct the event object, look for the calibration which include the first header
642     //
643     sgnl = 0;
644     if ( verbose ) printf(" Check for calorimeter calibrations and initialize event object \n");
645 mocchiut 1.31 // if ( !dbc->IsConnected() ) throw -116;
646 mocchiut 1.32 event->ProcessingInit(glt,runheadtime,sgnl,l0tr,debug,verbose);
647 mocchiut 1.1 if ( verbose ) printf("\n");
648     if ( sgnl == 100 ) {
649     code = sgnl;
650     if ( verbose ) printf(" CALORIMETER - WARNING: run header not included in any calibration interval\n");
651     sgnl = 0;
652     };
653     if ( sgnl ){
654     l0File->Close();
655     code = sgnl;
656     goto closeandexit;
657     };
658     //
659     qy.str("");
660     //
661 mocchiut 1.8 nevents = l0head->GetEntries();
662 mocchiut 1.1 caloevents = l0calo->GetEntries();
663     //
664     if ( nevents < 1 ) {
665     if ( verbose ) printf(" CALORIMETER - ERROR: Level0 file is empty\n\n");
666     l0File->Close();
667     code = -11;
668     goto closeandexit;
669     };
670     //
671     if ( evto > nevents-1 ) {
672     if ( verbose ) printf(" CALORIMETER - ERROR: too few entries in the registry tree\n");
673     l0File->Close();
674     code = -12;
675     goto closeandexit;
676     };
677     //
678     // Check if we have to load parameter files
679     //
680     sgnl = 0;
681 mocchiut 1.31 // if ( !dbc->IsConnected() ) throw -116;
682 mocchiut 1.32 sgnl = event->ChkParam(glt,runheadtime,mechal); // calorimeter parameter files
683 mocchiut 1.1 if ( sgnl < 0 ){
684     code = sgnl;
685     l0File->Close();
686     goto closeandexit;
687     };
688     //
689 mocchiut 1.11 if ( withtrk ){
690     if ( trkpar1 || ( tttrkpar1 != 0 && tttrkpar1 < runheadtime ) ){
691     trkpar1 = false;
692 mocchiut 1.31 // if ( !dbc->IsConnected() ) throw -116;
693 mocchiut 1.11 Int_t glpar = q4->Query_GL_PARAM(runinfo->RUNHEADER_TIME,1,dbc);
694     if ( glpar < 0 ){
695     code = glpar;
696     goto closeandexit;
697     };
698     tttrkpar1 = q4->TO_TIME;
699     // ----------------------------
700     // Read the magnetic field
701     // ----------------------------
702     if ( verbose ) printf(" Reading magnetic field maps at %s\n",(q4->PATH+q4->NAME).Data());
703     trk->LoadField(q4->PATH+q4->NAME);
704     if ( verbose ) printf("\n");
705 mocchiut 1.4 };
706 mocchiut 1.1 };
707     //
708     // run over all the events of the run
709     //
710     if ( verbose ) printf("\n Ready to start! \n\n Processed events: \n\n");
711     //
712 mocchiut 1.31 if ( dbc ){
713     dbc->Close();
714 mocchiut 1.32 delete dbc;
715 mocchiut 1.31 };
716 mocchiut 1.8 //
717 mocchiut 1.19 for ( re = runinfo->EV_FROM; re < (runinfo->EV_FROM+runinfo->NEVENTS); re++){
718     //for ( re = 46438+200241; re < 46441+200241; re++){
719 mocchiut 1.18 // printf(" i = %i \n",re-200241);
720 mocchiut 1.1 //
721     if ( procev%1000 == 0 && procev > 0 && verbose ) printf(" %iK \n",procev/1000);
722     //
723 mocchiut 1.8 l0head->GetEntry(re);
724 mocchiut 1.1 //
725     // absolute time of this event
726     //
727 mocchiut 1.8 ph = eh->GetPscuHeader();
728     atime = dbtime->DBabsTime(ph->GetOrbitalTime());
729 mocchiut 1.1 //
730     //
731     //
732 mocchiut 1.8 if ( re > caloevents-1 ){
733 mocchiut 1.1 if ( verbose ) printf(" CALORIMETER - ERROR: no physics events with entry = %i in Level0 file\n",i);
734     l0File->Close();
735     code = -112;
736     goto closeandexit;
737     };
738     //
739     if ( atime > runtrailtime || atime < runheadtime ) {
740     if ( verbose ) printf(" CALORIMETER - WARNING: event at time outside the run time window, skipping it\n");
741 mocchiut 1.9 jumped++;
742 mocchiut 1.1 goto jumpev;
743     };
744     //
745     // retrieve tracker informations
746     //
747     if ( !reprocall ){
748 mocchiut 1.19 itr = nobefrun + (re - evfrom - jumped);
749     //itr = re-(46438+200241);
750 mocchiut 1.1 } else {
751 mocchiut 1.9 itr = runinfo->GetFirstEntry() + (re - evfrom - jumped);
752 mocchiut 1.1 };
753 mocchiut 1.11 //
754     if ( withtrk ){
755     if ( itr > nevtrkl2 ){
756     if ( verbose ) printf(" CALORIMETER - ERROR: no tracker events with entry = %i in Level2 file\n",itr);
757     l0File->Close();
758     code = -113;
759     goto closeandexit;
760     };
761     //
762     trk->Clear();
763     //
764     tracker->GetEntry(itr);
765     //
766 mocchiut 1.1 };
767 mocchiut 1.10 //
768 mocchiut 1.1 procev++;
769     //
770     // start processing
771     //
772 mocchiut 1.13 if ( getl1 ) c1->Clear();
773 mocchiut 1.6 ca->Clear();
774 mocchiut 1.1 //
775     // determine who generate the trigger for this event (TOF, S4/PULSER, CALO)
776     //
777 mocchiut 1.8 l0trig->GetEntry(re);
778 mocchiut 1.1 S3 = 0;
779     S2 = 0;
780     S12 = 0;
781     S11 = 0;
782     S3 = trig->patterntrig[2];
783     S2 = trig->patterntrig[3];
784     S12 = trig->patterntrig[4];
785     S11 = trig->patterntrig[5];
786 mocchiut 1.17 if ( trig->patterntrig[1] & (1<<0) ) tmptrigty = 1.;
787 mocchiut 1.1 if ( trig->patterntrig[0] ) tmptrigty = 2.;
788     if ( S3 || S2 || S12 || S11 ) tmptrigty = 0.;
789 mocchiut 1.17 if ( !(trig->patterntrig[1] & (1<<0)) && !trig->patterntrig[0] && !S3 && !S2 && !S12 && !S11 ) tmptrigty = 1.;
790 mocchiut 1.1 event->clevel2->trigty = tmptrigty;
791     //
792     // check if the calibration we are using is still good, if not load another calibration
793     //
794     sgnl = 0;
795 mocchiut 1.32 sgnl = event->ChkCalib(glt,atime);
796 mocchiut 1.1 if ( sgnl < 0 ){
797     code = sgnl;
798     goto closeandexit;
799     };
800     if ( sgnl == 100 ){
801     code = sgnl;
802     if ( verbose ) printf(" CALORIMETER - WARNING: data not associated to any calibration interval\n");
803     badevent++;
804     sgnl = 0;
805     };
806     //
807 mocchiut 1.11 // do we have at least one track from the tracker? this check has been disabled
808 mocchiut 1.1 //
809     event->clevel1->good2 = 1;
810 mocchiut 1.8 //
811 mocchiut 1.29 // use the whole calorimeter, 22 W planes
812     //
813     event->clevel1->npla = 22;
814     //
815     // Use the standard silicon planes shifting
816     //
817     event->clevel1->reverse = 0;
818     //
819 mocchiut 1.1 //
820 mocchiut 1.8 // Calibrate calorimeter event "re" and store output in the two structures that will be passed to fortran routine
821 mocchiut 1.1 //
822 mocchiut 1.11 event->Calibrate(re);
823 mocchiut 1.1 //
824     // Here we have calibrated data, ready to be passed to the FORTRAN routine which will extract topological variables.
825     //
826     //
827     // Calculate variables common to all tracks (qtot, nstrip, etc.)
828     //
829     event->GetCommonVar();
830     //
831     // Fill common variables
832     //
833 mocchiut 1.13 event->FillCommonVar(c1,ca);
834 mocchiut 1.1 //
835     // Calculate variables related to tracks only if we have at least one track (from selftrigger and/or tracker)
836     //
837     ntrkentry = 0;
838     //
839     filled = false;
840     //
841 mocchiut 1.11 // Run over tracks (tracker or calorimeter )
842     //
843     if ( withtrk ){
844     for(Int_t nt=0; nt < trk->ntrk(); nt++){
845     //
846     event->clevel1->good2 = 1;
847     //
848     TrkTrack *ptt = trk->GetStoredTrack(nt);
849     //
850     event->clevel1->trkchi2 = 0;
851     //
852     // Copy the alpha vector in the input structure
853     //
854     for (Int_t e = 0; e < 5 ; e++){
855     event->clevel1->al_p[e][0] = ptt->al[e];
856     };
857     //
858     // Get tracker related variables for this track
859     //
860     event->GetTrkVar();
861     //
862     // Save tracker track sequence number
863     //
864     event->trkseqno = nt;
865     //
866     // Copy values in the class ca from the structure clevel2
867     //
868     event->FillTrkVar(ca,ntrkentry);
869     ntrkentry++;
870     filled = true;
871     //
872     }; // loop on all the tracks
873     };
874     //
875     // 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
876     // fit of the track (to be used for example when TRK is off due to any reason like IPM3/5 off).
877     // here we make an event selection so it must be done very carefully...
878     //
879     // 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
880     //
881     if ( trackanyway && !filled && event->clevel2->npcfit[0] >= 2 && event->clevel2->npcfit[1] >= 2 && event->clevel2->good != 0 && event->clevel2->trigty < 2. ){
882     if ( debug ) printf(" Event with a track not fitted by the tracker at entry %i \n",itr);
883     //
884     // Disable "track mode" in the fortran routine
885     //
886     event->clevel1->good2 = 0;
887     event->clevel1->riginput = rigdefault;
888     if ( debug ) printf(" Using as default rigidity: %f \n",event->clevel1->riginput);
889     //
890     // We have a selftrigger event to analyze.
891     //
892     for (Int_t e = 0; e < 5 ; e++){
893     event->clevel1->al_p[e][0] = 0.;
894     event->clevel1->al_p[e][1] = 0.;
895     };
896     event->clevel1->trkchi2 = 0;
897     //
898     event->GetTrkVar();
899     //
900     // if we had no problem (clevel1->good2 = 0, NOTICE zero, not one in this mode!), fill and go on
901 mocchiut 1.1 //
902 mocchiut 1.11 if ( event->clevel1->good2 == 0 ) {
903 mocchiut 1.1 //
904 mocchiut 1.11 // In selftrigger mode the trkentry variable is set to -1
905 mocchiut 1.1 //
906 mocchiut 1.11 event->trkseqno = -3;
907 mocchiut 1.1 //
908 mocchiut 1.11 // Copy values in the class ca from the structure clevel2
909 mocchiut 1.1 //
910 mocchiut 1.11 event->FillTrkVar(ca,ntrkentry);
911     ntrkentry++;
912     filled = true;
913     //
914     } else {
915     if ( verbose ) printf(" Selftrigger: problems with event at entry %i \n",itr);
916     };
917     //
918     };
919     //
920     // Call high energy nuclei routine
921     //
922     if ( hZn && event->clevel2->trigty >= 2. ){
923     if ( debug ) printf(" Calling selftrigger high energy nuclei routine for entry %i \n",itr);
924     //
925     // Disable "track mode" in the fortran routine
926     //
927     event->clevel1->good2 = 0;
928     //
929     // Set high energy nuclei flag to one
930     //
931     event->clevel1->hzn = 1;
932     event->clevel1->riginput = rigdefault;
933     //
934     // We have a selftrigger event to analyze.
935     //
936     for (Int_t e = 0; e < 5 ; e++){
937     event->clevel1->al_p[e][0] = 0.;
938     event->clevel1->al_p[e][1] = 0.;
939 mocchiut 1.1 };
940 mocchiut 1.11 event->clevel1->trkchi2 = 0;
941     //
942     event->GetTrkVar();
943     //
944     // if we had no problem (clevel1->good2 = 0, NOTICE zero, not one in this mode!), fill and go on
945     //
946     if ( event->clevel1->good2 == 0 ) {
947     //
948     // In selftrigger mode the trkentry variable is set to -1
949     //
950     event->trkseqno = -2;
951     //
952     // Copy values in the class ca from the structure clevel2
953 mocchiut 1.1 //
954 mocchiut 1.11 event->FillTrkVar(ca,ntrkentry);
955     ntrkentry++;
956     filled = true;
957 mocchiut 1.1 //
958 mocchiut 1.11 } else {
959     if ( verbose ) printf(" Selftrigger: problems with event at entry %i \n",itr);
960     };
961     //
962     };
963     //
964     // self trigger event
965     //
966     if ( st && event->clevel2->trigty >= 2. ){
967     if ( verbose ) printf(" Selftrigger event at entry %i \n",itr);
968     //
969     // Disable "track mode" in the fortran routine
970     //
971     event->clevel1->good2 = 0;
972     //
973     // disable high enery nuclei flag;
974     //
975     event->clevel1->hzn = 0;
976     //
977     // We have a selftrigger event to analyze.
978     //
979     for (Int_t e = 0; e < 5 ; e++){
980     event->clevel1->al_p[e][0] = 0.;
981     event->clevel1->al_p[e][1] = 0.;
982     };
983     event->clevel1->trkchi2 = 0;
984     //
985     event->GetTrkVar();
986     //
987     // if we had no problem (clevel2->good = 0, NOTICE zero, not one in selftrigger mode!), fill and go on
988     //
989     if ( event->clevel1->good2 == 0 ) {
990 mocchiut 1.1 //
991 mocchiut 1.11 // In selftrigger mode the trkentry variable is set to -1
992 mocchiut 1.1 //
993 mocchiut 1.11 event->trkseqno = -1;
994 mocchiut 1.1 //
995 mocchiut 1.11 // Copy values in the class ca from the structure clevel2
996 mocchiut 1.1 //
997 mocchiut 1.11 event->FillTrkVar(ca,ntrkentry);
998     ntrkentry++;
999     filled = true;
1000 mocchiut 1.1 //
1001 mocchiut 1.11 } else {
1002     if ( verbose ) printf(" Selftrigger: problems with event at entry %i \n",itr);
1003 mocchiut 1.1 };
1004     };
1005     //
1006     if ( !filled ) badevent++;
1007     //
1008     // Clear structures used to communicate with fortran
1009     //
1010     event->ClearStructs();
1011     //
1012     // Fill the rootple
1013     //
1014     calo->Fill();
1015     //
1016 mocchiut 1.6 // delete ca;
1017 mocchiut 1.1 //
1018     jumpev:
1019 mocchiut 1.23 if ( !debug ) debug = false;
1020 mocchiut 1.1 //
1021     };
1022     //
1023     if ( verbose ) printf("\n SUMMARY:\n");
1024     if ( verbose ) printf(" Total number of events: %i \n",totevent);
1025     if ( verbose ) printf(" Events with at least one track: %i \n",totevent-badevent);
1026     if ( verbose ) printf(" Events without tracks: %i \n",badevent);
1027     //
1028     if ( badevent == totevent ){
1029 mocchiut 1.8 if ( verbose ) printf("\n CALORIMETER - WARNING no tracks or good events in run %u \n",idRun);
1030 mocchiut 1.1 code = 101;
1031     };
1032     //
1033 mocchiut 1.8 delete dbtime;
1034 mocchiut 1.1 //
1035     // Clear variables before processing another run (needed to have always the same result when reprocessing data with the same software).
1036     //
1037     event->RunClose();
1038     if ( l0File ) l0File->Close();
1039     //
1040     }; // process all the runs
1041     //
1042     if ( verbose ) printf("\n Finished processing data \n");
1043     //
1044     closeandexit:
1045     //
1046     if ( !reprocall && reproc && code >= 0 ){
1047     if ( totfileentries > noaftrun ){
1048     if ( verbose ) printf("\n Post-processing: copying events from the old tree after the processed run\n");
1049 mocchiut 1.8 if ( verbose ) printf(" Copying %u events in the file which are after the end of the run %u \n",(totfileentries-noaftrun),run);
1050     if ( verbose ) printf(" Start copying at event number %u end copying at event number %u \n",noaftrun,totfileentries);
1051 mocchiut 1.1 for (UInt_t j = noaftrun; j < totfileentries; j++ ){
1052     //
1053     // Get entry from old tree
1054     //
1055     caloclone->GetEntry(j);
1056     //
1057     // copy caclone to ca
1058     //
1059 mocchiut 1.13 if ( getl1 ) c1->Clear();
1060 mocchiut 1.6 ca->Clear();
1061 mocchiut 1.8 //
1062 mocchiut 1.13 if ( getl1 ) memcpy(&c1,&c1clone,sizeof(c1clone));
1063 mocchiut 1.1 memcpy(&ca,&caclone,sizeof(caclone));
1064     //
1065     // Fill entry in the new tree
1066     //
1067     calo->Fill();
1068     //
1069     };
1070     if ( verbose ) printf(" Finished successful copying!\n");
1071     };
1072     };
1073     //
1074     // Case of no errors: close files, delete old tree(s), write and close level2 file
1075     //
1076     if ( l0File ) l0File->Close();
1077     if ( tempfile ) tempfile->Close();
1078 mocchiut 1.30 if ( myfold ) gSystem->Unlink(tempname.str().c_str());
1079 mocchiut 1.1 if ( tracker ) tracker->Delete();
1080     //
1081     if ( code < 0 ) printf("\n CALORIMETER - ERROR: an error occurred, try to save anyway...\n");
1082     if ( verbose ) printf("\n Writing and closing rootple\n");
1083     if ( runinfo ) runinfo->Close();
1084     if ( calo ) calo->SetName("Calorimeter");
1085     if ( file ){
1086     file->cd();
1087     file->Write();
1088     };
1089     if ( calo ) calo->Delete();
1090     //
1091 mocchiut 1.30 if ( myfold ) gSystem->Unlink(calofolder.str().c_str());
1092 mocchiut 1.1 //
1093 mocchiut 1.7 if ( ca ) delete ca;
1094     if ( caclone ) delete caclone;
1095 mocchiut 1.13 if ( c1 ) delete c1;
1096     if ( c1clone ) delete c1clone;
1097 mocchiut 1.7 if ( trk ) delete trk;
1098     if ( q4 ) delete q4;
1099     if ( glroot ) delete glroot;
1100     if ( runinfo ) delete runinfo;
1101     //
1102 mocchiut 1.1 // the end
1103     //
1104     if ( verbose ) printf("\n Exiting...\n");
1105     if ( code < 0 ) throw code;
1106     return(code);
1107     }
1108    
1109    
1110    

  ViewVC Help
Powered by ViewVC 1.1.23