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

Contents of /PamelaLevel2/src/PamLevel2.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.5 - (show annotations) (download)
Mon Oct 9 08:57:42 2006 UTC (18 years, 4 months ago) by pam-fi
Branch: MAIN
Changes since 1.4: +68 -201 lines
some bugs fixed + added RunInfo and TrkLevel2

1 #include <PamLevel2.h>
2 //--------------------------------------
3 //
4 //
5 //--------------------------------------
6 /**
7 * Default constructor
8 */
9 PamTrack::PamTrack(){
10 trk_track = this->TrkTrack::GetTrkTrack();
11 calo_track = this->CaloTrkVar::GetCaloTrkVar();
12 tof_track = this->ToFTrkVar::GetToFTrkVar();
13 };
14 //--------------------------------------
15 //
16 //
17 //--------------------------------------
18 /**
19 * Constructor
20 */
21 PamTrack::PamTrack(TrkTrack* t, CaloTrkVar* c, ToFTrkVar* o){
22 trk_track = this->TrkTrack::GetTrkTrack();
23 calo_track = this->CaloTrkVar::GetCaloTrkVar();
24 tof_track = this->ToFTrkVar::GetToFTrkVar();
25 if(t) *trk_track = *t;
26 if(c) *calo_track = *c;
27 if(o) *tof_track = *o;
28 };
29
30 //--------------------------------------
31 //
32 //
33 //--------------------------------------
34 /**
35 * Constructor
36 */
37 PamLevel2::PamLevel2(){
38
39 trk_l1_obj = this->TrkLevel1::GetTrkLevel1();
40 trk_obj = this->TrkLevel2::GetTrkLevel2();
41 calo_obj = this->CaloLevel2::GetCaloLevel2();
42 tof_obj = this->ToFLevel2::GetToFLevel2();
43 trig_obj = this->TrigLevel2::GetTrigLevel2();
44 s4_obj = this->S4Level2::GetS4Level2();
45 nd_obj = this->NDLevel2::GetNDLevel2();
46 ac_obj = this->AcLevel2::GetAcLevel2();
47 orb_obj = this->OrbitalInfo::GetOrbitalInfo();
48
49 run_obj = new GL_RUN();
50
51 sorted_tracks = new TRefArray();
52
53 CAL = true;
54 TRK = true;
55 TRG = true;
56 TOF = true;
57 S4 = true;
58 ND = true;
59 AC = true;
60 ORB = true;
61
62 TRK_L1 = false;
63
64 Tout = NULL;
65 };
66 /**
67 * Destructor
68 */
69 PamLevel2::~PamLevel2(){
70
71 TrkLevel1::Clear();
72
73 TrkLevel2::Clear();
74 CaloLevel2::Clear();
75 ToFLevel2::Clear();
76 TrigLevel2::Clear();
77 S4Level2::Clear();
78 NDLevel2::Clear();
79 AcLevel2::Clear();
80 OrbitalInfo::Clear();
81
82 delete run_obj;
83
84 // delete sorted_tracks;
85 sorted_tracks->Delete(); // clean the reference array
86
87 if(Tout)Tout->Delete(); // delete loaded tree from memory
88
89 };
90 /**
91 * Clear the event
92 */
93 void PamLevel2::Clear(){
94
95 TrkLevel1::Clear();
96
97 TrkLevel2::Clear();
98 CaloLevel2::Clear();
99 ToFLevel2::Clear();
100 TrigLevel2::Clear();
101 S4Level2::Clear();
102 NDLevel2::Clear();
103 AcLevel2::Clear();
104 OrbitalInfo::Clear();
105
106 sorted_tracks->Delete(); // clean the reference array
107
108 };
109
110
111 //--------------------------------------
112 //
113 //
114 //--------------------------------------
115 /**
116 * Retrieves the calorimeter track matching the seqno-th tracker stored track.
117 * (If seqno = -1 retrieves the self-trigger calorimeter track)
118 */
119 CaloTrkVar *PamLevel2::GetCaloStoredTrack(int seqno){
120
121 if( CaloLevel2::ntrk()==0 ){
122 cout << "PamLevel2::GetCaloStoredTrack(int) : requested tracker SeqNo "<< seqno <<" but no Calorimeter tracks are stored"<<endl;
123 return NULL;
124 };
125
126 CaloTrkVar *c = 0;
127 Int_t it_calo=0;
128
129 do{
130 c = CaloLevel2::GetCaloTrkVar(it_calo);
131 it_calo++;
132 } while( seqno != c->trkseqno && it_calo < CaloLevel2::ntrk());
133
134 if(seqno != c->trkseqno){
135 c = 0;
136 if(seqno!=-1)cout << "PamLevel2::GetCaloStoredTrack(int) : requested tracker SeqNo "<< seqno <<" does not match Calorimeter stored tracks"<<endl;
137 };
138 return c;
139
140 };
141 //--------------------------------------
142 //
143 //
144 //--------------------------------------
145 /**
146 * Retrieves the ToF track matching the seqno-th tracker stored track.
147 * (If seqno = -1 retrieves the tracker-independent tof track)
148 */
149 ToFTrkVar *PamLevel2::GetToFStoredTrack(int seqno){
150
151 if( ToFLevel2::ntrk()==0 ){
152 cout << "PamLevel2::GetToFStoredTrack(int) : requested tracker SeqNo "<< seqno <<" but no ToF tracks are stored"<<endl;
153 return NULL;
154 };
155
156 ToFTrkVar *c = 0;
157 Int_t it_tof=0;
158
159 do{
160 c = ToFLevel2::GetToFTrkVar(it_tof);
161 it_tof++;
162 } while( seqno != c->trkseqno && it_tof < ToFLevel2::ntrk());
163
164 if(seqno != c->trkseqno){
165 c = 0;
166 if(seqno!=-1)cout << "PamLevel2::GetToFStoredTrack(int) : requested tracker SeqNo "<< seqno <<" does not match ToF stored tracks"<<endl;
167 };
168 return c;
169
170 };
171
172 //--------------------------------------
173 //
174 //
175 //--------------------------------------
176 /**
177 * Give the pamela track associated to a tracker track, retrieving related calorimeter and tof track information.
178 */
179 PamTrack* PamLevel2::GetPamTrackAlong(TrkTrack* t){
180
181 CaloTrkVar *c = 0;
182 ToFTrkVar *o = 0;
183
184 if(CAL) c = GetCaloStoredTrack(t->GetSeqNo());
185 if(TOF) o = GetToFStoredTrack(t->GetSeqNo());
186
187 // if(t && c && o)track = new PamTrack(t,c,o);
188 PamTrack *track = new PamTrack(t,c,o);
189
190 return track;
191
192 };
193 //--------------------------------------
194 //
195 //
196 //--------------------------------------
197 /**
198 * Retrieves the it-th stored track.
199 * It override TrkLevel2::GetTrack(int it).
200 * @param itrk Track number, ranging from 0 to GetNTracks().
201 */
202
203 PamTrack* PamLevel2::GetStoredTrack(Int_t itrk){
204
205 PamTrack *track = 0;
206
207 if( itrk >=0 && itrk < TrkLevel2::ntrk() ){
208
209 TrkTrack *t = TrkLevel2::GetStoredTrack(itrk);
210 track = GetPamTrackAlong(t);
211
212 }else{
213 cout << "PamLevel2::GetStoredTrack(int) : tracker track SeqNo "<< itrk <<" does not exist (GetNTracks() = "<<TrkLevel2::GetNTracks()<<")"<<endl;
214 };
215
216 return track;
217
218 }
219 //--------------------------------------
220 //
221 //
222 //--------------------------------------
223 /**
224 * Sort physical (tracker) tracks and stores them in the TRefArray (of TrkTrack objects) which pointer is PamLevel2::sorted_tracks.
225 * @param how String to set the sorting cryterium (es: "CAL" or "TRK+CAL+TOF" ecc...).
226 * Sorting cryteria:
227 * TRK: lower chi**2
228 * CAL: lower Y spatial residual on the first calorimeter plane
229 * TOF: bigger numebr of hit PMTs along the track, on S12 S21 S32 (where paddles are along the Y axis).
230 * The default sorting cryterium is "TOF+CAL".
231 *
232 * 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).
233 */
234 void PamLevel2::SortTracks(TString how){
235
236 //Save current Object count
237 Int_t ObjectNumber = TProcessID::GetObjectCount();
238
239 sorted_tracks->Delete(); //temporaneo???
240
241 // loop over the tracks sorted by the tracker
242 Bool_t use_TRK = how.Contains("TRK", TString::kIgnoreCase);
243 Bool_t use_CAL = how.Contains("CAL", TString::kIgnoreCase);
244 Bool_t use_TOF = how.Contains("TOF", TString::kIgnoreCase);
245
246 if( !CAL && use_CAL) use_CAL = false;
247 if( !TOF && use_TOF) use_TOF = false;
248
249 if( !TRK ){
250 cout << "SortTracks() : without tracker does not work!!! (not yet)" << endl;
251 return;
252 };
253
254 for(Int_t i=0; i < TrkLevel2::GetNTracks(); i++){
255
256 TrkTrack *ts = 0;
257
258 // get tracker tracks
259 TrkTrack *tp = TrkLevel2::GetTrack(i); //tracker
260 // CaloTrkVar *cp = GetCaloStoredTrack(tp->GetSeqNo());
261 // ToFTrkVar *op = GetToFStoredTrack(tp->GetSeqNo());
262 CaloTrkVar *cp = 0;
263 ToFTrkVar *op = 0;
264
265 // if track has an image, check image selection
266 if(tp->HasImage()){
267
268 TrkTrack *ti = TrkLevel2::GetTrackImage(i); //tracker (image)
269 // CaloTrkVar *ci = GetCaloStoredTrack(ti->GetSeqNo());
270 // ToFTrkVar *oi = GetToFStoredTrack(ti->GetSeqNo());
271 CaloTrkVar *ci = 0;
272 ToFTrkVar *oi = 0;
273
274 //assign starting scores
275 Int_t tp_score = 0; //main track sorted by the tracker
276 Int_t ti_score = 0; //image track
277
278 // ------------------------
279 // calorimeter check
280 // ------------------------
281 // check the Y spatial residual on the first calorimeter plane
282 // (cut on calorimeter variables from Emiliano)
283 if(
284 use_CAL &&
285 npcfit[1] > 15 && //no. of fit planes on Y view
286 varcfit[1] < 1000. && //fit variance on Y view
287 true){
288
289 cp = GetCaloStoredTrack(tp->GetSeqNo());
290 ci = GetCaloStoredTrack(ti->GetSeqNo());
291
292 Float_t resy_p = cp->tbar[0][1] - cbar[0][1]; if(resy_p < 0)resy_p= - resy_p;
293 Float_t resy_i = ci->tbar[0][1] - cbar[0][1]; if(resy_i < 0)resy_i= - resy_i;
294
295 if(resy_p <= resy_i) tp_score++;
296 else ti_score++;
297 };
298 // ------------------------
299 // TOF check
300 // ------------------------
301 // check the number of hit pmts along the track
302 // on S12 S21 and S32, where paddles are parallel to Y axis
303 if( use_TOF ){
304
305 Int_t nphit_p =0;
306 Int_t nphit_i =0;
307
308 op = GetToFStoredTrack(tp->GetSeqNo());
309 oi = GetToFStoredTrack(ti->GetSeqNo());
310
311 /* cout << "track: npmtadc "<< op->npmtadc << endl;
312 cout << "track: npmttdc "<< op->npmttdc << endl;
313 cout << "image: npmtadc "<< oi->npmtadc << endl;
314 cout << "image: npmttdc "<< oi->npmttdc << endl;*/
315
316 for (Int_t ih=0; ih < op->npmtadc; ih++){
317 Int_t pl = GetPlaneIndex( (op->pmtadc).At(ih) );
318 if(pl == 1 || pl == 2 || pl == 5)nphit_p++;
319 };
320
321 for (Int_t ih=0; ih < oi->npmtadc; ih++){
322 Int_t pl = GetPlaneIndex( (oi->pmtadc).At(ih) );
323 if(pl == 1 || pl == 2 || pl == 5)nphit_i++;
324 };
325
326 if(
327 use_TOF &&
328 (nphit_p+nphit_i) !=0 &&
329 true){
330
331 if( nphit_p >= nphit_i) tp_score++;
332 else ti_score++;
333 };
334 };
335 if(tp_score == ti_score) use_TRK = true;
336 // ------------------------
337 // tracker check
338 // ------------------------
339 // chi**2 difference is not always large enough to distinguish among
340 // the real track and its image.
341 // Tracker check will be applied always when calorimeter and tof information is ambiguous.
342 if(use_TRK){
343 if( tp->chi2 > 0 && tp->chi2 < ti->chi2 ) tp_score++ ;
344 else if( ti->chi2 > 0 && ti->chi2 < tp->chi2 ) ti_score++ ;
345 };
346
347 // ------------------------
348 // the winner is....
349 // ------------------------
350 if (tp_score > ti_score) ts = tp;//the track sorted by the tracker!!
351 else if (tp_score < ti_score) ts = ti;//its image!!
352 else {
353 ts = tp;
354 // cout << "Warning - track image ambiguity not solved" << endl;
355 // cout << ts->GetNtot() << " "<< ts->chi2 << " " << npcfit[1] << " "<< nphit_p << endl;
356 };
357
358 }else{
359 ts = tp;
360 };
361
362 // cout <<" SortTracks() "<<i<<" -- "<<ts<<endl;
363 sorted_tracks->Add(ts);//save the track in the sorted array
364 // cout << "SortTracks:: sorted_tracks->Add(it) "<<i<<" "<<ts<<endl;
365
366 };
367 //Restore Object count
368 //To save space in the table keeping track of all referenced objects
369 //we assume that our events do not address each other. We reset the
370 //object count to what it was at the beginning of the event.
371 TProcessID::SetObjectCount(ObjectNumber);
372
373 };
374 //--------------------------------------
375 //
376 //
377 //--------------------------------------
378 /**
379 * This method overrides TrkLevel2::GetTracks(), where sorting is done by decreasing number of fit points and increasing chi^2.
380 * PamLevel2::GetTracks() keeps the same track order given by TrkLevel2::GetTracks(), but checks image selection by using calorimeter and ToF tracking information.
381 */
382 TRefArray *PamLevel2::GetTracks(){
383 //
384 // SortTracks("+CAL+TOF");
385 SortTracks("+CAL+TRK");//TEMP!!!!!!!!!!!!!
386 //
387 return sorted_tracks;
388 };
389 //--------------------------------------
390 //
391 //
392 //--------------------------------------
393 /**
394 * Retrieves the it-th Pamela "physical" track.
395 * It override TrkLevel2::GetTrack(int it).
396 * @param it Track number, ranging from 0 to GetNTracks().
397 */
398 PamTrack *PamLevel2::GetTrack(int it){
399
400 // *-*-*-*-*-*-*
401 // SortTracks("+CAL+TOF");
402 SortTracks("+CAL+TRK");//TEMP!!!!!!!!!!!!!
403 // *-*-*-*-*-*-*
404
405 PamTrack *track = 0;
406
407 if( it >=0 && it < TrkLevel2::GetNTracks() ){
408 TrkTrack *t = (TrkTrack*)sorted_tracks->At(it);
409 // cout << "GetTrack(int it):: sorted_tracks->At(it) "<<it<<" "<<t<<endl;
410 track = GetPamTrackAlong(t);
411 }else{
412 cout << "PamLevel2::GetTrack(int) : tracker track SeqNo "<< it <<" does not exist (GetNTracks() = "<<TrkLevel2::GetNTracks()<<")"<<endl;
413 };
414
415 return track;
416
417 };
418
419 //--------------------------------------
420 //
421 //
422 //--------------------------------------
423 /**
424 * Retrieves (if present) the image of the it-th Pamela "physical" track, sorted by the method PamLevel2::SortTracks().
425 * @param it Track number, ranging from 0 to GetNTracks().
426 */
427 PamTrack *PamLevel2::GetTrackImage(int it){
428
429 // SortTracks("+CAL+TOF");
430 SortTracks("+CAL+TRK");//TEMP!!!!!!!!!!!!!
431
432 PamTrack *image = 0;
433
434 if( it >=0 && it < TrkLevel2::GetNTracks() ){
435 TrkTrack *temp = (TrkTrack*)sorted_tracks->At(it);
436 if( temp->HasImage() ){
437 TrkTrack *t = TrkLevel2::GetStoredTrack(temp->GetImageSeqNo());
438 image = GetPamTrackAlong(t);
439 }else{
440 cout <<"PamLevel2::GetTrackImage(int) : Track SeqNo "<<it<<" does not have image"<<endl;
441 };
442 }else{
443 cout << "PamLevel2::GetTrackImage(int) : Tracker track SeqNo "<< it <<" does not exist (GetNTracks() = "<<TrkLevel2::GetNTracks()<<")"<<endl;
444 };
445
446 return image;
447 }
448
449 //--------------------------------------
450 //
451 //
452 //--------------------------------------
453 /**
454 * Get the Pamela detector trees in a single file and make them friends.
455 * @param f TFile pointer
456 * @param detlist String to select trees to be included
457 * @return Pointer to a TTree
458 */
459 TTree *PamLevel2::GetPamTree(TFile *f, TString detlist="+ALL"){
460
461 // cout << "WARNING!!! -- obsolete method -- \n";
462 // cout << "better use TChain *PamLevel2::GetPamTree(TList*, TString) \n";
463
464 TTree *Trout =0;
465
466 SetWhichTrees(detlist);
467 // Tracker
468 TTree *T = (TTree*)f->Get("Tracker");
469 if(T && TRK) {
470 if(TRK_L1){
471 T->SetBranchAddress("TrkLevel1", GetPointerToTrk(1));
472 cout << "Tracker : set branch address TrkLevel1"<<endl;
473 };
474 T->SetBranchAddress("TrkLevel2", GetPointerToTrk(2));
475 cout << "Tracker : set branch address TrkLevel2"<<endl;
476 Trout=T;
477 }else{
478 cout << "Tracker : missing tree"<<endl;
479 };
480 // Calorimeter
481 TTree *C = (TTree*)f->Get("Calorimeter");
482 if(C && CAL) {
483 C->SetBranchAddress("CaloLevel2", GetPointerToCalo());
484 cout << "Calorimeter : set branch address CaloLevel2"<<endl;
485 if(!Trout)Trout=C;
486 else Trout->AddFriend(C);
487 }else{
488 cout << "Calorimeter : missing tree"<<endl;
489 };
490 // ToF
491 TTree *O = (TTree*)f->Get("ToF");
492 if(O && TOF) {
493 O->SetBranchAddress("ToFLevel2", GetPointerToToF());
494 cout << "ToF : set branch address ToFLevel2"<<endl;
495 if(!Trout)Trout=O;
496 else Trout->AddFriend(O);
497 }else{
498 cout << "ToF : missing tree"<<endl;
499 };
500 // Trigger
501 TTree *R = (TTree*)f->Get("Trigger");
502 if(R && TRG) {
503 R->SetBranchAddress("TrigLevel2", GetPointerToTrig());
504 cout << "Trigger : set branch address TrigLevel2"<<endl;
505 if(!Trout)Trout=O;
506 else Trout->AddFriend(R);
507 }else{
508 cout << "Trigger : missing tree"<<endl;
509 };
510 // S4
511 TTree *S = (TTree*)f->Get("S4");
512 if(S && S4) {
513 S->SetBranchAddress("S4Level2", GetPointerToS4());
514 cout << "S4 : set branch address S4Level2"<<endl;
515 if(!Trout)Trout=O;
516 else Trout->AddFriend(S);
517 }else{
518 cout << "S4 : missing tree"<<endl;
519 };
520 // Neutron Detector
521 TTree *N = (TTree*)f->Get("NeutronD");
522 if(N && ND) {
523 N->SetBranchAddress("NDLevel2", GetPointerToND());
524 cout << "NeutronD : set branch address NDLevel2"<<endl;
525 if(!Trout)Trout=O;
526 else Trout->AddFriend(N);
527 }else{
528 cout << "NeutronD : missing tree"<<endl;
529 };
530 // Anticounters
531 TTree *A = (TTree*)f->Get("Anticounter");
532 if(A && AC) {
533 A->SetBranchAddress("AcLevel2", GetPointerToAc());
534 cout << "Anticounter : set branch address AcLevel2"<<endl;
535 if(!Trout)Trout=O;
536 else Trout->AddFriend(A);
537 }else{
538 cout << "Anticounter : missing tree"<<endl;
539 };
540 // Orbital Info
541 TTree *B = (TTree*)f->Get("OrbitalInfo");
542 if(B && ORB) {
543 B->SetBranchAddress("OrbitalInfo", GetPointerToOrb());
544 cout << "OrbitalInfo : set branch address OrbitalInfo"<<endl;
545 if(!Trout)Trout=O;
546 else Trout->AddFriend(B);
547 }else{
548 cout << "OrbitalInfo : missing tree"<<endl;
549 };
550
551 cout<<endl<<" Number of entries: "<<Trout->GetEntries()<<endl<<endl;
552
553 return Trout;
554
555 }
556 //--------------------------------------
557 //
558 //
559 //--------------------------------------
560 /**
561 * Get list of Level2 files.
562 * @param ddir Level2 data directory.
563 * @param flisttxt Name of txt file containing file list.
564 * @return Pointer to a TList of TSystemFiles
565 * If no input file list is given , all the Level2 files inside the directory are processed.
566 */
567 TList* PamLevel2::GetListOfLevel2Files(TString ddir, TString flisttxt = ""){
568
569 TString wdir = gSystem->WorkingDirectory();
570
571 if(ddir=="")ddir = wdir;
572 // TSystemDirectory *datadir = new TSystemDirectory(gSystem->BaseName(ddir),ddir);
573 cout << "Level2 data directory : "<< ddir << endl;
574
575 TList *contents = new TList; // create output list
576 contents->SetOwner();
577
578 char *fullpath;
579
580 // if no input file list is given:
581 if ( flisttxt != "" ){
582
583 if( !gSystem->IsFileInIncludePath(flisttxt,&fullpath) )return 0;
584
585 // flisttxt = gSystem->ConcatFileName(gSystem->DirName(flisttxt),gSystem->BaseName(flisttxt));
586 flisttxt = fullpath;
587
588 if( !gSystem->ChangeDirectory(ddir) )return 0;
589
590 cout <<"Input file list : " << flisttxt <<endl;
591 ifstream in;
592 in.open(flisttxt, ios::in); //open input file list
593 while (1) {
594 TString file;
595 in >> file;
596 if (!in.good()) break;
597 if( gSystem->IsFileInIncludePath(file,&fullpath) ){
598 // contents->Add(new TSystemDirectory(fullpath,ddir)); // add file to the list
599 // contents->Add(new TSystemFile(fullpath,ddir)); // add file to the list
600 contents->Add(new TSystemFile(fullpath,gSystem->DirName(fullpath)));// add file to the list
601 }else{
602 cout << "warning! --- File "<<file<<" does not exists"<< endl;
603 };
604 };
605 in.close();
606
607 }else{
608
609 cout << "No input file list given."<<endl;
610 cout << "Check for existing root files."<<endl;
611 // cout << "Warking directory: "<< gSystem->WorkingDirectory()<< endl;
612
613 TSystemDirectory *datadir = new TSystemDirectory(gSystem->BaseName(ddir),ddir);
614 TList *temp = datadir->GetListOfFiles();
615 // temp->Print();
616 // cout << "*************************************" << endl;
617
618 TIter next(temp);
619 TSystemFile *questo = 0;
620
621
622 while ( (questo = (TSystemFile*) next()) ) {
623 TString name = questo-> GetName();
624 if( name.EndsWith(".root") ){
625 char *fullpath;
626 gSystem->IsFileInIncludePath(name,&fullpath);
627 contents->Add(new TSystemFile(fullpath,gSystem->DirName(fullpath)));
628 };
629 }
630 delete temp;
631 delete datadir;
632
633 };
634 gSystem->ChangeDirectory(wdir); // back to the working directory
635 // cout << endl << "Selected files:" << endl;
636 // contents->Print();
637 cout << contents->GetEntries()<<" files selected\n";
638 // cout << endl;
639 // cout << "Working directory: "<< gSystem->WorkingDirectory()<< endl;
640 return contents;
641 };
642 //--------------------------------------
643 //
644 //
645 //--------------------------------------
646 /**
647 * Get the Pamela detector chains from a list of files and make them friends.
648 * @param fl Pointer to a TList of TSystemFiles
649 * @param detlist String to select trees to be included
650 * @return Pointer to a TChain
651 */
652 TChain *PamLevel2::GetPamTree(TList *fl, TString detlist="+ALL"){
653
654 // TChain *Tout=0;
655 if(Tout)Tout->Delete();
656 Tout = NULL;
657
658 SetWhichTrees(detlist);
659
660 TChain *T = 0;
661 TChain *C = 0;
662 TChain *O = 0;
663 TChain *R = 0;
664 TChain *S = 0;
665 TChain *N = 0;
666 TChain *A = 0;
667 TChain *B = 0;
668
669 if(TRK) T = new TChain("Tracker");
670 if(CAL) C = new TChain("Calorimeter");
671 if(TOF) O = new TChain("ToF");
672 if(TRG) R = new TChain("Trigger");
673 if(S4) S = new TChain("S4");
674 if(ND) N = new TChain("NeutronD");
675 if(AC) A = new TChain("Anticounter");
676 if(ORB) B = new TChain("OrbitalInfo");
677
678 // loop over files and create chains
679 TIter next(fl);
680 TSystemFile *questo = 0;
681 while ( (questo = (TSystemFile*) next()) ) {
682 TString name = questo->GetName();
683 // cout << "File: "<< name << endl;
684 if( CheckLevel2File(name) ){
685 if(TRK) T->Add(name);
686 if(CAL) C->Add(name);
687 if(TOF) O->Add(name);
688 if(TRG) R->Add(name);
689 if(S4) S->Add(name);
690 if(ND) N->Add(name);
691 if(AC) A->Add(name);
692 if(ORB) B->Add(name);
693 };
694 }
695
696 // Tracker
697 if(TRK) if(!Tout)Tout=T;
698
699 // Calorimeter
700 if(CAL) {
701 if(!Tout)Tout=C;
702 else Tout->AddFriend("Calorimeter");
703 };
704
705 // ToF
706 if(TOF) {
707 if(!Tout)Tout=O;
708 else Tout->AddFriend("ToF");
709 };
710 // Trigger
711 if(TRG) {
712 if(!Tout)Tout=O;
713 else Tout->AddFriend("Trigger");
714 };
715 // S4
716 if(S4) {
717 if(!Tout)Tout=O;
718 else Tout->AddFriend("S4");
719 };
720 // Neutron Detector
721 if(ND) {
722 if(!Tout)Tout=O;
723 else Tout->AddFriend("NeutronD");
724 };
725 // Anticounters
726 if(AC) {
727 if(!Tout)Tout=O;
728 else Tout->AddFriend("Anticounter");
729 };
730 // OrbitalInfo
731 if(ORB) {
732 if(!Tout)Tout=O;
733 else Tout->AddFriend("OrbitalInfo");
734 };
735
736 cout<<endl<<" Number of entries: "<<Tout->GetEntries()<<endl<<endl;
737
738 PamLevel2::SetBranchAddress();
739
740 return Tout;
741 }
742 //--------------------------------------
743 //
744 //
745 //--------------------------------------
746 /**
747 * Set branch addresses for Pamela friend trees
748 */
749 void PamLevel2::SetBranchAddress(){
750 // Tracker
751 if(TRK) {
752 if(TRK_L1){
753 Tout->SetBranchAddress("TrkLevel1", GetPointerToTrk(1));
754 cout << "Tracker : set branch address TrkLevel1"<<endl;
755 };
756 Tout->SetBranchAddress("TrkLevel2", GetPointerToTrk(2));
757 cout << "Tracker : set branch address TrkLevel2"<<endl;
758 };
759
760 // Calorimeter
761 if(CAL) {
762 Tout->SetBranchAddress("CaloLevel2", GetPointerToCalo());
763 cout << "Calorimeter : set branch address CaloLevel2"<<endl;
764 };
765
766 // ToF
767 if(TOF) {
768 Tout->SetBranchAddress("ToFLevel2", GetPointerToToF());
769 cout << "ToF : set branch address ToFLevel2"<<endl;
770 };
771 // Trigger
772 if(TRG) {
773 Tout->SetBranchAddress("TrigLevel2", GetPointerToTrig());
774 cout << "Trigger : set branch address TrigLevel2"<<endl;
775 };
776 // S4
777 if(S4) {
778 Tout->SetBranchAddress("S4Level2", GetPointerToS4());
779 cout << "S4 : set branch address S4Level2"<<endl;
780 };
781 // Neutron Detector
782 if(ND) {
783 Tout->SetBranchAddress("NDLevel2", GetPointerToND());
784 cout << "NeutronD : set branch address NDLevel2"<<endl;
785 };
786 // Anticounters
787 if(AC) {
788 Tout->SetBranchAddress("AcLevel2", GetPointerToAc());
789 cout << "Anticounter : set branch address AcLevel2"<<endl;
790 };
791 // OrbitalInfo
792 if(ORB) {
793 Tout->SetBranchAddress("OrbitalInfo", GetPointerToOrb());
794 cout << "OrbitalInfo : set branch address OrbitalInfo"<<endl;
795 };
796
797 }
798
799 //--------------------------------------
800 //
801 //
802 //--------------------------------------
803 void *PamLevel2::GetPointerTo(const char* c ){
804 // cout << "objname "<< objname << endl;
805 TString objname = c;
806 if(!objname.CompareTo("TrkLevel1"))return &trk_l1_obj;
807 if(!objname.CompareTo("TrkLevel2"))return &trk_obj;
808
809 return NULL;
810 };
811 //--------------------------------------
812 //
813 //
814 //--------------------------------------
815 /**
816 * Get the Run tree chain from a list of files.
817 * @param fl Pointer to a TList of TSystemFiles
818 * @return Pointer to a TChain
819 */
820 TChain *PamLevel2::GetRunTree(TList *fl){
821
822 TChain *R = new TChain("Run");
823
824 // loop over files and create chains
825 TIter next(fl);
826 TSystemFile *questo = 0;
827 while ( (questo = (TSystemFile*) next()) ) {
828 TString name = questo->GetName();
829 // cout << "File: "<< name << endl;
830 if( CheckLevel2File(name) ){
831 R->Add(name);
832 };
833 }
834
835 R->SetBranchAddress("RunInfo", GetPointerToRun());
836 cout << "Run : set branch address RunInfo"<<endl;
837
838 return R;
839
840 }
841 //--------------------------------------
842 //
843 //
844 //--------------------------------------
845 /**
846 * Get the Run tree from a file.
847 * @param f Pointer to a TFile
848 * @return Pointer to a TTree
849 */
850 TTree *PamLevel2::GetRunTree(TFile *f){
851
852
853 TTree *R = (TTree*)f->Get("Run");
854
855 R->SetBranchAddress("RunInfo", GetPointerToRun());
856 cout << "Run : set branch address RunInfo"<<endl;
857
858 return R;
859
860 }
861 //--------------------------------------
862 //
863 //
864 //--------------------------------------
865 /**
866 * Set which trees should be analysed
867 * @param detlist TString containing the sequence of trees required
868 */
869 void PamLevel2::SetWhichTrees(TString detlist){
870
871 if(detlist.Contains("+ALL", TString::kIgnoreCase)){
872 CAL = true;
873 TRK = true;
874 TRK_L1 = false;
875 TRG = true;
876 TOF = true;
877 S4 = true;
878 ND = true;
879 AC = true;
880 ORB = true;
881 }else if( detlist.Contains("-ALL", TString::kIgnoreCase) ){
882 CAL = false;
883 TRK = false;
884 TRK_L1 = false;
885 TRG = false;
886 TOF = false;
887 S4 = false;
888 ND = false;
889 AC = false;
890 ORB = false;
891 };
892
893 if( detlist.Contains("-CAL", TString::kIgnoreCase) )CAL = false;
894 else if( detlist.Contains("+CAL", TString::kIgnoreCase) )CAL = true;
895
896 if( detlist.Contains("-TRK", TString::kIgnoreCase) )TRK = false;
897 else if( detlist.Contains("+TRK", TString::kIgnoreCase) )TRK = true;
898
899 if( detlist.Contains("-TRK1", TString::kIgnoreCase) )TRK_L1 = false;
900 else if( detlist.Contains("+TRK1", TString::kIgnoreCase) )TRK_L1 = true;
901
902 if( detlist.Contains("-TRG", TString::kIgnoreCase) )TRG = false;
903 else if( detlist.Contains("+TRG", TString::kIgnoreCase) )TRG = true;
904
905 if( detlist.Contains("-TOF", TString::kIgnoreCase) )TOF = false;
906 else if( detlist.Contains("+TOF", TString::kIgnoreCase) )TOF = true;
907
908 if( detlist.Contains("-S4", TString::kIgnoreCase) )S4 = false;
909 else if( detlist.Contains("+S4", TString::kIgnoreCase) )S4 = true;
910
911 if( detlist.Contains("-ND", TString::kIgnoreCase) )ND = false;
912 else if( detlist.Contains("+ND", TString::kIgnoreCase) )ND = true;
913
914 if( detlist.Contains("-AC", TString::kIgnoreCase) )AC = false;
915 else if( detlist.Contains("+AC", TString::kIgnoreCase) )AC = true;
916
917 if( detlist.Contains("-ORB", TString::kIgnoreCase) )ORB = false;
918 else if( detlist.Contains("+ORB", TString::kIgnoreCase) )ORB = true;
919
920 };
921 //--------------------------------------
922 //
923 //
924 //--------------------------------------
925 /**
926 * Check if a file contains selected Pamela Level2 trees.
927 * @param name File name
928 * @return true if the file is ok.
929 */
930 Bool_t PamLevel2::CheckLevel2File(TString name){
931
932 Bool_t CAL__ok = false;
933 Bool_t TRK__ok = false;
934 Bool_t TRK_L1__ok = false;
935 Bool_t TRG__ok = false;
936 Bool_t TOF__ok = false;
937 Bool_t S4__ok = false;
938 Bool_t ND__ok = false;
939 Bool_t AC__ok = false;
940 Bool_t ORB__ok = false;
941
942 Bool_t RUN__ok = false;
943
944 TFile *f = new TFile(name.Data());
945 TList *lk = f->GetListOfKeys();
946 // lk->Print();
947 TIter next(lk);
948 TKey *key =0;
949 while( (key = (TKey*)next()) ){
950 // cout << key->GetName() << endl;
951 if( !strcmp(key->GetName(),"Calorimeter") )CAL__ok = true;
952 // if( !strcmp(key->GetName(),"Tracker" ) )TRK__ok = true;
953 if( !strcmp(key->GetName(),"Trigger" ) )TRG__ok = true;
954 if( !strcmp(key->GetName(),"ToF" ) )TOF__ok = true;
955 if( !strcmp(key->GetName(),"S4" ) )S4__ok = true;
956 if( !strcmp(key->GetName(),"NeutronD" ) )ND__ok = true;
957 if( !strcmp(key->GetName(),"Anticounter") )AC__ok = true;
958 if( !strcmp(key->GetName(),"OrbitalInfo") )ORB__ok = true;
959 if( !strcmp(key->GetName(),"Run" ) )RUN__ok = true;
960
961 if( !strcmp(key->GetName(),"Tracker" ) ){
962 TRK__ok = true;
963 TTree *T = (TTree*)f->Get("Tracker");
964 for(Int_t i=0; i<T->GetListOfBranches()->GetEntries(); i++){
965 TString name = T->GetListOfBranches()->At(i)->GetName();
966 if( !name.CompareTo("TrkLevel1") )TRK_L1__ok=true;
967 };
968 };
969
970 };
971
972 lk->Delete();
973 f->Close();
974
975 Bool_t FLAG = true;
976 if(!RUN__ok) {
977 cout << "File: "<< f->GetName() <<" discarded ---- Missing RunInfo tree"<< endl;
978 FLAG = false;
979 };
980 if(CAL && !CAL__ok){
981 cout << "File: "<< f->GetName() <<" discarded ---- Missing Calorimeter tree"<< endl;
982 FLAG = false;
983 };
984 if(TRK && !TRK__ok){
985 cout << "File: "<< f->GetName() <<" discarded ---- Missing Tracker tree"<< endl;
986 FLAG = false;
987 };
988 if(TRK_L1 && !TRK_L1__ok){
989 cout << "File: "<< f->GetName() <<" discarded ---- Missing Tracker Level1 Branch"<< endl;
990 FLAG = false;
991 };
992 if(TRG && !TRG__ok){
993 cout << "File: "<< f->GetName() <<" discarded ---- Missing Trigger tree"<< endl;
994 FLAG = false;
995 };
996 if(TOF && !TOF__ok){
997 cout << "File: "<< f->GetName() <<" discarded ---- Missing ToF tree"<< endl;
998 FLAG = false;
999 };
1000 if(S4 && !S4__ok){
1001 cout << "File: "<< f->GetName() <<" discarded ---- Missing S4 tree"<< endl;
1002 FLAG = false;
1003 };
1004 if(ND && !ND__ok){
1005 cout << "File: "<< f->GetName() <<" discarded ---- Missing ND tree"<< endl;
1006 FLAG = false;
1007 };
1008 if(AC && !AC__ok){
1009 cout << "File: "<< f->GetName() <<" discarded ---- Missing AC tree"<< endl;
1010 FLAG = false;
1011 };
1012 if(ORB && !ORB__ok){
1013 cout << "File: "<< f->GetName() <<" discarded ---- Missing ORB tree"<< endl;
1014 FLAG = false;
1015 };
1016
1017 return FLAG;
1018
1019 };
1020
1021

  ViewVC Help
Powered by ViewVC 1.1.23