/[PAMELA software]/PamelaLevel2/src/PamLevel2.cpp
ViewVC logotype

Contents of /PamelaLevel2/src/PamLevel2.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.79 - (show annotations) (download)
Wed Mar 18 09:02:01 2009 UTC (15 years, 11 months ago) by pam-fi
Branch: MAIN
Changes since 1.78: +22 -17 lines
bug fixed

1 #include <PamLevel2.h>
2
3
4
5 /////////////////////////////////////////////////////////////////////////////
6 /////////////////////////////////////////////////////////////////////////////
7 /////////////////////////////////////////////////////////////////////////////
8 /////////////////////////////////////////////////////////////////////////////
9
10 void GPamela::Clear(){
11 Irun = 0;
12 Ievnt = 0;
13 Ipa = 0;
14 X0 = 0.;
15 Y0 = 0.;
16 Z0 = 0.;
17 Theta = 0.;
18 Phi = 0.;
19 P0 = 0.;
20 Nthtof = 0;
21 Nthcat = 0;
22 Nthcas = 0;
23 Nthspe = 0;
24 Nstrpx = 0;
25 Nstrpy = 0;
26 Nthcali = 0;
27 Nthcal = 0;
28 Nthnd = 0;
29 Nthcard = 0;
30 }
31
32 void GPamela::Delete(){
33
34 Clear();
35
36 delete [] Ipltof;
37 delete [] Ipaddle;
38 delete [] Ipartof;
39 delete [] Xintof;
40 delete [] Yintof;
41 delete [] Zintof;
42 delete [] Xouttof;
43 delete [] Youttof;
44 delete [] Zouttof;
45 delete [] Ereltof;
46 delete [] Timetof;
47 delete [] Pathtof;
48 delete [] P0tof;
49 delete [] Iparcat;
50 delete [] Icat;
51 delete [] Xincat;
52 delete [] Yincat;
53 delete [] Zincat;
54 delete [] Xoutcat;
55 delete [] Youtcat;
56 delete [] Zoutcat;
57 delete [] Erelcat;
58 delete [] Timecat;
59 delete [] Pathcat;
60 delete [] P0cat;
61 delete [] Iparcas;
62 delete [] Icas;
63 delete [] Xincas;
64 delete [] Yincas;
65 delete [] Zincas;
66 delete [] Xoutcas;
67 delete [] Youtcas;
68 delete [] Zoutcas;
69 delete [] Erelcas;
70 delete [] Timecas;
71 delete [] Pathcas;
72 delete [] P0cas;
73 delete [] Iparspe;
74 delete [] Itrpb;
75 delete [] Itrsl;
76 delete [] Itspa;
77 delete [] Xinspe;
78 delete [] Yinspe;
79 delete [] Zinspe;
80 delete [] Xoutspe;
81 delete [] Youtspe;
82 delete [] Zoutspe;
83 delete [] Xavspe;
84 delete [] Yavspe;
85 delete [] Zavspe;
86 delete [] Erelspe;
87 delete [] Pathspe;
88 delete [] P0spe;
89 delete [] Nxmult;
90 delete [] Nymult;
91 delete [] Npstripx;
92 delete [] Ntstripx;
93 delete [] Istripx;
94 delete [] Qstripx;
95 delete [] Xstripx;
96 delete [] Npstripy;
97 delete [] Ntstripy;
98 delete [] Istripy;
99 delete [] Qstripy;
100 delete [] Ystripy;
101 delete [] Icaplane;
102 delete [] Icastrip;
103 delete [] Icamod;
104 delete [] Enestrip;
105 delete [] Icapl;
106 delete [] Icasi;
107 delete [] Icast;
108 delete [] Xincal;
109 delete [] Yincal;
110 delete [] Zincal;
111 delete [] Erelcal;
112 delete [] Itubend;
113 delete [] Iparnd;
114 delete [] Xinnd;
115 delete [] Yinnd;
116 delete [] Zinnd;
117 delete [] Xoutnd;
118 delete [] Youtnd;
119 delete [] Zoutnd;
120 delete [] Erelnd;
121 delete [] Timend;
122 delete [] Pathnd;
123 delete [] P0nd;
124 delete [] Iparcard;
125 delete [] Icard;
126 delete [] Xincard;
127 delete [] Yincard;
128 delete [] Zincard;
129 delete [] Xoutcard;
130 delete [] Youtcard;
131 delete [] Zoutcard;
132 delete [] Erelcard;
133 delete [] Timecard;
134 delete [] Pathcard;
135 delete [] P0card;
136
137
138 };
139
140
141
142 void GPamela::SetBranchAddress( TChain* fhBookTree ){
143
144 // cout << "fhBookTree "<<fhBookTree << endl;
145 // prepare tree
146 fhBookTree->SetBranchAddress("Irun",&Irun);
147 fhBookTree->SetBranchAddress("Ievnt",&Ievnt);
148 fhBookTree->SetBranchAddress("Ipa",&Ipa);
149 fhBookTree->SetBranchAddress("X0",&X0);
150 fhBookTree->SetBranchAddress("Y0",&Y0);
151 fhBookTree->SetBranchAddress("Z0",&Z0);
152 fhBookTree->SetBranchAddress("Theta",&Theta);
153 fhBookTree->SetBranchAddress("Phi",&Phi);
154 fhBookTree->SetBranchAddress("P0",&P0);
155 fhBookTree->SetBranchAddress("Nthtof",&Nthtof);
156 fhBookTree->SetBranchAddress("Ipltof",Ipltof);
157 fhBookTree->SetBranchAddress("Ipaddle",Ipaddle);
158 fhBookTree->SetBranchAddress("Ipartof",Ipartof);
159 fhBookTree->SetBranchAddress("Xintof",Xintof);
160 fhBookTree->SetBranchAddress("Yintof",Yintof);
161 fhBookTree->SetBranchAddress("Zintof",Zintof);
162 fhBookTree->SetBranchAddress("Xouttof",Xouttof);
163 fhBookTree->SetBranchAddress("Youttof",Youttof);
164 fhBookTree->SetBranchAddress("Zouttof",Zouttof);
165 fhBookTree->SetBranchAddress("Ereltof",Ereltof);
166 fhBookTree->SetBranchAddress("Timetof",Timetof);
167 fhBookTree->SetBranchAddress("Pathtof",Pathtof);
168 fhBookTree->SetBranchAddress("P0tof",P0tof);
169 fhBookTree->SetBranchAddress("Nthcat",&Nthcat);
170 fhBookTree->SetBranchAddress("Iparcat",Iparcat);
171 fhBookTree->SetBranchAddress("Icat",Icat);
172 fhBookTree->SetBranchAddress("Xincat",Xincat);
173 fhBookTree->SetBranchAddress("Yincat",Yincat);
174 fhBookTree->SetBranchAddress("Zincat",Zincat);
175 fhBookTree->SetBranchAddress("Xoutcat",Xoutcat);
176 fhBookTree->SetBranchAddress("Youtcat",Youtcat);
177 fhBookTree->SetBranchAddress("Zoutcat",Zoutcat);
178 fhBookTree->SetBranchAddress("Erelcat",Erelcat);
179 fhBookTree->SetBranchAddress("Timecat",Timecat);
180 fhBookTree->SetBranchAddress("Pathcat",Pathcat);
181 fhBookTree->SetBranchAddress("P0cat",P0cat);
182 fhBookTree->SetBranchAddress("Nthcas",&Nthcas);
183 fhBookTree->SetBranchAddress("Iparcas",Iparcas);
184 fhBookTree->SetBranchAddress("Icas",Icas);
185 fhBookTree->SetBranchAddress("Xincas",Xincas);
186 fhBookTree->SetBranchAddress("Yincas",Yincas);
187 fhBookTree->SetBranchAddress("Zincas",Zincas);
188 fhBookTree->SetBranchAddress("Xoutcas",Xoutcas);
189 fhBookTree->SetBranchAddress("Youtcas",Youtcas);
190 fhBookTree->SetBranchAddress("Zoutcas",Zoutcas);
191 fhBookTree->SetBranchAddress("Erelcas",Erelcas);
192 fhBookTree->SetBranchAddress("Timecas",Timecas);
193 fhBookTree->SetBranchAddress("Pathcas",Pathcas);
194 fhBookTree->SetBranchAddress("P0cas",P0cas);
195 fhBookTree->SetBranchAddress("Nthspe",&Nthspe);
196 fhBookTree->SetBranchAddress("Iparspe",Iparspe);
197 fhBookTree->SetBranchAddress("Itrpb",Itrpb);
198 fhBookTree->SetBranchAddress("Itrsl",Itrsl);
199 fhBookTree->SetBranchAddress("Itspa",Itspa);
200 fhBookTree->SetBranchAddress("Xinspe",Xinspe);
201 fhBookTree->SetBranchAddress("Yinspe",Yinspe);
202 fhBookTree->SetBranchAddress("Zinspe",Zinspe);
203 fhBookTree->SetBranchAddress("Xoutspe",Xoutspe);
204 fhBookTree->SetBranchAddress("Youtspe",Youtspe);
205 fhBookTree->SetBranchAddress("Zoutspe",Zoutspe);
206 fhBookTree->SetBranchAddress("Xavspe",Xavspe);
207 fhBookTree->SetBranchAddress("Yavspe",Yavspe);
208 fhBookTree->SetBranchAddress("Zavspe",Zavspe);
209 fhBookTree->SetBranchAddress("Erelspe",Erelspe);
210 fhBookTree->SetBranchAddress("Pathspe",Pathspe);
211 fhBookTree->SetBranchAddress("P0spe",P0spe);
212 fhBookTree->SetBranchAddress("Nxmult",Nxmult);
213 fhBookTree->SetBranchAddress("Nymult",Nymult);
214 fhBookTree->SetBranchAddress("Nstrpx",&Nstrpx);
215 fhBookTree->SetBranchAddress("Npstripx",Npstripx);
216 fhBookTree->SetBranchAddress("Ntstripx",Ntstripx);
217 fhBookTree->SetBranchAddress("Istripx",Istripx);
218 fhBookTree->SetBranchAddress("Qstripx",Qstripx);
219 fhBookTree->SetBranchAddress("Xstripx",Xstripx);
220 fhBookTree->SetBranchAddress("Nstrpy",&Nstrpy);
221 fhBookTree->SetBranchAddress("Npstripy",Npstripy);
222 fhBookTree->SetBranchAddress("Ntstripy",Ntstripy);
223 fhBookTree->SetBranchAddress("Istripy",Istripy);
224 fhBookTree->SetBranchAddress("Qstripy",Qstripy);
225 fhBookTree->SetBranchAddress("Ystripy",Ystripy);
226 fhBookTree->SetBranchAddress("Nthcali",&Nthcali);
227 fhBookTree->SetBranchAddress("Icaplane",Icaplane);
228 fhBookTree->SetBranchAddress("Icastrip",Icastrip);
229 fhBookTree->SetBranchAddress("Icamod",Icamod);
230 fhBookTree->SetBranchAddress("Enestrip",Enestrip);
231 fhBookTree->SetBranchAddress("Nthcal",&Nthcal);
232 fhBookTree->SetBranchAddress("Icapl",Icapl);
233 fhBookTree->SetBranchAddress("Icasi",Icasi);
234 fhBookTree->SetBranchAddress("Icast",Icast);
235 fhBookTree->SetBranchAddress("Xincal",Xincal);
236 fhBookTree->SetBranchAddress("Yincal",Yincal);
237 fhBookTree->SetBranchAddress("Zincal",Zincal);
238 fhBookTree->SetBranchAddress("Erelcal",Erelcal);
239 fhBookTree->SetBranchAddress("Nthnd",&Nthnd);
240 fhBookTree->SetBranchAddress("Itubend",Itubend);
241 fhBookTree->SetBranchAddress("Iparnd",Iparnd);
242 fhBookTree->SetBranchAddress("Xinnd",Xinnd);
243 fhBookTree->SetBranchAddress("Yinnd",Yinnd);
244 fhBookTree->SetBranchAddress("Zinnd",Zinnd);
245 fhBookTree->SetBranchAddress("Xoutnd",Xoutnd);
246 fhBookTree->SetBranchAddress("Youtnd",Youtnd);
247 fhBookTree->SetBranchAddress("Zoutnd",Zoutnd);
248 fhBookTree->SetBranchAddress("Erelnd",Erelnd);
249 fhBookTree->SetBranchAddress("Timend",Timend);
250 fhBookTree->SetBranchAddress("Pathnd",Pathnd);
251 fhBookTree->SetBranchAddress("P0nd",P0nd);
252 fhBookTree->SetBranchAddress("Nthcard",&Nthcard);
253 fhBookTree->SetBranchAddress("Iparcard",Iparcard);
254 fhBookTree->SetBranchAddress("Icard",Icard);
255 fhBookTree->SetBranchAddress("Xincard",Xincard);
256 fhBookTree->SetBranchAddress("Yincard",Yincard);
257 fhBookTree->SetBranchAddress("Zincard",Zincard);
258 fhBookTree->SetBranchAddress("Xoutcard",Xoutcard);
259 fhBookTree->SetBranchAddress("Youtcard",Youtcard);
260 fhBookTree->SetBranchAddress("Zoutcard",Zoutcard);
261 fhBookTree->SetBranchAddress("Erelcard",Erelcard);
262 fhBookTree->SetBranchAddress("Timecard",Timecard);
263 fhBookTree->SetBranchAddress("Pathcard",Pathcard);
264 fhBookTree->SetBranchAddress("P0card",P0card);
265
266 // fhBookTree->SetBranchStatus("*",0);
267
268 }
269
270 ClassImp(GPamela);
271
272 /////////////////////////////////////////////////////////////////////////////
273 /////////////////////////////////////////////////////////////////////////////
274 /////////////////////////////////////////////////////////////////////////////
275 /////////////////////////////////////////////////////////////////////////////
276 //--------------------------------------
277 //
278 //
279 //--------------------------------------
280 /**
281 * Default constructor
282 */
283 PamTrack::PamTrack(){
284 trk_track = 0;
285 calo_track = 0;
286 tof_track = 0;
287 orb_track = 0;
288 candeleteobj = 0;
289 pscore = 0;
290 iscore = 0;
291 };
292 //--------------------------------------
293 //
294 //
295 //--------------------------------------
296 /**
297 * Constructor
298 */
299 PamTrack::PamTrack(TrkTrack* t, CaloTrkVar* c, ToFTrkVar* o, OrbitalInfoTrkVar *r){
300
301 trk_track = 0;
302 calo_track = 0;
303 tof_track = 0;
304 orb_track = 0;
305 // if(t)trk_track = new TrkTrack(*t);
306 // if(c)calo_track = new CaloTrkVar(*c);
307 // if(o)tof_track = new ToFTrkVar(*o);
308 if(t)trk_track = t;
309 if(c)calo_track = c;
310 if(o)tof_track = o;
311 if(r) orb_track = r;
312
313 candeleteobj = 0;
314
315 };
316 PamTrack::PamTrack(const PamTrack& track){
317
318 TrkTrack *t = track.trk_track;
319 CaloTrkVar *c = track.calo_track;
320 ToFTrkVar *o = track.tof_track;
321 OrbitalInfoTrkVar *r = track.orb_track;
322
323 trk_track = 0;
324 calo_track = 0;
325 tof_track = 0;
326 orb_track = 0;
327 if(t)trk_track = new TrkTrack(*t);
328 if(c)calo_track = new CaloTrkVar(*c);
329 if(o)tof_track = new ToFTrkVar(*o);
330 if(r)orb_track = new OrbitalInfoTrkVar(*r);
331 candeleteobj = 1;
332
333 }
334 void PamTrack::Clear(){
335
336 // cout << "PamTrack::Clear() "<<candeleteobj<<endl;
337 if(candeleteobj){
338 if(trk_track) trk_track->TrkTrack::Clear();
339 if(calo_track) calo_track->CaloTrkVar::Clear();//???
340 if(tof_track) tof_track->ToFTrkVar::Clear();//???
341 if(orb_track) orb_track->OrbitalInfoTrkVar::Clear();//???
342 }else{
343 trk_track = 0;
344 calo_track = 0;
345 tof_track = 0;
346 orb_track = 0;
347 }
348 pscore = 0;
349 iscore = 0;
350
351 }
352 void PamTrack::Delete(){
353 // cout << "PamTrack::Delete() "<<candeleteobj<<endl;
354 if(candeleteobj){
355 if(trk_track) {
356 trk_track->TrkTrack::Clear();
357 delete trk_track;
358 }
359 if(calo_track){
360 calo_track->CaloTrkVar::Clear();//???
361 delete calo_track;
362 }
363 if(tof_track){
364 tof_track->ToFTrkVar::Clear();//???
365 delete tof_track;
366 }
367 if(orb_track){
368 orb_track->OrbitalInfoTrkVar::Clear();//???
369 delete orb_track;
370 }
371 }else{
372 Clear();
373 }
374 }
375 //--------------------------------------
376 //
377 //
378 //--------------------------------------
379 /**
380 * Default Constructor
381 */
382 PamLevel2::PamLevel2(){
383 Initialize();
384 };
385
386 /**
387 * Constructor
388 * @param ddir Name of directory where level2 files are stored.
389 * @param list Name of an ascii file containing the list of file names
390 * @param detlist Options to chose what to load.
391 * Possible options are:
392 * +AUTO --> load all trees/branches in the input files
393 * +(-)ALL --> inlcude(exclude) all trees/branches
394 * +(-)TRK1+(-)TRK2+(-)CAL1+(-)CAL2+(-)TOF+(-)TRG+(-)ND+(-)S4+(-)ORB+(-)AC --> inlcude(exclude) trees and branches
395 * +(-)TRK0 --> include(exclude) tracker level0 tree
396 * +(-)GP --> include exclude GPAMELA output tree
397 * If no options are specified, the default is assumed. Default is:
398 * +TRK2+CAL2+CAL1+TOF+TRG+ND+AC+S4+ORB
399 */
400 PamLevel2::PamLevel2(TString ddir,TString llist,TString detlist){
401 Initialize();
402 TList* listf = GetListOfLevel2Files(ddir,llist);
403 if(listf)GetPamTree(listf,detlist);
404 if(listf)GetRunTree(listf);
405 };
406
407 PamLevel2::PamLevel2(TString ddir,TList *llist,TString detlist){
408 Initialize();
409 GetPamTree(llist,detlist);
410 GetRunTree(llist);
411 };
412 /**
413 * Constructor
414 * @param ddir Name of directory where level2 files are stored.
415 * @param list Name of an ascii file containing the list of file names
416 * Default trees/branches are loaded. Default is:
417 * +TRK2+CAL2+CAL1+TOF+TRG+ND+AC+S4+ORB
418 */
419 PamLevel2::PamLevel2(TString ddir,TString llist){
420 Initialize();
421 TList* listf = GetListOfLevel2Files(ddir,llist);
422 GetPamTree(listf,"");
423 GetRunTree(listf);
424 };
425
426
427 void PamLevel2::Initialize(){
428
429 h0_obj = 0;
430 trk0_obj = 0;
431 calo0_obj = 0;
432
433 trk2_obj = 0;
434 trk1_obj = 0;
435 trkh_obj = 0;
436 calo1_obj = 0;
437 calo2_obj = 0;
438 tof_obj = 0;
439 trig_obj = 0;
440 s4_obj = 0;
441 nd_obj = 0;
442 ac_obj = 0;
443 orb_obj = 0;
444 gp_obj = 0;
445
446 run_obj = 0;//new GL_RUN();
447 soft_obj = 0;// Emiliano
448 irun = -1LL;
449 irunt = -1LL;
450 runfirstentry = 0LL;
451 runlastentry = 0LL;
452 gltsync = 0; // Emiliano
453
454 l0_file = NULL;
455 l0_tree = NULL;
456 iroot = -1;
457 dbc = 0;
458
459 prevshift = 0;
460 maxshift = 10; //EMILIANO
461
462 run_tree = NULL;
463 run_tree_clone = NULL;
464 sel_tree = NULL;
465 sel_tree_clone = NULL;
466
467 irunentry = -1LL;
468 pam_tree = NULL;
469 for(Int_t i=0; i<NCLONES; i++ )pam_tree_clone[i]=NULL;
470
471 totdltime[0] = 0LL;
472 totdltime[1] = 0LL;
473 totdltime[2] = 0LL;
474
475 host = "mysql://localhost/pamelaprod";
476 user = "anonymous";
477 psw = "";
478 const char *pamdbhost=gSystem->Getenv("PAM_DBHOST");
479 const char *pamdbuser=gSystem->Getenv("PAM_DBUSER");
480 const char *pamdbpsw=gSystem->Getenv("PAM_DBPSW");
481 if ( !pamdbhost ) pamdbhost = "";
482 if ( !pamdbuser ) pamdbuser = "";
483 if ( !pamdbpsw ) pamdbpsw = "";
484 if ( strcmp(pamdbhost,"") ) host = pamdbhost;
485 if ( strcmp(pamdbuser,"") ) user = pamdbuser;
486 if ( strcmp(pamdbpsw,"") ) psw = pamdbpsw;
487
488
489
490 // sorted_tracks = 0;//new TRefArray();
491
492 CAL0 = false;
493 CAL1 = true;
494 CAL2 = true;
495 TRK2 = true;
496 TRK1 = false;
497 TRK0 = false;
498 TRKh = false;
499 TRG = true;
500 TOF = true;
501 TOF0 = false;
502 S4 = true;
503 ND = true;
504 AC = true;
505 ORB = true;
506 GP = false;
507
508 RUN = true;
509
510 SELLI = -1;
511
512 ISGP = false;
513
514 DBG = false;
515
516 tsorted=0;
517 timage=0;
518
519 howtosort = "+CAL+TOF";
520 //howtosort = "+TOF";
521 sortthr = 100.;
522
523 };
524 /**
525 * Delete the event (act as Dtor)
526 */
527 void PamLevel2::Delete(){
528
529 if(run_obj)delete run_obj;
530 if(soft_obj)delete soft_obj; //Emiliano
531
532 // cout << "void PamLevel2::Clear()"<<endl;
533 if(h0_obj) delete h0_obj;
534 if(trk0_obj) delete trk0_obj;
535 if(calo0_obj) delete calo0_obj;
536 if(trk1_obj) delete trk1_obj;
537 if(trk2_obj) delete trk2_obj;
538 if(trkh_obj) delete trkh_obj;
539 if(calo1_obj)delete calo1_obj;
540 if(calo2_obj)delete calo2_obj;
541 if(tof_obj) delete tof_obj;
542 if(trig_obj) delete trig_obj;
543 if(s4_obj) delete s4_obj;
544 if(nd_obj) delete nd_obj;
545 if(ac_obj) delete ac_obj;
546 if(orb_obj) delete orb_obj;
547 if(gp_obj) delete gp_obj;
548
549 if(tsorted){
550 tsorted->Delete();
551 delete tsorted;
552 }
553 if(timage){
554 timage->Delete();
555 delete timage;
556 }
557
558 if(dbc){
559 dbc->Close();
560 delete dbc;
561 }
562
563 if ( gltsync ) delete gltsync;
564
565 if(l0_file)l0_file->Close();
566 // if(pam_tree)pam_tree->Delete();;
567
568 if ( pam_tree ){
569 //
570 // we have first to find which chains we have to delete, then delete the main chain and only after delete the friend chains. Any other order causes a segfault...
571 //
572 TList *temp = pam_tree->GetListOfFriends();
573 TList *contents = new TList; // create chain friend list
574 contents->SetOwner();
575 TIter next(temp);
576 TChain *questo = 0;
577 while ( (questo = (TChain*) next()) ){
578 TString name = questo->GetName();
579 contents->Add((TChain*)gROOT->FindObject(name.Data()));// add object to the list
580 };
581 //
582 // deleting the main chain
583 //
584 pam_tree->Delete();
585 //
586 // deleting the friends...
587 //
588 TIter next2(contents);
589 TChain *questa = 0;
590 while ( questa = (TChain*)next2() ){
591 TString name = questa->GetName();
592 questa->Delete();
593 questa=NULL;
594 };
595 //
596 };
597 pam_tree = NULL;
598
599 if(run_tree)run_tree->Delete();;
600 if(sel_tree)sel_tree->Delete();;
601 for(Int_t i=0; i<NCLONES; i++ )if(pam_tree_clone[i])pam_tree_clone[i]->Delete();;
602 if(run_tree_clone)run_tree_clone->Delete();;
603 if(sel_tree_clone)sel_tree_clone->Delete();;
604
605 if(irunoffset) delete [] irunoffset;
606
607 };
608
609 /**
610 * Clear the event (NB! does not deallocate objects)
611 */
612 void PamLevel2::Clear(){
613
614 // cout << "void PamLevel2::Clear()"<<endl;
615
616 //
617 // This method is called once for every entry but RunInfo and SoftInfo do not change until the next run so we cannot clear them here unless we don't
618 // want to load them for each event even if they are the same...
619 //
620 // if(run_obj)delete run_obj;
621 // if(run_obj) run_obj->Clear(); // Emiliano: Do not deallocate run_obj here, it will give segmentation fault! call clear instead
622 // if(soft_obj) soft_obj->Clear();
623
624 if(h0_obj) h0_obj->Clear();
625 // if(trk0_obj) trk0_obj->Clear();
626 if(trk1_obj) trk1_obj->Clear();
627 if(trk2_obj) trk2_obj->Clear();
628 if(trkh_obj) trkh_obj->Clear();
629 if(calo0_obj) calo0_obj->Clear();
630 if(calo1_obj)calo1_obj->Clear();
631 if(calo2_obj)calo2_obj->Clear();
632 if(tof_obj) tof_obj->Clear();
633 if(trig_obj) trig_obj->Clear();
634 if(s4_obj) s4_obj->Clear();
635 if(nd_obj) nd_obj->Clear();
636 if(ac_obj) ac_obj->Clear();
637 if(orb_obj) orb_obj->Clear();
638 if(gp_obj) gp_obj->Clear();
639
640 // if(sorted_tracks)sorted_tracks->Clear();
641 // sorted_tracks.Clear();
642
643 if(tsorted){
644 tsorted->Delete();
645 }
646 if(timage){
647 timage->Delete();
648 }
649 };
650
651 void PamLevel2::Reset(){
652 //
653 // First of all clear everything
654 //
655 Clear();
656 //
657 // close and reset chains and pointers
658 //
659 if ( pam_tree ){
660 //
661 // we have first to find which chains we have to delete, then delete the main chain and only after delete the friend chains. Any other order causes a segfault...
662 //
663 TList *temp = pam_tree->GetListOfFriends();
664 TList *contents = new TList; // create chain friend list
665 contents->SetOwner();
666 TIter next(temp);
667 TChain *questo = 0;
668 while ( (questo = (TChain*) next()) ){
669 TString name = questo->GetName();
670 contents->Add((TChain*)gROOT->FindObject(name.Data()));// add object to the list
671 };
672 //
673 // deleting the main chain
674 //
675 pam_tree->Delete();
676 //
677 // deleting the friends...
678 //
679 TIter next2(contents);
680 TChain *questa = 0;
681 while ( questa = (TChain*)next2() ){
682 TString name = questa->GetName();
683 questa->Delete();
684 questa=NULL;
685 };
686 //
687 };
688 pam_tree = NULL;
689 //
690 if(run_tree)run_tree->Delete();;
691 run_tree = NULL;
692 if(sel_tree)sel_tree->Delete();;
693 sel_tree = NULL;
694 //
695 // Close file
696 //
697 if(l0_file)l0_file->Close("R");
698 l0_file = NULL;
699 //
700 h0_obj = 0;
701 trk0_obj = 0;
702 calo0_obj = 0;
703 //
704 trk2_obj = 0;
705 trk1_obj = 0;
706 trkh_obj = 0;
707 calo1_obj = 0;
708 calo2_obj = 0;
709 tof_obj = 0;
710 trig_obj = 0;
711 s4_obj = 0;
712 nd_obj = 0;
713 ac_obj = 0;
714 orb_obj = 0;
715 gp_obj = 0;
716 //
717 // Reset run pointers
718 //
719 run_obj = 0;//new GL_RUN();
720 soft_obj = 0;// Emiliano
721 irun = -1;
722 irunt = -1;
723 runfirstentry = 0ULL;
724 runlastentry = 0ULL;
725 //
726 totdltime[0] = 0LL;
727 totdltime[1] = 0LL;
728 totdltime[2] = 0LL;
729 //
730 };
731
732 Bool_t PamLevel2::IsGood(Bool_t strict){
733 Bool_t goodev=true;
734 //
735 if(calo2_obj && !calo2_obj->IsGood(strict) ) goodev = false;
736 //
737 if ( strict ){
738 if(trk2_obj && trk2_obj->UnpackError() != 0 ) goodev = false;
739 if(tof_obj && tof_obj->unpackError != 0) goodev = false;
740 if(trig_obj && trig_obj->unpackError != 0) goodev = false;
741 if(s4_obj && s4_obj->unpackError != 0) goodev = false;
742 if(nd_obj && nd_obj->unpackError != 0) goodev = false;
743 if(ac_obj && (ac_obj->unpackError != 0 || ((ac_obj->status[0]>>2)&1) || ((ac_obj->status[1]>>2)&1)) ) goodev = false;
744 // if(orb_obj)
745 } else {
746 if(nd_obj && nd_obj->unpackError != 0) goodev = false;
747 if(ac_obj && (ac_obj->unpackError != 0 || ((ac_obj->status[0]>>2)&1) || ((ac_obj->status[1]>>2)&1)) ) goodev = false;
748 };
749 return(goodev);
750 };
751
752 //--------------------------------------
753 //
754 //
755 //--------------------------------------
756 void *PamLevel2::GetPointerTo(const char* c ){
757
758 TString objname = c;
759
760 if(!objname.CompareTo("TrkLevel1")) {
761 if(!trk1_obj){
762 trk1_obj = new TrkLevel1();
763 trk1_obj->Set();
764 }
765 return &trk1_obj;
766 };
767 if(!objname.CompareTo("TrkLevel2")) {
768 if(!trk2_obj){
769 trk2_obj = new TrkLevel2();
770 trk2_obj->Set();
771 }
772 return &trk2_obj;
773 };
774 if(!objname.CompareTo("TrkHough")) {
775 if(!trkh_obj) {
776 trkh_obj = new TrkHough();
777 trkh_obj->Set();
778 }
779 return &trkh_obj;
780 };
781 if(!objname.CompareTo("CaloLevel1")) {
782 if(!calo1_obj) calo1_obj = new CaloLevel1();
783 return &calo1_obj;
784 };
785 if(!objname.CompareTo("CaloLevel2")) {
786 if(!calo2_obj){
787 calo2_obj = new CaloLevel2();
788 calo2_obj->Set();
789 };
790 return &calo2_obj;
791 };
792 if(!objname.CompareTo("ToFLevel2")) {
793 if(!tof_obj){
794 tof_obj = new ToFLevel2();
795 tof_obj->Set();
796 }
797 return &tof_obj;
798 };
799 if(!objname.CompareTo("TrigLevel2")) {
800 if(!trig_obj) trig_obj = new TrigLevel2();
801 return &trig_obj;
802 };
803 if(!objname.CompareTo("S4Level2")) {
804 if(!s4_obj) s4_obj = new S4Level2();
805 return &s4_obj;
806 };
807 if(!objname.CompareTo("NDLevel2")) {
808 if(!nd_obj) nd_obj = new NDLevel2();
809 return &nd_obj;
810 };
811 if(!objname.CompareTo("AcLevel2")) {
812 if(!ac_obj) ac_obj = new AcLevel2();
813 return &ac_obj;
814 };
815 if(!objname.CompareTo("OrbitalInfo")) {
816 if(!orb_obj){
817 orb_obj = new OrbitalInfo();
818 orb_obj->Set();
819 }
820 return &orb_obj;
821 };
822 // if(!objname.CompareTo("OrbitalInfo")){
823 // if(!orb_obj) orb_obj = new OrbitalInfo();
824 // return &orb_obj;
825 // };
826 if(!objname.CompareTo("GPamela")){
827 if(!gp_obj) gp_obj = new GPamela();
828 return &gp_obj;
829 };
830
831 if(!objname.CompareTo("RunInfo"))return &run_obj;
832
833 if(!objname.CompareTo("SoftInfo"))return &soft_obj; // Emiliano
834
835 return NULL;
836 };
837 //--------------------------------------
838 //
839 //
840 //--------------------------------------
841 /**
842 * Retrieves the calorimeter track matching the seqno-th tracker stored track.
843 * (If seqno = -1 retrieves the self-trigger calorimeter track)
844 */
845 CaloTrkVar *PamLevel2::GetCaloStoredTrack(int seqno){
846
847 if( !calo2_obj )return 0;
848
849 if( calo2_obj->CaloLevel2::ntrk()==0 ){
850 cout << "PamLevel2::GetCaloStoredTrack(int) : requested tracker SeqNo "<< seqno <<" but no Calorimeter tracks are stored"<<endl;
851 return NULL;
852 };
853
854 CaloTrkVar *c = 0;
855 Int_t it_calo=0;
856
857 do{
858 c = calo2_obj->CaloLevel2::GetCaloTrkVar(it_calo);
859 it_calo++;
860 } while( c && seqno != c->trkseqno && it_calo < calo2_obj->CaloLevel2::ntrk());
861
862 if(!c || seqno != c->trkseqno){
863 c = 0;
864 if(seqno!=-1)cout << "PamLevel2::GetCaloStoredTrack(int) : requested tracker SeqNo "<< seqno <<" does not match Calorimeter stored tracks"<<endl;
865 };
866 return c;
867
868 };
869 //--------------------------------------
870 //
871 //
872 //--------------------------------------
873 /**
874 * Retrieves the ToF track matching the seqno-th tracker stored track.
875 * (If seqno = -1 retrieves the tracker-independent tof track)
876 */
877 ToFTrkVar *PamLevel2::GetToFStoredTrack(int seqno){
878
879 if( !tof_obj )return 0;
880
881 if( tof_obj->ToFLevel2::ntrk()==0 ){
882 cout << "PamLevel2::GetToFStoredTrack(int) : requested tracker SeqNo "<< seqno <<" but no ToF tracks are stored"<<endl;
883 return NULL;
884 };
885
886 ToFTrkVar *c = 0;
887 Int_t it_tof=0;
888
889 do{
890 c = tof_obj->ToFLevel2::GetToFTrkVar(it_tof);
891 it_tof++;
892 } while( c && seqno != c->trkseqno && it_tof < tof_obj->ToFLevel2::ntrk());
893
894 if(!c || seqno != c->trkseqno){
895 c = 0;
896 if(seqno!=-1)cout << "PamLevel2::GetToFStoredTrack(int) : requested tracker SeqNo "<< seqno <<" does not match ToF stored tracks"<<endl;
897 };
898 return c;
899
900 };
901
902 //--------------------------------------
903 //
904 //
905 //--------------------------------------
906 /**
907 * Retrieves the OrbitalInfo track matching the seqno-th tracker stored track.
908 * (If seqno = -1 retrieves the tracker-independent tof related track)
909 */
910 OrbitalInfoTrkVar *PamLevel2::GetOrbitalInfoStoredTrack(int seqno){
911
912 if( !orb_obj )return 0;
913
914
915 if( orb_obj->OrbitalInfo::ntrk()==0 ){
916 // // TRICK BEGIN
917 // OrbitalInfoTrkVar *r = new OrbitalInfoTrkVar(); // TEMPORARY TRICK
918 // Int_t nn = 0;
919 // TClonesArray &tor = *orb_obj->OrbitalInfoTrk;
920 // for(Int_t nt=0; nt < tof_obj->ToFLevel2::ntrk(); nt++){
921 // //
922 // ToFTrkVar *ptt = tof_obj->ToFLevel2::GetToFTrkVar(nt);
923 // if ( ptt->trkseqno != -1 ){
924 // //
925 // r->trkseqno = ptt->trkseqno;
926 // //
927 // r->Eij = 0;
928 // //
929 // r->Sij = 0;
930 // //
931 // r->pitch = -1000.;
932 // //
933 // r->cutoff = -1000.;
934 // //
935 // new(tor[nn]) OrbitalInfoTrkVar(*r);
936 // nn++;
937 // //
938 // r->Clear();
939 // //
940 // };
941 // };
942 // delete r;
943 // OrbitalInfoTrkVar *c = 0;
944 // c = orb_obj->OrbitalInfo::GetOrbitalInfoTrkVar(0);
945 // return c;
946 // //TRICK END
947 cout << "PamLevel2::GetOrbitalInfoStoredTrack(int) : requested tracker SeqNo "<< seqno <<" but no OrbitalInfo tracks are stored"<<endl;
948 return NULL;
949 };
950
951 OrbitalInfoTrkVar *c = 0;
952 Int_t it_tof=0;
953
954 do{
955 c = orb_obj->OrbitalInfo::GetOrbitalInfoTrkVar(it_tof);
956 it_tof++;
957 } while( c && seqno != c->trkseqno && it_tof < orb_obj->OrbitalInfo::ntrk());
958
959 if(!c || seqno != c->trkseqno){
960 c = 0;
961 if(seqno!=-1)cout << "PamLevel2::GetOrbitalInfoStoredTrack(int) : requested tracker SeqNo "<< seqno <<" does not match OrbitalInfo stored tracks"<<endl;
962 };
963 return c;
964
965 };
966
967 //--------------------------------------
968 //
969 //
970 //--------------------------------------
971 /**
972 * Give the pamela track associated to a tracker track, retrieving related calorimeter, orbitalinfo and tof track information.
973 */
974 PamTrack* PamLevel2::GetPamTrackAlong(TrkTrack* t){
975
976 cout <<"PamLevel2::GetPamTrackAlong(TrkTrack* t) **obsolete** "<<endl;
977 cout <<"(if you use it, remember to delete the PamTrack object)"<<endl;
978
979 CaloTrkVar *c = 0;
980 ToFTrkVar *o = 0;
981 OrbitalInfoTrkVar *r = 0;
982
983 if(CAL2) c = GetCaloStoredTrack(t->GetSeqNo());
984 if(TOF) o = GetToFStoredTrack(t->GetSeqNo());
985 if(ORB) r = GetOrbitalInfoStoredTrack(t->GetSeqNo());
986
987 // if(t && c && o)track = new PamTrack(t,c,o);
988 PamTrack *track = new PamTrack(t,c,o,r);
989
990 return track;
991
992 };
993 //--------------------------------------
994 //
995 //
996 //--------------------------------------
997 /**
998 * Retrieves the it-th stored track.
999 * It override TrkLevel2::GetTrack(int it).
1000 * @param itrk Track number, ranging from 0 to GetNTracks().
1001 */
1002
1003 PamTrack* PamLevel2::GetStoredTrack(Int_t itrk){
1004
1005 cout <<"PamLevel2::GetStoredTrack(Int_t itrk) **to-be-updated** "<<endl;
1006 cout <<"for the moment, better use separately the methods: TrkLevel2::GetStoredTrack(seqno) CaloLevel2::GetCaloTrkVar(Int_t notrack) ToFLevel2::GetToFTrkVar(Int_t notrack) OrbitalInfo::GetOrbitalInfoTrkVar(Int_t notrack)"<<endl;
1007 cout <<"(if you use it, remember to delete the PamTrack object)"<<endl;
1008 PamTrack *track = 0;
1009
1010 if( itrk >=0 && itrk < trk2_obj->TrkLevel2::ntrk() ){
1011
1012 TrkTrack *t = trk2_obj->TrkLevel2::GetStoredTrack(itrk);
1013 track = GetPamTrackAlong(t);
1014
1015
1016
1017 }else{
1018 cout << "PamLevel2::GetStoredTrack(int) : tracker track SeqNo "<< itrk <<" does not exist (GetNTracks() = "<<trk2_obj->TrkLevel2::GetNTracks()<<")"<<endl;
1019 };
1020
1021 return track;
1022
1023 }
1024 //--------------------------------------
1025 //
1026
1027 /**
1028 * Sort physical (tracker) tracks. Left here as backward compatibility method.
1029 **/
1030 void PamLevel2::SortTracks(TString how){
1031 printf(" WARNING! obsolete, use SortTracks() and SetSortingMethod(TString) instead! \n Setting sorting method to %s \n",how.Data());
1032 howtosort = how;
1033 SortTracks();
1034 };
1035
1036 //
1037 //--------------------------------------
1038 /**
1039 * Sort physical (tracker) tracks.
1040 * @param how String to set the sorting cryterium (es: "CAL" or "TRK+CAL+TOF" ecc...).
1041 * Sorting cryteria:
1042 * TRK: lower chi**2
1043 * CAL: lower Y spatial residual on the first calorimeter plane
1044 * TOF: bigger numebr of hit PMTs along the track, on S12 S21 S32 (where paddles are along the Y axis).
1045 * S1: (ask Emiliano)
1046 * S2: (ask Emiliano)
1047 * S3: (ask Emiliano)
1048 * GP: more GP hits
1049 * The default sorting cryterium is "TOF+CAL".
1050 *
1051 * The total number of physical tracks is always given by GetNTracks() and the it-th physical track can be retrieved by means of the methods GetTrack(int it) and GetTrack(int it, TString how).
1052 */
1053 void PamLevel2::SortTracks(){
1054 TString how = howtosort;
1055
1056 // cout <<" PamLevel2::SortTracks(TString how) "<<endl;
1057 if( !trk2_obj ){
1058 cout << "void PamLevel2::SortTracks(): TrkLevel2 not loaded !!!";
1059 return;
1060 };
1061 //Save current Object count
1062 Int_t ObjectNumber = TProcessID::GetObjectCount();
1063
1064 // create TCloneArrays to store tracks and its images
1065 if(!tsorted)tsorted = new TClonesArray("PamTrack",trk2_obj->GetNTracks());
1066 tsorted->Delete();
1067 TClonesArray &ttsorted = *tsorted;
1068
1069 if(!timage)timage = new TClonesArray("PamTrack",trk2_obj->GetNTracks());
1070 timage->Delete();
1071 TClonesArray &ttimage = *timage;
1072
1073
1074
1075 //--------------------------------------------------
1076 // retrieve sorting method
1077 //--------------------------------------------------
1078 Bool_t use_TRK = how.Contains("TRK", TString::kIgnoreCase);
1079 Bool_t use_CAL = how.Contains("CAL", TString::kIgnoreCase);
1080 Bool_t use_TOF = how.Contains("TOF", TString::kIgnoreCase);
1081 Bool_t use_S1 = how.Contains("S1", TString::kIgnoreCase);
1082 Bool_t use_S2 = how.Contains("S2", TString::kIgnoreCase);
1083 Bool_t use_S3 = how.Contains("S3", TString::kIgnoreCase);
1084 Bool_t use_GP = how.Contains("GP", TString::kIgnoreCase);
1085
1086 if ( use_TOF ){
1087 use_S1 = true;
1088 use_S2 = true;
1089 use_S3 = true;
1090 };
1091 if( !CAL2 && use_CAL) use_CAL = false;
1092 if( !TOF ){
1093 use_TOF = false;
1094 use_S1 = false;
1095 use_S2 = false;
1096 use_S3 = false;
1097 }
1098 if( !GP ){
1099 use_GP = false;
1100 }
1101
1102 if( !TRK2 ){
1103 cout << "SortTracks() : without tracker does not work!!! (not yet)" << endl;
1104 return;
1105 };
1106
1107 // cout << "use_CAL "<<use_CAL<<" use_TOF "<<use_TOF<<" use_TRK "<<use_TRK <<endl;
1108
1109
1110 //--------------------------------------------------
1111 // loop over "physical" tracks sorted by the tracker
1112 //--------------------------------------------------
1113 for(Int_t i=0; i < trk2_obj->TrkLevel2::GetNTracks(); i++){
1114
1115 TrkTrack *ts = 0;
1116 CaloTrkVar *cs = 0;
1117 ToFTrkVar *os = 0;
1118 OrbitalInfoTrkVar *rs = 0;
1119
1120 // get tracker tracks
1121 TrkTrack *tp = trk2_obj->TrkLevel2::GetTrack(i); //tracker
1122 CaloTrkVar *cp = GetCaloStoredTrack(tp->GetSeqNo());
1123 ToFTrkVar *op = GetToFStoredTrack(tp->GetSeqNo());
1124 OrbitalInfoTrkVar *rp = GetOrbitalInfoStoredTrack(tp->GetSeqNo());
1125
1126 TrkTrack *ti = 0; //tracker (image)
1127 CaloTrkVar *ci = 0;
1128 ToFTrkVar *oi = 0;
1129 OrbitalInfoTrkVar *ri = 0;
1130 // cout << "trk track n. "<<i << " "<<hex<< tp <<dec<< endl;
1131 // if track has an image, check image selection
1132
1133 Int_t tp_score = 0; //main track sorted by the tracker
1134 Int_t ti_score = 0; //image track
1135 Int_t totp_score = 0; //main track sorted by the tracker
1136 Int_t toti_score = 0; //image track
1137
1138 if(tp->HasImage()){
1139
1140 ti = trk2_obj->TrkLevel2::GetTrackImage(i); //tracker (image)
1141 ci = GetCaloStoredTrack(ti->GetSeqNo());
1142 oi = GetToFStoredTrack(ti->GetSeqNo());
1143 ri = GetOrbitalInfoStoredTrack(ti->GetSeqNo());
1144
1145 // cout << "its image "<<i << " "<<hex<< ti <<dec<< endl;
1146
1147 //assign starting scores
1148 tp_score = 0; //main track sorted by the tracker
1149 ti_score = 0; //image track
1150
1151 // -----------------------------------------------------------------------------------------
1152 // *****************************************************************************************
1153 // -----------------------------------------------------------------------------------------
1154 // calorimeter check
1155 // -----------------------------------------------------------------------------------------
1156 if( use_CAL && !calo2_obj ){
1157 cout << "void PamLevel2::SortTracks(): howtosort= "<<how<<" but CaloLevel2 not loaded !!!";
1158 return;
1159 };
1160 if( use_CAL && !cp && ci ){
1161 ti_score++;
1162 toti_score++;
1163 };
1164 if( use_CAL && cp && !ci ){
1165 tp_score++;
1166 totp_score++;
1167 };
1168 if(
1169 use_CAL &&
1170 cp && ci &&
1171 true){
1172
1173
1174 if(
1175 cp->npresh > ci->npresh &&
1176 true){
1177 tp_score++;
1178 totp_score++;
1179 };
1180 if(
1181 cp->npresh < ci->npresh &&
1182 true){
1183 ti_score++;
1184 toti_score++;
1185 };
1186
1187 // cout << "CALO "<<tp_score<<ti_score<<endl;
1188
1189 };
1190 // -----------------------------------------------------------------------------------------
1191 // *****************************************************************************************
1192 // -----------------------------------------------------------------------------------------
1193 // TOF check
1194 // -----------------------------------------------------------------------------------------
1195 // check the number of hit pmts along the track
1196 // on S12 S21 and S32, where paddles are parallel to Y axis
1197 if( (use_TOF || use_S1 || use_S2 || use_S3 ) && !tof_obj ){
1198 cout << "void PamLevel2::SortTracks(): howtosort= "<<how<<" but ToFLevel2 not loaded !!!";
1199 return;
1200 };
1201 //
1202 if( (use_TOF || use_S1 || use_S2 || use_S3 ) && !op && oi ){
1203 ti_score++;
1204 toti_score++;
1205 };
1206 if( (use_TOF || use_S1 || use_S2 || use_S3 ) && op && !oi ){
1207 tp_score++;
1208 totp_score++;
1209 };
1210 if( (use_TOF || use_S1 || use_S2 || use_S3 ) && op && oi ){
1211 //
1212 Float_t sen = 0.;
1213 for (Int_t ih=0; ih < op->npmtadc; ih++){
1214 Int_t pl = tof_obj->GetPlaneIndex( (op->pmtadc).At(ih) );
1215 if ( pl == 2 || pl == 3 || pl == 4 || pl == 5 ) sen += (op->dedx).At(ih);
1216 };
1217 for (Int_t ih=0; ih < oi->npmtadc; ih++){
1218 Int_t pl = tof_obj->GetPlaneIndex( (oi->pmtadc).At(ih) );
1219 if ( pl == 2 || pl == 3 || pl == 4 || pl == 5 ) sen += (oi->dedx).At(ih);
1220 };
1221 //
1222 if ( sen >= sortthr && false){ // temporary disabled NUCLEI special algorithm since the new one should work for every particle (to be checked!)
1223 //printf(" IS A NUCLEUS! en = %f \n",sen);
1224 //
1225 // is a nucleus use a different algorithm
1226 //
1227 Int_t nz = 6; Float_t zin[6]; // << define TOF z-coordinates
1228 for(Int_t ip=0; ip<nz; ip++)
1229 zin[ip] = tof_obj->ToFLevel2::GetZTOF(tof_obj->ToFLevel2::GetToFPlaneID(ip)); // << read ToF plane z-coordinates
1230 Trajectory *tr = new Trajectory(nz,zin);
1231 //
1232 Int_t nphit_p =0;
1233 Int_t nphit_i =0;
1234 Float_t enhit_p = 0.;
1235 Float_t enhit_i = 0.;
1236 //
1237 for (Int_t ih=0; ih < op->npmtadc; ih++){
1238 Int_t pl = tof_obj->GetPlaneIndex( (op->pmtadc).At(ih) );
1239 if(pl == 1 || pl == 2 || pl == 5){
1240 nphit_p++;
1241 enhit_p += (op->dedx).At(ih);
1242 };
1243 };
1244 //
1245 tp->DoTrack2(tr);
1246 //
1247 if ( fabs(tr->y[0]-oi->ytofpos[0]) < 2. ){
1248 for (Int_t ih=0; ih < op->npmtadc; ih++){
1249 Int_t pl = tof_obj->GetPlaneIndex( (op->pmtadc).At(ih) );
1250 if(pl == 0){
1251 nphit_p++;
1252 enhit_p += (op->dedx).At(ih);
1253 };
1254 };
1255 };
1256 if ( fabs(tr->y[3]-oi->ytofpos[1]) < 2. ){
1257 for (Int_t ih=0; ih < op->npmtadc; ih++){
1258 Int_t pl = tof_obj->GetPlaneIndex( (op->pmtadc).At(ih) );
1259 if(pl == 3){
1260 nphit_p++;
1261 enhit_p += (op->dedx).At(ih);
1262 };
1263 };
1264 };
1265 if ( fabs(tr->y[4]-oi->ytofpos[2]) < 2. ){
1266 for (Int_t ih=0; ih < op->npmtadc; ih++){
1267 Int_t pl = tof_obj->GetPlaneIndex( (op->pmtadc).At(ih) );
1268 if(pl == 4){
1269 nphit_p++;
1270 enhit_p += (op->dedx).At(ih);
1271 };
1272 };
1273 };
1274
1275 for (Int_t ih=0; ih < oi->npmtadc; ih++){
1276 Int_t pl = tof_obj->GetPlaneIndex( (oi->pmtadc).At(ih) );
1277 if(pl == 1 || pl == 2 || pl == 5){
1278 nphit_i++;
1279 enhit_i += (op->dedx).At(ih);
1280 };
1281 };
1282 //
1283 ti->DoTrack2(tr);
1284 //
1285 if ( fabs(tr->y[0]-oi->ytofpos[0]) < 2. ){
1286 for (Int_t ih=0; ih < oi->npmtadc; ih++){
1287 Int_t pl = tof_obj->GetPlaneIndex( (oi->pmtadc).At(ih) );
1288 if(pl == 0){
1289 nphit_i++;
1290 enhit_i += (op->dedx).At(ih);
1291 };
1292 };
1293 };
1294 if ( fabs(tr->y[3]-oi->ytofpos[1]) < 2. ){
1295 for (Int_t ih=0; ih < oi->npmtadc; ih++){
1296 Int_t pl = tof_obj->GetPlaneIndex( (oi->pmtadc).At(ih) );
1297 if(pl == 3){
1298 nphit_i++;
1299 enhit_i += (op->dedx).At(ih);
1300 };
1301 };
1302 };
1303 if ( fabs(tr->y[4]-oi->ytofpos[2]) < 2. ){
1304 for (Int_t ih=0; ih < oi->npmtadc; ih++){
1305 Int_t pl = tof_obj->GetPlaneIndex( (oi->pmtadc).At(ih) );
1306 if(pl == 4){
1307 nphit_i++;
1308 enhit_i += (op->dedx).At(ih);
1309 };
1310 };
1311 };
1312
1313
1314 if(
1315 (use_TOF || use_S1 || use_S2 || use_S3) &&
1316 (nphit_p+nphit_i) !=0 &&
1317 true){
1318
1319 // printf(" seqno %i nphit_p %i nphit_i %i enhit_p %f enhit_i %f \n",trk2_obj->TrkLevel2::GetSeqNo(i),nphit_p,nphit_i,enhit_p,enhit_i);
1320 // printf(" score p %i score i %i \n",tp_score,ti_score);
1321 // if( enhit_p > enhit_i ) tp_score++;
1322 // if( nphit_p >= nphit_i && enhit_p > enhit_i ) tp_score++;
1323 if ( nphit_p > nphit_i ) tp_score++;
1324 if ( nphit_p < nphit_i ) ti_score++;
1325 if ( nphit_p == nphit_i ){
1326 if ( enhit_p > enhit_i ) tp_score++;
1327 else ti_score++;
1328 };
1329 // printf(" dopo score p %i score i %i \n",tp_score,ti_score);
1330 };
1331 delete tr;
1332 //
1333 } else {
1334 // -------------
1335 // NOT a NUCLEUS
1336 // -------------
1337 //printf(" NOT a NUCLEUS! en = %f \n",sen);
1338
1339 Int_t nphit_p =0;
1340 Int_t nphit_i =0;
1341
1342
1343 /* cout << "track: npmtadc "<< op->npmtadc << endl;
1344 cout << "track: npmttdc "<< op->npmttdc << endl;
1345 cout << "image: npmtadc "<< oi->npmtadc << endl;
1346 cout << "image: npmttdc "<< oi->npmttdc << endl;*/
1347
1348 // for (Int_t ih=0; ih < op->npmtadc; ih++){
1349 // Int_t pl = tof_obj->GetPlaneIndex( (op->pmtadc).At(ih) );
1350 // if(pl == 1 || pl == 2 || pl == 5)nphit_p++;
1351 // };
1352
1353 // for (Int_t ih=0; ih < oi->npmtadc; ih++){
1354 // Int_t pl = tof_obj->GetPlaneIndex( (oi->pmtadc).At(ih) );
1355 // if(pl == 1 || pl == 2 || pl == 5)nphit_i++;
1356 // };
1357 // --- modified to count tdc signals (more efficient?)
1358 // --- and to implement check on tdcflag
1359 for (Int_t ih=0; ih < op->npmttdc; ih++){
1360 Int_t pl = tof_obj->GetPlaneIndex( (op->pmttdc).At(ih) );
1361 // if( (op->tdcflag).At(ih)==0 && (pl == 1 || pl == 2 || pl == 5) )nphit_p++;
1362 if ( (use_S1 && ( pl == 0 || pl == 1 )) || (use_S2 && ( pl == 2 || pl == 3 )) || (use_S3 && ( pl == 4 || pl == 5 )) ){
1363 if( (op->tdcflag).At(ih)==0 )nphit_p++;
1364 };
1365 };
1366
1367 for (Int_t ih=0; ih < oi->npmttdc; ih++){
1368 Int_t pl = tof_obj->GetPlaneIndex( (oi->pmttdc).At(ih) );
1369 // if( (oi->tdcflag).At(ih)==0 && (pl == 1 || pl == 2 || pl == 5) )nphit_i++;
1370 if ( (use_S1 && ( pl == 0 || pl == 1 )) || (use_S2 && ( pl == 2 || pl == 3 )) || (use_S3 && ( pl == 4 || pl == 5 )) ){
1371 if( (oi->tdcflag).At(ih)==0 )nphit_i++;
1372 };
1373 };
1374
1375 if(
1376 (nphit_p+nphit_i) !=0 &&
1377 true){
1378
1379 if ( nphit_p != nphit_i ){
1380 totp_score += nphit_p;
1381 toti_score += nphit_i;
1382 tp_score+=nphit_p;
1383 ti_score+=nphit_i;
1384 };
1385 // if ( nphit_p > nphit_i) tp_score+=nphit_p;
1386 // else if( nphit_p < nphit_i) ti_score+=nphit_i;
1387 // else ;//niente
1388 };
1389 };
1390 // cout << "TOF "<<tp_score<<ti_score<<endl;
1391 };
1392
1393
1394 // if(tp_score == ti_score) use_TRK = true;
1395
1396
1397 // -----------------------------------------------------------------------------------------
1398 // *****************************************************************************************
1399 // -----------------------------------------------------------------------------------------
1400 // tracker check
1401 // -----------------------------------------------------------------------------------------
1402 // chi**2 difference is not always large enough to distinguish among
1403 // the real track and its image.
1404 // Tracker check will be applied always when calorimeter and tof information is ambiguous.
1405 // *** MODIFIED ON AUGUST 2007 ***
1406 if(use_TRK){
1407 // if( tp->chi2 > 0 && tp->chi2 < ti->chi2 ) tp_score++ ;
1408 // else if( ti->chi2 > 0 && ti->chi2 < tp->chi2 ) ti_score++ ;
1409
1410 // CHECK 1 : number of points along X
1411 if ( tp->GetNX() >= ti->GetNX() ){
1412 tp_score++ ;
1413 totp_score++ ;
1414 };
1415 if ( tp->GetNX() <= ti->GetNX() ){
1416 ti_score++ ;
1417 toti_score++ ;
1418 };
1419 // CHECK 2 : number of points along Y
1420 if ( tp->GetNY() >= ti->GetNY() ){
1421 tp_score++ ;
1422 totp_score++ ;
1423 };
1424 if ( tp->GetNY() <= ti->GetNY() ){
1425 ti_score++ ;
1426 toti_score++ ;
1427 };
1428
1429 // cout << "TRK "<<tp_score<<ti_score<<endl;
1430 };
1431
1432
1433 // -----------------------------------------------------------------------------------------
1434 // *****************************************************************************************
1435 // -----------------------------------------------------------------------------------------
1436 // GPamela check
1437 // -----------------------------------------------------------------------------------------
1438
1439 //---------------------------------------------------
1440 // count the number of GP hits
1441 //---------------------------------------------------
1442 if(use_GP){
1443 int ngphits_p=0;
1444 int ngphits_i=0;
1445 float toll = 0.02; //200 micron
1446 for(int ih=0; ih<GetGPamela()->Nthspe; ih++){
1447 int ip = (Int_t) GetGPamela()->Itrpb[ih] - 1;
1448 if(
1449 tp &&
1450 tp->YGood(ip) &&
1451 fabs(tp->ym[ip]- GetGPamela()->Yavspe[ih])<toll &&
1452 true) ngphits_p++;
1453 if( ti &&
1454 ti->YGood(ip) &&
1455 fabs(ti->ym[ip]- GetGPamela()->Yavspe[ih])<toll &&
1456 true) ngphits_i++;
1457 }
1458 if(
1459 ngphits_p > ngphits_i &&
1460 true){
1461 tp_score++ ;
1462 totp_score++ ;
1463 }
1464 if(
1465 ngphits_p < ngphits_i &&
1466 true){
1467 ti_score++ ;
1468 toti_score++ ;
1469 }
1470 }
1471
1472
1473 // *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
1474 // the winner is....
1475 // *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
1476 if (tp_score > ti_score) {
1477
1478
1479 }else if (tp_score < ti_score) {
1480
1481
1482 ts = ti;//its image!!
1483 cs = ci;
1484 os = oi;
1485 rs = ri;
1486 Int_t totis = toti_score;
1487
1488 ti = tp;//its image!!
1489 ci = cp;
1490 oi = op;
1491 ri = rp;
1492
1493 tp = ts;//its image!!
1494 cp = cs;
1495 op = os;
1496 rp = rs;
1497
1498 toti_score = totp_score;
1499 totp_score = totis;
1500
1501
1502 }else {
1503
1504 // cout << "Warning - track image ambiguity not solved" << endl;
1505
1506 };
1507
1508 }else{
1509 totp_score = 1;
1510 toti_score = 0;
1511
1512 // ts = tp;
1513 // cs = cp;
1514 // os = op;
1515 };
1516
1517 // cout <<" SortTracks() "<<i<<" -- "<<ts<<endl;
1518 // sorted_tracks->Add(ts);//save the track in the sorted array
1519 // sorted_tracks.Add(ts);//save the track in the sorted array
1520 // sorted_tracks.Add(tp);//save the track in the sorted array
1521 // cout << "SortTracks:: sorted_tracks->Add(it) "<<i<<" "<<ts<<endl;
1522 // cout<<"o "<<tp<<endl;
1523 // cout<<"o "<<cp<<endl;
1524 // cout<<"o "<<op<<endl;
1525
1526 new(ttsorted[i]) PamTrack(tp,cp,op,rp);
1527 new(ttimage[i]) PamTrack(ti,ci,oi,ri);
1528
1529 ((PamTrack*)(ttsorted[i]))->SetPScore(totp_score);
1530 ((PamTrack*)(ttsorted[i]))->SetIScore(toti_score);
1531 ((PamTrack*)(ttimage[i]))->SetPScore(totp_score);
1532 ((PamTrack*)(ttimage[i]))->SetIScore(toti_score);
1533 };
1534
1535 if( tsorted->GetEntries() != trk2_obj->GetNTracks() ){
1536 cout << "void PamLevel2::SortTracks(): tsorted->GetEntries() "<<tsorted->GetEntries()<<" != trk2_obj->GetNTracks() = "<<trk2_obj->GetNTracks() <<endl;
1537 tsorted->Delete(); tsorted=0;
1538 timage->Delete(); timage=0;
1539 }
1540
1541 //Restore Object count
1542 //To save space in the table keeping track of all referenced objects
1543 //We reset the object count to what it was at the beginning of the event.
1544 TProcessID::SetObjectCount(ObjectNumber);
1545
1546 };
1547 //--------------------------------------
1548 //
1549 //
1550 //--------------------------------------
1551 /**
1552 * This method overrides TrkLevel2::GetTracks(), where sorting is done by decreasing number of fit points and increasing chi^2.
1553 * PamLevel2::GetTracks() keeps the same track order given by TrkLevel2::GetTracks(), but checks image selection by using calorimeter and ToF tracking information.
1554 */
1555 // TRefArray *PamLevel2::GetTracks(){
1556
1557 // // *-*-*-*-*-*-*-*-*-*-*-*-*
1558 // SortTracks("+CAL+TOF");
1559 // // *-*-*-*-*-*-*-*-*-*-*-*-*
1560
1561 // // return sorted_tracks;
1562 // return &sorted_tracks;
1563
1564 // };
1565 TClonesArray *PamLevel2::GetTracks(){
1566
1567 // *-*-*-*-*-*-*-*-*-*-*-*-*
1568 SortTracks();
1569 // *-*-*-*-*-*-*-*-*-*-*-*-*
1570
1571 return tsorted;
1572
1573 };
1574 //--------------------------------------
1575 //
1576 //
1577 //--------------------------------------
1578 /**
1579 * Retrieves the it-th Pamela "physical" track.
1580 * It override TrkLevel2::GetTrack(int it).
1581 * @param it Track number, ranging from 0 to GetNTracks().
1582 */
1583 PamTrack *PamLevel2::GetTrack(int it){
1584
1585 // if(!trk2_obj) return 0;
1586
1587 // // *-*-*-*+-*-*-*-*-*-*-*-*-*
1588 // SortTracks("+CAL+TOF");
1589 // // *-*-*-*-*-*-*-*-*-*-*-*-*
1590 // // if(!sorted_tracks)return 0;
1591 // if(sorted_tracks.IsEmpty())return 0;
1592
1593 // PamTrack *track = 0;
1594
1595 // if( it >=0 && it < trk2_obj->TrkLevel2::GetNTracks() && it<sorted_tracks.GetEntriesFast() ){
1596 // TrkTrack *t = (TrkTrack*)sorted_tracks.At(it);
1597 // track = GetPamTrackAlong(t);
1598 // }else{
1599 // cout << "PamLevel2::GetTrack(int) : tracker track SeqNo "<< it <<" does not exist (GetNTracks() = "<<trk2_obj->TrkLevel2::GetNTracks()<<")"<<endl;
1600 // };
1601
1602 // return track;
1603
1604 // cout << "PamLevel2::GetTrack(int it) "<<endl;
1605 // *-*-*-*-*-*-*-*-*-*-*-*-*
1606 SortTracks();
1607 // *-*-*-*-*-*-*-*-*-*-*-*-*
1608 if(!tsorted)return 0;
1609 if(!tsorted->GetEntries())return 0;
1610
1611 PamTrack *track = 0;
1612
1613 if( it >=0 && it < trk2_obj->TrkLevel2::GetNTracks()){
1614 // TrkTrack *t = (TrkTrack*)sorted_tracks.At(it);
1615 // track = GetPamTrackAlong(t);
1616 TClonesArray &t = *(tsorted);
1617 track = (PamTrack*)t[it];
1618
1619 }else{
1620 cout << "PamLevel2::GetTrack(int) : tracker track SeqNo "<< it <<" does not exist (GetNTracks() = "<<trk2_obj->TrkLevel2::GetNTracks()<<")"<<endl;
1621 };
1622
1623 return track;
1624
1625 };
1626
1627 //--------------------------------------
1628 //
1629 //
1630 //--------------------------------------
1631 /**
1632 * Retrieves (if present) the image of the it-th Pamela "physical" track, sorted by the method PamLevel2::SortTracks().
1633 * @param it Track number, ranging from 0 to GetNTracks().
1634 */
1635 PamTrack *PamLevel2::GetTrackImage(int it){
1636
1637 // *-*-*-*-*-*-*-*-*-*-*-*-*
1638 SortTracks();
1639 // *-*-*-*-*-*-*-*-*-*-*-*-*
1640 if(!timage)return 0;
1641 if(!timage->GetEntries())return 0;
1642
1643 PamTrack *image = 0;
1644
1645 if( it >=0 && it < trk2_obj->TrkLevel2::GetNTracks() ){
1646 TClonesArray &t = *(tsorted);
1647 PamTrack *temp = (PamTrack*)t[it];
1648 if( temp->GetTrkTrack()->HasImage() ){
1649 TClonesArray &t = *(timage);
1650 image = (PamTrack*)t[it];
1651 }else{
1652 // cout <<"PamLevel2::GetTrackImage(int) : Track SeqNo "<<it<<" does not have image"<<endl;
1653 };
1654 }else{
1655 cout << "PamLevel2::GetTrackImage(int) : Tracker track SeqNo "<< it <<" does not exist (GetNTracks() = "<<trk2_obj->TrkLevel2::GetNTracks()<<")"<<endl;
1656 };
1657
1658 return image;
1659 }
1660
1661 //--------------------------------------
1662 //
1663 //
1664 //--------------------------------------
1665 /**
1666 * Get the Pamela detector trees in a single file and make them friends.
1667 * @param f TFile pointer
1668 * @param detlist String to select trees to be included
1669 * @return Pointer to a TTree
1670 */
1671 TTree *PamLevel2::GetPamTree(TFile *f, TString detlist ){
1672
1673 if( detlist.Contains("+AUTO", TString::kIgnoreCase) ) {
1674 cout << "+AUTO"<<endl;
1675 GetWhichTrees(f);
1676 };
1677 SetWhichTrees(detlist);
1678
1679 if ( pam_tree ){
1680 printf("WARNING: TTree *PamLevel2::GetPamTree(TFile *fl, TString detlist) -- pam_tree already exists!\n ");
1681 return pam_tree;
1682 };
1683 //
1684
1685 cout << "TTree *PamLevel2::GetPamTree(TFile *f, TString detlist ) -- obsolte "<<endl;
1686
1687 // SetWhichTrees(detlist);
1688
1689 TTree *Trout =0;
1690
1691 TString fname = f->GetName();
1692 if(!CheckLevel2File(fname))return NULL;
1693
1694 // UInt_t *found=0;
1695
1696 cout<< "GetPamTree(TFile*,TString): detector list --> ";
1697 if(TRK1)cout<<"TRK1 ";
1698 if(TRK2)cout<<"TRK2 ";
1699 if(TRKh)cout<<"TRKH ";
1700 if(CAL1)cout<<"CAL1 ";
1701 if(CAL2)cout<<"CAL2 ";
1702 if(TOF)cout<<"TOF ";
1703 if(TRG)cout<<"TRG ";
1704 if(AC)cout<<"AC ";
1705 if(ND)cout<<"ND ";
1706 if(S4)cout<<"S4 ";
1707 if(ORB)cout<<"ORB ";
1708 if(GP)cout<<"GP ";
1709 cout << endl;
1710 if(SELLI && SELLI!=2)cout<<">>> Found selection-list <<<"<<endl; //EMILIANO
1711
1712 f->cd();
1713
1714 // Tracker
1715 TTree *T = (TTree*)f->Get("Tracker");
1716 if(T && (TRK2||TRK1||TRKh)) {
1717 if(TRK2)T->SetBranchAddress("TrkLevel2", GetPointerTo("TrkLevel2"));
1718 // else T->SetBranchStatus("TrkLevel2",0,found);
1719 if(TRK2)cout << "Tracker : set branch address TrkLevel2"<<endl;
1720 if(TRK1)T->SetBranchAddress("TrkLevel1", GetPointerTo("TrkLevel1"));
1721 // else T->SetBranchStatus("TrkLevel1",0,found);
1722 if(TRK1)cout << "Tracker : set branch address TrkLevel1"<<endl;
1723 if(TRKh)T->SetBranchAddress("TrkHough", GetPointerTo("TrkHough"));
1724 // else T->SetBranchStatus("TrkHough",0,found);
1725 if(TRKh)cout << "Tracker : set branch address TrkHough"<<endl;
1726 if(!Trout)Trout=T;
1727 else Trout->AddFriend(T);
1728 }else{
1729 cout << "Tracker : missing tree"<<endl;
1730 };
1731 // Calorimeter
1732 TTree *C = (TTree*)f->Get("Calorimeter");
1733 if(C && (CAL2||CAL1)) {
1734 if(CAL2)C->SetBranchAddress("CaloLevel2", GetPointerTo("CaloLevel2"));
1735 // else C->SetBranchStatus("CaloLevel2",0,found);
1736 if(CAL2)cout << "Calorimeter : set branch address CaloLevel2"<<endl;
1737 if(CAL1)C->SetBranchAddress("CaloLevel1", GetPointerTo("CaloLevel1"));
1738 // else C->SetBranchStatus("CaloLevel1",0,found);
1739 if(CAL1)cout << "Calorimeter : set branch address CaloLevel1"<<endl;
1740 if(!Trout)Trout=C;
1741 else Trout->AddFriend(C);
1742 }else{
1743 cout << "Calorimeter : missing tree"<<endl;
1744 };
1745
1746 // ToF
1747 TTree *O = (TTree*)f->Get("ToF");
1748 if(O && TOF) {
1749 O->SetBranchAddress("ToFLevel2", GetPointerTo("ToFLevel2"));
1750 cout << "ToF : set branch address ToFLevel2"<<endl;
1751 if(!Trout)Trout=O;
1752 else Trout->AddFriend(O);
1753 }else{
1754 cout << "ToF : missing tree"<<endl;
1755 };
1756 // Trigger
1757 TTree *R = (TTree*)f->Get("Trigger");
1758 if(R && TRG) {
1759 R->SetBranchAddress("TrigLevel2", GetPointerTo("TrigLevel2"));
1760 cout << "Trigger : set branch address TrigLevel2"<<endl;
1761 if(!Trout)Trout=R;
1762 else Trout->AddFriend(R);
1763 }else{
1764 cout << "Trigger : missing tree"<<endl;
1765 };
1766 // S4
1767 TTree *S = (TTree*)f->Get("S4");
1768 if(S && S4) {
1769 S->SetBranchAddress("S4Level2", GetPointerTo("S4Level2"));
1770 cout << "S4 : set branch address S4Level2"<<endl;
1771 if(!Trout)Trout=S;
1772 else Trout->AddFriend(S);
1773 }else{
1774 cout << "S4 : missing tree"<<endl;
1775 };
1776 // Neutron Detector
1777 TTree *N = (TTree*)f->Get("NeutronD");
1778 if(N && ND) {
1779 N->SetBranchAddress("NDLevel2", GetPointerTo("NDLevel2"));
1780 cout << "NeutronD : set branch address NDLevel2"<<endl;
1781 if(!Trout)Trout=N;
1782 else Trout->AddFriend(N);
1783 }else{
1784 cout << "NeutronD : missing tree"<<endl;
1785 };
1786 // Anticounters
1787 TTree *A = (TTree*)f->Get("Anticounter");
1788 if(A && AC) {
1789 A->SetBranchAddress("AcLevel2", GetPointerTo("AcLevel2"));
1790 cout << "Anticounter : set branch address AcLevel2"<<endl;
1791 if(!Trout)Trout=A;
1792 else Trout->AddFriend(A);
1793 }else{
1794 cout << "Anticounter : missing tree"<<endl;
1795 };
1796 // Orbital Info
1797 TTree *B = (TTree*)f->Get("OrbitalInfo");
1798 if(B && ORB) {
1799 B->SetBranchAddress("OrbitalInfo", GetPointerTo("OrbitalInfo"));
1800 cout << "OrbitalInfo : set branch address OrbitalInfo"<<endl;
1801 if(!Trout)Trout=B;
1802 else Trout->AddFriend(B);
1803 }else{
1804 cout << "OrbitalInfo : missing tree"<<endl;
1805 };
1806
1807 // GPamela
1808 TTree *G = (TTree*)f->Get("h20");
1809 if(G && GP) {
1810 if(!gp_obj)gp_obj=new GPamela();
1811 // ------------------------------------
1812 // ATTENZIONE!!!
1813 // non so per quale arcano motivo,
1814 // per l'albero di gpamela il branch address lo devo settare
1815 // DOPO aver fatto friend
1816 // FGRRRVZZZZUTSALKJMSLKJ!!!
1817 // ------------------------------------
1818 // gp_obj->SetBranchAddress(G); //ho dovuto fare in maniera diversa dagli altri
1819 // cout << "h20 : set branch address GPamela "<<endl;
1820 if(!Trout)Trout=G;
1821 else Trout->AddFriend(G);
1822 }else{
1823 // cout << "h20 : missing tree"<<endl;
1824 };
1825
1826
1827 TTree *L = (TTree*)f->Get("SelectionList");
1828 if(L && SELLI==1) {
1829 cout << " TTree *PamLevel2::GetPamTree(TFile, TString) >>> SelectionList not implemented!!!!"<<endl;
1830 sel_tree = 0;
1831 }else{
1832 cout << "SelectionList : missing tree"<<endl;
1833 };
1834
1835 cout<<endl<<" Number of entries: "<<Trout->GetEntries()<<endl<<endl;
1836
1837 // ------------------------------------
1838 // ATTENZIONE!!!
1839 // non so per quale arcano motivo,
1840 // per l'albero di gpamela il branch address lo devo settare
1841 // DOPO aver fatto friend
1842 // FGRRRVZZZZUTSALKJMSLKJ!!!
1843 // ------------------------------------
1844 if(G && GP) {
1845 gp_obj->SetBranchAddress(Trout); //ho dovuto fare in maniera diversa dagli altri
1846 cout << "h20 : set branch address GPamela "<<endl;
1847 }else{
1848 cout << "h20 : missing tree"<<endl;
1849 };
1850
1851 pam_tree = (TChain*)Trout;
1852
1853 return Trout;
1854
1855 }
1856 //--------------------------------------
1857 //
1858 //
1859 //--------------------------------------
1860 /**
1861 * Get list of Level2 files.
1862 * @param ddir Level2 data directory.
1863 * @param flisttxt Name of txt file containing file list.
1864 * @return Pointer to a TList of TSystemFiles
1865 * If no input file list is given , all the Level2 files inside the directory are processed.
1866 */
1867 TList* PamLevel2::GetListOfLevel2Files(TString ddir, TString flisttxt = ""){
1868
1869 TString wdir = gSystem->WorkingDirectory();
1870
1871 if ( ddir != ""){
1872 cout << "Level2 data directory : "<< ddir << endl;
1873 } else {
1874 cout << "Level2 data directory not given as input: trying to evaluate from list or taking working directory " << endl;
1875 };
1876 TList *contents = new TList; // create output list
1877 contents->SetOwner();
1878
1879 // --------------------------------------
1880 // case 1 : input file/file-list provided
1881 // --------------------------------------
1882 if ( flisttxt != "" ){
1883
1884 // --------------------------------------
1885 // a list of files given as input
1886 // --------------------------------------
1887 if ( !flisttxt.EndsWith(".root") ){
1888
1889 TString dir = gSystem->DirName(flisttxt);
1890 // cout << " List directory "<<dir<<endl;
1891 if(dir == "." || dir == "")
1892 flisttxt = gSystem->ConcatFileName(wdir.Data(),gSystem->BaseName(flisttxt));
1893 // flisttxt = gSystem->ConcatFileName(gSystem->DirName(flisttxt),gSystem->BaseName(flisttxt));
1894
1895 if( !gSystem->ChangeDirectory(ddir) ){
1896 cout << "Cannot change directory : "<<ddir<<endl;
1897 return 0;
1898 }
1899
1900 cout <<"Input file list : " << flisttxt <<endl;
1901 ifstream in;
1902 in.open(flisttxt, ios::in); //open input file list
1903 if(!in.good()){
1904 cout <<" TList* PamLevel2::GetListOfLevel2Files(TString, TString) --> ERROR opening the file "<<endl;
1905 gSystem->ChangeDirectory(wdir); // back to the working directory
1906 return 0;
1907 }
1908 int line=0;
1909 // ...........................
1910 // loop over file-list records
1911 // ...........................
1912 while (1) {
1913 TString file;
1914 in >> file;
1915 if (!in.good()) break;
1916 line++;
1917 cout <<"(*) " << file << endl;
1918 if(file.IsNull()){
1919 cout << "-- list interrupted at line "<<line <<endl;
1920 break;
1921 }
1922 if(file.Contains("#"))file = file(0,file.First("#"));
1923 //
1924 // take only root files
1925 //
1926 if( file.EndsWith(".root") ){
1927 TString filedir;
1928 cout << ddir << endl;
1929 if (ddir != ""){
1930 filedir = ddir; // take the input dir
1931 } else {
1932 gSystem->ChangeDirectory(wdir); // back to the working directory
1933 filedir = gSystem->DirName(file); // this will take the path if exist in the list otherwise it will return automatically the working dir
1934 };
1935 filedir.Append("/");
1936 char *fullpath = gSystem->ConcatFileName(gSystem->DirName(filedir),gSystem->BaseName(file));
1937 contents->Add(new TSystemFile(fullpath,gSystem->DirName(fullpath)));// add file to the list
1938 cout << fullpath << endl;
1939 delete fullpath;
1940 }
1941 // }else{
1942 // if(file.Data()!="")cout << "File: "<<file<<" ---> missing "<< endl;
1943 // };
1944 };
1945 in.close();
1946 // --------------------------------------
1947 // a single root file given as input
1948 // --------------------------------------
1949 } else {
1950 if(flisttxt.Contains("#"))flisttxt = flisttxt(0,flisttxt.First("#"));
1951 char *fullpath = gSystem->ConcatFileName(gSystem->DirName(flisttxt),gSystem->BaseName(flisttxt));
1952 contents->Add(new TSystemFile(fullpath,gSystem->DirName(fullpath)));// add file to the list
1953 delete fullpath;
1954 };
1955 // ---------------------------------------------------------------------------------
1956 // case 2 : no input file/file-list provided --> read all files insede the directory
1957 // ---------------------------------------------------------------------------------
1958 }else{
1959
1960 cout << "No input file list given."<<endl;
1961 cout << "Check for existing root files."<<endl;
1962 // cout << "Warking directory: "<< gSystem->WorkingDirectory()<< endl;
1963 if ( ddir == "" ){
1964 ddir = wdir;
1965 cout << "Level2 data directory : "<< ddir << endl;
1966 };
1967
1968 TSystemDirectory *datadir = new TSystemDirectory(gSystem->BaseName(ddir),ddir);
1969 TList *temp = datadir->GetListOfFiles();
1970 if(!temp)return 0;
1971 // temp->Print();
1972 // cout << "*************************************" << endl;
1973
1974 TIter next(temp);
1975 TSystemFile *questo = 0;
1976
1977
1978 while ( (questo = (TSystemFile*) next()) ) {
1979 TString name = questo-> GetName();
1980 if( name.EndsWith(".root") ){
1981 // const char *fullpath = gSystem->FindFile(ddir,name);
1982 // char *fullpath;
1983 // gSystem->IsFileInIncludePath(name,&fullpath);
1984 char *fullpath = gSystem->ConcatFileName(gSystem->DirName(ddir),gSystem->BaseName(name));
1985 contents->Add(new TSystemFile(fullpath,gSystem->DirName(fullpath)));
1986 delete fullpath;
1987 };
1988 }
1989 delete temp;
1990 delete datadir;
1991
1992 };
1993 gSystem->ChangeDirectory(wdir); // back to the working directory
1994 // cout << endl << "Selected files:" << endl;
1995 // contents->Print();
1996 cout << contents->GetEntries()<<" files \n";
1997 // cout << endl;
1998 // cout << "Working directory: "<< gSystem->WorkingDirectory()<< endl;
1999 return contents;
2000 };
2001 //--------------------------------------
2002 //
2003 //
2004 //--------------------------------------
2005 /**
2006 * Get the Pamela detector chains from a list of files and make them friends.
2007 * @param fl Pointer to a TList of TSystemFiles
2008 * @param detlist String to select trees to be included
2009 * @return Pointer to a TChain
2010 */
2011 TChain *PamLevel2::GetPamTree(TList *fl, TString detlist ){
2012 //
2013 //
2014 //
2015 if ( pam_tree ){
2016 printf("WARNING: TChain *PamLevel2::GetPamTree(TList *fl, TString detlist) -- pam_tree already exists!\n ");
2017 return pam_tree;
2018 };
2019 //
2020
2021 TChain *Trout =0;
2022
2023 // -------------------------------------------
2024 // set flags to include/exclude trees/branches
2025 // -------------------------------------------
2026 if( detlist.Contains("+AUTO", TString::kIgnoreCase) ) {
2027 if( fl->GetEntries()>0 ){
2028 cout << "+AUTO"<<endl;
2029 TFile *fprimo = new TFile( fl->At(0)->GetName() );
2030 GetWhichTrees(fprimo);
2031 fprimo->Close();// AAAAARGGGGGHHHHH!!!!!!! non commentare questa riga, altrimenti si incasina il TChain
2032 fprimo->Delete();
2033 }
2034 };
2035 SetWhichTrees(detlist);
2036
2037
2038 // -------------------------------------------
2039 // build chains
2040 // -------------------------------------------
2041 TChain *T = 0;
2042 TChain *C = 0;
2043 TChain *O = 0;
2044 TChain *R = 0;
2045 TChain *S = 0;
2046 TChain *N = 0;
2047 TChain *A = 0;
2048 TChain *B = 0;
2049 TChain *G = 0;
2050
2051 TChain *L = 0;
2052
2053 if(TRK2||TRK1||TRKh) T = new TChain("Tracker");
2054 if(CAL2||CAL1) C = new TChain("Calorimeter");
2055 if(TOF) O = new TChain("ToF");
2056 if(TRG) R = new TChain("Trigger");
2057 if(S4) S = new TChain("S4");
2058 if(ND) N = new TChain("NeutronD");
2059 if(AC) A = new TChain("Anticounter");
2060 if(ORB) B = new TChain("OrbitalInfo");
2061 if(GP) G = new TChain("h20");
2062 L = new TChain("SelectionList");
2063
2064 // loop over files and create chains
2065 TIter next(fl);
2066 TSystemFile *questo = 0;
2067 while ( (questo = (TSystemFile*) next()) ) {
2068 TString name = questo->GetName();
2069 cout << "File: "<< name << endl;
2070 if( CheckLevel2File(name) ){
2071 if(TRK2||TRK1||TRKh) T->Add(name);
2072 if(CAL1||CAL2) C->Add(name);
2073 if(TOF) O->Add(name);
2074 if(TRG) R->Add(name);
2075 if(S4) S->Add(name);
2076 if(ND) N->Add(name);
2077 if(AC) A->Add(name);
2078 if(ORB) B->Add(name);
2079 if(GP) G->Add(name);
2080 if(SELLI==1) L->Add(name);
2081 };
2082 };
2083
2084 cout << "done chains\n";
2085 cout << "+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+" <<endl;
2086
2087
2088 // -------------------------------------------
2089 // make friends
2090 // -------------------------------------------
2091
2092 // Tracker
2093 cout << "Friends: "<<endl;
2094 if(T && (TRK2||TRK1||TRKh)) {
2095 if(!Trout)Trout=T;
2096 else Trout->AddFriend("Tracker");
2097 // cout << "+Tacker"<<endl;
2098 };
2099 // Calorimeter
2100 if(C && (CAL2||CAL1)) {
2101 if(!Trout)Trout=C;
2102 else Trout->AddFriend("Calorimeter");
2103 // cout << "+Calorimeter"<<endl;
2104 };
2105 // ToF
2106 if(O && TOF) {
2107 if(!Trout)Trout=O;
2108 else Trout->AddFriend("ToF");
2109 // cout << "+ToF"<<endl;
2110 };
2111 // Trigger
2112 if(R && TRG) {
2113 if(!Trout)Trout=O;
2114 else Trout->AddFriend("Trigger");
2115 // cout << "+Trigger"<<endl;
2116 };
2117 // S4
2118 if(S && S4) {
2119 if(!Trout)Trout=O;
2120 else Trout->AddFriend("S4");
2121 // cout << "+S4"<<endl;
2122 };
2123 // Neutron Detector
2124 if(N && ND) {
2125 if(!Trout)Trout=O;
2126 else Trout->AddFriend("NeutronD");
2127 // cout << "+NeutronD"<<endl;
2128 };
2129 // Anticounters
2130 if(A && AC) {
2131 if(!Trout)Trout=O;
2132 else Trout->AddFriend("Anticounter");
2133 // cout << "+Anticounter"<<endl;
2134 };
2135 // Orbital Info
2136 if(B && ORB) {
2137 if(!Trout)Trout=O;
2138 else Trout->AddFriend("OrbitalInfo");
2139 // cout << "+OrbitalInfo"<<endl;
2140 };
2141 // GPamela
2142 if(G && GP) {
2143 if(!Trout)Trout=G;
2144 else Trout->AddFriend("h20");
2145 // cout << "+h20"<<endl;
2146 };
2147
2148 // =====================================
2149 // SET BRANCH-ADDRESS AFTER CHAIN+FRIEND
2150 // =====================================
2151 SetBranchAddress(Trout);
2152
2153
2154 // ------------------------------------
2155 // finally handle selection trees...
2156 // (it is not friend of pamela tree)
2157 // ------------------------------------
2158
2159 cout << "+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+" <<endl;
2160
2161 // Selection List
2162 if(L && SELLI==1) {
2163 cout<<">>> Found selection-list <<<"<<endl;
2164 // L->SetBranchAddress("RunEntry",&irun);
2165 L->SetBranchAddress("RunEntry",&irunt);//NEWNEW
2166 cout << "SelectionList: set branch address RunEntry"<<endl;
2167 L->SetBranchAddress("EventEntry",&irunentry);
2168 cout << "SelectionList: set branch address EventEntry"<<endl;
2169 sel_tree = L;
2170 // if(!Trout)Trout=O;
2171 // else Trout->AddFriend("SelectionList");
2172 cout << "+SelectionList"<<endl;
2173 cout << "+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+" <<endl;
2174 }else{
2175 // cout << "SelectionList : missing tree"<<endl;
2176 if(L)L->Delete();
2177 };
2178
2179 // --------------------------------------------
2180 // return the pamela chain with all the friends
2181 // --------------------------------------------
2182
2183 pam_tree = Trout;
2184
2185 return Trout;
2186 }
2187
2188
2189
2190 //--------------------------------------
2191 //
2192 //
2193 //--------------------------------------
2194 /**
2195 * Set branch addresses for Pamela friend trees
2196 */
2197 void PamLevel2::SetBranchAddress(TTree *t){
2198
2199 TRK2 = TRK2 & t->GetBranchStatus("TrkLevel2");
2200 TRK1 = TRK1 & t->GetBranchStatus("TrkLevel1");
2201 TRKh = TRKh & t->GetBranchStatus("TrkHough");
2202 CAL2 = CAL2 & t->GetBranchStatus("CaloLevel2");
2203 CAL1 = CAL1 & t->GetBranchStatus("CaloLevel1");
2204 TOF = TOF & t->GetBranchStatus("ToFLevel2");
2205 TRG = TRG & t->GetBranchStatus("TrigLevel2");
2206 S4 = S4 & t->GetBranchStatus("S4Level2");
2207 ND = ND & t->GetBranchStatus("NDLevel2");
2208 AC = AC & t->GetBranchStatus("AcLevel2");
2209 ORB = ORB & t->GetBranchStatus("OrbitalInfo");
2210 GP = GP & t->GetBranchStatus("h20");
2211
2212
2213 // Tracker
2214 if(TRK1) {
2215 t->SetBranchAddress("TrkLevel1", GetPointerTo("TrkLevel2"));
2216 cout << "Tracker : set branch address TrkLevel1"<<endl;
2217 };
2218 if(TRK2) {
2219 t->SetBranchAddress("TrkLevel2", GetPointerTo("TrkLevel1"));
2220 cout << "Tracker : set branch address TrkLevel2"<<endl;
2221 };
2222 if(TRKh) {
2223 t->SetBranchAddress("TrkHough", GetPointerTo("TrkHough"));
2224 cout << "Tracker : set branch address TrkHough"<<endl;
2225 };
2226
2227 // Calorimeter
2228 if(CAL1) {
2229 t->SetBranchAddress("CaloLevel1", GetPointerTo("CaloLevel1"));
2230 cout << "Calorimeter : set branch address CaloLevel1"<<endl;
2231 };
2232 if(CAL2) {
2233 t->SetBranchAddress("CaloLevel2", GetPointerTo("CaloLevel2"));
2234 cout << "Calorimeter : set branch address CaloLevel2"<<endl;
2235 };
2236
2237 // ToF
2238 if(TOF) {
2239 t->SetBranchAddress("ToFLevel2", GetPointerTo("ToFLevel2"));
2240 cout << "ToF : set branch address ToFLevel2"<<endl;
2241 };
2242 // Trigger
2243 if(TRG) {
2244 t->SetBranchAddress("TrigLevel2", GetPointerTo("TrigLevel2"));
2245 cout << "Trigger : set branch address TrigLevel2"<<endl;
2246 };
2247 // S4
2248 if(S4) {
2249 t->SetBranchAddress("S4Level2", GetPointerTo("S4Level2"));
2250 cout << "S4 : set branch address S4Level2"<<endl;
2251 };
2252 // Neutron Detector
2253 if(ND) {
2254 t->SetBranchAddress("NDLevel2", GetPointerTo("NDLevel2"));
2255 cout << "NeutronD : set branch address NDLevel2"<<endl;
2256 };
2257 // Anticounters
2258 if(AC) {
2259 t->SetBranchAddress("AcLevel2", GetPointerTo("AcLevel2"));
2260 cout << "Anticounter : set branch address AcLevel2"<<endl;
2261 };
2262 // OrbitalInfo
2263 if(ORB) {
2264 t->SetBranchAddress("OrbitalInfo", GetPointerTo("OrbitalInfo"));
2265 cout << "OrbitalInfo : set branch address OrbitalInfo"<<endl;
2266 };
2267 // GPamela
2268 if(GP) {
2269 // GetPointerTo("GPamela");
2270 if(!gp_obj)gp_obj = new GPamela();
2271 // gp_obj->SetBranchAddress(t); //ho dovuto fare in maniera diversa dagli altri
2272 // // t->SetBranchAddress("GPamela", GetPointerTo("GPamela"));
2273 if(SELLI) t->SetBranchAddress("GPamela", GetPointerTo("GPamela"));
2274 else gp_obj->SetBranchAddress(t); //ho dovuto fare in maniera diversa dagli altri
2275
2276 cout << "h20 : set branch address GPamela "<<endl;
2277 };
2278
2279 }
2280 /**
2281 * Set branch addresses for Pamela friend trees
2282 */
2283 void PamLevel2::SetBranchAddress(TChain *t){
2284
2285 // TRK2 = TRK2 & t->GetBranchStatus("TrkLevel2");
2286 // TRK1 = TRK1 & t->GetBranchStatus("TrkLevel1");
2287 // TRKh = TRKh & t->GetBranchStatus("TrkHough");
2288 // CAL1 = CAL1 & t->GetBranchStatus("CaloLevel1");
2289 // CAL2 = CAL2 & t->GetBranchStatus("CaloLevel2");
2290 // TOF = TOF & t->GetBranchStatus("ToFLevel2");
2291 // TRG = TRG & t->GetBranchStatus("TrigLevel2");
2292 // S4 = S4 & t->GetBranchStatus("S4Level2");
2293 // ND = ND & t->GetBranchStatus("NDLevel2");
2294 // AC = AC & t->GetBranchStatus("AcLevel2");
2295 // ORB = ORB & t->GetBranchStatus("OrbitalInfo");
2296 // GP = GP & t->GetBranchStatus("h20");
2297
2298 // Tracker
2299 if(TRK2) {
2300 t->SetBranchAddress("TrkLevel2", GetPointerTo("TrkLevel2"));
2301 cout << "Tracker : set branch address TrkLevel2"<<endl;
2302 };
2303 if(TRK1) {
2304 t->SetBranchAddress("TrkLevel1", GetPointerTo("TrkLevel1"));
2305 cout << "Tracker : set branch address TrkLevel1"<<endl;
2306 };
2307 if(TRKh) {
2308 t->SetBranchAddress("TrkHough", GetPointerTo("TrkHough"));
2309 cout << "Tracker : set branch address TrkHough"<<endl;
2310 };
2311
2312 // Calorimeter
2313 if(CAL2) {
2314 t->SetBranchAddress("CaloLevel2", GetPointerTo("CaloLevel2"));
2315 cout << "Calorimeter : set branch address CaloLevel2"<<endl;
2316 };
2317 if(CAL1) {
2318 t->SetBranchAddress("CaloLevel1", GetPointerTo("CaloLevel1"));
2319 cout << "Calorimeter : set branch address CaloLevel1"<<endl;
2320 };
2321
2322 // ToF
2323 if(TOF) {
2324 t->SetBranchAddress("ToFLevel2", GetPointerTo("ToFLevel2"));
2325 cout << "ToF : set branch address ToFLevel2"<<endl;
2326 };
2327 // Trigger
2328 if(TRG) {
2329 t->SetBranchAddress("TrigLevel2", GetPointerTo("TrigLevel2"));
2330 cout << "Trigger : set branch address TrigLevel2"<<endl;
2331 };
2332 // S4
2333 if(S4) {
2334 t->SetBranchAddress("S4Level2", GetPointerTo("S4Level2"));
2335 cout << "S4 : set branch address S4Level2"<<endl;
2336 };
2337 // Neutron Detector
2338 if(ND) {
2339 t->SetBranchAddress("NDLevel2", GetPointerTo("NDLevel2"));
2340 cout << "NeutronD : set branch address NDLevel2"<<endl;
2341 };
2342 // Anticounters
2343 if(AC) {
2344 t->SetBranchAddress("AcLevel2", GetPointerTo("AcLevel2"));
2345 cout << "Anticounter : set branch address AcLevel2"<<endl;
2346 };
2347 // OrbitalInfo
2348 if(ORB) {
2349 t->SetBranchAddress("OrbitalInfo", GetPointerTo("OrbitalInfo"));
2350 cout << "OrbitalInfo : set branch address OrbitalInfo"<<endl;
2351 };
2352 // GPamela
2353 // cout <<"GP "<<GP<<endl;
2354 if(GP) {
2355 // GetPointerTo("GPamela");
2356 if(!gp_obj)gp_obj = new GPamela();
2357 if(SELLI) t->SetBranchAddress("GPamela", GetPointerTo("GPamela"));
2358 else gp_obj->SetBranchAddress(t); //ho dovuto fare in maniera diversa dagli altri
2359 // gp_obj->SetBranchAddress(t); //ho dovuto fare in maniera diversa dagli altri
2360 cout << "h20 : set branch address GPamela "<<endl;
2361 };
2362 // SelectionList
2363 // if(SELLI==1){
2364 // t->SetBranchAddress("RunEntry",&irunt);//NEWNEW
2365 // cout << "SelectionList: set branch address RunEntry"<<endl;
2366 // t->SetBranchAddress("EventEntry",&irunentry);
2367 // cout << "SelectionList: set branch address EventEntry"<<endl;
2368
2369 // }
2370
2371 }
2372
2373
2374 //--------------------------------------
2375 //
2376 //
2377 //--------------------------------------
2378 /**
2379 * Get the Run tree chain from a list of files.
2380 * @param fl Pointer to a TList of TSystemFiles
2381 * @return Pointer to a TChain
2382 */
2383 TChain *PamLevel2::GetRunTree(TList *fl){
2384 //
2385 //
2386 //
2387 if ( run_tree ){
2388 printf("WARNING: TChain *PamLevel2::GetRunTree(TList *fl) -- run_tree already exists!\n ");
2389 return run_tree;
2390 };
2391 //
2392
2393
2394 TChain *R = new TChain("Run");
2395
2396 // loop over files and create chains
2397 TIter next(fl);
2398 TSystemFile *questo = 0;
2399 while ( (questo = (TSystemFile*) next()) ) {
2400 TString name = questo->GetName();
2401 // cout << "File: "<< name << endl;
2402 if( CheckLevel2File(name) ){
2403 R->Add(name);
2404 };
2405 }
2406
2407
2408 if(RUN && R->GetNtrees()){
2409
2410 R->SetBranchAddress("RunInfo", GetPointerTo("RunInfo"));
2411 cout << "Run : set branch address RunInfo"<<endl;
2412 R->SetBranchAddress("SoftInfo", GetPointerTo("SoftInfo")); // Emiliano
2413 cout << "Software : set branch address SoftInfo"<<endl; // Emiliano
2414
2415 irunoffset = new int[R->GetNtrees()];
2416 if(DBG){
2417 cout << "----------------------------------------------------"<<endl;
2418 cout << "irun\t | ";
2419 cout << "tree\t |";
2420 // cout << "offset\t |";
2421 cout << "RUN\t";
2422 cout << "FRAG\t";
2423 cout << "NEVENTS\t";
2424 cout << "absolute time\t\t\t";
2425 cout << "on-board time";
2426 cout<<endl;
2427 }
2428 for (Int_t ii=0; ii<R->GetEntries(); ii++){
2429 R->GetEntry(ii);
2430 if(DBG){
2431 cout << ii<< "\t | ";
2432 cout << R->GetTreeNumber()<< "\t |";
2433 // cout << R->GetChainOffset()<< "\t |";
2434 cout <<GetRunInfo()->ID<<"\t";
2435 cout <<GetRunInfo()->ID_RUN_FRAG<<"\t";
2436 cout <<GetRunInfo()->NEVENTS<< "\t";
2437 cout <<GetRunInfo()->RUNHEADER_TIME<<" <---> "<<GetRunInfo()->RUNTRAILER_TIME <<"\t";
2438 cout <<GetRunInfo()->RUNHEADER_OBT<<" <---> "<<GetRunInfo()->RUNTRAILER_OBT<<"\t";
2439 cout <<endl;
2440 }
2441 irunoffset[R->GetTreeNumber()]=R->GetChainOffset();
2442 }
2443 cout << "N.run = "<<R->GetEntries()<<endl;
2444 cout << "----------------------------------------------------"<<endl;
2445
2446
2447 }else{
2448 delete R;
2449 R=0;
2450 }
2451
2452
2453 run_tree = R;
2454
2455 return R;
2456
2457 }
2458 //--------------------------------------
2459 //
2460 //
2461 //--------------------------------------
2462 /**
2463 * Get the Run tree from a file.
2464 * @param f Pointer to a TFile
2465 * @return Pointer to a TTree
2466 */
2467 TTree *PamLevel2::GetRunTree(TFile *f){
2468 if ( run_tree ){
2469 printf("WARNING: TTree *PamLevel2::GetRunTree(TFile *f) -- run_tree already exists!\n ");
2470 return run_tree;
2471 };
2472
2473
2474 cout << "TTree *PamLevel2::GetRunTree(TFile *f) -- obsolte "<<endl;
2475
2476 TTree *T = (TTree*)f->Get("Run");
2477
2478 if(T){
2479 T->SetBranchAddress("RunInfo", GetPointerTo("RunInfo"));
2480 cout << "Run : set branch address RunInfo"<<endl;
2481 T->SetBranchAddress("SoftInfo", GetPointerTo("SoftInfo")); // Emiliano
2482 cout << "Software : set branch address SoftInfo"<<endl; // Emiliano
2483
2484 }
2485
2486 run_tree = (TChain*)T;
2487
2488 return T;
2489
2490 }
2491 /**
2492 * Update the runinfo informations (to be used to have Run infos event by event basis)
2493 * @param run Pointer to the chain/tree which contains run infos
2494 * @return true if a new run has been read, false if it is still the same run
2495 */
2496 Bool_t PamLevel2::UpdateRunInfo(TChain *run, Long64_t iev){
2497 //
2498 // check if we have already called once GetEntry, if not call it
2499 //
2500 cout << "Bool_t PamLevel2::UpdateRunInfo(TChain *run, Long64_t iev) --- ATTENZIONE --- NON E` MANTENUTA!!!!!!!.... "<<endl;
2501 if(!run){
2502 cout << "Bool_t PamLevel2::UpdateRunInfo(TChain *run, ULong64_t iev) -- ERROR -- missing RunInfo tree "<<endl;
2503 return(false);
2504 }
2505 if ( run->GetEntries() <= 0 ) return(false);
2506 //
2507
2508 // Int_t oldrun = irun;
2509 Long64_t oldrun = irun;
2510
2511 // --------------------------------------
2512 // if it is a full file (not preselected)
2513 // --------------------------------------
2514 if(SELLI==0){
2515
2516 //
2517 // the absolute time is necessary to relate the event with the run
2518 //
2519 if( !GetOrbitalInfo() && !ISGP){
2520 cout << "Bool_t PamLevel2::UpdateRunInfo(TChain *run, ULong64_t iev) -- ERROR -- missing OrbitalInfo "<<endl;
2521 return(false);
2522 }
2523
2524 ULong64_t abstime = 0;
2525 if( GetOrbitalInfo() )abstime=GetOrbitalInfo()->absTime;
2526
2527
2528 //
2529 // the first time the routine is called, set run search from the beginning
2530 //
2531 if ( irun < 0LL ){
2532 irun = 0LL;
2533 run->GetEntry(irun);
2534 runfirstentry = 0LL;
2535 runlastentry += (Long64_t)(this->GetRunInfo()->NEVENTS);
2536 if ( (Long64_t)(this->GetRunInfo()->NEVENTS) > 0LL ) runlastentry -= 1LL;
2537
2538 if( ISGP && run->GetEntries()!=1 ){
2539 cout << "** WARNING ** simulated files are assumed to have 1 single run, not "<< run->GetEntries() << endl;
2540 cout << "** WARNING ** run will not be updated"<<endl;
2541 }
2542
2543 };
2544 //
2545 if(ISGP)abstime = GetRunInfo()->RUNHEADER_TIME; // BARBATRUCCO
2546 //
2547 if ( irun == run->GetEntries()-1LL &&
2548 !(abstime >= GetRunInfo()->RUNHEADER_TIME &&
2549 abstime <= GetRunInfo()->RUNTRAILER_TIME)
2550 ){
2551 irun = -1LL;
2552 irunt = -1LL;
2553 runfirstentry = 0LL;
2554 runlastentry = -1LL;
2555 };
2556 // modificato il controllo sull'aggiornamento del run, per evitare problemi
2557 // dovuti agli eventi annidati (NB! NEVENTS conta anche questi!!)
2558 //
2559 bool fromfirst = true;
2560 //
2561 while ( !(abstime >= GetRunInfo()->RUNHEADER_TIME && abstime <= GetRunInfo()->RUNTRAILER_TIME) && irun < run->GetEntries()-1LL ){
2562 // while ( iev > (runfirstentry+(ULong64_t)(this->GetRunInfo()->NEVENTS-1)) && irun < run->GetEntries() ){
2563 irun++;
2564 run->GetEntry(irun);
2565 runfirstentry = runlastentry;
2566 if ( (Long64_t)(this->GetRunInfo()->NEVENTS) > 0LL ) runfirstentry += 1LL;
2567 runlastentry += (Long64_t)(this->GetRunInfo()->NEVENTS);
2568 // cout << " ))))) UPDATE RUN INFO ((((( @iev "<<iev<<" run "<<GetRunInfo()->ID<<" irun "<<irun<<endl;
2569 // cout << "runfirstentry "<<runfirstentry<<endl;
2570 // printf(" iev %llu %u %llu \n",iev,this->GetRunInfo()->NEVENTS,(ULong64_t)(runfirstentry+(ULong64_t)(this->GetRunInfo()->NEVENTS)));
2571 // printf(" abstime %u trailertime %u \n",abstime,GetRunInfo()->RUNTRAILER_TIME);
2572 // printf(" IDRUN %u \n",GetRunInfo()->ID);
2573 //
2574 // prevshift = 0;
2575 //
2576 if ( irun == (Long64_t)(run->GetEntries()-1LL) && fromfirst && !(abstime >= GetRunInfo()->RUNHEADER_TIME && abstime <= GetRunInfo()->RUNTRAILER_TIME)){
2577 printf(" resetting irun (it should NOT happen!!!)\n");
2578 fromfirst = false;
2579 irun = 0;
2580 run->GetEntry(irun);
2581 runfirstentry = 0ULL;
2582 runlastentry += (Long64_t)(this->GetRunInfo()->NEVENTS);
2583 if ( (Long64_t)(this->GetRunInfo()->NEVENTS) > 0LL ) runlastentry -= 1LL;
2584 };
2585 //
2586 };
2587 //
2588 if (
2589 !(abstime >= GetRunInfo()->RUNHEADER_TIME &&
2590 abstime <= GetRunInfo()->RUNTRAILER_TIME)
2591 ) {
2592 printf(" Something very wrong here: cannot find RUN containing absolute time %llu \n",abstime);
2593 return false;
2594 }
2595 //
2596 if ( irun == oldrun || irun >= run->GetEntries() ) return(false);
2597 //
2598 // printf(" iev %llu irun %i nevents %u 1st %llu last %llu \n",iev,irun,this->GetRunInfo()->NEVENTS,(ULong64_t)runfirstentry,(ULong64_t)runlastentry);
2599 //
2600 prevshift = 0;
2601 cout << " ))))) UPDATE RUN INFO ((((( @iev "<<iev<<" run "<<GetRunInfo()->ID<<" irun "<<irun<<endl;
2602 // cout << "runfirstentry "<<runfirstentry<<endl;
2603 return(true);
2604 };
2605 // ----------------------------------------------------
2606 // if it is a preselected file (there is SelectionList)
2607 // NBNB - the event tree MUST be read first
2608 // ----------------------------------------------------
2609 if(SELLI==1){
2610 sel_tree->GetEntry(iev);
2611 // cout << irun << " "<< irunentry << endl;
2612 if(irun != oldrun){
2613 run->GetEntry(irun);
2614 cout << " ))))) UPDATE RUN INFO ((((( @iev "<<iev<<" run "<<GetRunInfo()->ID<<" irun "<<irun<<endl;
2615 prevshift = 0;
2616 return true;
2617 }
2618 return false;
2619 }
2620
2621 return false;
2622 //
2623 };
2624
2625 Bool_t PamLevel2::UpdateRunInfo(Long64_t iev){
2626
2627 if(!run_tree){
2628 cout << " Bool_t PamLevel2::UpdateRunInfo(ULong64_t iev) -- ERROR -- run tree not loaded"<<endl;
2629 return false;
2630 }
2631 if ( run_tree->GetEntries() <= 0 ) {
2632 cout << " Bool_t PamLevel2::UpdateRunInfo(ULong64_t iev) -- ERROR -- run tree is empty"<<endl;
2633 return(false);
2634 }
2635
2636 Int_t oldrun = irun; // store current run index
2637
2638 // -----------------------------------------------------------------------
2639 // the first time the routine is called, set run search from the beginning
2640 // -----------------------------------------------------------------------
2641
2642 if ( irun < 0 ){
2643 irun = 0LL;
2644 irunt = 0LL;
2645 irunentry = 0;
2646 prevshift = 0;
2647 run_tree->GetEntry(irun);
2648 if( !GetOrbitalInfo() )cout << "** WARNING ** missing OrbitalInfo ---> run info might be not correctly updated "<<endl;
2649 if ( gltsync ) delete gltsync; //Emiliano
2650 if(!dbc || (dbc && !dbc->IsConnected()) )SetDBConnection(); //Emiliano
2651 gltsync = new GL_TIMESYNC(GetRunInfo()->ID_ROOT_L0,"ID",dbc,false); //Emiliano // the "false" means not to use level0 file (not necessary here)
2652 if ( dbc ) dbc->Close();// Emiliano
2653 };
2654 // ---------------------------------------------------------------
2655 // retrieve OBT and absolute time of the event
2656 // ---------------------------------------------------------------
2657 ULong64_t abstime = 0LL;
2658 // ULong64_t obt = 0LL; // Emiliano
2659 Long64_t obt = 0LL; // Emiliano, Long64_t GL_TIMESYNC::DBobt(UInt_t obt) since depending on the situation OBT is lowered or boosted
2660 if( GetOrbitalInfo() ){
2661 abstime = GetOrbitalInfo()->absTime;
2662 obt = gltsync->DBobt(GetOrbitalInfo()->OBT); // Emiliano
2663 }else{
2664 abstime = GetRunInfo()->RUNHEADER_TIME;
2665 obt = gltsync->DBobt(GetRunInfo()->RUNHEADER_OBT); // Emiliano
2666 }
2667
2668
2669 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
2670 // if it is a full file (not preselected)
2671 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
2672 if(SELLI==0 || SELLI==2){ // Emiliano
2673
2674 // ---------------------------------------------------------------
2675 // increment dead and live-time counters
2676 // (only when reading a file not preselected)
2677 // ---------------------------------------------------------------
2678 if(SELLI==0){
2679 if( GetTrigLevel2() ){
2680 totdltime[0]+=GetTrigLevel2()->dltime[0];
2681 totdltime[1]+=GetTrigLevel2()->dltime[1];
2682 }
2683 totdltime[2]++;
2684 }
2685
2686 //
2687 bool fromfirst = true; // first loop over runs
2688
2689
2690 // ------------------------------------------------------
2691 // loop over runs to find the one that contains the event
2692 // ------------------------------------------------------
2693 while (
2694 (
2695 // (
2696 // !(abstime >= GetRunInfo()->RUNHEADER_TIME && // check on absolute time (s)
2697 // abstime <= GetRunInfo()->RUNTRAILER_TIME) &&
2698 // !(obt >= GetRunInfo()->RUNHEADER_OBT && // additional check on OBT (ms)
2699 // obt <= GetRunInfo()->RUNTRAILER_OBT)
2700 // )
2701
2702 !(abstime >= GetRunInfo()->RUNHEADER_TIME && // check on absolute time (s)
2703 abstime <= GetRunInfo()->RUNTRAILER_TIME)
2704 ||
2705 !(obt >= gltsync->DBobt(GetRunInfo()->RUNHEADER_OBT) && // additional check on OBT (ms) // Emiliano
2706 obt <= gltsync->DBobt(GetRunInfo()->RUNTRAILER_OBT)) // Emiliano
2707 ||
2708 GetRunInfo()->NEVENTS==0
2709 // || !(irunentry < GetRunInfo()->NEVENTS-1-prevshift) // ERRORE!!! fa saltare i run con 1 evento
2710 ||
2711 !(irunentry <= GetRunInfo()->NEVENTS-1-prevshift)
2712 )
2713 && irun < run_tree->GetEntries() ){
2714
2715
2716 // if( !(abstime >= GetRunInfo()->RUNHEADER_TIME &&abstime <= GetRunInfo()->RUNTRAILER_TIME) )cout << "ABS TIME "<<abstime << " " <<GetRunInfo()->RUNTRAILER_TIME <<endl;
2717 // if( !(obt >= GetRunInfo()->RUNHEADER_OBT && obt <= GetRunInfo()->RUNTRAILER_OBT) )cout << "OBT TIME "<< obt <<" "<< GetRunInfo()->RUNTRAILER_OBT << endl;
2718 // if( GetRunInfo()->NEVENTS==0 )cout <<"GetRunInfo()->NEVENTS==0 "<<endl;
2719 // if( !(irunentry <= GetRunInfo()->NEVENTS-1-prevshift) ) cout << "irunentry > "<<GetRunInfo()->NEVENTS-1-prevshift << endl;
2720 // - - - - - - - - - - - - -
2721 // irunentry = position of current entry, relative to the run
2722 // prevshift = shift needed to synchronize l0 and l2 data (nested events)
2723 // - - - - - - - - - - - - -
2724
2725 // -----------------------------------------
2726 // store dead and live-time of previous run
2727 // -----------------------------------------
2728 // if(SELLI==0){
2729 if(SELLI!=2){
2730 if(fromfirst){
2731 if(oldrun==irun){
2732 /// decrement counters
2733 if( GetTrigLevel2()){
2734 totdltime[0]-=GetTrigLevel2()->dltime[0];//live-time
2735 totdltime[1]-=GetTrigLevel2()->dltime[1];//dead-time
2736 }
2737 totdltime[2]--; //event counter
2738 cout << endl;
2739 cout << "n.events : "<<totdltime[2]<<endl;
2740 cout << "RUN LIVE-TIME: "<<totdltime[0]*0.16<<" ms"<<endl;
2741 cout << "RUN DEAD-TIME: "<<totdltime[1]*0.01<<" ms"<<endl;
2742 }else{
2743 totdltime[0]=0;//live-time
2744 totdltime[1]=0;//dead-time
2745 totdltime[2]=0; //event counter
2746 cout << " *** JUMP RUN *** irun "<<irun<<endl;
2747 }
2748 /// add an entry
2749 if(run_tree_clone)
2750 if(run_tree_clone->GetBranch("DeadLiveTime")->GetEntries() < run_tree->GetEntries())
2751 run_tree_clone->GetBranch("DeadLiveTime")->Fill();
2752 /// reset counters
2753 if( GetTrigLevel2() ){
2754 totdltime[0]=GetTrigLevel2()->dltime[0];//live-time
2755 totdltime[1]=0; //dead-time
2756 }
2757 totdltime[2]=1; //event counter
2758 }
2759 }
2760 // }
2761
2762 irun++;
2763 // ------------------------------------
2764 // if the end of run tree is reached...
2765 // ------------------------------------
2766 if( irun == run_tree->GetEntries() ){
2767 if(!fromfirst){
2768 // -----------------------------------------------------
2769 // if it happened already once and the run was not found
2770 // ---> exit with error
2771 // -----------------------------------------------------
2772 cout << "Bool_t PamLevel2::UpdateRunInfo(Long64_t iev) -- ERROR -- event entry #"<<iev<<" does not belong to any run (should not happen)" <<endl;
2773 return false;
2774 }
2775 // -----------------------------------------
2776 // ...otherwise repeat search from beginning
2777 // -----------------------------------------
2778 cout << "Bool_t PamLevel2::UpdateRunInfo(Long64_t iev) -- WARNING -- reached end of run tree. searchin again from beginning " <<endl;
2779 fromfirst = false;
2780 irun = 0LL;
2781 runfirstentry = 0LL;
2782 }
2783 // -------------------------------------------------------------------
2784 // save the index of the first entry of the run, relative to pam_tree,
2785 // and read a new run
2786 // -------------------------------------------------------------------
2787 if(irun>0)runfirstentry += (GetRunInfo()->NEVENTS)-prevshift;
2788 irunentry = 0;
2789 prevshift = 0;
2790 run_tree->GetEntry(irun);//update runinfo
2791 irunt = irun - irunoffset[run_tree->GetTreeNumber()];
2792 if ( gltsync ) delete gltsync; // Emiliano
2793 if(!dbc || (dbc && !dbc->IsConnected()) )SetDBConnection(); //Emiliano
2794 gltsync = new GL_TIMESYNC(GetRunInfo()->ID_ROOT_L0,"ID",dbc,false); // Emiliano
2795 if ( dbc ) dbc->Close(); // Emiliano
2796 if(gltsync->DBobt(GetRunInfo()->RUNHEADER_OBT)>gltsync->DBobt(GetRunInfo()->RUNTRAILER_OBT) ){ // Emiliano
2797 cout << "Bool_t PamLevel2::UpdateRunInfo(Long64_t iev) -- WARNING -- irun "<<irun<<" has RUNHEADER_OBT>=RUNTRAILER_OBT " <<endl;
2798 cout << " (NB!! in this case some events are assigned to a wrong run)"<<endl;
2799 }
2800 // if(hasfrag && fragid != GetRunInfo()->ID){
2801 // cout << "... where is the next fragment ??"<<endl;
2802 // }
2803 };
2804
2805
2806 // --------------------------------------
2807 // if there was no need to update the run
2808 // ---> exit with FALSE
2809 // --------------------------------------
2810 if ( irun == oldrun ) return(false);
2811
2812 // --------------------------------------
2813 // ... otherwise
2814 // --------------------------------------
2815
2816
2817 // --------------------------------------
2818 // ---> exit with TRUE
2819 // --------------------------------------
2820 if(DBG)cout << endl << " ))))) UPDATE RUN INFO ((((( @iev "<<iev<<" run "<<GetRunInfo()->ID<<" irun "<<irun<<endl;
2821 // ----------------------------------------------------
2822 // update the tracker parameters
2823 // (non ho trovato nessun altro modo sicuro di farlo...)
2824 // ----------------------------------------------------
2825 if(!dbc || (dbc && !dbc->IsConnected()) )SetDBConnection();
2826 TrkParams::Set(GetRunInfo() ,dbc);
2827 if(dbc)dbc->Close();
2828
2829 // ----------------------------------------------------
2830 // then check if the run has a fragment
2831 // in this case we have to switch to the next fragment
2832 // when the end of the first fragment is reached
2833 // ----------------------------------------------------
2834 if(
2835 GetRunInfo()->ID_RUN_FRAG != 0 &&
2836 // GetRunInfo()->ID_RUN_FRAG != GetRunInfo()->ID &&
2837 DBG &&
2838 true ){
2839 cout << "* fragment *"<<endl;
2840 }
2841
2842 return(true);
2843 };
2844 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
2845 // if it is a preselected file (there is SelectionList)
2846 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
2847 // irun = run entry relative to the chain
2848 // irunt = run entry relative to the tree
2849 if(SELLI==1){
2850 sel_tree->GetEntry(iev);// read irunt from SelectionList
2851 irun = irunt + irunoffset[sel_tree->GetTreeNumber()];//NEWNEW
2852 if(irun != oldrun ){
2853 if( irun < run_tree->GetEntries() )run_tree->GetEntry(irun);
2854 // check if the time is ok (with merged files it is not...)
2855 // if not loop over run and look for the proper entry
2856 bool SECONDO_GIRO=false;
2857 // Long64_t irun_start = irun;
2858 int offset_start = irunoffset[sel_tree->GetTreeNumber()];
2859 while (
2860 (
2861 (
2862 !(abstime >= GetRunInfo()->RUNHEADER_TIME && // check on absolute time (s)
2863 abstime <= GetRunInfo()->RUNTRAILER_TIME)
2864 // ||
2865 // !(obt >= GetRunInfo()->RUNHEADER_OBT && // additional check on OBT (ms)
2866 // obt <= GetRunInfo()->RUNTRAILER_OBT)
2867 )
2868 || GetRunInfo()->NEVENTS==0
2869 )
2870 // && irun < run_tree->GetEntries()
2871 ){
2872
2873 if(DBG){
2874 cout << " (test) ";
2875 cout << " tree "<<sel_tree->GetTreeNumber();
2876 cout << " irunt "<<irunt;
2877 cout << " offset "<<irunoffset[sel_tree->GetTreeNumber()];
2878 cout << " abs "<<abstime;
2879 cout <<" >> "<<GetRunInfo()->RUNHEADER_TIME<<" "<<GetRunInfo()->RUNTRAILER_TIME;
2880 cout << " obt "<<obt;
2881 cout <<" >> "<<GetRunInfo()->RUNHEADER_OBT<<" "<<GetRunInfo()->RUNTRAILER_OBT;
2882 cout << " *** JUMP RUN *** irun "<<irun;
2883 cout << endl;
2884 }
2885 // irun++;
2886 irunoffset[sel_tree->GetTreeNumber()]++;
2887 irun = irunt + irunoffset[sel_tree->GetTreeNumber()];//NEWNEW
2888 if(irun == run_tree->GetEntries() && SECONDO_GIRO){
2889 // if(irun == irun_start ){
2890 cout << " ...grrrvzzkhhhajsdkj!!!! "<<endl;
2891 irunoffset[sel_tree->GetTreeNumber()] = offset_start;
2892 return false;
2893 }
2894 if( irun >= run_tree->GetEntries() || irun < 0){
2895 cout << "irun = "<<irun<<" >> search from the beginning... <<"<<endl;
2896 SECONDO_GIRO=true;
2897 irun=0;
2898 irunoffset[sel_tree->GetTreeNumber()]=-irunt;
2899 }
2900 run_tree->GetEntry(irun);
2901 }
2902
2903
2904 if(DBG){
2905 cout << " (test) ";
2906 cout << " tree "<<sel_tree->GetTreeNumber();
2907 cout << " irunt "<<irunt;
2908 cout << " offset "<<irunoffset[sel_tree->GetTreeNumber()];
2909 cout << " abs "<<abstime;
2910 cout <<" >> "<<GetRunInfo()->RUNHEADER_TIME<<" "<<GetRunInfo()->RUNTRAILER_TIME;
2911 cout << " obt "<<obt;
2912 cout <<" >> "<<GetRunInfo()->RUNHEADER_OBT<<" "<<GetRunInfo()->RUNTRAILER_OBT;
2913 }
2914 if(DBG)cout << endl;
2915 if(DBG)cout << endl << " ))))) UPDATE RUN INFO ((((( @iev "<<iev<<" run "<<GetRunInfo()->ID<<" (run-entry "<<irun<<")"<<endl;
2916 // ----------------------------------------------------
2917 // update the tracker parameters
2918 // (non ho trovato nessun altro modo sicuro di farlo...)
2919 // ----------------------------------------------------
2920 if(!dbc || (dbc && !dbc->IsConnected()) )SetDBConnection();
2921 TrkParams::Set(GetRunInfo() ,dbc);
2922 if(dbc)dbc->Close();
2923 // cout << endl;
2924 prevshift = 0;
2925 return true;
2926 }
2927 return false;
2928 }
2929
2930 return false;
2931 //
2932 };
2933 /**
2934 * Update the runinfo informations (to be used to have Run infos event by event basis)
2935 * @param run Pointer to the chain/tree which contains run infos
2936 * @return true if a new run has been read, false if it is still the same run
2937 */
2938 Bool_t PamLevel2::UpdateRunInfo(TTree *run, Long64_t iev){
2939 return(UpdateRunInfo((TChain*)run,iev));
2940 };
2941
2942 //--------------------------------------
2943 //
2944 //
2945 //--------------------------------------
2946 /**
2947 * Set which trees shoul be analysed
2948 * @param detlist TString containing the sequence of trees required
2949 */
2950 void PamLevel2::SetWhichTrees(TString detlist){
2951
2952 // if(detlist.IsNull() || detlist.Contains("+ALL", TString::kIgnoreCase)){
2953 if( detlist.Contains("+ALL", TString::kIgnoreCase)){
2954
2955 cout << " ======================================================== "<<endl;
2956 cout << " (( WARNING )) "<<endl;
2957 cout << " The meaning of the option +ALL has changed!! "<<endl;
2958 cout << " Now it includes really all (level0+level1+level2+gpamela)"<<endl;
2959 cout << " and the file is discarded if it does not contain "<<endl;
2960 cout << " all trees or if level0 files are not available!! "<<endl;
2961 cout << " ======================================================== "<<endl;
2962
2963 CAL0 = true;
2964 CAL1 = true;
2965 CAL2 = true;
2966 TRK2 = true;
2967 TRK1 = true;
2968 TRKh = true;
2969 TRK0 = true;
2970 TRG = true;
2971 TOF = true;
2972 TOF0 = true;
2973 S4 = true;
2974 ND = true;
2975 AC = true;
2976 ORB = true;
2977 GP = true;
2978 }else if( detlist.Contains("-ALL", TString::kIgnoreCase) ){
2979 CAL0 = false;
2980 CAL1 = false;
2981 CAL2 = false;
2982 TRK2 = false;
2983 TRK1 = false;
2984 TRKh = false;
2985 TRK0 = false;
2986 TRG = false;
2987 TOF = false;
2988 TOF0 = false;
2989 S4 = false;
2990 ND = false;
2991 AC = false;
2992 ORB = false;
2993 GP = false;
2994 };
2995
2996 // -------------------------------------------------------------------------
2997 if( detlist.Contains("CAL1", TString::kIgnoreCase) ){
2998 if ( detlist.Contains("-CAL1", TString::kIgnoreCase) )CAL1=false;
2999 if ( detlist.Contains("+CAL1", TString::kIgnoreCase) )CAL1=true;
3000 };
3001
3002 if( detlist.Contains("CAL0", TString::kIgnoreCase) ){
3003 if ( detlist.Contains("-CAL0", TString::kIgnoreCase) )CAL0=false;
3004 if ( detlist.Contains("+CAL0", TString::kIgnoreCase) )CAL0=true;
3005 };
3006
3007 if( detlist.Contains("CAL2", TString::kIgnoreCase)){
3008 if ( detlist.Contains("-CAL2", TString::kIgnoreCase) )CAL2=false;
3009 if ( detlist.Contains("+CAL2", TString::kIgnoreCase) )CAL2=true;
3010 };
3011
3012 if( detlist.Contains("+CAL", TString::kIgnoreCase) && !CAL1 && !CAL2 )CAL2=true;
3013 if( detlist.Contains("-CAL", TString::kIgnoreCase) && CAL1 && CAL2 ){
3014 CAL2=false;
3015 CAL1=false;
3016 }
3017 // -------------------------------------------------------------------------
3018 if( detlist.Contains("TRK0", TString::kIgnoreCase) ){
3019 if ( detlist.Contains("-TRK0", TString::kIgnoreCase) )TRK0=false;
3020 if ( detlist.Contains("+TRK0", TString::kIgnoreCase) )TRK0=true;
3021 };
3022
3023 if( detlist.Contains("TRK1", TString::kIgnoreCase) ){
3024 if ( detlist.Contains("-TRK1", TString::kIgnoreCase) )TRK1=false;
3025 if ( detlist.Contains("+TRK1", TString::kIgnoreCase) )TRK1=true;
3026 };
3027
3028 if( detlist.Contains("TRK2", TString::kIgnoreCase)){
3029 if ( detlist.Contains("-TRK2", TString::kIgnoreCase) )TRK2=false;
3030 if ( detlist.Contains("+TRK2", TString::kIgnoreCase) )TRK2=true;
3031 };
3032
3033 if( detlist.Contains("TRKh", TString::kIgnoreCase)){
3034 if ( detlist.Contains("-TRKh", TString::kIgnoreCase) )TRKh=false;
3035 if ( detlist.Contains("+TRKh", TString::kIgnoreCase) )TRKh=true;
3036 };
3037
3038 if( detlist.Contains("+TRK", TString::kIgnoreCase) && !TRK1 && !TRK2 && !TRKh )TRK2=true;
3039 if( detlist.Contains("-TRK", TString::kIgnoreCase) && TRK1 && TRK2 && TRKh){
3040 TRK2=false;
3041 TRK1=false;
3042 TRKh=false;
3043 }
3044 // -------------------------------------------------------------------------
3045
3046 if( detlist.Contains("-TRG", TString::kIgnoreCase) )TRG = false;
3047 else if( detlist.Contains("+TRG", TString::kIgnoreCase) )TRG = true;
3048
3049 if( detlist.Contains("-TOF", TString::kIgnoreCase) )TOF = false;
3050 else if( detlist.Contains("+TOF", TString::kIgnoreCase) )TOF = true;
3051
3052 if( detlist.Contains("-TOF0", TString::kIgnoreCase) )TOF0 = false;
3053 else if( detlist.Contains("+TOF0", TString::kIgnoreCase) )TOF0 = true;
3054
3055 if( detlist.Contains("-S4", TString::kIgnoreCase) )S4 = false;
3056 else if( detlist.Contains("+S4", TString::kIgnoreCase) )S4 = true;
3057
3058 if( detlist.Contains("-ND", TString::kIgnoreCase) )ND = false;
3059 else if( detlist.Contains("+ND", TString::kIgnoreCase) )ND = true;
3060
3061 if( detlist.Contains("-AC", TString::kIgnoreCase) )AC = false;
3062 else if( detlist.Contains("+AC", TString::kIgnoreCase) )AC = true;
3063
3064 if( detlist.Contains("-ORB", TString::kIgnoreCase) )ORB = false;
3065 else if( detlist.Contains("+ORB", TString::kIgnoreCase) )ORB = true;
3066
3067 if( detlist.Contains("-GP", TString::kIgnoreCase) )GP = false;
3068 else if( detlist.Contains("+GP", TString::kIgnoreCase) )GP = true;
3069
3070 cout<< "tree/branch list from input --> ";
3071 if(TRK0)cout<<"TRK0 ";
3072 if(TRK1)cout<<"TRK1 ";
3073 if(TRK2)cout<<"TRK2 ";
3074 if(TRKh)cout<<"TRKH ";
3075 if(CAL0)cout<<"CAL0 ";
3076 if(CAL1)cout<<"CAL1 ";
3077 if(CAL2)cout<<"CAL2 ";
3078 if(TOF)cout<<"TOF ";
3079 if(TRG)cout<<"TRG ";
3080 if(AC)cout<<"AC ";
3081 if(ND)cout<<"ND ";
3082 if(S4)cout<<"S4 ";
3083 if(ORB)cout<<"ORB ";
3084 if(GP)cout<<"GP ";
3085 cout << endl;
3086 // cout<< "Set detector list --> ";
3087 // if(TRK1)cout<<"TRK1 ";
3088 // if(TRK2)cout<<"TRK2 ";
3089 // if(TRKh)cout<<"TRKH ";
3090 // if(CAL1)cout<<"CAL1 ";
3091 // if(CAL2)cout<<"CAL2 ";
3092 // if(TOF0)cout<<"TOF0 ";
3093 // if(TOF)cout<<"TOF ";
3094 // if(TRG)cout<<"TRG ";
3095 // if(AC)cout<<"AC ";
3096 // if(ND)cout<<"ND ";
3097 // if(S4)cout<<"S4 ";
3098 // if(ORB)cout<<"ORB ";
3099 // cout << endl;
3100
3101 };
3102
3103
3104 /**
3105 * Set tree/branch detector flags from the content of a tree
3106 */
3107 void PamLevel2::GetWhichTrees(TFile* f){
3108
3109
3110
3111 // cout << "void PamLevel2::GetWhichTrees(TFile* f) --- WARNING!! --- ...potrebbe non funzionare "<<endl;
3112 // -----------
3113 // reset flags
3114 // -----------
3115 CAL1 = false;
3116 CAL2 = false;
3117 TRK2 = false;
3118 TRK1 = false;
3119 TRKh = false;
3120 TRG = false;
3121 TOF = false;
3122 S4 = false;
3123 ND = false;
3124 AC = false;
3125 ORB = false;
3126 GP = false;
3127
3128 RUN = false;
3129
3130 // cout << "Checking file: "<<f->GetName()<<endl;
3131 if( !f || f->IsZombie() ){
3132 cout << "File: "<< f->GetName() <<" Non valid root file"<< endl;
3133 return;
3134 }
3135
3136 TList *lk = f->GetListOfKeys();
3137 if(!lk)return;
3138 TIter next(lk);
3139 TKey *key =0;
3140
3141 Int_t nev = 0;
3142
3143 while( (key = (TKey*)next()) ){
3144
3145 if( !strcmp(key->GetName(),"Run" ) )RUN = true;
3146
3147 //=========================================================
3148 if( !strcmp(key->GetName(),"Trigger" ) ){
3149 TRG = true;
3150 Int_t nevt = ((TTree*)f->Get("Trigger"))->GetEntries();
3151 if( nev && nevt!=nev){
3152 cout << "File: "<< f->GetName() <<" Trigger tree has "<<nevt<<" events instead of "<<nev<< endl;
3153 TRG = false;
3154 }else nev=nevt;
3155 }
3156 //=========================================================
3157 if( !strcmp(key->GetName(),"ToF" ) ){
3158 TOF = true;
3159 Int_t nevt = ((TTree*)f->Get("ToF"))->GetEntries();
3160 if( nev && nevt!=nev){
3161 cout << "File: "<< f->GetName() <<" ToF tree has "<<nevt<<" events instead of "<<nev<< endl;
3162 TOF = false;
3163 }else nev=nevt;
3164 }
3165 //=========================================================
3166 if( !strcmp(key->GetName(),"S4" ) ){
3167 S4 = true;
3168 Int_t nevt = ((TTree*)f->Get("S4"))->GetEntries();
3169 if( nev && nevt!=nev){
3170 cout << "File: "<< f->GetName() <<" S4 tree has "<<nevt<<" events instead of "<<nev<< endl;
3171 S4 = false;
3172 }else nev=nevt;
3173 }
3174 //=========================================================
3175
3176 if( !strcmp(key->GetName(),"NeutronD" ) ){
3177 ND = true;
3178 Int_t nevt = ((TTree*)f->Get("NeutronD"))->GetEntries();
3179 if( nev && nevt!=nev){
3180 cout << "File: "<< f->GetName() <<"NeutronD tree has "<<nevt<<" events instead of "<<nev<< endl;
3181 ND =false;
3182 }else nev=nevt;
3183 }
3184 //=========================================================
3185 if( !strcmp(key->GetName(),"Anticounter") ){
3186 AC = true;
3187 Int_t nevt = ((TTree*)f->Get("Anticounter"))->GetEntries();
3188 if( nev && nevt!=nev){
3189 cout << "File: "<< f->GetName() <<" Anticounter tree has "<<nevt<<" events instead of "<<nev<< endl;
3190 AC =false;
3191 }else nev=nevt;
3192 }
3193 //=========================================================
3194 if( !strcmp(key->GetName(),"OrbitalInfo") ){
3195 ORB = true;
3196 Int_t nevt = ((TTree*)f->Get("OrbitalInfo"))->GetEntries();
3197 if( nev && nevt!=nev){
3198 cout << "File: "<< f->GetName() <<" OrbitalInfo tree has "<<nevt<<" events instead of "<<nev<< endl;
3199 ORB = false;
3200 }else nev=nevt;
3201 }
3202 //=========================================================
3203 if( !strcmp(key->GetName(),"Tracker" ) ){
3204 TTree *T = (TTree*)f->Get("Tracker");
3205 for(Int_t i=0; i<T->GetListOfBranches()->GetEntries(); i++){
3206 TString name = T->GetListOfBranches()->At(i)->GetName();
3207 if( !name.CompareTo("TrkLevel1") )TRK1=true;
3208 if( !name.CompareTo("TrkLevel2") )TRK2=true;
3209 if( !name.CompareTo("TrkHough") )TRKh=true;
3210 };
3211 Int_t nevt = T->GetEntries();
3212 if( nev && nevt!=nev){
3213 cout << "File: "<< f->GetName() <<" Tracker tree has "<<nevt<<" events instead of "<<nev<< endl;
3214 TRK1 = false;
3215 TRK2 = false;
3216 TRKh = false;
3217 }else nev=nevt;
3218 // T->Delete();
3219 };
3220 //=========================================================
3221 if( !strcmp(key->GetName(),"Calorimeter" ) ){
3222 TTree *T = (TTree*)f->Get("Calorimeter");
3223 for(Int_t i=0; i<T->GetListOfBranches()->GetEntries(); i++){
3224 TString name = T->GetListOfBranches()->At(i)->GetName();
3225 if( !name.CompareTo("CaloLevel1") )CAL1=true;
3226 if( !name.CompareTo("CaloLevel2") )CAL2=true;
3227 };
3228 Int_t nevt = T->GetEntries();
3229 if( nev && nevt!=nev){
3230 cout << "File: "<< f->GetName() <<" Calorimeter tree has "<<nevt<<" events instead of "<<nev<< endl;
3231 CAL1 = false;
3232 CAL2 = false;
3233 }else nev=nevt;
3234 // T->Delete();
3235 };
3236 //=========================================================
3237 if( !strcmp(key->GetName(),"h20") ){
3238 GP = true;
3239 Int_t nevt = ((TTree*)f->Get("h20"))->GetEntries();
3240 if( nev && nevt!=nev){
3241 cout << "File: "<< f->GetName() <<" h20 tree has "<<nevt<<" events instead of "<<nev<< endl;
3242 GP = false;
3243 }else nev=nevt;
3244 }
3245
3246 };
3247
3248 // delete lk;
3249
3250 cout<< "tree/branch list from file --> ";
3251 if(TRK1)cout<<"TRK1 ";
3252 if(TRK2)cout<<"TRK2 ";
3253 if(TRKh)cout<<"TRKH ";
3254 if(CAL1)cout<<"CAL1 ";
3255 if(CAL2)cout<<"CAL2 ";
3256 if(TOF)cout<<"TOF ";
3257 if(TRG)cout<<"TRG ";
3258 if(AC)cout<<"AC ";
3259 if(ND)cout<<"ND ";
3260 if(S4)cout<<"S4 ";
3261 if(ORB)cout<<"ORB ";
3262 if(GP)cout<<"GP ";
3263 cout << endl;
3264
3265 return ;
3266
3267 };
3268
3269
3270 //--------------------------------------
3271 //
3272 //
3273 //--------------------------------------
3274 /**
3275 * Check if a file contains selected Pamela Level2 trees.
3276 * @param name File name
3277 * @return true if the file is ok.
3278 */
3279 Bool_t PamLevel2::CheckLevel2File(TString name){
3280
3281 Bool_t CAL1__ok = false;
3282 Bool_t CAL2__ok = false;
3283 Bool_t TRK2__ok = false;
3284 Bool_t TRK1__ok = false;
3285 Bool_t TRKh__ok = false;
3286 Bool_t TRG__ok = false;
3287 Bool_t TOF__ok = false;
3288 Bool_t S4__ok = false;
3289 Bool_t ND__ok = false;
3290 Bool_t AC__ok = false;
3291 Bool_t ORB__ok = false;
3292 Bool_t GP__ok = false;
3293
3294 Bool_t RUN__ok = false;
3295
3296 Bool_t SELLI__ok = false;
3297
3298 // cout << "Checking file: "<<name<<endl;
3299 TFile *f = new TFile(name.Data());
3300 if( !f || f->IsZombie() ){
3301 cout << "File: "<< f->GetName() <<" discarded ---- Non valid root file"<< endl; return false;
3302 }
3303 // cout << "Get list of keys: "<<f<<endl;
3304 TList *lk = f->GetListOfKeys();
3305 // lk->Print();
3306 TIter next(lk);
3307 TKey *key =0;
3308
3309 Int_t nev = 0;
3310
3311 while( (key = (TKey*)next()) ){
3312
3313 // cout << key->GetName() << endl;
3314 // cout << key->GetName() << ""<<key->GetClassName()<<endl;
3315 // cout << " Get tree: " << f->Get(key->GetName())<<endl;
3316 // nev_previous = nev;
3317 // cout << " n.entries "<< nev <<endl;
3318 // if( key->GetClassName()=="TTree" && nev_previous && nev != nev_previous ){
3319 // nev = ((TTree*)f->Get(key->GetName()))->GetEntries();
3320 // cout << "File: "<< f->GetName() <<" discarded ---- "<< key->GetName() << " tree: n.entries does not match "<<nev<<" "<<nev_previous<< endl;
3321 // return false;
3322 // };
3323
3324 //=========================================================
3325 // check if the file
3326
3327
3328 if( !strcmp(key->GetName(),"Run" ) )RUN__ok = true;
3329
3330 //=========================================================
3331 if( !strcmp(key->GetName(),"SelectionList" ) ){
3332 SELLI__ok = true;
3333 if(SELLI==1){
3334 Int_t nevt = ((TTree*)f->Get("SelectionList"))->GetEntries();
3335 if( nev && nevt!=nev){
3336 cout << "File: "<< f->GetName() <<" discarded ---- SelectionList tree has "<<nevt<<" events instead of "<<nev<< endl;
3337 return false;
3338 }
3339 nev=nevt;
3340 }
3341 }
3342
3343 //=========================================================
3344 if( !strcmp(key->GetName(),"Trigger" ) ){
3345 TRG__ok = true;
3346 if(TRG){
3347 Int_t nevt = ((TTree*)f->Get("Trigger"))->GetEntries();
3348 if( nev && nevt!=nev){
3349 cout << "File: "<< f->GetName() <<" discarded ---- Trigger tree has "<<nevt<<" events instead of "<<nev<< endl;
3350 return false;
3351 }
3352 nev=nevt;
3353 }
3354 }
3355 //=========================================================
3356 if( !strcmp(key->GetName(),"ToF" ) ){
3357 TOF__ok = true;
3358 if(TOF){
3359 Int_t nevt = ((TTree*)f->Get("ToF"))->GetEntries();
3360 if( nev && nevt!=nev){
3361 cout << "File: "<< f->GetName() <<" discarded ---- ToF tree has "<<nevt<<" events instead of "<<nev<< endl;
3362 return false;
3363 }
3364 nev=nevt;
3365 }
3366 }
3367 //=========================================================
3368 if( !strcmp(key->GetName(),"S4" ) ){
3369 S4__ok = true;
3370 if(S4){
3371 Int_t nevt = ((TTree*)f->Get("S4"))->GetEntries();
3372 if( nev && nevt!=nev){
3373 cout << "File: "<< f->GetName() <<" discarded ---- S4 tree has "<<nevt<<" events instead of "<<nev<< endl;
3374 return false;
3375 }
3376 nev=nevt;
3377 }
3378 }
3379 //=========================================================
3380
3381 if( !strcmp(key->GetName(),"NeutronD" ) ){
3382 ND__ok = true;
3383 if(ND){
3384 Int_t nevt = ((TTree*)f->Get("NeutronD"))->GetEntries();
3385 if( nev && nevt!=nev){
3386 cout << "File: "<< f->GetName() <<" discarded ---- NeutronD tree has "<<nevt<<" events instead of "<<nev<< endl;
3387 return false;
3388 }
3389 nev=nevt;
3390 }
3391 }
3392 //=========================================================
3393 if( !strcmp(key->GetName(),"Anticounter") ){
3394 AC__ok = true;
3395 if(AC){
3396 Int_t nevt = ((TTree*)f->Get("Anticounter"))->GetEntries();
3397 if( nev && nevt!=nev){
3398 cout << "File: "<< f->GetName() <<" discarded ---- Anticounter tree has "<<nevt<<" events instead of "<<nev<< endl;
3399 return false;
3400 }
3401 nev=nevt;
3402 }
3403 }
3404 //=========================================================
3405 if( !strcmp(key->GetName(),"OrbitalInfo") ){
3406 ORB__ok = true;
3407 if(ORB){
3408 Int_t nevt = ((TTree*)f->Get("OrbitalInfo"))->GetEntries();
3409 if( nev && nevt!=nev){
3410 cout << "File: "<< f->GetName() <<" discarded ---- OrbitalInfo tree has "<<nevt<<" events instead of "<<nev<< endl;
3411 return false;
3412 }
3413 nev=nevt;
3414 }
3415 }
3416 //=========================================================
3417 if( !strcmp(key->GetName(),"Tracker" ) ){
3418 TTree *T = (TTree*)f->Get("Tracker");
3419 if(TRK1||TRK2||TRKh){
3420 Int_t nevt = T->GetEntries();
3421 if( nev && nevt!=nev){
3422 cout << "File: "<< f->GetName() <<" discarded ---- Tracker tree has "<<nevt<<" events instead of "<<nev<< endl;
3423 return false;
3424 }
3425 nev=nevt;
3426 }
3427 for(Int_t i=0; i<T->GetListOfBranches()->GetEntries(); i++){
3428 TString name = T->GetListOfBranches()->At(i)->GetName();
3429 if( !name.CompareTo("TrkLevel1") )TRK1__ok=true;
3430 if( !name.CompareTo("TrkLevel2") )TRK2__ok=true;
3431 if( !name.CompareTo("TrkHough") )TRKh__ok=true;
3432 };
3433 T->Delete();
3434 };
3435 //=========================================================
3436 if( !strcmp(key->GetName(),"Calorimeter" ) ){
3437 TTree *T = (TTree*)f->Get("Calorimeter");
3438 if(CAL1||CAL2){
3439 Int_t nevt = T->GetEntries();
3440 if( nev && nevt!=nev){
3441 cout << "File: "<< f->GetName() <<" discarded ---- Calorimeter tree has "<<nevt<<" events instead of "<<nev<< endl;
3442 return false;
3443 }
3444 nev=nevt;
3445 }
3446 for(Int_t i=0; i<T->GetListOfBranches()->GetEntries(); i++){
3447 TString name = T->GetListOfBranches()->At(i)->GetName();
3448 if( !name.CompareTo("CaloLevel1") )CAL1__ok=true;
3449 if( !name.CompareTo("CaloLevel2") )CAL2__ok=true;
3450 };
3451 T->Delete();
3452 };
3453 //=========================================================
3454 if( !strcmp(key->GetName(),"h20") ){
3455 ISGP = true;
3456 GP__ok = true;
3457 if(GP){
3458 Int_t nevt = ((TTree*)f->Get("h20"))->GetEntries();
3459 if( nev && nevt!=nev){
3460 cout << "File: "<< f->GetName() <<" discarded ---- h20 tree has "<<nevt<<" events instead of "<<nev<< endl;
3461 return false;
3462 }
3463 nev=nevt;
3464 }
3465 }
3466
3467 };
3468
3469 if( SELLI==-1 )SELLI = (Int_t)SELLI__ok;
3470 if( SELLI==0 && SELLI__ok ){
3471 cout << "File: "<< f->GetName() <<" discarded ---- found SelectionList (it is not a full-event file)" << endl;
3472 return false;
3473 }
3474 if( SELLI==1 && !SELLI__ok ){
3475 cout << "File: "<< f->GetName() <<" discarded ---- SelectionList missing" << endl;
3476 return false;
3477 }
3478
3479 // cout << "SELLI "<<SELLI<<endl;
3480
3481 // cout<< "CheckLevel2File(TString): detector list --> ";
3482 // if(TRK1__ok)cout<<"TRK1 ";
3483 // if(TRK2__ok)cout<<"TRK2 ";
3484 // if(TRKh__ok)cout<<"TRKH ";
3485 // if(CAL1__ok)cout<<"CAL1 ";
3486 // if(CAL2__ok)cout<<"CAL2 ";
3487 // if(TOF__ok)cout<<"TOF ";
3488 // if(TRG__ok)cout<<"TRG ";
3489 // if(AC__ok)cout<<"AC ";
3490 // if(ND__ok)cout<<"ND ";
3491 // if(S4__ok)cout<<"S4 ";
3492 // if(ORB__ok)cout<<"ORB ";
3493 // cout << endl;
3494
3495
3496 if(TRK2 && TRK1__ok)TRK1=1;
3497 // ----------------------------------------------------------------------------
3498 // NOTA
3499 // se c'e` il level1, lo devo necessarimente leggere.
3500 // infatti (non ho capito perche`) i cluster vengono letti e allocati in memoria
3501 // comunque, ma non vengono disallocati da PamLevel2::Clear()
3502 // ----------------------------------------------------------------------------
3503
3504
3505 if(!RUN__ok) {
3506 cout << "File: "<< f->GetName() <<" *WARNING* ---- Missing RunInfo tree (NB: RUN infos will not be updated)"<< endl;
3507 RUN = false;
3508 };
3509
3510 if(CAL1 && !CAL1__ok){
3511 cout << "File: "<< f->GetName() <<" discarded ---- Missing CaloLevel1 branch"<< endl;
3512 return false;
3513 };
3514 if(CAL2 && !CAL2__ok){
3515 cout << "File: "<< f->GetName() <<" discarded ---- Missing CaloLevel2 branch"<< endl;
3516 return false;
3517 };
3518 if(TRK2 && !TRK2__ok){
3519 cout << "File: "<< f->GetName() <<" discarded ---- Missing TrkLevel2 branch"<< endl;
3520 return false;
3521 };
3522 if(TRK1 && !TRK1__ok){
3523 cout << "File: "<< f->GetName() <<" discarded ---- Missing TrkLevel1 branch"<< endl;
3524 return false;
3525 };
3526 if(TRKh && !TRKh__ok){
3527 cout << "File: "<< f->GetName() <<" discarded ---- Missing TrkHough branch"<< endl;
3528 return false;
3529 };
3530 if(ORB && !ORB__ok){
3531 cout << "File: "<< f->GetName() <<" discarded ---- Missing ORB tree"<< endl;
3532 return false;
3533 };
3534 if(AC && !AC__ok){
3535 cout << "File: "<< f->GetName() <<" discarded ---- Missing AC tree"<< endl;
3536 return false;
3537 };
3538 if(S4 && !S4__ok){
3539 cout << "File: "<< f->GetName() <<" discarded ---- Missing S4 tree"<< endl;
3540 return false;
3541 };
3542 if(TOF && !TOF__ok){
3543 cout << "File: "<< f->GetName() <<" discarded ---- Missing ToF tree"<< endl;
3544 return false;
3545 };
3546
3547 if(ND && !ND__ok){
3548 cout << "File: "<< f->GetName() <<" discarded ---- Missing ND tree"<< endl;
3549 return false;
3550 };
3551 if(TRG && !TRG__ok){
3552 cout << "File: "<< f->GetName() <<" discarded ---- Missing Trigger tree"<< endl;
3553 return false;
3554 };
3555 if(GP && !GP__ok){
3556 cout << "File: "<< f->GetName() <<" discarded ---- Missing h20 tree"<< endl;
3557 return false;
3558 };
3559
3560
3561 // lk->Delete();
3562 // delete lk;
3563 f->Close();
3564
3565 // cout<< "CheckLevel2File(TString): detector list --> ";
3566 // if(TRK1)cout<<"TRK1 ";
3567 // if(TRK2)cout<<"TRK2 ";
3568 // if(TRKh)cout<<"TRKH ";
3569 // if(CAL1)cout<<"CAL1 ";
3570 // if(CAL2)cout<<"CAL2 ";
3571 // if(TOF)cout<<"TOF ";
3572 // if(TRG)cout<<"TRG ";
3573 // if(AC)cout<<"AC ";
3574 // if(ND)cout<<"ND ";
3575 // if(S4)cout<<"S4 ";
3576 // if(ORB)cout<<"ORB ";
3577 // if(GP)cout<<"GP ";
3578 // cout << endl;
3579
3580 return true;
3581
3582 };
3583
3584
3585 /**
3586 * Create clone-trees
3587 */
3588 void PamLevel2::CreateCloneTrees0( TChain *fChain, TFile *ofile ){
3589
3590 cout << "+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+" <<endl;
3591 cout << "Create clones of PAMELA trees "<<endl;
3592
3593 Int_t i=0;
3594 pam_tree_clone[i] = fChain->GetTree()->CloneTree(0);
3595 TString name = pam_tree_clone[i]->GetName();
3596 name.Append("_clone");
3597 // pam_tree_clone[i]->SetName(name.Data());
3598 cout << pam_tree_clone[i]->GetName() <<endl;
3599 i++;
3600
3601 TList *li = fChain->GetListOfFriends();
3602 TIter next(li);
3603 TFriendElement* T_friend=0;
3604 ofile->cd();
3605 while( (T_friend = (TFriendElement*)next()) ){
3606 // cout<<T_friend->IsA()->GetName()<<" "<<T_friend->GetName()<<hex << T_friend->GetTree() << dec<<endl;
3607 // cout<<T_friend->GetTree()->GetName()<< endl;
3608 pam_tree_clone[i] = T_friend->GetTree()->CloneTree(0);
3609 pam_tree_clone[i]->SetAutoSave(1000000);
3610 name = pam_tree_clone[i]->GetName();
3611 name.Append("_clone");
3612 // pam_tree_clone[i]->SetName(name.Data());
3613 cout << pam_tree_clone[i]->GetName() << endl;
3614 i++;
3615 }
3616
3617 delete li;
3618
3619 cout << "+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+" <<endl;
3620
3621 }
3622
3623 /**
3624 * Create clone-trees
3625 */
3626 void PamLevel2::CreateCloneTrees(TFile *ofile){
3627
3628
3629 // if the pointer is null, create a default file
3630 if(!run_tree)return;
3631
3632 if(!ofile){
3633 cout << "void PamLevel2::CreateCloneTrees(TFile*) -- WARNING -- Creating file: clone-tree.root "<<endl;
3634 ofile = new TFile("clone-tree.root","recreate");
3635 }
3636
3637 ofile->cd();
3638
3639 cout << "+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+" <<endl;
3640 cout << "Create new PAMELA trees "<<endl;
3641
3642
3643 run_tree_clone = new TTree("Run","PAMELA Level2 data from the GL_RUN table ");
3644 run_tree_clone->Branch("RunInfo","GL_RUN",GetPointerTo("RunInfo"));
3645 cout << "Run : branch RunInfo"<<endl;
3646 run_tree_clone->Branch("SoftInfo","SoftInfo",GetPointerTo("SoftInfo"));
3647 cout << "Run : branch SoftInfo"<<endl;
3648 // ------------------
3649 // replicate run tree
3650 // ------------------
3651 // cout << "----------------------------------------------------"<<endl;
3652 // cout << "irun\t | RUN\t NEVENTS\t absolute time"<<endl;
3653 for (Int_t i=0; i<run_tree->GetEntries(); i++){
3654 run_tree->GetEntry(i);
3655 // cout << i<< "\t | "<<GetRunInfo()->ID<<"\t "<<GetRunInfo()->NEVENTS<< "\t "<<GetRunInfo()->RUNHEADER_TIME<<" <---> "<<GetRunInfo()->RUNTRAILER_TIME<<endl;
3656 run_tree_clone->Fill();
3657 }
3658 cout << "----------------------------------------------------"<<endl;
3659
3660 // ------------------------------------
3661 // add branch with dead and live times
3662 // ------------------------------------
3663 if ( SELLI != 2 ){ // EMILIANO
3664 run_tree_clone->Branch("DeadLiveTime",totdltime,"dltime[3]/l");
3665 cout << "Run : branch DeadLiveTime"<<endl;
3666
3667
3668 sel_tree_clone = new TTree("SelectionList","List of selected events ");
3669 // sel_tree_clone->Branch("RunEntry",&irun,"runentry/L");
3670 sel_tree_clone->Branch("RunEntry",&irunt,"runentry/L");//NEWNEW
3671 sel_tree_clone->Branch("EventEntry",&irunentry,"eventry/L");
3672 };
3673
3674 Int_t i=0;
3675 if(TRK1||TRK2||TRKh){
3676 pam_tree_clone[i] = new TTree("Tracker","PAMELA tracker level2 data ");
3677 if(TRK1) {
3678 pam_tree_clone[i]->Branch("TrkLevel1","TrkLevel1", GetPointerTo("TrkLevel1"));
3679 pam_tree_clone[i]->BranchRef();
3680 cout << "Tracker : branch TrkLevel1"<<endl;
3681 // cout << "CreateCloneTrees " << GetTrkLevel1()<<endl;
3682 };
3683 if(TRK2) {
3684 pam_tree_clone[i]->Branch("TrkLevel2", "TrkLevel2",GetPointerTo("TrkLevel2"));
3685 cout << "Tracker : branch TrkLevel2"<<endl;
3686 };
3687 if(TRKh) {
3688 pam_tree_clone[i]->Branch("TrkHough","TrkHough", GetPointerTo("TrkHough"));
3689 cout << "Tracker : branch TrkHough"<<endl;
3690 };
3691 i++;
3692 }
3693
3694 // Calorimeter
3695 if(CAL1||CAL2){
3696 pam_tree_clone[i] = new TTree("Calorimeter","PAMELA calorimeter level2 data ");
3697 if(CAL1) {
3698 pam_tree_clone[i]->Branch("CaloLevel1", "CaloLevel1", GetPointerTo("CaloLevel1"));
3699 cout << "Calorimeter : branch CaloLevel1"<<endl;
3700 };
3701 if(CAL2) {
3702 pam_tree_clone[i]->Branch("CaloLevel2","CaloLevel2", GetPointerTo("CaloLevel2"));
3703 cout << "Calorimeter : branch CaloLevel2"<<endl;
3704 };
3705 i++;
3706 }
3707
3708 // ToF
3709 if(TOF) {
3710 pam_tree_clone[i] = new TTree("ToF","PAMELA ToF level2 data ");
3711 pam_tree_clone[i]->Branch("ToFLevel2","ToFLevel2", GetPointerTo("ToFLevel2"));
3712 cout << "ToF : branch ToFLevel2"<<endl;
3713 i++;
3714 };
3715 // Trigger
3716 if(TRG) {
3717 pam_tree_clone[i] = new TTree("Trigger","PAMELA trigger level2 data ");
3718 pam_tree_clone[i]->Branch("TrigLevel2","TrigLevel2", GetPointerTo("TrigLevel2"));
3719 cout << "Trigger : branch TrigLevel2"<<endl;
3720 i++;
3721 };
3722 // S4
3723 if(S4) {
3724 pam_tree_clone[i] = new TTree("S4","PAMELA S4 level2 data ");
3725 pam_tree_clone[i]->Branch("S4Level2","S4Level2", GetPointerTo("S4Level2"));
3726 cout << "S4 : branch S4Level2"<<endl;
3727 i++;
3728 };
3729 // Neutron Detector
3730 if(ND) {
3731 pam_tree_clone[i] = new TTree("NeutronD","PAMELA neutron detector level2 data ");
3732 pam_tree_clone[i]->Branch("NDLevel2","NDLevel2", GetPointerTo("NDLevel2"));
3733 cout << "NeutronD : branch NDLevel2"<<endl;
3734 i++;
3735 };
3736 // Anticounters
3737 if(AC) {
3738 pam_tree_clone[i] = new TTree("Anticounter","PAMELA anticounter detector level2 data ");
3739 pam_tree_clone[i]->Branch("AcLevel2","AcLevel2", GetPointerTo("AcLevel2"));
3740 cout << "Anticounter : branch AcLevel2"<<endl;
3741 i++;
3742 };
3743 // OrbitalInfo
3744 if(ORB) {
3745 pam_tree_clone[i] = new TTree("OrbitalInfo","PAMELA orbital info ");
3746 pam_tree_clone[i]->Branch("OrbitalInfo","OrbitalInfo", GetPointerTo("OrbitalInfo"));
3747 cout << "OrbitalInfo : branch OrbitalInfo"<<endl;
3748 i++;
3749 };
3750 // GPamela
3751 if(GP) {
3752 pam_tree_clone[i] = new TTree("h20","GPAMELA info ");
3753 pam_tree_clone[i]->Branch("GPamela","GPamela", GetPointerTo("GPamela"),32000,1);//split
3754 cout << "OrbitalInfo : branch OrbitalInfo"<<endl;
3755 i++;
3756 };
3757 cout << "+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+" <<endl;
3758
3759 }
3760
3761
3762 /**
3763 * Fill tree (created with CreateCloneTrees)
3764 *
3765 */
3766 //void PamLevel2::FillNewPamTree(TTree *T){
3767 void PamLevel2::FillCloneTrees(){
3768
3769 // cout << "PamLevel2::FillCloneTrees()" << irunentry << endl;
3770
3771 for(Int_t i=0; i<NCLONES; i++){
3772 if(pam_tree_clone[i])pam_tree_clone[i]->Fill();
3773 }
3774 if(sel_tree_clone)sel_tree_clone->Fill();
3775
3776 }
3777
3778
3779 TTree* PamLevel2::GetCloneTree(TString name){
3780
3781 for(Int_t i=0; i<NCLONES; i++){
3782 if(pam_tree_clone[i]){
3783 TString na = pam_tree_clone[i]->GetName();
3784 if(!name.CompareTo(na))return pam_tree_clone[i];
3785 };
3786 }
3787 if(run_tree_clone){
3788 TString na = run_tree_clone->GetName();
3789 if(!name.CompareTo(na))return run_tree_clone;
3790 }
3791 if(sel_tree_clone){
3792 TString na = sel_tree_clone->GetName();
3793 if(!name.CompareTo(na))return sel_tree_clone;
3794 }
3795 return NULL;
3796
3797 }
3798 void PamLevel2::WriteCloneTrees(){
3799 cout << "+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+" <<endl;
3800 cout << "Write clones of PAMELA trees "<<endl;
3801 cout << run_tree_clone->GetName()<<endl;
3802 if ( SELLI != 2){// Emiliano
3803 if(run_tree_clone->GetBranch("DeadLiveTime")->GetEntries() < run_tree->GetEntries())
3804 run_tree_clone->GetBranch("DeadLiveTime")->Fill();
3805 };
3806 run_tree_clone->Write();
3807 if ( SELLI != 2){ //Emiliano
3808 cout << sel_tree_clone->GetName()<<endl;
3809 sel_tree_clone->Write();
3810 };
3811 for(Int_t i=0; i<NCLONES; i++){
3812 if(pam_tree_clone[i]){
3813 cout << pam_tree_clone[i]->GetName()<<endl;
3814 pam_tree_clone[i]->Write();
3815 };
3816 }
3817 cout << "+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+" <<endl;
3818
3819 }
3820
3821 /**
3822 * Method to get level2-trees entry, the corresponding run entry and (if required) the level0 entry.
3823 */
3824 //Int_t PamLevel2::GetEntry(Int_t iee){
3825 Int_t PamLevel2::GetEntry(Long64_t iee){
3826
3827 // cout << "-------------------------------------"<<endl;
3828 // cout << "Int_t PamLevel2::GetEntry("<<iee<<")"<<endl;
3829
3830 if(!pam_tree){
3831 cout << " Int_t PamLevel2::GetEntry(Int_t) -- ERROR -- level2 trees not loaded"<<endl;
3832 return 0;
3833 }
3834
3835
3836 //
3837 // This is a sort of bug: if you don't have the run tree you don't want to exit here you want to have loaded the event anyway...
3838 //
3839 // if(!run_tree ){
3840 // cout << " Int_t PamLevel2::GetEntry(Int_t) -- ERROR -- run tree not loeaded"<<endl;
3841 // return 0;
3842 // }
3843
3844 Long64_t ii=0;
3845 //-------------------------------
3846 ii = iee;
3847 if( !pam_tree->GetEntry(ii) ){
3848 cout << " Int_t PamLevel2::GetEntry(Int_t) -- ERROR -- error reading pam tree"<<endl;
3849 return 0;
3850 }
3851 //
3852 // ... that's way I put it here. Notice that nothing change in the code (is backward compatible) since in any case you return with 0.
3853 // in theory one would like to return 1 if run is not loaded but now I don't have the will to add that 2 lines of code and it is not
3854 // a problem if you don't check the return code of getentry.
3855 //
3856 if(!RUN || !run_tree ){
3857 if ( TRK0 || CAL0 || TOF0 || RUN ) { //forse cosi` va bene per tornare 1?
3858 cout << " Int_t PamLevel2::GetEntry(Int_t) -- ERROR -- run tree not loaded"<<endl;
3859 return 0;
3860 } else {
3861 return 1; //cosi` se non c'e` run esce qua...
3862 }
3863 }
3864
3865 //-------------------------------
3866 ii = iee;
3867 // Bool_t UPDATED = UpdateRunInfo(run_tree,ii);
3868 // Bool_t UPDATED = UpdateRunInfo(ii);
3869 UpdateRunInfo(ii);
3870 if(SELLI==0||SELLI==2)irunentry = iee-runfirstentry;
3871 // if(UPDATED && run_tree_clone)run_tree_clone->Fill();
3872
3873 // cout << "PamLevel2::GetEntry("<<iee<<") "<<irun<<" "<<runfirstentry<<" "<<irunentry<<endl;
3874
3875 // cout << "irunentry "<<irunentry << endl;
3876 // cout << "runfirstentry "<<runfirstentry << endl;
3877 // cout << "nevents "<<GetRunInfo()->NEVENTS<< endl;
3878
3879 // if( TRK0 || CAL0 || TOF0 ){
3880 // if( !GetYodaEntry( ) ){
3881 // cout << " Int_t PamLevel2::GetEntry(Int_t) -- ERROR -- error reading level0 tree"<<endl;
3882 // return 0;
3883 // }
3884 // }
3885
3886
3887 return 1;
3888
3889 }
3890
3891 TrkLevel0 *PamLevel2::GetTrkLevel0(){
3892 if( !TRK0 )return NULL;
3893 if( !GetYodaEntry( ) ){
3894 cout << " Int_t PamLevel2::GetTrkLevel0() -- ERROR -- error reading level0 tree"<<endl;
3895 return 0;
3896 }
3897 return trk0_obj;
3898 };
3899 CaloLevel0 *PamLevel2::GetCaloLevel0(){
3900 if( !CAL0 )return NULL;
3901 if( !GetYodaEntry( ) ){
3902 cout << " Int_t PamLevel2::GetCaloLevel0() -- ERROR -- error reading level0 tree"<<endl;
3903 return 0;
3904 }
3905 return calo0_obj;
3906 };
3907
3908
3909 /**
3910 * Method to retrieve the level0 tree (YODA tree) that contains the current event.
3911 * Given the run ID (...), if needed it query the DB and load the proper file.
3912 * @return Pointer to the tree
3913 */
3914
3915
3916 TTree* PamLevel2::GetYodaTree( ){
3917
3918 // cout << "TTree* PamLevel2::GetYodaTree( )"<<endl;
3919 //===================================
3920 // check if iroot has changed
3921 //===================================
3922 if( irun<0 ){
3923 cout << "PamLevel2::GetYodaTree() -- ERROR -- irun = "<<irun<<endl;
3924 // cout << "In order to use this method you have to first load the RunInfo tree "<<endl;
3925 return NULL;
3926 }
3927 Int_t irootnew = run_obj->ID_ROOT_L0;
3928 // cout << "iroot "<<iroot<<endl;
3929 // cout << "irootnew "<<irootnew<<endl;
3930
3931 //===================================
3932 // load the level0 file
3933 // (if not already loaded)
3934 //===================================
3935 if( iroot != irootnew || !l0_tree){
3936 iroot = irootnew;
3937 //===================================
3938 // open the DB connection
3939 // (if not already opened)
3940 //===================================
3941 if(!dbc || (dbc && !dbc->IsConnected()))SetDBConnection();
3942 GL_ROOT glroot = GL_ROOT();
3943 if( glroot.Query_GL_ROOT(iroot,dbc) ){
3944 cout << "TTree* PamLevel2::GetYodaTree( ) -- ERROR -- level0 file iroot = "<<iroot<< " does not exists"<<endl;
3945 return NULL;
3946 };
3947 TString filename = glroot.PATH + glroot.NAME;
3948 if(l0_file){
3949 l0_file->Close();
3950 l0_file->Delete();
3951 }
3952 cout << "Opening LEVEL0 file: "<< filename << endl;
3953 FileStat_t t;
3954 if( gSystem->GetPathInfo(filename.Data(),t) ){
3955 cout << " PamLevel2::GetYodaTree() -- ERROR opening file "<<endl;
3956 return NULL;
3957 }
3958 l0_file = new TFile(filename);
3959 if( !l0_file )return NULL;
3960 l0_tree = (TTree*)l0_file->Get("Physics");
3961 if(!h0_obj)h0_obj = new EventHeader();
3962 l0_tree->SetBranchAddress("Header" ,&h0_obj);
3963 prevshift = 0;
3964 //---------------------------------------------------
3965 // TRACKER:
3966 if(TRK0){
3967 if(!trk0_obj){
3968 trk0_obj = new TrkLevel0();
3969 trk0_obj->Set();
3970 };
3971 l0_tree->SetBranchAddress("Tracker" ,trk0_obj->GetPointerToTrackerEvent());
3972 }
3973 //--------------------------------------------------
3974 // CALORIMETER:
3975 if(CAL0){
3976 if(!calo0_obj){
3977 calo0_obj = new CaloLevel0();
3978 calo0_obj->Set();
3979 };
3980 l0_tree->SetBranchAddress("Calorimeter" ,calo0_obj->GetPointerToCalorimeterEvent());
3981 // cout << "PamLevel2::GetYodaTree() --- level0 calorimeter not implemented "<<endl;
3982 }
3983 //---------------------------------------------------
3984 // TOF:
3985 if(TOF0){
3986 cout << "PamLevel2::GetYodaTree() --- level0 TOF not implemented "<<endl;
3987 }
3988
3989 dbc->Close(); // EMILIANO, do not leave open connections, open only when needed
3990
3991
3992 };
3993
3994 // if(!dbc || (dbc && !dbc->IsConnected())){
3995 // cout << " TTree* PamLevel2::GetYodaTree( ) -- no DB connected... hai fatto qualche cazzata "<<endl;
3996 // }
3997
3998 if ( TRK0 ){
3999 // TrkParams::Load(6);
4000 // if( !TrkParams::IsLoaded(6) ){
4001 // cout << " TTree* PamLevel2::GetYodaTree( ) -- WARNING -- VK-mask not loaded"<<endl;
4002 // };
4003 // if(!dbc || (dbc && !dbc->IsConnected()))SetDBConnection();
4004 TrkParams::SetCalib(run_obj,dbc);
4005 TrkParams::LoadCalib( );
4006 if( !TrkParams::CalibIsLoaded() ){
4007 cout << " TTree* PamLevel2::GetYodaTree( ) -- WARNING -- Calibration not loaded"<<endl;
4008 };
4009 // if(dbc)dbc->Close(); // EMILIANO, do not leave open connections, open only when needed
4010 }
4011
4012
4013 // cout << l0_tree << endl;
4014 return l0_tree;
4015
4016 }
4017
4018 /**
4019 * Method to retrieve the level0 tree (YODA tree) that contains the current event.
4020 */
4021 Int_t PamLevel2::GetYodaEntry(){
4022
4023 // cout << "Int_t PamLevel2::GetYodaEntry()"<<endl;
4024 if(!GetYodaTree())return 0;
4025
4026 // patch
4027 if( irunentry < 0){
4028 // cout << "Int_t PamLevel2::GetYodaEntry() -- ATTENZIONE -- irunentry negativo?!?! "<<(Int_t)irunentry<<endl;
4029 irunentry=0LL;
4030 }
4031 // ---------------------------------
4032 // if file is NOT a preselected file
4033 // ---------------------------------
4034 Long64_t quellagiusta = irunentry + (Long64_t)(run_obj->EV_FROM);
4035 // cout << " irunentry "<<irunentry<<endl;
4036 // cout << " EV_FROM "<<run_obj->EV_FROM<<endl;
4037 // cout << " quellagiusta = irunentry + EV_FROM "<< quellagiusta << endl;
4038
4039 // cout << " irun "<< irun << " irunentry "<< irunentry<<" run_obj->EV_FROM "<<run_obj->EV_FROM <<" quella giusta "<<quellagiusta << endl;
4040 // cout << " iroot "<<iroot<<" run_obj->ID_ROOT_L0 "<<run_obj->ID_ROOT_L0<<endl;
4041 // cout << " time "<< abstime << endl;
4042 // cout << " trk_calib_used "<<run_obj->TRK_CALIB_USED<< endl;
4043
4044 ULong64_t obt = 0;
4045 ULong64_t pktn = 0;
4046 if( GetOrbitalInfo() ){
4047 obt = GetOrbitalInfo()->OBT;
4048 pktn = GetOrbitalInfo()->pkt_num;
4049 }
4050
4051 if( !GetOrbitalInfo() && !ISGP){
4052 cout << "Int_t PamLevel2::GetYodaEntry() -- ERROR -- missing OrbitalInfo "<<endl;
4053 return 0;
4054 }
4055 if( obt==0 && pktn==0 && !ISGP ){
4056 cout << "Int_t PamLevel2::GetYodaEntry() -- ERROR -- level2 event corrupted ?? "<<endl;
4057 return 0;
4058 }
4059
4060 // ---------------------------------------------------------------------
4061 // ATTENTION!!!
4062 // If data are not pre-processed with cleaner, the level0 tree may contain
4063 // spurious nested physics packets.
4064 // The GL_RUN variables EV_FROM, EV_TO and NEVENTS counts also these entries
4065 // while level2 tree DOES NOT!!
4066 // This means that "quellagiusta" in these cases is not correct.
4067 // In order to retrieve the correct level0 event, I implemented a check
4068 // of the OBT and pkt-number. In case of mismatch, the level0 entry number
4069 // is shift forward until when the packets match.
4070 // ---------------------------------------------------------------------
4071 Int_t answer = 0;
4072 Int_t shift =0;
4073 // printf(" siamo qui %i %i \n",shift,prevshift);
4074 // Int_t maxshift = 50; // EMILIANO
4075 do{
4076 if(shift>0){
4077 cout << " PKTNUM L2 --- "<< pktn << " --- L0 --- "<< GetEventHeader()->GetPscuHeader()->GetCounter()<<endl;
4078 if(DBG)cout << " RUN: ID "<< GetRunInfo()->ID << " ID_ROOT_L0 "<<run_obj->ID_ROOT_L0<<" ID_RUN_FRAG "<<GetRunInfo()->ID_RUN_FRAG << " EV_FROM "<<GetRunInfo()->EV_FROM <<endl;
4079 if(DBG)cout << " L2 <--> L0 mismatch ( irun "<<irun<<" irunentry "<<irunentry<<" shift "<<shift<<" prevshift "<<prevshift<<" )"<<endl;
4080 }
4081 answer = l0_tree->GetEntry(quellagiusta+(Long64_t)shift+(Long64_t)prevshift);
4082 shift++;
4083 if( !GetEventHeader() ){
4084 cout << "Int_t PamLevel2::GetYodaEntry() -- ERROR -- missing EventHeader "<<endl;
4085 return 0;
4086 }
4087
4088 if(ISGP){
4089 obt = (UInt_t)(GetEventHeader()->GetPscuHeader()->GetOrbitalTime()); //BARBATRUCCO
4090 pktn = (UInt_t)(GetEventHeader()->GetPscuHeader()->GetCounter()); //BARBATRUCCO
4091 }
4092
4093 // cout << "PKTNUM "<<shift<<" == L2 --- "<< pktn << " --- L0 --- "<< GetEventHeader()->GetPscuHeader()->GetCounter()<<endl;
4094 // cout << " L2 --- "<< obt << " --- L0 --- "<< GetEventHeader()->GetPscuHeader()->GetOrbitalTime()<<endl;
4095 // if( (quellagiusta+shift) == l0_tree->GetEntries()+1 )cout << ">>> end of level0 tree <<<"<<endl;
4096 // cout << " obt "<< obt << endl;
4097 // cout << " GetEventHeader()->GetPscuHeader()->GetOrbitalTime() "<< GetEventHeader()->GetPscuHeader()->GetOrbitalTime() << endl;
4098 // cout << " pktn "<< pktn << endl;
4099 // cout << " GetEventHeader()->GetPscuHeader()->GetCounter() "<< GetEventHeader()->GetPscuHeader()->GetCounter() << endl;
4100 // printf(" IDRUN %u \n",GetRunInfo()->ID);
4101 //
4102 if ( prevshift != 0 && (quellagiusta+(Long64_t)shift) == GetYodaTree()->GetEntries() ){
4103 prevshift = 0;
4104 shift = -1;
4105 };
4106
4107 }while( ( obt != (UInt_t)(GetEventHeader()->GetPscuHeader()->GetOrbitalTime()) ||
4108 pktn != (UInt_t)(GetEventHeader()->GetPscuHeader()->GetCounter()) )
4109 && (quellagiusta+(Long64_t)shift) < GetYodaTree()->GetEntries() && shift < maxshift);
4110
4111 if ( (quellagiusta+(Long64_t)shift+(Long64_t)prevshift) > GetYodaTree()->GetEntries() || shift == maxshift ) {
4112 cout << " Big trouble here, no such event in Level0 data! (NB maxshift set to "<<maxshift<<" )" <<endl;
4113 return 0;
4114 }
4115 // cout << "LA ENTRY GIUSTA E`: "<<quellagiusta<<" (spero...)"<<endl;
4116 // return GetYodaTree()->GetEntry(quellagiusta);
4117 if ( shift > 1 ) prevshift += (shift-1);
4118
4119 return answer;
4120
4121 }
4122 /**
4123 * \Brief Set DB connection
4124 */
4125 Bool_t PamLevel2::SetDBConnection(){
4126
4127 // cout << "PamLevel2::SetDBConnection()" << endl;
4128 if(DBG){
4129 cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<<endl;
4130 cout<<"Connecting to DB"<<endl;
4131 cout<<"HOST "<<host<<endl;
4132 cout<<"USER "<<user<<endl;
4133 cout<<"PSW "<<psw<<endl;
4134 }
4135 dbc = TSQLServer::Connect(host.Data(),user.Data(),psw.Data());
4136 if( !dbc )return false;
4137 if( !dbc->IsConnected() )return false;
4138 stringstream myquery; // EMILIANO
4139 myquery.str(""); // EMILIANO
4140 myquery << "SET time_zone='+0:00'"; // EMILIANO
4141 dbc->Query(myquery.str().c_str()); // EMILIANO
4142 if(DBG)cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<<endl;
4143 return true;
4144
4145 }
4146
4147 /**
4148 * \Brief Add a friend to the pamela chain.
4149 * @param cname name of the chain to be added
4150 */
4151
4152 TChain* PamLevel2::AddFriend(TString cname){
4153
4154 if(!GetPamTree()){
4155 cout << " TChain* PamLevel2::AddFriend(TString cname) --- a pamela tree must be created first"<<endl;
4156 return NULL;
4157 }
4158
4159
4160 TChain *c = new TChain( cname.Data() );
4161
4162 TIter next( GetPamTree()->GetListOfFiles() );
4163 Int_t nf = 0;
4164 TChainElement* element = 0;
4165 while ((element = (TChainElement*) next())) {
4166 c->Add(element->GetTitle());
4167 nf++;
4168 }
4169
4170 GetPamTree()->AddFriend(cname.Data());
4171
4172 cout << "external chain created and added to pamela friends :"<<cname<<endl;
4173 cout << "n.files "<<nf<<endl;
4174
4175
4176 return c;
4177
4178 }
4179
4180

  ViewVC Help
Powered by ViewVC 1.1.23