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

Annotation of /PamelaLevel2/src/PamLevel2.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.12 - (hide annotations) (download)
Wed Dec 13 09:57:29 2006 UTC (17 years, 11 months ago) by pam-fi
Branch: MAIN
CVS Tags: v0r02, v2r02
Changes since 1.11: +116 -43 lines
*** empty log message ***

1 pam-fi 1.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 pam-fi 1.3 if(o) *tof_track = *o;
28 pam-fi 1.1 };
29    
30     //--------------------------------------
31     //
32     //
33     //--------------------------------------
34     /**
35     * Constructor
36     */
37     PamLevel2::PamLevel2(){
38 pam-fi 1.2
39 pam-fi 1.9 trk2_obj = TrkLevel2::GetTrkLevel2();
40     trk1_obj = TrkLevel1::GetTrkLevel1();
41     trkh_obj = TrkHough::GetTrkHough();
42     calo1_obj = CaloLevel1::GetCaloLevel1();
43     calo2_obj = CaloLevel2::GetCaloLevel2();
44     tof_obj = ToFLevel2::GetToFLevel2();
45     trig_obj = TrigLevel2::GetTrigLevel2();
46     s4_obj = S4Level2::GetS4Level2();
47     nd_obj = NDLevel2::GetNDLevel2();
48     ac_obj = AcLevel2::GetAcLevel2();
49     orb_obj = OrbitalInfo::GetOrbitalInfo();
50 pam-fi 1.2
51 pam-fi 1.8 run_obj = new GL_RUN();
52 pam-fi 1.6
53 pam-fi 1.9 // trk1_clone = 0;
54     // trk2_clone = 0;
55     // trkh_clone = 0;
56     // calo1_clone = 0;
57     // calo2_clone = 0;
58     // tof_clone = 0;
59     // trig_clone = 0;
60     // s4_clone = 0;
61     // nd_clone = 0;
62     // ac_clone = 0;
63     // orb_clone = 0;
64    
65     // T_clone = 0;
66     // C_clone = 0;
67     // O_clone = 0;
68     // R_clone = 0;
69     // S_clone = 0;
70     // N_clone = 0;
71     // A_clone = 0;
72     // B_clone = 0;
73    
74     for(Int_t i=0; i<8; i++ )tree_clone[i]=NULL;
75    
76 pam-fi 1.6 sorted_tracks = new TRefArray();
77    
78 pam-fi 1.9 CAL1 = true;
79 pam-fi 1.8 CAL2 = true;
80     TRK2 = true;
81     TRK1 = false;
82     TRKh = false;
83 pam-fi 1.6 TRG = true;
84     TOF = true;
85     S4 = true;
86     ND = true;
87     AC = true;
88     ORB = true;
89    
90 pam-fi 1.12 RUN = true;
91 pam-fi 1.8
92 pam-fi 1.2 };
93     /**
94     * Destructor
95     */
96 pam-fi 1.9 PamLevel2::~PamLevel2(){
97 pam-fi 1.6 delete run_obj;
98 pam-fi 1.9 Clear();
99 pam-fi 1.2 };
100     /**
101     * Clear the event
102     */
103     void PamLevel2::Clear(){
104 pam-fi 1.3
105 pam-fi 1.6 TrkLevel1::Clear();
106 pam-fi 1.2
107 pam-fi 1.6 TrkLevel2::Clear();
108     CaloLevel2::Clear();
109     ToFLevel2::Clear();
110     TrigLevel2::Clear();
111     S4Level2::Clear();
112     NDLevel2::Clear();
113     AcLevel2::Clear();
114     OrbitalInfo::Clear();
115 pam-fi 1.9
116     // if(trk1_clone)trk1_clone->Clear();
117     // if(trk2_clone)trk2_clone->Clear();
118     // if(trkh_clone)trkh_clone->Clear();
119     // if(calo1_clone)calo1_clone->Clear();
120     // if(calo2_clone)calo2_clone->Clear();
121     // if(tof_clone)tof_clone->Clear();
122     // if(trig_clone)trig_clone->Clear();
123     // if(s4_clone)s4_clone->Clear();
124     // if(nd_clone)nd_clone->Clear();
125     // if(ac_clone)ac_clone->Clear();
126     // if(orb_clone)orb_clone->Clear();
127 pam-fi 1.6
128     sorted_tracks->Delete(); // clean the reference array
129    
130 pam-fi 1.1 };
131 pam-fi 1.2
132    
133 pam-fi 1.1 //--------------------------------------
134     //
135     //
136     //--------------------------------------
137 pam-fi 1.9 void *PamLevel2::GetPointerTo(const char* c ){
138    
139     TString objname = c;
140     if(!objname.CompareTo("TrkLevel1"))return &trk1_obj;
141     if(!objname.CompareTo("TrkLevel2"))return &trk2_obj;
142     if(!objname.CompareTo("TrkHough"))return &trkh_obj;
143     if(!objname.CompareTo("CaloLevel1"))return &calo1_obj;
144     if(!objname.CompareTo("CaloLevel2"))return &calo2_obj;
145     if(!objname.CompareTo("ToFLevel2"))return &tof_obj;
146     if(!objname.CompareTo("TrigLevel2"))return &trig_obj;
147     if(!objname.CompareTo("S4Level2"))return &s4_obj;
148     if(!objname.CompareTo("NDLevel2"))return &nd_obj;
149     if(!objname.CompareTo("AcLevel2"))return &ac_obj;
150     if(!objname.CompareTo("OrbitalInfo"))return &orb_obj;
151     if(!objname.CompareTo("RunInfo"))return &run_obj;
152     return NULL;
153     };
154     //--------------------------------------
155     //
156     //
157     //--------------------------------------
158 pam-fi 1.1 /**
159 pam-fi 1.3 * Retrieves the calorimeter track matching the seqno-th tracker stored track.
160     * (If seqno = -1 retrieves the self-trigger calorimeter track)
161     */
162     CaloTrkVar *PamLevel2::GetCaloStoredTrack(int seqno){
163    
164 pam-fi 1.6 if( CaloLevel2::ntrk()==0 ){
165     cout << "PamLevel2::GetCaloStoredTrack(int) : requested tracker SeqNo "<< seqno <<" but no Calorimeter tracks are stored"<<endl;
166     return NULL;
167     };
168    
169     CaloTrkVar *c = 0;
170     Int_t it_calo=0;
171    
172     do{
173     c = CaloLevel2::GetCaloTrkVar(it_calo);
174     it_calo++;
175     } while( c && seqno != c->trkseqno && it_calo < CaloLevel2::ntrk());
176    
177     if(!c || seqno != c->trkseqno){
178     c = 0;
179     if(seqno!=-1)cout << "PamLevel2::GetCaloStoredTrack(int) : requested tracker SeqNo "<< seqno <<" does not match Calorimeter stored tracks"<<endl;
180     };
181     return c;
182    
183 pam-fi 1.3 };
184     //--------------------------------------
185     //
186     //
187     //--------------------------------------
188     /**
189     * Retrieves the ToF track matching the seqno-th tracker stored track.
190     * (If seqno = -1 retrieves the tracker-independent tof track)
191     */
192     ToFTrkVar *PamLevel2::GetToFStoredTrack(int seqno){
193    
194 pam-fi 1.6 if( ToFLevel2::ntrk()==0 ){
195     cout << "PamLevel2::GetToFStoredTrack(int) : requested tracker SeqNo "<< seqno <<" but no ToF tracks are stored"<<endl;
196     return NULL;
197     };
198    
199     ToFTrkVar *c = 0;
200     Int_t it_tof=0;
201    
202     do{
203     c = ToFLevel2::GetToFTrkVar(it_tof);
204     it_tof++;
205     } while( c && seqno != c->trkseqno && it_tof < ToFLevel2::ntrk());
206    
207     if(!c || seqno != c->trkseqno){
208     c = 0;
209     if(seqno!=-1)cout << "PamLevel2::GetToFStoredTrack(int) : requested tracker SeqNo "<< seqno <<" does not match ToF stored tracks"<<endl;
210     };
211     return c;
212    
213 pam-fi 1.3 };
214    
215     //--------------------------------------
216     //
217     //
218     //--------------------------------------
219     /**
220     * Give the pamela track associated to a tracker track, retrieving related calorimeter and tof track information.
221     */
222     PamTrack* PamLevel2::GetPamTrackAlong(TrkTrack* t){
223    
224 pam-fi 1.6 CaloTrkVar *c = 0;
225     ToFTrkVar *o = 0;
226    
227 pam-fi 1.8 if(CAL2) c = GetCaloStoredTrack(t->GetSeqNo());
228 pam-fi 1.6 if(TOF) o = GetToFStoredTrack(t->GetSeqNo());
229    
230 pam-fi 1.3 // if(t && c && o)track = new PamTrack(t,c,o);
231 pam-fi 1.6 PamTrack *track = new PamTrack(t,c,o);
232    
233     return track;
234 pam-fi 1.3
235     };
236     //--------------------------------------
237     //
238     //
239     //--------------------------------------
240     /**
241 pam-fi 1.1 * Retrieves the it-th stored track.
242     * It override TrkLevel2::GetTrack(int it).
243     * @param itrk Track number, ranging from 0 to GetNTracks().
244     */
245    
246     PamTrack* PamLevel2::GetStoredTrack(Int_t itrk){
247    
248 pam-fi 1.6 PamTrack *track = 0;
249    
250     if( itrk >=0 && itrk < TrkLevel2::ntrk() ){
251 pam-fi 1.3
252 pam-fi 1.6 TrkTrack *t = TrkLevel2::GetStoredTrack(itrk);
253     track = GetPamTrackAlong(t);
254 pam-fi 1.2
255 pam-fi 1.6 }else{
256     cout << "PamLevel2::GetStoredTrack(int) : tracker track SeqNo "<< itrk <<" does not exist (GetNTracks() = "<<TrkLevel2::GetNTracks()<<")"<<endl;
257     };
258    
259     return track;
260    
261 pam-fi 1.1 }
262     //--------------------------------------
263     //
264     //
265     //--------------------------------------
266     /**
267 pam-fi 1.3 * Sort physical (tracker) tracks and stores them in the TRefArray (of TrkTrack objects) which pointer is PamLevel2::sorted_tracks.
268     * @param how String to set the sorting cryterium (es: "CAL" or "TRK+CAL+TOF" ecc...).
269     * Sorting cryteria:
270 pam-fi 1.8 * TRK: lower chi**2
271 pam-fi 1.3 * CAL: lower Y spatial residual on the first calorimeter plane
272     * TOF: bigger numebr of hit PMTs along the track, on S12 S21 S32 (where paddles are along the Y axis).
273     * The default sorting cryterium is "TOF+CAL".
274     *
275     * 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).
276 pam-fi 1.1 */
277 pam-fi 1.3 void PamLevel2::SortTracks(TString how){
278 pam-fi 1.1
279 pam-fi 1.9 // cout << "call SortTracs() "<<endl;
280 pam-fi 1.4 //Save current Object count
281 pam-fi 1.6 Int_t ObjectNumber = TProcessID::GetObjectCount();
282 pam-fi 1.9
283     // cout << "ObjectNumber "<<ObjectNumber <<endl;
284 pam-fi 1.6
285     sorted_tracks->Delete(); //temporaneo???
286 pam-fi 1.4
287 pam-fi 1.6 // loop over the tracks sorted by the tracker
288     Bool_t use_TRK = how.Contains("TRK", TString::kIgnoreCase);
289     Bool_t use_CAL = how.Contains("CAL", TString::kIgnoreCase);
290     Bool_t use_TOF = how.Contains("TOF", TString::kIgnoreCase);
291    
292 pam-fi 1.8 if( !CAL2 && use_CAL) use_CAL = false;
293 pam-fi 1.6 if( !TOF && use_TOF) use_TOF = false;
294    
295 pam-fi 1.8 if( !TRK2 ){
296 pam-fi 1.9 // cout << "SortTracks() : without tracker does not work!!! (not yet)" << endl;
297 pam-fi 1.6 return;
298     };
299 pam-fi 1.9
300     // cout << "use_CAL "<<use_CAL<<" use_TOF "<<use_TOF<<" use_TRK "<<use_TRK <<endl;
301 pam-fi 1.6
302     for(Int_t i=0; i < TrkLevel2::GetNTracks(); i++){
303 pam-fi 1.4
304 pam-fi 1.6 TrkTrack *ts = 0;
305 pam-fi 1.3
306 pam-fi 1.1 // get tracker tracks
307 pam-fi 1.6 TrkTrack *tp = TrkLevel2::GetTrack(i); //tracker
308     CaloTrkVar *cp = 0;
309     ToFTrkVar *op = 0;
310 pam-fi 1.9
311     // cout << "trk track n. "<<i << " "<<hex<< tp <<dec<< endl;
312 pam-fi 1.1 // if track has an image, check image selection
313 pam-fi 1.6 if(tp->HasImage()){
314    
315     TrkTrack *ti = TrkLevel2::GetTrackImage(i); //tracker (image)
316     CaloTrkVar *ci = 0;
317     ToFTrkVar *oi = 0;
318    
319 pam-fi 1.9 // cout << "its image "<<i << " "<<hex<< ti <<dec<< endl;
320    
321 pam-fi 1.1 //assign starting scores
322 pam-fi 1.6 Int_t tp_score = 0; //main track sorted by the tracker
323     Int_t ti_score = 0; //image track
324    
325 pam-fi 1.1 // ------------------------
326     // calorimeter check
327     // ------------------------
328 pam-fi 1.6 // check the Y spatial residual on the first calorimeter plane
329     // (cut on calorimeter variables from Emiliano)
330     if(
331     use_CAL &&
332     npcfit[1] > 15 && //no. of fit planes on Y view
333     varcfit[1] < 1000. && //fit variance on Y view
334     true){
335 pam-fi 1.9
336 pam-fi 1.6 cp = GetCaloStoredTrack(tp->GetSeqNo());
337     ci = GetCaloStoredTrack(ti->GetSeqNo());
338    
339     Float_t resy_p = cp->tbar[0][1] - cbar[0][1]; if(resy_p < 0)resy_p= - resy_p;
340     Float_t resy_i = ci->tbar[0][1] - cbar[0][1]; if(resy_i < 0)resy_i= - resy_i;
341    
342     if(resy_p <= resy_i) tp_score++;
343     else ti_score++;
344 pam-fi 1.9
345     // cout << "CALO "<<tp_score<<ti_score<<endl;
346    
347 pam-fi 1.6 };
348 pam-fi 1.1 // ------------------------
349     // TOF check
350     // ------------------------
351 pam-fi 1.6 // check the number of hit pmts along the track
352     // on S12 S21 and S32, where paddles are parallel to Y axis
353     if( use_TOF ){
354    
355     Int_t nphit_p =0;
356     Int_t nphit_i =0;
357    
358     op = GetToFStoredTrack(tp->GetSeqNo());
359     oi = GetToFStoredTrack(ti->GetSeqNo());
360    
361 pam-fi 1.5 /* cout << "track: npmtadc "<< op->npmtadc << endl;
362     cout << "track: npmttdc "<< op->npmttdc << endl;
363     cout << "image: npmtadc "<< oi->npmtadc << endl;
364     cout << "image: npmttdc "<< oi->npmttdc << endl;*/
365 pam-fi 1.6
366     for (Int_t ih=0; ih < op->npmtadc; ih++){
367     Int_t pl = GetPlaneIndex( (op->pmtadc).At(ih) );
368     if(pl == 1 || pl == 2 || pl == 5)nphit_p++;
369     };
370    
371     for (Int_t ih=0; ih < oi->npmtadc; ih++){
372     Int_t pl = GetPlaneIndex( (oi->pmtadc).At(ih) );
373     if(pl == 1 || pl == 2 || pl == 5)nphit_i++;
374     };
375    
376     if(
377     use_TOF &&
378     (nphit_p+nphit_i) !=0 &&
379     true){
380    
381     if( nphit_p >= nphit_i) tp_score++;
382     else ti_score++;
383     };
384 pam-fi 1.9 // cout << "TOF "<<tp_score<<ti_score<<endl;
385 pam-fi 1.6 };
386     if(tp_score == ti_score) use_TRK = true;
387     // ------------------------
388 pam-fi 1.3 // tracker check
389     // ------------------------
390 pam-fi 1.6 // chi**2 difference is not always large enough to distinguish among
391     // the real track and its image.
392     // Tracker check will be applied always when calorimeter and tof information is ambiguous.
393     if(use_TRK){
394     if( tp->chi2 > 0 && tp->chi2 < ti->chi2 ) tp_score++ ;
395     else if( ti->chi2 > 0 && ti->chi2 < tp->chi2 ) ti_score++ ;
396 pam-fi 1.9 // cout << "TRK "<<tp_score<<ti_score<<endl;
397 pam-fi 1.6 };
398    
399 pam-fi 1.1 // ------------------------
400     // the winner is....
401     // ------------------------
402 pam-fi 1.6 if (tp_score > ti_score) ts = tp;//the track sorted by the tracker!!
403     else if (tp_score < ti_score) ts = ti;//its image!!
404     else {
405     ts = tp;
406 pam-fi 1.3 // cout << "Warning - track image ambiguity not solved" << endl;
407     // cout << ts->GetNtot() << " "<< ts->chi2 << " " << npcfit[1] << " "<< nphit_p << endl;
408 pam-fi 1.6 };
409    
410     }else{
411     ts = tp;
412     };
413    
414 pam-fi 1.9 // cout <<" SortTracks() "<<i<<" -- "<<ts<<endl;
415 pam-fi 1.6 sorted_tracks->Add(ts);//save the track in the sorted array
416 pam-fi 1.9 // cout << "SortTracks:: sorted_tracks->Add(it) "<<i<<" "<<ts<<endl;
417 pam-fi 1.6
418     };
419     //Restore Object count
420     //To save space in the table keeping track of all referenced objects
421     //we assume that our events do not address each other. We reset the
422     //object count to what it was at the beginning of the event.
423     TProcessID::SetObjectCount(ObjectNumber);
424    
425 pam-fi 1.1 };
426     //--------------------------------------
427     //
428     //
429     //--------------------------------------
430     /**
431 pam-fi 1.2 * This method overrides TrkLevel2::GetTracks(), where sorting is done by decreasing number of fit points and increasing chi^2.
432     * PamLevel2::GetTracks() keeps the same track order given by TrkLevel2::GetTracks(), but checks image selection by using calorimeter and ToF tracking information.
433     */
434 pam-fi 1.8 TRefArray *PamLevel2::GetTracks(){
435    
436     // *-*-*-*-*-*-*-*-*-*-*-*-*
437     SortTracks("+CAL+TOF");
438     // *-*-*-*-*-*-*-*-*-*-*-*-*
439    
440     return sorted_tracks;
441 pam-fi 1.2 };
442     //--------------------------------------
443 pam-fi 1.3 //
444     //
445 pam-fi 1.2 //--------------------------------------
446     /**
447 pam-fi 1.1 * Retrieves the it-th Pamela "physical" track.
448     * It override TrkLevel2::GetTrack(int it).
449     * @param it Track number, ranging from 0 to GetNTracks().
450     */
451     PamTrack *PamLevel2::GetTrack(int it){
452 pam-fi 1.3
453 pam-fi 1.8 // *-*-*-*-*-*-*-*-*-*-*-*-*
454     SortTracks("+CAL+TOF");
455     // *-*-*-*-*-*-*-*-*-*-*-*-*
456    
457 pam-fi 1.6 PamTrack *track = 0;
458    
459     if( it >=0 && it < TrkLevel2::GetNTracks() && it<sorted_tracks->GetEntriesFast() ){
460     TrkTrack *t = (TrkTrack*)sorted_tracks->At(it);
461     track = GetPamTrackAlong(t);
462     }else{
463     cout << "PamLevel2::GetTrack(int) : tracker track SeqNo "<< it <<" does not exist (GetNTracks() = "<<TrkLevel2::GetNTracks()<<")"<<endl;
464     };
465    
466     return track;
467    
468 pam-fi 1.1 };
469 pam-fi 1.3
470 pam-fi 1.1 //--------------------------------------
471     //
472     //
473     //--------------------------------------
474     /**
475 pam-fi 1.3 * Retrieves (if present) the image of the it-th Pamela "physical" track, sorted by the method PamLevel2::SortTracks().
476 pam-fi 1.1 * @param it Track number, ranging from 0 to GetNTracks().
477     */
478     PamTrack *PamLevel2::GetTrackImage(int it){
479    
480 pam-fi 1.8 // *-*-*-*-*-*-*-*-*-*-*-*-*
481     SortTracks("+CAL+TOF");
482     // *-*-*-*-*-*-*-*-*-*-*-*-*
483    
484     PamTrack *image = 0;
485    
486     if( it >=0 && it < TrkLevel2::GetNTracks() ){
487     TrkTrack *temp = (TrkTrack*)sorted_tracks->At(it);
488     if( temp->HasImage() ){
489     TrkTrack *t = TrkLevel2::GetStoredTrack(temp->GetImageSeqNo());
490     image = GetPamTrackAlong(t);
491 pam-fi 1.2 }else{
492 pam-fi 1.8 cout <<"PamLevel2::GetTrackImage(int) : Track SeqNo "<<it<<" does not have image"<<endl;
493 pam-fi 1.1 };
494 pam-fi 1.8 }else{
495     cout << "PamLevel2::GetTrackImage(int) : Tracker track SeqNo "<< it <<" does not exist (GetNTracks() = "<<TrkLevel2::GetNTracks()<<")"<<endl;
496     };
497 pam-fi 1.1
498 pam-fi 1.8 return image;
499 pam-fi 1.1 }
500    
501     //--------------------------------------
502     //
503     //
504     //--------------------------------------
505     /**
506 pam-fi 1.2 * Get the Pamela detector trees in a single file and make them friends.
507     * @param f TFile pointer
508     * @param detlist String to select trees to be included
509     * @return Pointer to a TTree
510 pam-fi 1.1 */
511 pam-fi 1.11 TTree *PamLevel2::GetPamTree(TFile *f, TString detlist ){
512 pam-fi 1.4
513 pam-fi 1.12 // if( !detlist.IsNull() ) SetWhichTrees(detlist);
514     // else GetWhichTrees(f);
515     SetWhichTrees(detlist);
516 pam-fi 1.9
517 pam-fi 1.6 TTree *Trout =0;
518 pam-fi 1.9
519     TString fname = f->GetName();
520     if(!CheckLevel2File(fname))return NULL;
521    
522 pam-fi 1.11 UInt_t *found=0;
523    
524 pam-fi 1.12 cout<< "GetPamTree(TFile*,TString): detector list --> ";
525     if(TRK1)cout<<"TRK1 ";
526     if(TRK2)cout<<"TRK2 ";
527     if(TRKh)cout<<"TRKH ";
528     if(CAL1)cout<<"CAL1 ";
529     if(CAL2)cout<<"CAL2 ";
530     if(TOF)cout<<"TOF ";
531     if(TRG)cout<<"TRG ";
532     if(AC)cout<<"AC ";
533     if(ND)cout<<"ND ";
534     if(S4)cout<<"S4 ";
535     if(ORB)cout<<"ORB ";
536     cout << endl;
537    
538     f->cd();
539    
540 pam-fi 1.4 // Tracker
541 pam-fi 1.1 TTree *T = (TTree*)f->Get("Tracker");
542 pam-fi 1.8 if(T && (TRK2||TRK1||TRKh)) {
543 pam-fi 1.9 if(TRK2)T->SetBranchAddress("TrkLevel2", GetPointerTo("TrkLevel2"));
544 pam-fi 1.11 else T->SetBranchStatus("TrkLevel2",0,found);
545 pam-fi 1.8 if(TRK2)cout << "Tracker : set branch address TrkLevel2"<<endl;
546 pam-fi 1.9 if(TRK1)T->SetBranchAddress("TrkLevel1", GetPointerTo("TrkLevel1"));
547 pam-fi 1.11 else T->SetBranchStatus("TrkLevel1",0,found);
548 pam-fi 1.8 if(TRK1)cout << "Tracker : set branch address TrkLevel1"<<endl;
549 pam-fi 1.9 if(TRKh)T->SetBranchAddress("TrkHough", GetPointerTo("TrkHough"));
550 pam-fi 1.11 else T->SetBranchStatus("TrkHough",0,found);
551 pam-fi 1.9 if(TRKh)cout << "Tracker : set branch address TrkHough"<<endl;
552     if(!Trout)Trout=T;
553     else Trout->AddFriend(T);
554 pam-fi 1.1 }else{
555     cout << "Tracker : missing tree"<<endl;
556     };
557     // Calorimeter
558     TTree *C = (TTree*)f->Get("Calorimeter");
559 pam-fi 1.9 if(C && (CAL2||CAL1)) {
560     if(CAL2)C->SetBranchAddress("CaloLevel2", GetPointerTo("CaloLevel2"));
561 pam-fi 1.11 else C->SetBranchStatus("CaloLevel2",0,found);
562 pam-fi 1.9 if(CAL2)cout << "Calorimeter : set branch address CaloLevel2"<<endl;
563     if(CAL1)C->SetBranchAddress("CaloLevel1", GetPointerTo("CaloLevel1"));
564 pam-fi 1.11 else C->SetBranchStatus("CaloLevel1",0,found);
565 pam-fi 1.9 if(CAL1)cout << "Calorimeter : set branch address CaloLevel1"<<endl;
566 pam-fi 1.4 if(!Trout)Trout=C;
567     else Trout->AddFriend(C);
568 pam-fi 1.1 }else{
569     cout << "Calorimeter : missing tree"<<endl;
570     };
571 pam-fi 1.12
572 pam-fi 1.1 // ToF
573     TTree *O = (TTree*)f->Get("ToF");
574 pam-fi 1.2 if(O && TOF) {
575 pam-fi 1.9 O->SetBranchAddress("ToFLevel2", GetPointerTo("ToFLevel2"));
576 pam-fi 1.1 cout << "ToF : set branch address ToFLevel2"<<endl;
577 pam-fi 1.4 if(!Trout)Trout=O;
578     else Trout->AddFriend(O);
579 pam-fi 1.1 }else{
580     cout << "ToF : missing tree"<<endl;
581     };
582     // Trigger
583     TTree *R = (TTree*)f->Get("Trigger");
584 pam-fi 1.2 if(R && TRG) {
585 pam-fi 1.9 R->SetBranchAddress("TrigLevel2", GetPointerTo("TrigLevel2"));
586 pam-fi 1.1 cout << "Trigger : set branch address TrigLevel2"<<endl;
587 pam-fi 1.4 if(!Trout)Trout=O;
588     else Trout->AddFriend(R);
589 pam-fi 1.1 }else{
590     cout << "Trigger : missing tree"<<endl;
591     };
592     // S4
593     TTree *S = (TTree*)f->Get("S4");
594 pam-fi 1.2 if(S && S4) {
595 pam-fi 1.9 S->SetBranchAddress("S4Level2", GetPointerTo("S4Level2"));
596 pam-fi 1.1 cout << "S4 : set branch address S4Level2"<<endl;
597 pam-fi 1.4 if(!Trout)Trout=O;
598     else Trout->AddFriend(S);
599 pam-fi 1.1 }else{
600     cout << "S4 : missing tree"<<endl;
601     };
602     // Neutron Detector
603     TTree *N = (TTree*)f->Get("NeutronD");
604 pam-fi 1.2 if(N && ND) {
605 pam-fi 1.9 N->SetBranchAddress("NDLevel2", GetPointerTo("NDLevel2"));
606 pam-fi 1.1 cout << "NeutronD : set branch address NDLevel2"<<endl;
607 pam-fi 1.4 if(!Trout)Trout=O;
608     else Trout->AddFriend(N);
609 pam-fi 1.1 }else{
610     cout << "NeutronD : missing tree"<<endl;
611     };
612     // Anticounters
613     TTree *A = (TTree*)f->Get("Anticounter");
614 pam-fi 1.2 if(A && AC) {
615 pam-fi 1.9 A->SetBranchAddress("AcLevel2", GetPointerTo("AcLevel2"));
616 pam-fi 1.1 cout << "Anticounter : set branch address AcLevel2"<<endl;
617 pam-fi 1.4 if(!Trout)Trout=O;
618     else Trout->AddFriend(A);
619 pam-fi 1.1 }else{
620     cout << "Anticounter : missing tree"<<endl;
621     };
622 pam-fi 1.2 // Orbital Info
623 pam-fi 1.11 TTree *B = (TTree*)f->Get("OrbitalInfo");
624     if(B && ORB) {
625     B->SetBranchAddress("OrbitalInfo", GetPointerTo("OrbitalInfo"));
626     cout << "OrbitalInfo : set branch address OrbitalInfo"<<endl;
627     if(!Trout)Trout=O;
628     else Trout->AddFriend(B);
629     }else{
630     cout << "OrbitalInfo : missing tree"<<endl;
631     };
632    
633     cout<<endl<<" Number of entries: "<<Trout->GetEntries()<<endl<<endl;
634 pam-fi 1.1
635 pam-fi 1.11 return Trout;
636 pam-fi 1.1
637     }
638 pam-fi 1.2 //--------------------------------------
639     //
640     //
641     //--------------------------------------
642     /**
643     * Get list of Level2 files.
644     * @param ddir Level2 data directory.
645     * @param flisttxt Name of txt file containing file list.
646     * @return Pointer to a TList of TSystemFiles
647     * If no input file list is given , all the Level2 files inside the directory are processed.
648     */
649     TList* PamLevel2::GetListOfLevel2Files(TString ddir, TString flisttxt = ""){
650    
651 pam-fi 1.6 TString wdir = gSystem->WorkingDirectory();
652    
653     if(ddir=="")ddir = wdir;
654     // TSystemDirectory *datadir = new TSystemDirectory(gSystem->BaseName(ddir),ddir);
655     cout << "Level2 data directory : "<< ddir << endl;
656    
657     TList *contents = new TList; // create output list
658     contents->SetOwner();
659    
660     char *fullpath;
661    
662     // if no input file list is given:
663     if ( flisttxt != "" ){
664 pam-fi 1.2
665 pam-fi 1.11 if( !gSystem->IsFileInIncludePath(flisttxt,&fullpath) ){
666     cout <<"File "<<flisttxt<<" not found"<<endl;
667     return 0;
668     }
669 pam-fi 1.4 // flisttxt = gSystem->ConcatFileName(gSystem->DirName(flisttxt),gSystem->BaseName(flisttxt));
670 pam-fi 1.6 flisttxt = fullpath;
671    
672 pam-fi 1.11 if( !gSystem->ChangeDirectory(ddir) ){
673     cout << "Cannot change directory : "<<ddir<<endl;
674     return 0;
675     }
676 pam-fi 1.2
677 pam-fi 1.6 cout <<"Input file list : " << flisttxt <<endl;
678     ifstream in;
679     in.open(flisttxt, ios::in); //open input file list
680 pam-fi 1.9 int line=0;
681 pam-fi 1.6 while (1) {
682     TString file;
683     in >> file;
684     if (!in.good()) break;
685 pam-fi 1.9 line++;
686 pam-fi 1.8 // cout <<"(1) " << file << endl;
687 pam-fi 1.9 if(file.IsNull()){
688     cout << "-- list interrupted at line "<<line <<endl;
689     break;
690     }
691 pam-fi 1.10 if(file.Contains("#"))file = file(0,file.First("#"));
692     // cout <<"(2) " << file << endl;
693 pam-fi 1.6 if( gSystem->IsFileInIncludePath(file,&fullpath) ){
694 pam-fi 1.8
695 pam-fi 1.6 contents->Add(new TSystemFile(fullpath,gSystem->DirName(fullpath)));// add file to the list
696 pam-fi 1.8
697 pam-fi 1.6 }else{
698 pam-fi 1.10 // if(file.Data()!="")cout << "File: "<<file<<" ---> missing "<< endl;
699 pam-fi 1.6 };
700     };
701     in.close();
702    
703     }else{
704 pam-fi 1.2
705 pam-fi 1.6 cout << "No input file list given."<<endl;
706     cout << "Check for existing root files."<<endl;
707 pam-fi 1.2 // cout << "Warking directory: "<< gSystem->WorkingDirectory()<< endl;
708 pam-fi 1.6
709     TSystemDirectory *datadir = new TSystemDirectory(gSystem->BaseName(ddir),ddir);
710     TList *temp = datadir->GetListOfFiles();
711 pam-fi 1.2 // temp->Print();
712     // cout << "*************************************" << endl;
713    
714 pam-fi 1.6 TIter next(temp);
715     TSystemFile *questo = 0;
716    
717    
718     while ( (questo = (TSystemFile*) next()) ) {
719     TString name = questo-> GetName();
720     if( name.EndsWith(".root") ){
721     char *fullpath;
722     gSystem->IsFileInIncludePath(name,&fullpath);
723     contents->Add(new TSystemFile(fullpath,gSystem->DirName(fullpath)));
724     };
725     }
726     delete temp;
727     delete datadir;
728    
729     };
730     gSystem->ChangeDirectory(wdir); // back to the working directory
731 pam-fi 1.5 // cout << endl << "Selected files:" << endl;
732     // contents->Print();
733 pam-fi 1.6 cout << contents->GetEntries()<<" files selected\n";
734 pam-fi 1.5 // cout << endl;
735 pam-fi 1.4 // cout << "Working directory: "<< gSystem->WorkingDirectory()<< endl;
736 pam-fi 1.6 return contents;
737 pam-fi 1.2 };
738     //--------------------------------------
739     //
740     //
741     //--------------------------------------
742     /**
743     * Get the Pamela detector chains from a list of files and make them friends.
744     * @param fl Pointer to a TList of TSystemFiles
745     * @param detlist String to select trees to be included
746     * @return Pointer to a TChain
747     */
748 pam-fi 1.11 TChain *PamLevel2::GetPamTree(TList *fl, TString detlist ){
749    
750     TChain *Trout =0;
751 pam-fi 1.2
752 pam-fi 1.12 // if( !detlist.IsNull() )SetWhichTrees(detlist);
753     SetWhichTrees(detlist);
754 pam-fi 1.6
755 pam-fi 1.12 cout<< "GetPamTree(TList*,TString): detector list --> ";
756     if(TRK1)cout<<"TRK1 ";
757     if(TRK2)cout<<"TRK2 ";
758     if(TRKh)cout<<"TRKH ";
759     if(CAL1)cout<<"CAL1 ";
760     if(CAL2)cout<<"CAL2 ";
761     if(TOF)cout<<"TOF ";
762     if(TRG)cout<<"TRG ";
763     if(AC)cout<<"AC ";
764     if(ND)cout<<"ND ";
765     if(S4)cout<<"S4 ";
766     if(ORB)cout<<"ORB ";
767     cout << endl;
768    
769    
770 pam-fi 1.6
771     TChain *T = 0;
772     TChain *C = 0;
773     TChain *O = 0;
774     TChain *R = 0;
775     TChain *S = 0;
776     TChain *N = 0;
777     TChain *A = 0;
778     TChain *B = 0;
779    
780 pam-fi 1.8 if(TRK2||TRK1||TRKh) T = new TChain("Tracker");
781 pam-fi 1.11 if(CAL2||CAL1) C = new TChain("Calorimeter");
782     if(TOF) O = new TChain("ToF");
783     if(TRG) R = new TChain("Trigger");
784     if(S4) S = new TChain("S4");
785     if(ND) N = new TChain("NeutronD");
786     if(AC) A = new TChain("Anticounter");
787     if(ORB) B = new TChain("OrbitalInfo");
788 pam-fi 1.6
789     // loop over files and create chains
790     TIter next(fl);
791     TSystemFile *questo = 0;
792     while ( (questo = (TSystemFile*) next()) ) {
793     TString name = questo->GetName();
794 pam-fi 1.11 // cout << "File: "<< name << endl;
795 pam-fi 1.6 if( CheckLevel2File(name) ){
796 pam-fi 1.8 if(TRK2||TRK1||TRKh) T->Add(name);
797 pam-fi 1.11 if(CAL1||CAL2) C->Add(name);
798     if(TOF) O->Add(name);
799     if(TRG) R->Add(name);
800     if(S4) S->Add(name);
801     if(ND) N->Add(name);
802     if(AC) A->Add(name);
803     if(ORB) B->Add(name);
804 pam-fi 1.4 };
805 pam-fi 1.6 }
806    
807     cout << "done chain \n";
808 pam-fi 1.11
809     UInt_t *found=0;
810     // Tracker
811     if(T && (TRK2||TRK1||TRKh)) {
812     if(TRK2)T->SetBranchAddress("TrkLevel2", GetPointerTo("TrkLevel2"));
813     else T->SetBranchStatus("TrkLevel2",0,found);
814     if(TRK2)cout << "Tracker : set branch address TrkLevel2"<<endl;
815     if(TRK1)T->SetBranchAddress("TrkLevel1", GetPointerTo("TrkLevel1"));
816     else T->SetBranchStatus("TrkLevel1",0,found);
817     if(TRK1)cout << "Tracker : set branch address TrkLevel1"<<endl;
818     if(TRKh)T->SetBranchAddress("TrkHough", GetPointerTo("TrkHough"));
819     else T->SetBranchStatus("TrkHough",0,found);
820     if(TRKh)cout << "Tracker : set branch address TrkHough"<<endl;
821     if(!Trout)Trout=T;
822     else Trout->AddFriend("Tracker");
823     }else{
824     cout << "Tracker : missing tree"<<endl;
825     };
826 pam-fi 1.6 // Calorimeter
827 pam-fi 1.11 if(C && (CAL2||CAL1)) {
828     if(CAL2)C->SetBranchAddress("CaloLevel2", GetPointerTo("CaloLevel2"));
829     else C->SetBranchStatus("CaloLevel2",0,found);
830     if(CAL2)cout << "Calorimeter : set branch address CaloLevel2"<<endl;
831     if(CAL1)C->SetBranchAddress("CaloLevel1", GetPointerTo("CaloLevel1"));
832     else C->SetBranchStatus("CaloLevel1",0,found);
833     if(CAL1)cout << "Calorimeter : set branch address CaloLevel1"<<endl;
834     if(!Trout)Trout=C;
835     else Trout->AddFriend("Calorimeter");
836     }else{
837     cout << "Calorimeter : missing tree"<<endl;
838 pam-fi 1.6 };
839 pam-fi 1.4 // ToF
840 pam-fi 1.11 if(O && TOF) {
841     O->SetBranchAddress("ToFLevel2", GetPointerTo("ToFLevel2"));
842     cout << "ToF : set branch address ToFLevel2"<<endl;
843     if(!Trout)Trout=O;
844     else Trout->AddFriend("ToF");
845     }else{
846     cout << "ToF : missing tree"<<endl;
847 pam-fi 1.6 };
848 pam-fi 1.4 // Trigger
849 pam-fi 1.11 if(R && TRG) {
850     R->SetBranchAddress("TrigLevel2", GetPointerTo("TrigLevel2"));
851     cout << "Trigger : set branch address TrigLevel2"<<endl;
852     if(!Trout)Trout=O;
853     else Trout->AddFriend("Trigger");
854     }else{
855     cout << "Trigger : missing tree"<<endl;
856 pam-fi 1.6 };
857 pam-fi 1.4 // S4
858 pam-fi 1.11 if(S && S4) {
859     S->SetBranchAddress("S4Level2", GetPointerTo("S4Level2"));
860     cout << "S4 : set branch address S4Level2"<<endl;
861     if(!Trout)Trout=O;
862     else Trout->AddFriend("S4");
863     }else{
864     cout << "S4 : missing tree"<<endl;
865 pam-fi 1.6 };
866 pam-fi 1.4 // Neutron Detector
867 pam-fi 1.11 if(N && ND) {
868     N->SetBranchAddress("NDLevel2", GetPointerTo("NDLevel2"));
869     cout << "NeutronD : set branch address NDLevel2"<<endl;
870     if(!Trout)Trout=O;
871     else Trout->AddFriend("NeutronD");
872     }else{
873     cout << "NeutronD : missing tree"<<endl;
874 pam-fi 1.6 };
875 pam-fi 1.4 // Anticounters
876 pam-fi 1.11 if(A && AC) {
877     A->SetBranchAddress("AcLevel2", GetPointerTo("AcLevel2"));
878     cout << "Anticounter : set branch address AcLevel2"<<endl;
879     if(!Trout)Trout=O;
880     else Trout->AddFriend("Anticounter");
881     }else{
882     cout << "Anticounter : missing tree"<<endl;
883 pam-fi 1.6 };
884 pam-fi 1.11 // Orbital Info
885     if(B && ORB) {
886     B->SetBranchAddress("OrbitalInfo", GetPointerTo("OrbitalInfo"));
887     cout << "OrbitalInfo : set branch address OrbitalInfo"<<endl;
888     if(!Trout)Trout=O;
889     else Trout->AddFriend("OrbitalInfo");
890     }else{
891     cout << "OrbitalInfo : missing tree"<<endl;
892 pam-fi 1.6 };
893    
894 pam-fi 1.11 // cout<<endl<<" Number of entries: "<<Trout->GetEntries()<<endl<<endl;
895    
896    
897     // // Tracker
898     // if(TRK2||TRK1||TRKh){
899     // if(!Tout)Tout=T;
900     // else Tout->AddFriend("Tracker");
901     // }
902     // // Calorimeter
903     // if(CAL2||CAL1) {
904     // if(!Tout)Tout=C;
905     // else Tout->AddFriend("Calorimeter");
906     // };
907     // // ToF
908     // if(TOF) {
909     // if(!Tout)Tout=O;
910     // else Tout->AddFriend("ToF");
911     // };
912     // // Trigger
913     // if(TRG) {
914     // if(!Tout)Tout=R;
915     // else Tout->AddFriend("Trigger");
916     // };
917     // // S4
918     // if(S4) {
919     // if(!Tout)Tout=S;
920     // else Tout->AddFriend("S4");
921     // };
922     // // Neutron Detector
923     // if(ND) {
924     // if(!Tout)Tout=N;
925     // else Tout->AddFriend("NeutronD");
926     // };
927     // // Anticounters
928     // if(AC) {
929     // if(!Tout)Tout=A;
930     // else Tout->AddFriend("Anticounter");
931     // };
932     // // OrbitalInfo
933     // if(ORB) {
934     // if(!Tout)Tout=B;
935     // else Tout->AddFriend("OrbitalInfo");
936     // };
937    
938 pam-fi 1.6 // cout<<endl<<" Number of entries: "<<Tout->GetEntries()<<endl<<endl;
939    
940 pam-fi 1.11 // if( Tout->GetEntries() )PamLevel2::SetBranchAddress( Tout );
941 pam-fi 1.6
942 pam-fi 1.11 return Trout;
943 pam-fi 1.4 }
944 pam-fi 1.8
945    
946    
947 pam-fi 1.4 //--------------------------------------
948     //
949     //
950     //--------------------------------------
951     /**
952     * Set branch addresses for Pamela friend trees
953     */
954 pam-fi 1.8 void PamLevel2::SetBranchAddress(TTree *t){
955    
956     TRK2 = TRK2 & t->GetBranchStatus("TrkLevel2");
957     TRK1 = TRK1 & t->GetBranchStatus("TrkLevel1");
958     TRKh = TRKh & t->GetBranchStatus("TrkHough");
959     CAL2 = CAL2 & t->GetBranchStatus("CaloLevel2");
960     CAL1 = CAL1 & t->GetBranchStatus("CaloLevel1");
961     TOF = TOF & t->GetBranchStatus("ToFLevel2");
962     TRG = TRG & t->GetBranchStatus("TrigLevel2");
963     S4 = S4 & t->GetBranchStatus("S4Level2");
964     ND = ND & t->GetBranchStatus("NDLevel2");
965     AC = AC & t->GetBranchStatus("AcLevel2");
966     ORB = ORB & t->GetBranchStatus("OrbitalInfo");
967    
968    
969 pam-fi 1.4 // Tracker
970 pam-fi 1.8 if(TRK1) {
971 pam-fi 1.9 t->SetBranchAddress("TrkLevel1", GetPointerTo("TrkLevel2"));
972 pam-fi 1.8 cout << "Tracker : set branch address TrkLevel1"<<endl;
973     };
974     if(TRK2) {
975 pam-fi 1.9 t->SetBranchAddress("TrkLevel2", GetPointerTo("TrkLevel1"));
976 pam-fi 1.6 cout << "Tracker : set branch address TrkLevel2"<<endl;
977     };
978 pam-fi 1.8 if(TRKh) {
979 pam-fi 1.9 t->SetBranchAddress("TrkHough", GetPointerTo("TrkHough"));
980 pam-fi 1.8 cout << "Tracker : set branch address TrkHough"<<endl;
981     };
982 pam-fi 1.6
983     // Calorimeter
984 pam-fi 1.8 if(CAL1) {
985 pam-fi 1.9 t->SetBranchAddress("CaloLevel1", GetPointerTo("CaloLevel1"));
986 pam-fi 1.8 cout << "Calorimeter : set branch address CaloLevel1"<<endl;
987     };
988     if(CAL2) {
989 pam-fi 1.9 t->SetBranchAddress("CaloLevel2", GetPointerTo("CaloLevel2"));
990 pam-fi 1.6 cout << "Calorimeter : set branch address CaloLevel2"<<endl;
991     };
992    
993 pam-fi 1.4 // ToF
994 pam-fi 1.6 if(TOF) {
995 pam-fi 1.9 t->SetBranchAddress("ToFLevel2", GetPointerTo("ToFLevel2"));
996 pam-fi 1.6 cout << "ToF : set branch address ToFLevel2"<<endl;
997     };
998 pam-fi 1.4 // Trigger
999 pam-fi 1.6 if(TRG) {
1000 pam-fi 1.9 t->SetBranchAddress("TrigLevel2", GetPointerTo("TrigLevel2"));
1001 pam-fi 1.6 cout << "Trigger : set branch address TrigLevel2"<<endl;
1002     };
1003 pam-fi 1.4 // S4
1004 pam-fi 1.6 if(S4) {
1005 pam-fi 1.9 t->SetBranchAddress("S4Level2", GetPointerTo("S4Level2"));
1006 pam-fi 1.6 cout << "S4 : set branch address S4Level2"<<endl;
1007     };
1008 pam-fi 1.4 // Neutron Detector
1009 pam-fi 1.6 if(ND) {
1010 pam-fi 1.9 t->SetBranchAddress("NDLevel2", GetPointerTo("NDLevel2"));
1011 pam-fi 1.6 cout << "NeutronD : set branch address NDLevel2"<<endl;
1012     };
1013 pam-fi 1.4 // Anticounters
1014 pam-fi 1.6 if(AC) {
1015 pam-fi 1.9 t->SetBranchAddress("AcLevel2", GetPointerTo("AcLevel2"));
1016 pam-fi 1.6 cout << "Anticounter : set branch address AcLevel2"<<endl;
1017     };
1018 pam-fi 1.4 // OrbitalInfo
1019 pam-fi 1.6 if(ORB) {
1020 pam-fi 1.9 t->SetBranchAddress("OrbitalInfo", GetPointerTo("OrbitalInfo"));
1021 pam-fi 1.6 cout << "OrbitalInfo : set branch address OrbitalInfo"<<endl;
1022     };
1023    
1024 pam-fi 1.4 }
1025 pam-fi 1.8 /**
1026     * Set branch addresses for Pamela friend trees
1027     */
1028     void PamLevel2::SetBranchAddress(TChain *t){
1029 pam-fi 1.4
1030 pam-fi 1.8 TRK2 = TRK2 & t->GetBranchStatus("TrkLevel2");
1031     TRK1 = TRK1 & t->GetBranchStatus("TrkLevel1");
1032     TRKh = TRKh & t->GetBranchStatus("TrkHough");
1033     CAL1 = CAL1 & t->GetBranchStatus("CaloLevel1");
1034     CAL2 = CAL2 & t->GetBranchStatus("CaloLevel2");
1035     TOF = TOF & t->GetBranchStatus("ToFLevel2");
1036     TRG = TRG & t->GetBranchStatus("TrigLevel2");
1037     S4 = S4 & t->GetBranchStatus("S4Level2");
1038     ND = ND & t->GetBranchStatus("NDLevel2");
1039     AC = AC & t->GetBranchStatus("AcLevel2");
1040     ORB = ORB & t->GetBranchStatus("OrbitalInfo");
1041    
1042     // Tracker
1043 pam-fi 1.9 if(TRK2) {
1044 pam-fi 1.11 t->SetBranchAddress("TrkLevel2", GetPointerTo("TrkLevel2"));
1045 pam-fi 1.9 cout << "Tracker : set branch address TrkLevel2"<<endl;
1046     };
1047 pam-fi 1.8 if(TRK1) {
1048 pam-fi 1.9 t->SetBranchAddress("TrkLevel1", GetPointerTo("TrkLevel1"));
1049 pam-fi 1.8 cout << "Tracker : set branch address TrkLevel1"<<endl;
1050     };
1051     if(TRKh) {
1052 pam-fi 1.9 t->SetBranchAddress("TrkHough", GetPointerTo("TrkHough"));
1053 pam-fi 1.8 cout << "Tracker : set branch address TrkHough"<<endl;
1054     };
1055    
1056     // Calorimeter
1057 pam-fi 1.9 if(CAL2) {
1058     t->SetBranchAddress("CaloLevel2", GetPointerTo("CaloLevel2"));
1059     cout << "Calorimeter : set branch address CaloLevel2"<<endl;
1060     };
1061 pam-fi 1.8 if(CAL1) {
1062 pam-fi 1.9 t->SetBranchAddress("CaloLevel1", GetPointerTo("CaloLevel1"));
1063 pam-fi 1.8 cout << "Calorimeter : set branch address CaloLevel1"<<endl;
1064     };
1065    
1066     // ToF
1067     if(TOF) {
1068 pam-fi 1.9 t->SetBranchAddress("ToFLevel2", GetPointerTo("ToFLevel2"));
1069 pam-fi 1.8 cout << "ToF : set branch address ToFLevel2"<<endl;
1070     };
1071     // Trigger
1072     if(TRG) {
1073 pam-fi 1.9 t->SetBranchAddress("TrigLevel2", GetPointerTo("TrigLevel2"));
1074 pam-fi 1.8 cout << "Trigger : set branch address TrigLevel2"<<endl;
1075     };
1076     // S4
1077     if(S4) {
1078 pam-fi 1.9 t->SetBranchAddress("S4Level2", GetPointerTo("S4Level2"));
1079 pam-fi 1.8 cout << "S4 : set branch address S4Level2"<<endl;
1080     };
1081     // Neutron Detector
1082     if(ND) {
1083 pam-fi 1.9 t->SetBranchAddress("NDLevel2", GetPointerTo("NDLevel2"));
1084 pam-fi 1.8 cout << "NeutronD : set branch address NDLevel2"<<endl;
1085     };
1086     // Anticounters
1087     if(AC) {
1088 pam-fi 1.9 t->SetBranchAddress("AcLevel2", GetPointerTo("AcLevel2"));
1089 pam-fi 1.8 cout << "Anticounter : set branch address AcLevel2"<<endl;
1090     };
1091     // OrbitalInfo
1092     if(ORB) {
1093 pam-fi 1.9 t->SetBranchAddress("OrbitalInfo", GetPointerTo("OrbitalInfo"));
1094 pam-fi 1.8 cout << "OrbitalInfo : set branch address OrbitalInfo"<<endl;
1095     };
1096    
1097     }
1098 pam-fi 1.9
1099    
1100 pam-fi 1.4 //--------------------------------------
1101     //
1102     //
1103     //--------------------------------------
1104     /**
1105     * Get the Run tree chain from a list of files.
1106     * @param fl Pointer to a TList of TSystemFiles
1107     * @return Pointer to a TChain
1108     */
1109     TChain *PamLevel2::GetRunTree(TList *fl){
1110    
1111 pam-fi 1.6 TChain *R = new TChain("Run");
1112    
1113     // loop over files and create chains
1114     TIter next(fl);
1115     TSystemFile *questo = 0;
1116     while ( (questo = (TSystemFile*) next()) ) {
1117     TString name = questo->GetName();
1118 pam-fi 1.4 // cout << "File: "<< name << endl;
1119 pam-fi 1.6 if( CheckLevel2File(name) ){
1120     R->Add(name);
1121     };
1122     }
1123    
1124 pam-fi 1.9 R->SetBranchAddress("RunInfo", GetPointerTo("RunInfo"));
1125 pam-fi 1.6 cout << "Run : set branch address RunInfo"<<endl;
1126 pam-fi 1.4
1127 pam-fi 1.6 return R;
1128 pam-fi 1.4
1129     }
1130     //--------------------------------------
1131     //
1132     //
1133     //--------------------------------------
1134     /**
1135     * Get the Run tree from a file.
1136     * @param f Pointer to a TFile
1137     * @return Pointer to a TTree
1138     */
1139     TTree *PamLevel2::GetRunTree(TFile *f){
1140    
1141    
1142 pam-fi 1.6 TTree *R = (TTree*)f->Get("Run");
1143    
1144 pam-fi 1.9 R->SetBranchAddress("RunInfo", GetPointerTo("RunInfo"));
1145 pam-fi 1.6 cout << "Run : set branch address RunInfo"<<endl;
1146 pam-fi 1.4
1147 pam-fi 1.6 return R;
1148 pam-fi 1.2
1149     }
1150     //--------------------------------------
1151     //
1152     //
1153     //--------------------------------------
1154     /**
1155 pam-fi 1.8 * Set which trees shoul be analysed
1156 pam-fi 1.2 * @param detlist TString containing the sequence of trees required
1157     */
1158     void PamLevel2::SetWhichTrees(TString detlist){
1159    
1160 pam-fi 1.12 if(detlist.IsNull() || detlist.Contains("+ALL", TString::kIgnoreCase)){
1161 pam-fi 1.8 CAL1 = true;
1162     CAL2 = true;
1163     TRK2 = true;
1164     TRK1 = false;
1165     TRKh = false;
1166 pam-fi 1.6 TRG = true;
1167     TOF = true;
1168     S4 = true;
1169     ND = true;
1170     AC = true;
1171     ORB = true;
1172     }else if( detlist.Contains("-ALL", TString::kIgnoreCase) ){
1173 pam-fi 1.8 CAL1 = false;
1174     CAL2 = false;
1175     TRK2 = false;
1176     TRK1 = false;
1177     TRKh = false;
1178 pam-fi 1.6 TRG = false;
1179     TOF = false;
1180     S4 = false;
1181     ND = false;
1182     AC = false;
1183     ORB = false;
1184     };
1185    
1186 pam-fi 1.8 // -------------------------------------------------------------------------
1187     if( detlist.Contains("CAL1", TString::kIgnoreCase) ){
1188     if ( detlist.Contains("-CAL1", TString::kIgnoreCase) )CAL1=false;
1189     if ( detlist.Contains("+CAL1", TString::kIgnoreCase) )CAL1=true;
1190     };
1191    
1192     if( detlist.Contains("CAL2", TString::kIgnoreCase)){
1193     if ( detlist.Contains("-CAL2", TString::kIgnoreCase) )CAL2=false;
1194     if ( detlist.Contains("+CAL2", TString::kIgnoreCase) )CAL2=true;
1195     };
1196    
1197     if( detlist.Contains("+CAL", TString::kIgnoreCase) && !CAL1 && !CAL2 )CAL2=true;
1198     if( detlist.Contains("-CAL", TString::kIgnoreCase) && CAL1 && CAL2 ){
1199     CAL2=false;
1200     CAL1=false;
1201     }
1202     // -------------------------------------------------------------------------
1203     if( detlist.Contains("TRK1", TString::kIgnoreCase) ){
1204     if ( detlist.Contains("-TRK1", TString::kIgnoreCase) )TRK1=false;
1205     if ( detlist.Contains("+TRK1", TString::kIgnoreCase) )TRK1=true;
1206     };
1207    
1208     if( detlist.Contains("TRK2", TString::kIgnoreCase)){
1209     if ( detlist.Contains("-TRK2", TString::kIgnoreCase) )TRK2=false;
1210     if ( detlist.Contains("+TRK2", TString::kIgnoreCase) )TRK2=true;
1211     };
1212    
1213     if( detlist.Contains("TRKh", TString::kIgnoreCase)){
1214     if ( detlist.Contains("-TRKh", TString::kIgnoreCase) )TRKh=false;
1215     if ( detlist.Contains("+TRKh", TString::kIgnoreCase) )TRKh=true;
1216     };
1217    
1218     if( detlist.Contains("+TRK", TString::kIgnoreCase) && !TRK1 && !TRK2 && !TRKh )TRK2=true;
1219     if( detlist.Contains("-TRK", TString::kIgnoreCase) && TRK1 && TRK2 && TRKh){
1220     TRK2=false;
1221     TRK1=false;
1222     TRKh=false;
1223     }
1224     // -------------------------------------------------------------------------
1225 pam-fi 1.6
1226     if( detlist.Contains("-TRG", TString::kIgnoreCase) )TRG = false;
1227     else if( detlist.Contains("+TRG", TString::kIgnoreCase) )TRG = true;
1228    
1229     if( detlist.Contains("-TOF", TString::kIgnoreCase) )TOF = false;
1230     else if( detlist.Contains("+TOF", TString::kIgnoreCase) )TOF = true;
1231    
1232     if( detlist.Contains("-S4", TString::kIgnoreCase) )S4 = false;
1233     else if( detlist.Contains("+S4", TString::kIgnoreCase) )S4 = true;
1234    
1235     if( detlist.Contains("-ND", TString::kIgnoreCase) )ND = false;
1236     else if( detlist.Contains("+ND", TString::kIgnoreCase) )ND = true;
1237    
1238     if( detlist.Contains("-AC", TString::kIgnoreCase) )AC = false;
1239     else if( detlist.Contains("+AC", TString::kIgnoreCase) )AC = true;
1240    
1241     if( detlist.Contains("-ORB", TString::kIgnoreCase) )ORB = false;
1242     else if( detlist.Contains("+ORB", TString::kIgnoreCase) )ORB = true;
1243 pam-fi 1.11
1244 pam-fi 1.12 // cout<< "Set detector list --> ";
1245     // if(TRK1)cout<<"TRK1 ";
1246     // if(TRK2)cout<<"TRK2 ";
1247     // if(TRKh)cout<<"TRKH ";
1248     // if(CAL1)cout<<"CAL1 ";
1249     // if(CAL2)cout<<"CAL2 ";
1250     // if(TOF)cout<<"TOF ";
1251     // if(TRG)cout<<"TRG ";
1252     // if(AC)cout<<"AC ";
1253     // if(ND)cout<<"ND ";
1254     // if(S4)cout<<"S4 ";
1255     // if(ORB)cout<<"ORB ";
1256     // cout << endl;
1257 pam-fi 1.6
1258 pam-fi 1.2 };
1259 pam-fi 1.11
1260    
1261     /**
1262     * Set tree/branch detector flags from the content of a tree
1263     */
1264     void PamLevel2::GetWhichTrees(TFile* f){
1265    
1266    
1267     // -----------
1268     // reset flags
1269     // -----------
1270 pam-fi 1.12 CAL1 = false;
1271     CAL2 = false;
1272     TRK2 = false;
1273     TRK1 = false;
1274     TRKh = false;
1275     TRG = false;
1276     TOF = false;
1277     S4 = false;
1278     ND = false;
1279     AC = false;
1280     ORB = false;
1281 pam-fi 1.11
1282 pam-fi 1.12 RUN = false;
1283 pam-fi 1.11
1284     cout << "Checking file: "<<f->GetName()<<endl;
1285     if( !f || f->IsZombie() ){
1286     cout << "File: "<< f->GetName() <<" Non valid root file"<< endl;
1287     return;
1288     }
1289    
1290     TList *lk = f->GetListOfKeys();
1291     TIter next(lk);
1292     TKey *key =0;
1293    
1294     Int_t nev = 0;
1295    
1296     while( (key = (TKey*)next()) ){
1297    
1298     if( !strcmp(key->GetName(),"Run" ) )RUN = true;
1299    
1300     //=========================================================
1301     if( !strcmp(key->GetName(),"Trigger" ) ){
1302     TRG = true;
1303     Int_t nevt = ((TTree*)f->Get("Trigger"))->GetEntries();
1304     if( nev && nevt!=nev){
1305     cout << "File: "<< f->GetName() <<" Trigger tree has "<<nevt<<" events instead of "<<nev<< endl;
1306     TRG = false;
1307     }else nev=nevt;
1308     }
1309     //=========================================================
1310     if( !strcmp(key->GetName(),"ToF" ) ){
1311     TOF = true;
1312     Int_t nevt = ((TTree*)f->Get("ToF"))->GetEntries();
1313     if( nev && nevt!=nev){
1314     cout << "File: "<< f->GetName() <<" ToF tree has "<<nevt<<" events instead of "<<nev<< endl;
1315     TOF = false;
1316     }else nev=nevt;
1317     }
1318     //=========================================================
1319     if( !strcmp(key->GetName(),"S4" ) ){
1320     S4 = true;
1321     Int_t nevt = ((TTree*)f->Get("S4"))->GetEntries();
1322     if( nev && nevt!=nev){
1323     cout << "File: "<< f->GetName() <<" S4 tree has "<<nevt<<" events instead of "<<nev<< endl;
1324     S4 = false;
1325     }else nev=nevt;
1326     }
1327     //=========================================================
1328    
1329     if( !strcmp(key->GetName(),"NeutronD" ) ){
1330     ND = true;
1331     Int_t nevt = ((TTree*)f->Get("NeutronD"))->GetEntries();
1332     if( nev && nevt!=nev){
1333     cout << "File: "<< f->GetName() <<"NeutronD tree has "<<nevt<<" events instead of "<<nev<< endl;
1334     ND =false;
1335     }else nev=nevt;
1336     }
1337     //=========================================================
1338     if( !strcmp(key->GetName(),"Anticounter") ){
1339     AC = true;
1340     Int_t nevt = ((TTree*)f->Get("Anticounter"))->GetEntries();
1341     if( nev && nevt!=nev){
1342     cout << "File: "<< f->GetName() <<" Anticounter tree has "<<nevt<<" events instead of "<<nev<< endl;
1343     AC =false;
1344     }else nev=nevt;
1345     }
1346     //=========================================================
1347     if( !strcmp(key->GetName(),"OrbitalInfo") ){
1348     ORB = true;
1349     Int_t nevt = ((TTree*)f->Get("OrbitalInfo"))->GetEntries();
1350     if( nev && nevt!=nev){
1351     cout << "File: "<< f->GetName() <<" OrbitalInfo tree has "<<nevt<<" events instead of "<<nev<< endl;
1352     ORB = false;
1353     }else nev=nevt;
1354     }
1355     //=========================================================
1356     if( !strcmp(key->GetName(),"Tracker" ) ){
1357     TTree *T = (TTree*)f->Get("Tracker");
1358     for(Int_t i=0; i<T->GetListOfBranches()->GetEntries(); i++){
1359     TString name = T->GetListOfBranches()->At(i)->GetName();
1360     if( !name.CompareTo("TrkLevel1") )TRK1=true;
1361     if( !name.CompareTo("TrkLevel2") )TRK2=true;
1362     if( !name.CompareTo("TrkHough") )TRKh=true;
1363     };
1364     Int_t nevt = T->GetEntries();
1365     if( nev && nevt!=nev){
1366     cout << "File: "<< f->GetName() <<" Tracker tree has "<<nevt<<" events instead of "<<nev<< endl;
1367     TRK1 = false;
1368     TRK2 = false;
1369     TRKh = false;
1370     }else nev=nevt;
1371     T->Delete();
1372     };
1373     //=========================================================
1374     if( !strcmp(key->GetName(),"Calorimeter" ) ){
1375     TTree *T = (TTree*)f->Get("Calorimeter");
1376     for(Int_t i=0; i<T->GetListOfBranches()->GetEntries(); i++){
1377     TString name = T->GetListOfBranches()->At(i)->GetName();
1378     if( !name.CompareTo("CaloLevel1") )CAL1=true;
1379     if( !name.CompareTo("CaloLevel2") )CAL2=true;
1380     };
1381     Int_t nevt = T->GetEntries();
1382     if( nev && nevt!=nev){
1383     cout << "File: "<< f->GetName() <<" Calorimeter tree has "<<nevt<<" events instead of "<<nev<< endl;
1384     CAL1 = false;
1385     CAL2 = false;
1386     }else nev=nevt;
1387     T->Delete();
1388     };
1389    
1390     };
1391    
1392     lk->Delete();
1393 pam-fi 1.12
1394     // cout<< "Get detector list from input file --> ";
1395     // if(TRK1)cout<<"TRK1 ";
1396     // if(TRK2)cout<<"TRK2 ";
1397     // if(TRKh)cout<<"TRKH ";
1398     // if(CAL1)cout<<"CAL1 ";
1399     // if(CAL2)cout<<"CAL2 ";
1400     // if(TOF)cout<<"TOF ";
1401     // if(TRG)cout<<"TRG ";
1402     // if(AC)cout<<"AC ";
1403     // if(ND)cout<<"ND ";
1404     // if(S4)cout<<"S4 ";
1405     // if(ORB)cout<<"ORB ";
1406     // cout << endl;
1407 pam-fi 1.11
1408     return ;
1409    
1410     };
1411    
1412    
1413 pam-fi 1.2 //--------------------------------------
1414     //
1415     //
1416     //--------------------------------------
1417     /**
1418 pam-fi 1.3 * Check if a file contains selected Pamela Level2 trees.
1419 pam-fi 1.2 * @param name File name
1420 pam-fi 1.4 * @return true if the file is ok.
1421 pam-fi 1.2 */
1422     Bool_t PamLevel2::CheckLevel2File(TString name){
1423    
1424 pam-fi 1.8 Bool_t CAL1__ok = false;
1425     Bool_t CAL2__ok = false;
1426     Bool_t TRK2__ok = false;
1427     Bool_t TRK1__ok = false;
1428     Bool_t TRKh__ok = false;
1429 pam-fi 1.7 Bool_t TRG__ok = false;
1430     Bool_t TOF__ok = false;
1431     Bool_t S4__ok = false;
1432     Bool_t ND__ok = false;
1433     Bool_t AC__ok = false;
1434     Bool_t ORB__ok = false;
1435 pam-fi 1.6
1436 pam-fi 1.7 Bool_t RUN__ok = false;
1437 pam-fi 1.6
1438 pam-fi 1.8
1439    
1440     cout << "Checking file: "<<name<<endl;
1441 pam-fi 1.6 TFile *f = new TFile(name.Data());
1442     if( !f || f->IsZombie() ){
1443     cout << "File: "<< f->GetName() <<" discarded ---- Non valid root file"<< endl; return false;
1444     }
1445 pam-fi 1.7 // cout << "Get list of keys: "<<f<<endl;
1446 pam-fi 1.6 TList *lk = f->GetListOfKeys();
1447 pam-fi 1.8 // lk->Print();
1448 pam-fi 1.6 TIter next(lk);
1449     TKey *key =0;
1450 pam-fi 1.8
1451     Int_t nev = 0;
1452    
1453 pam-fi 1.6 while( (key = (TKey*)next()) ){
1454    
1455 pam-fi 1.12 // cout << key->GetName() << ""<<key->GetClassName()<<endl;
1456     // cout << " Get tree: " << f->Get(key->GetName())<<endl;
1457 pam-fi 1.7 // nev_previous = nev;
1458     // cout << " n.entries "<< nev <<endl;
1459     // if( key->GetClassName()=="TTree" && nev_previous && nev != nev_previous ){
1460     // nev = ((TTree*)f->Get(key->GetName()))->GetEntries();
1461     // cout << "File: "<< f->GetName() <<" discarded ---- "<< key->GetName() << " tree: n.entries does not match "<<nev<<" "<<nev_previous<< endl;
1462     // return false;
1463     // };
1464 pam-fi 1.6
1465     if( !strcmp(key->GetName(),"Run" ) )RUN__ok = true;
1466 pam-fi 1.8
1467     //=========================================================
1468     if( !strcmp(key->GetName(),"Trigger" ) ){
1469     TRG__ok = true;
1470     if(TRG){
1471     Int_t nevt = ((TTree*)f->Get("Trigger"))->GetEntries();
1472     if( nev && nevt!=nev){
1473     cout << "File: "<< f->GetName() <<" discarded ---- Trigger tree has "<<nevt<<" events instead of "<<nev<< endl;
1474     return false;
1475     }
1476     nev=nevt;
1477     }
1478     }
1479     //=========================================================
1480     if( !strcmp(key->GetName(),"ToF" ) ){
1481     TOF__ok = true;
1482     if(TOF){
1483     Int_t nevt = ((TTree*)f->Get("ToF"))->GetEntries();
1484     if( nev && nevt!=nev){
1485     cout << "File: "<< f->GetName() <<" discarded ---- ToF tree has "<<nevt<<" events instead of "<<nev<< endl;
1486     return false;
1487     }
1488     nev=nevt;
1489     }
1490     }
1491     //=========================================================
1492     if( !strcmp(key->GetName(),"S4" ) ){
1493     S4__ok = true;
1494     if(S4){
1495     Int_t nevt = ((TTree*)f->Get("S4"))->GetEntries();
1496     if( nev && nevt!=nev){
1497     cout << "File: "<< f->GetName() <<" discarded ---- S4 tree has "<<nevt<<" events instead of "<<nev<< endl;
1498     return false;
1499     }
1500     nev=nevt;
1501     }
1502     }
1503     //=========================================================
1504    
1505     if( !strcmp(key->GetName(),"NeutronD" ) ){
1506     ND__ok = true;
1507     if(ND){
1508     Int_t nevt = ((TTree*)f->Get("NeutronD"))->GetEntries();
1509     if( nev && nevt!=nev){
1510     cout << "File: "<< f->GetName() <<" discarded ---- NeutronD tree has "<<nevt<<" events instead of "<<nev<< endl;
1511     return false;
1512     }
1513     nev=nevt;
1514     }
1515     }
1516     //=========================================================
1517     if( !strcmp(key->GetName(),"Anticounter") ){
1518     AC__ok = true;
1519     if(AC){
1520     Int_t nevt = ((TTree*)f->Get("Anticounter"))->GetEntries();
1521     if( nev && nevt!=nev){
1522     cout << "File: "<< f->GetName() <<" discarded ---- Anticounter tree has "<<nevt<<" events instead of "<<nev<< endl;
1523     return false;
1524     }
1525     nev=nevt;
1526     }
1527     }
1528     //=========================================================
1529     if( !strcmp(key->GetName(),"OrbitalInfo") ){
1530     ORB__ok = true;
1531     if(ORB){
1532     Int_t nevt = ((TTree*)f->Get("OrbitalInfo"))->GetEntries();
1533     if( nev && nevt!=nev){
1534     cout << "File: "<< f->GetName() <<" discarded ---- OrbitalInfo tree has "<<nevt<<" events instead of "<<nev<< endl;
1535     return false;
1536     }
1537     nev=nevt;
1538     }
1539     }
1540     //=========================================================
1541 pam-fi 1.6 if( !strcmp(key->GetName(),"Tracker" ) ){
1542     TTree *T = (TTree*)f->Get("Tracker");
1543 pam-fi 1.8 if(TRK1||TRK2||TRKh){
1544     Int_t nevt = T->GetEntries();
1545     if( nev && nevt!=nev){
1546     cout << "File: "<< f->GetName() <<" discarded ---- Tracker tree has "<<nevt<<" events instead of "<<nev<< endl;
1547     return false;
1548     }
1549     nev=nevt;
1550     }
1551 pam-fi 1.6 for(Int_t i=0; i<T->GetListOfBranches()->GetEntries(); i++){
1552     TString name = T->GetListOfBranches()->At(i)->GetName();
1553 pam-fi 1.8 if( !name.CompareTo("TrkLevel1") )TRK1__ok=true;
1554     if( !name.CompareTo("TrkLevel2") )TRK2__ok=true;
1555     if( !name.CompareTo("TrkHough") )TRKh__ok=true;
1556     };
1557     T->Delete();
1558 pam-fi 1.2 };
1559 pam-fi 1.8 //=========================================================
1560     if( !strcmp(key->GetName(),"Calorimeter" ) ){
1561     TTree *T = (TTree*)f->Get("Calorimeter");
1562     if(CAL1||CAL2){
1563     Int_t nevt = T->GetEntries();
1564     if( nev && nevt!=nev){
1565     cout << "File: "<< f->GetName() <<" discarded ---- Calorimeter tree has "<<nevt<<" events instead of "<<nev<< endl;
1566     return false;
1567     }
1568     nev=nevt;
1569     }
1570     for(Int_t i=0; i<T->GetListOfBranches()->GetEntries(); i++){
1571     TString name = T->GetListOfBranches()->At(i)->GetName();
1572     if( !name.CompareTo("CaloLevel1") )CAL1__ok=true;
1573     if( !name.CompareTo("CaloLevel2") )CAL2__ok=true;
1574     };
1575     T->Delete();
1576     };
1577    
1578 pam-fi 1.6 };
1579    
1580 pam-fi 1.12 // cout<< "CheckLevel2File(TString): detector list --> ";
1581     // if(TRK1__ok)cout<<"TRK1 ";
1582     // if(TRK2__ok)cout<<"TRK2 ";
1583     // if(TRKh__ok)cout<<"TRKH ";
1584     // if(CAL1__ok)cout<<"CAL1 ";
1585     // if(CAL2__ok)cout<<"CAL2 ";
1586     // if(TOF__ok)cout<<"TOF ";
1587     // if(TRG__ok)cout<<"TRG ";
1588     // if(AC__ok)cout<<"AC ";
1589     // if(ND__ok)cout<<"ND ";
1590     // if(S4__ok)cout<<"S4 ";
1591     // if(ORB__ok)cout<<"ORB ";
1592     // cout << endl;
1593 pam-fi 1.8
1594    
1595 pam-fi 1.6 if(!RUN__ok) {
1596 pam-fi 1.9 cout << "File: "<< f->GetName() <<" *WARNING* ---- Missing RunInfo tree"<< endl;
1597     // return false;
1598 pam-fi 1.8 };
1599    
1600     if(CAL1 && !CAL1__ok){
1601     cout << "File: "<< f->GetName() <<" discarded ---- Missing CaloLevel1 branch"<< endl;
1602     return false;
1603     };
1604     if(CAL2 && !CAL2__ok){
1605     cout << "File: "<< f->GetName() <<" discarded ---- Missing CaloLevel2 branch"<< endl;
1606     return false;
1607     };
1608     if(TRK2 && !TRK2__ok){
1609     cout << "File: "<< f->GetName() <<" discarded ---- Missing TrkLevel2 branch"<< endl;
1610     return false;
1611     };
1612     if(TRK1 && !TRK1__ok){
1613     cout << "File: "<< f->GetName() <<" discarded ---- Missing TrkLevel1 branch"<< endl;
1614     return false;
1615     };
1616     if(TRKh && !TRKh__ok){
1617     cout << "File: "<< f->GetName() <<" discarded ---- Missing TrkHough branch"<< endl;
1618     return false;
1619 pam-fi 1.6 };
1620 pam-fi 1.8 if(ORB && !ORB__ok){
1621     cout << "File: "<< f->GetName() <<" discarded ---- Missing ORB tree"<< endl;
1622     return false;
1623 pam-fi 1.6 };
1624 pam-fi 1.8 if(AC && !AC__ok){
1625     cout << "File: "<< f->GetName() <<" discarded ---- Missing AC tree"<< endl;
1626     return false;
1627 pam-fi 1.6 };
1628     if(S4 && !S4__ok){
1629 pam-fi 1.8 cout << "File: "<< f->GetName() <<" discarded ---- Missing S4 tree"<< endl;
1630     return false;
1631 pam-fi 1.6 };
1632 pam-fi 1.8 if(TOF && !TOF__ok){
1633     cout << "File: "<< f->GetName() <<" discarded ---- Missing ToF tree"<< endl;
1634     return false;
1635 pam-fi 1.6 };
1636 pam-fi 1.8
1637 pam-fi 1.12 if(ND && !ND__ok){
1638     cout << "File: "<< f->GetName() <<" discarded ---- Missing ND tree"<< endl;
1639     return false;
1640     };
1641     if(TRG && !TRG__ok){
1642     cout << "File: "<< f->GetName() <<" discarded ---- Missing Trigger tree"<< endl;
1643     return false;
1644     };
1645    
1646 pam-fi 1.8
1647     lk->Delete();
1648     f->Close();
1649 pam-fi 1.12
1650     // cout<< "CheckLevel2File(TString): detector list --> ";
1651     // if(TRK1)cout<<"TRK1 ";
1652     // if(TRK2)cout<<"TRK2 ";
1653     // if(TRKh)cout<<"TRKH ";
1654     // if(CAL1)cout<<"CAL1 ";
1655     // if(CAL2)cout<<"CAL2 ";
1656     // if(TOF)cout<<"TOF ";
1657     // if(TRG)cout<<"TRG ";
1658     // if(AC)cout<<"AC ";
1659     // if(ND)cout<<"ND ";
1660     // if(S4)cout<<"S4 ";
1661     // if(ORB)cout<<"ORB ";
1662     // cout << endl;
1663 pam-fi 1.8
1664     return true;
1665 pam-fi 1.2
1666     };
1667    
1668    
1669 pam-fi 1.9 /**
1670     * Create clone-trees
1671     */
1672 pam-fi 1.11 void PamLevel2::CreateCloneTrees0( TChain *fChain, TFile *ofile ){
1673 pam-fi 1.9
1674     cout << "+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+" <<endl;
1675     cout << "Create clones of PAMELA trees "<<endl;
1676    
1677     Int_t i=0;
1678     tree_clone[i] = fChain->GetTree()->CloneTree(0);
1679     TString name = tree_clone[i]->GetName();
1680     name.Append("_clone");
1681     // tree_clone[i]->SetName(name.Data());
1682     cout << tree_clone[i]->GetName() <<endl;
1683     i++;
1684    
1685     TList *li = fChain->GetListOfFriends();
1686     TIter next(li);
1687     TFriendElement* T_friend=0;
1688 pam-fi 1.11 ofile->cd();
1689 pam-fi 1.9 while( (T_friend = (TFriendElement*)next()) ){
1690     // cout<<T_friend->IsA()->GetName()<<" "<<T_friend->GetName()<<hex << T_friend->GetTree() << dec<<endl;
1691     // cout<<T_friend->GetTree()->GetName()<< endl;
1692 pam-fi 1.11 tree_clone[i] = T_friend->GetTree()->CloneTree(0);
1693     tree_clone[i]->SetAutoSave(1000000);
1694 pam-fi 1.9 name = tree_clone[i]->GetName();
1695     name.Append("_clone");
1696     // tree_clone[i]->SetName(name.Data());
1697     cout << tree_clone[i]->GetName() << endl;
1698     i++;
1699     }
1700    
1701     cout << "+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+" <<endl;
1702    
1703     }
1704    
1705 pam-fi 1.11 /**
1706     * Create clone-trees
1707     */
1708     void PamLevel2::CreateCloneTrees(TFile *ofile){
1709    
1710     ofile->cd();
1711 pam-fi 1.9
1712 pam-fi 1.11 cout << "+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+" <<endl;
1713     cout << "Create new PAMELA trees "<<endl;
1714 pam-fi 1.9
1715 pam-fi 1.11 Int_t i=0;
1716    
1717     if(TRK1||TRK2||TRKh){
1718     tree_clone[i] = new TTree("Tracker","PAMELA tracker level2 data ");
1719     if(TRK1) {
1720     tree_clone[i]->Branch("TrkLevel1","TrkLevel1", GetPointerTo("TrkLevel1"));
1721     tree_clone[i]->BranchRef();
1722     cout << "Tracker : branch TrkLevel1"<<endl;
1723     };
1724     if(TRK2) {
1725     tree_clone[i]->Branch("TrkLevel2", "TrkLevel2",GetPointerTo("TrkLevel2"));
1726     cout << "Tracker : branch TrkLevel2"<<endl;
1727     };
1728     if(TRKh) {
1729     tree_clone[i]->Branch("TrkHough","TrkHough", GetPointerTo("TrkHough"));
1730     cout << "Tracker : branch TrkHough"<<endl;
1731     };
1732     i++;
1733     }
1734 pam-fi 1.9
1735 pam-fi 1.11 // Calorimeter
1736     if(CAL1||CAL2){
1737     tree_clone[i] = new TTree("Calorimeter","PAMELA calorimeter level2 data ");
1738     if(CAL1) {
1739     tree_clone[i]->Branch("CaloLevel1", "CaloLevel1", GetPointerTo("CaloLevel1"));
1740     cout << "Calorimeter : branch CaloLevel1"<<endl;
1741     };
1742     if(CAL2) {
1743     tree_clone[i]->Branch("CaloLevel2","CaloLevel2", GetPointerTo("CaloLevel2"));
1744     cout << "Calorimeter : branch CaloLevel2"<<endl;
1745     };
1746     i++;
1747     }
1748 pam-fi 1.9
1749 pam-fi 1.11 // ToF
1750     if(TOF) {
1751     tree_clone[i] = new TTree("ToF","PAMELA ToF level2 data ");
1752     tree_clone[i]->Branch("ToFLevel2","ToFLevel2", GetPointerTo("ToFLevel2"));
1753     cout << "ToF : branch ToFLevel2"<<endl;
1754     i++;
1755     };
1756     // Trigger
1757     if(TRG) {
1758     tree_clone[i] = new TTree("Trigger","PAMELA trigger level2 data ");
1759     tree_clone[i]->Branch("TrigLevel2","TrigLevel2", GetPointerTo("TrigLevel2"));
1760     cout << "Trigger : branch TrigLevel2"<<endl;
1761     i++;
1762     };
1763     // S4
1764     if(S4) {
1765     tree_clone[i] = new TTree("S4","PAMELA S4 level2 data ");
1766     tree_clone[i]->Branch("S4Level2","S4Level2", GetPointerTo("S4Level2"));
1767     cout << "S4 : branch S4Level2"<<endl;
1768     i++;
1769     };
1770     // Neutron Detector
1771     if(ND) {
1772     tree_clone[i] = new TTree("NeutronD","PAMELA neutron detector level2 data ");
1773     tree_clone[i]->Branch("NDLevel2","NDLevel2", GetPointerTo("NDLevel2"));
1774     cout << "NeutronD : branch NDLevel2"<<endl;
1775     i++;
1776     };
1777     // Anticounters
1778     if(AC) {
1779     tree_clone[i] = new TTree("Anticounter","PAMELA anticounter detector level2 data ");
1780     tree_clone[i]->Branch("AcLevel2","AcLevel2", GetPointerTo("AcLevel2"));
1781     cout << "Anticounter : branch AcLevel2"<<endl;
1782     i++;
1783     };
1784     // OrbitalInfo
1785     if(ORB) {
1786     tree_clone[i] = new TTree("OrbitalInfo","PAMELA oribital info ");
1787     tree_clone[i]->Branch("OrbitalInfo","OrbitalInfo", GetPointerTo("OrbitalInfo"));
1788     cout << "OrbitalInfo : branch OrbitalInfo"<<endl;
1789     i++;
1790     };
1791     cout << "+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+" <<endl;
1792 pam-fi 1.9
1793 pam-fi 1.11 }
1794 pam-fi 1.9
1795     // /**
1796     // * Create clone-trees
1797     // */
1798     // void PamLevel2::CreateCloneTrees(){
1799    
1800     // cout << "+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+" <<endl;
1801     // cout << "Create new PAMELA trees "<<endl;
1802    
1803     // if(TRK1||TRK2||TRKh){
1804     // T_clone = new TTree("Tracker_clone","PAMELA tracker level2 data ");
1805     // if(TRK1) {
1806     // trk1_clone = new TrkLevel1();
1807     // T_clone->Branch("TrkLevel1","TrkLevel1", &trk1_clone);
1808     // T_clone->BranchRef();
1809     // cout << "Tracker : branch TrkLevel1"<<endl;
1810     // };
1811     // if(TRK2) {
1812     // trk2_clone = new TrkLevel2();
1813     // T_clone->Branch("TrkLevel2", "TrkLevel2",&trk2_clone);
1814     // cout << "Tracker : branch TrkLevel2"<<endl;
1815     // };
1816     // if(TRKh) {
1817     // trkh_clone = new TrkHough();
1818     // T_clone->Branch("TrkHough","TrkHough", &trkh_clone);
1819     // cout << "Tracker : branch TrkHough"<<endl;
1820     // };
1821     // cout << hex << T_clone << dec << endl;
1822     // }
1823    
1824     // // Calorimeter
1825     // if(CAL1||CAL2){
1826     // C_clone = new TTree("Calorimeter_clone","PAMELA calorimeter level2 data ");
1827     // if(CAL1) {
1828     // calo1_clone = new CaloLevel1();
1829     // C_clone->Branch("CaloLevel1", "CaloLevel1", &calo1_clone);
1830     // cout << "Calorimeter : branch CaloLevel1"<<endl;
1831     // };
1832     // if(CAL2) {
1833     // calo2_clone = new CaloLevel2();
1834     // C_clone->Branch("CaloLevel2","CaloLevel2", &calo2_clone);
1835     // cout << "Calorimeter : branch CaloLevel2"<<endl;
1836     // };
1837     // }
1838    
1839     // // ToF
1840     // if(TOF) {
1841     // O_clone = new TTree("ToF_clone","PAMELA ToF level2 data ");
1842     // tof_clone = new ToFLevel2();
1843     // O_clone->Branch("ToFLevel2","ToFLevel2", &tof_clone);
1844     // cout << "ToF : branch ToFLevel2"<<endl;
1845     // };
1846     // // Trigger
1847     // if(TRG) {
1848     // R_clone = new TTree("Trigger_clone","PAMELA trigger level2 data ");
1849     // trig_clone = new TrigLevel2();
1850     // R_clone->Branch("TrigLevel2","TrigLevel2", &trig_clone);
1851     // cout << "Trigger : branch TrigLevel2"<<endl;
1852     // };
1853     // // S4
1854     // if(S4) {
1855     // S_clone = new TTree("S4_clone","PAMELA S4 level2 data ");
1856     // s4_clone = new S4Level2();
1857     // S_clone->Branch("S4Level2","S4Level2", &s4_clone);
1858     // cout << "S4 : branch S4Level2"<<endl;
1859     // };
1860     // // Neutron Detector
1861     // if(ND) {
1862     // N_clone = new TTree("NeutronD_clone","PAMELA neutron detector level2 data ");
1863     // nd_clone = new NDLevel2();
1864     // N_clone->Branch("NDLevel2","NDLevel2", &nd_clone);
1865     // cout << "NeutronD : branch NDLevel2"<<endl;
1866     // };
1867     // // Anticounters
1868     // if(AC) {
1869     // A_clone = new TTree("Anticounter_clone","PAMELA anticounter detector level2 data ");
1870     // ac_clone = new AcLevel2();
1871     // A_clone->Branch("AcLevel2","AcLevel2", &ac_clone);
1872     // cout << "Anticounter : branch AcLevel2"<<endl;
1873     // };
1874     // // OrbitalInfo
1875     // if(ORB) {
1876     // B_clone = new TTree("OrbitalInfo_clone","PAMELA oribital info ");
1877     // orb_clone = new OrbitalInfo();
1878     // B_clone->Branch("OrbitalInfo","OrbitalInfo", &orb_clone);
1879     // cout << "OrbitalInfo : branch OrbitalInfo"<<endl;
1880     // };
1881     // cout << "+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+" <<endl;
1882    
1883     // }
1884    
1885     /**
1886     * Fill tree (created with CreateCloneTrees)
1887     *
1888     */
1889     //void PamLevel2::FillNewPamTree(TTree *T){
1890     void PamLevel2::FillCloneTrees(){
1891    
1892     // // --------------------------------------
1893     // // copy the event
1894     // // --------------------------------------
1895     // if(trk1_clone) *trk1_clone = *trk1_obj;
1896     // if(trk2_clone){
1897     // trk2_clone->Clear();
1898     // trk2_obj->Copy(*trk2_clone);
1899     // // *trk2_clone = *trk2_obj;
1900     // }
1901     // if(trkh_clone) *trkh_clone = *trkh_obj;
1902     // if(calo1_clone){
1903     // // *calo1_clone = *calo1_obj;
1904     // calo1_clone->Clear();
1905     // calo1_obj->Copy(*calo1_clone);
1906     // }
1907     // if(calo2_clone){
1908     // // *calo2_clone = *calo2_obj;
1909     // calo2_clone->Clear();
1910     // calo2_obj->Copy(*calo2_clone);
1911     // }
1912     // if(tof_clone) *tof_clone = *tof_obj;
1913     // if(trig_clone) *trig_clone = *trig_obj;
1914     // if(s4_clone) *s4_clone = *s4_obj;
1915     // if(nd_clone) *nd_clone = *nd_obj;
1916     // if(ac_clone) *ac_clone = *ac_obj;
1917     // if(orb_clone) *orb_clone = *orb_obj;
1918    
1919     // if(T_clone)T_clone->Fill();
1920     // if(C_clone)C_clone->Fill();
1921     // if(O_clone)O_clone->Fill();
1922     // if(R_clone)R_clone->Fill();
1923     // if(S_clone)S_clone->Fill();
1924     // if(N_clone)N_clone->Fill();
1925     // if(A_clone)A_clone->Fill();
1926     // if(O_clone)O_clone->Fill();
1927    
1928     for(Int_t i=0; i<8; i++){
1929     if(tree_clone[i])tree_clone[i]->Fill();
1930     }
1931     }
1932    
1933    
1934     TTree* PamLevel2::GetCloneTree(TString name){
1935    
1936     for(Int_t i=0; i<8; i++){
1937     if(tree_clone[i]){
1938     TString na = tree_clone[i]->GetName();
1939     if(!name.CompareTo(na))return tree_clone[i];
1940     };
1941     }
1942     return NULL;
1943    
1944     }
1945     void PamLevel2::WriteCloneTrees(){
1946     cout << "+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+" <<endl;
1947     cout << "Write clones of PAMELA trees "<<endl;
1948     for(Int_t i=0; i<8; i++){
1949     if(tree_clone[i]){
1950     cout << tree_clone[i]->GetName()<<endl;
1951     tree_clone[i]->Write();
1952     };
1953     }
1954     cout << "+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+" <<endl;
1955    
1956     }
1957    
1958     /**
1959     * Create a new (empty) Pamela trees
1960     */
1961     // TTree* PamLevel2::GetNewPamTree(){
1962    
1963     // if(tree_clone)return tree_clone;
1964    
1965     // TTree *Tout = 0;
1966    
1967     // cout << "+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+" <<endl;
1968     // cout << "Create new PAMELA trees "<<endl;
1969    
1970    
1971     // if(TRK1||TRK2||TRKh){
1972     // TTree *T = new TTree("Tracker_clone","PAMELA tracker level2 data ");
1973     // if(TRK1) {
1974     // trk1_clone = new TrkLevel1();
1975     // T->Branch("TrkLevel1","TrkLevel1", &trk1_clone);
1976     // T->BranchRef();
1977     // cout << "Tracker : branch TrkLevel1"<<endl;
1978     // };
1979     // if(TRK2) {
1980     // trk2_clone = new TrkLevel2();
1981     // T->Branch("TrkLevel2", "TrkLevel2",&trk2_clone);
1982     // cout << "Tracker : branch TrkLevel2"<<endl;
1983     // };
1984     // if(TRKh) {
1985     // trkh_clone = new TrkHough();
1986     // T->Branch("TrkHough","TrkHough", &trkh_clone);
1987     // cout << "Tracker : branch TrkHough"<<endl;
1988     // };
1989     // if(!Tout)Tout=T;
1990     // else Tout->AddFriend("Tracker_clone");
1991     // }
1992    
1993     // // Calorimeter
1994     // if(CAL1||CAL2){
1995     // TTree *C = new TTree("Calorimeter_clone","PAMELA calorimeter level2 data ");
1996     // if(CAL1) {
1997     // calo1_clone = new CaloLevel1();
1998     // C->Branch("CaloLevel1", "CaloLevel1", &calo1_clone);
1999     // cout << "Calorimeter : branch CaloLevel1"<<endl;
2000     // };
2001     // if(CAL2) {
2002     // calo2_clone = new CaloLevel2();
2003     // C->Branch("CaloLevel2","CaloLevel2", &calo2_clone);
2004     // cout << "Calorimeter : branch CaloLevel2"<<endl;
2005     // };
2006     // if(!Tout)Tout=C;
2007     // else Tout->AddFriend("Calorimeter_clone");
2008     // }
2009    
2010     // // ToF
2011     // if(TOF) {
2012     // TTree *O = new TTree("ToF_clone","PAMELA ToF level2 data ");
2013     // tof_clone = new ToFLevel2();
2014     // O->Branch("ToFLevel2","ToFLevel2", &tof_clone);
2015     // cout << "ToF : branch ToFLevel2"<<endl;
2016     // if(!Tout)Tout=O;
2017     // else Tout->AddFriend("ToF_clone");
2018     // };
2019     // // Trigger
2020     // if(TRG) {
2021     // TTree *R = new TTree("Trigger_clone","PAMELA trigger level2 data ");
2022     // trig_clone = new TrigLevel2();
2023     // R->Branch("TrigLevel2","TrigLevel2", &trig_clone);
2024     // cout << "Trigger : branch TrigLevel2"<<endl;
2025     // if(!Tout)Tout=R;
2026     // else Tout->AddFriend("Trigger_clone");
2027     // };
2028     // // S4
2029     // if(S4) {
2030     // TTree *S = new TTree("S4_clone","PAMELA S4 level2 data ");
2031     // s4_clone = new S4Level2();
2032     // S->Branch("S4Level2","S4Level2", &s4_clone);
2033     // cout << "S4 : branch S4Level2"<<endl;
2034     // if(!Tout)Tout=S;
2035     // else Tout->AddFriend("S4_clone");
2036     // };
2037     // // Neutron Detector
2038     // if(ND) {
2039     // TTree *N = new TTree("NeutronD_clone","PAMELA neutron detector level2 data ");
2040     // nd_clone = new NDLevel2();
2041     // N->Branch("NDLevel2","NDLevel2", &nd_clone);
2042     // cout << "NeutronD : branch NDLevel2"<<endl;
2043     // if(!Tout)Tout=N;
2044     // else Tout->AddFriend("NeutronD_clone");
2045     // };
2046     // // Anticounters
2047     // if(AC) {
2048     // TTree *A = new TTree("Anticounter_clone","PAMELA anticounter detector level2 data ");
2049     // ac_clone = new AcLevel2();
2050     // A->Branch("AcLevel2","AcLevel2", &ac_clone);
2051     // cout << "Anticounter : branch AcLevel2"<<endl;
2052     // if(!Tout)Tout=A;
2053     // else Tout->AddFriend("Anticounter_clone");
2054     // };
2055     // // OrbitalInfo
2056     // if(ORB) {
2057     // TTree *B = new TTree("OrbitalInfo_clone","PAMELA oribital info ");
2058     // orb_clone = new OrbitalInfo();
2059     // B->Branch("OrbitalInfo","OrbitalInfo", &orb_clone);
2060     // cout << "OrbitalInfo : branch OrbitalInfo"<<endl;
2061     // if(!Tout)Tout=B;
2062     // else Tout->AddFriend("OrbitalInfo_clone");
2063     // };
2064     // cout << "+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+" <<endl;
2065    
2066     // tree_clone = Tout;
2067     // tree_clone->SetDirectory(0);
2068    
2069     // return Tout;
2070     // }
2071     // /**
2072     // * Fill a tree (created with GetNewPamTree)
2073     // *
2074     // */
2075     // //void PamLevel2::FillNewPamTree(TTree *T){
2076     // void PamLevel2::FillNewPamTree(){
2077    
2078    
2079     // if(trk1_clone) *trk1_clone = *trk1_obj;
2080     // if(trk2_clone){
2081     // trk2_clone->Clear();
2082     // trk2_obj->Copy(*trk2_clone);
2083     // // *trk2_clone = *trk2_obj;
2084     // }
2085     // if(trkh_clone) *trkh_clone = *trkh_obj;
2086     // if(calo1_clone){
2087     // // *calo1_clone = *calo1_obj;
2088     // calo1_clone->Clear();
2089     // calo1_obj->Copy(*calo1_clone);
2090     // }
2091     // if(calo2_clone){
2092     // // *calo2_clone = *calo2_obj;
2093     // calo2_clone->Clear();
2094     // calo2_obj->Copy(*calo2_clone);
2095     // }
2096     // if(tof_clone) *tof_clone = *tof_obj;
2097     // if(trig_clone) *trig_clone = *trig_obj;
2098     // if(s4_clone) *s4_clone = *s4_obj;
2099     // if(nd_clone) *nd_clone = *nd_obj;
2100     // if(ac_clone) *ac_clone = *ac_obj;
2101     // if(orb_clone) *orb_clone = *orb_obj;
2102    
2103     // TTree *T = tree_clone;
2104    
2105     // T->Fill(); //fill main tree
2106     // // cout<<T->IsA()->GetName()<<" "<<T->GetName()<<endl;
2107     // TList *li = T->GetListOfFriends();
2108     // TIter next(li);
2109     // TFriendElement* T_friend=0;
2110     // while( (T_friend = (TFriendElement*)next()) ){
2111     // // cout<<T_friend->IsA()->GetName()<<" "<<T_friend->GetName()<<hex << T_friend->GetTree() << dec<<endl;
2112     // T_friend->GetTree()->Fill();//fill friends
2113     // }
2114    
2115     // }

  ViewVC Help
Powered by ViewVC 1.1.23