]> git.uio.no Git - u/mrichter/AliRoot.git/blob - TRD/AliTRDseedsAnalysis.C
Storing angle alpha for the tracks stopped at TRD. The stored value is used for inwar...
[u/mrichter/AliRoot.git] / TRD / AliTRDseedsAnalysis.C
1 #ifndef __CINT__
2   #include <iostream.h>
3   #include "AliTRDtracker.h"
4   #include "AliTRDcluster.h" 
5   #include "AliTRDv1.h"
6   #include "AliTRDgeometry.h"    
7   #include "AliTRDparameter.h"    
8   #include "alles.h"  
9   #include "AliTRDmcTrack.h"
10   #include "AliTRDtrack.h"
11   
12   #include "TFile.h"
13   #include "TParticle.h"
14   #include "TStopwatch.h"
15 #endif
16
17
18 void AliTRDseedsAnalysis() {
19
20   const Int_t nPrimaries = (Int_t) 3*86030/4;
21   //  const Int_t nPrimaries = 500;
22
23   Bool_t page[6]; for(Int_t i=0; i<6; i++) page[i]=kTRUE;
24
25   const Int_t nPtSteps = 30;
26   const Float_t maxPt = 3.;
27   const Float_t minPt = 0.;
28   
29   const Int_t nEtaSteps = 40;
30   const Float_t maxEta = 1.;
31   const Float_t minEta = -1.;
32   
33   // page[0]
34   TH1F *hNcl=new TH1F("hNcl","Seeds No of Clusters",255,-9.5,500.5); 
35   hNcl->SetFillColor(4);
36   hNcl->SetXTitle("No of clusters"); 
37   hNcl->SetYTitle("counts"); 
38   TH1F *hNtb=new TH1F("hNtb","Seeds No of TB with clusters",160,-9.5,150.5); 
39   hNtb->SetFillColor(4);
40   hNtb->SetXTitle("No of timebins with clusters"); 
41   hNtb->SetYTitle("counts"); 
42   TH1F *hNep=new TH1F("hNep","Seeds end point",160, -9.5, 150.5); 
43   hNep->SetFillColor(4);
44   hNep->SetXTitle("outermost timebin with cluster"); 
45   hNep->SetYTitle("counts"); 
46   TH1F *hNmg=new TH1F("hNmg","Seeds max gap",160, -9.5, 150.5); 
47   hNmg->SetFillColor(4);
48   hNmg->SetXTitle("max gap (tb)"); 
49   hNmg->SetYTitle("counts"); 
50
51   // page[1]
52   Float_t fMin = -5.5, fMax = 134.5;
53   Int_t   iChan = 140; 
54   TH2F *h2ep = new TH2F("h2ep","MC vs RT (end point)",iChan,fMin,fMax,iChan,fMin,fMax); 
55   h2ep->SetMarkerColor(4);
56   h2ep->SetMarkerSize(2);
57   TH2F *h2ntb = new TH2F("h2ntb","MC vs RT (TB with Clusters)",iChan,fMin,fMax,iChan,fMin,fMax); 
58   h2ntb->SetMarkerColor(4);
59   h2ntb->SetMarkerSize(2);
60   TH2F *h2mg = new TH2F("h2mg","MC vs RT (max gap)",iChan/2,fMin,fMax/2,iChan/2,fMin,fMax/2); 
61   h2mg->SetMarkerColor(4);
62   h2mg->SetMarkerSize(2);
63
64   // page[2]
65   TH1F *hPt_all=new TH1F("hPt_all","Seeds Pt",nPtSteps,minPt,maxPt);
66   hPt_all->SetLineColor(4);
67   hPt_all->SetXTitle("Pt (GeV/c)"); 
68   hPt_all->SetYTitle("counts"); 
69
70   TH1F *hPt_short=new TH1F("hPt_short","Short seeds Pt",nPtSteps,minPt,maxPt);
71   hPt_short->SetLineColor(8);
72   TH1F *hPt_long=new TH1F("hPt_long","Long seeds Pt",nPtSteps,minPt,maxPt);
73   hPt_long->SetLineColor(2);
74   
75   TH1F *hrtPt_short=new TH1F("hrtPt_short","RT from short seeds",nPtSteps,minPt,maxPt);
76   hrtPt_short->SetLineColor(8);
77   TH1F *hrtPt_long=new TH1F("hrtPt_long","RT from long seeds",nPtSteps,minPt,maxPt);
78   hrtPt_long->SetLineColor(2);
79
80   TH1F *hEta_all=new TH1F("hEta_all","Seeds Eta",nEtaSteps,minEta,maxEta);
81   hEta_all->SetLineColor(4);
82   hEta_all->SetXTitle("Eta"); 
83   hEta_all->SetYTitle("counts"); 
84   TH1F *hEta_short=new TH1F("hEta_short","Short seeds Eta",nEtaSteps,minEta,maxEta);
85   hEta_short->SetLineColor(8);
86   TH1F *hEta_long=new TH1F("hEta_long","Long seeds Eta",nEtaSteps,minEta,maxEta);
87   hEta_long->SetLineColor(2);
88   
89   TH1F *hrtEta_short=new TH1F("hrtEta_short","RT from short seeds",nEtaSteps,minEta,maxEta);
90   hrtEta_short->SetLineColor(8);
91   TH1F *hrtEta_long=new TH1F("hrtEta_long","RT from long seeds",nEtaSteps,minEta,maxEta);
92   hrtPt_long->SetLineColor(2);
93
94   // page[3]
95   TH1F *hEff_long = new TH1F("hEff_long","Efficiency vs Pt",nPtSteps,minPt,maxPt); 
96   hEff_long->SetLineColor(2); hEff_long->SetLineWidth(2);  
97   hEff_long->SetXTitle("Pt, GeV/c"); 
98   hEff_long->SetYTitle("Efficiency"); 
99   
100   TH1F *hEff_short = new TH1F("hEff_short","Efficiency short",nPtSteps,minPt,maxPt); 
101   hEff_short->SetLineColor(8); hEff_short->SetLineWidth(2);  
102   hEff_short->SetXTitle("Pt, GeV/c"); 
103   hEff_short->SetYTitle("Efficiency"); 
104   
105   TH1F *hEff_long_eta = new TH1F("hEff_long_eta","Efficiency vs Eta",nEtaSteps,minEta,maxEta); 
106   hEff_long_eta->SetLineColor(2); hEff_long_eta->SetLineWidth(2);  
107   hEff_long_eta->SetXTitle("Pt, GeV/c"); 
108   hEff_long_eta->SetYTitle("Efficiency"); 
109   
110   TH1F *hEff_short_eta = new TH1F("hEff_short_eta","Efficiency short",nEtaSteps,minEta,maxEta); 
111   hEff_short_eta->SetLineColor(8); hEff_short_eta->SetLineWidth(2);  
112   hEff_short_eta->SetXTitle("Pt, GeV/c"); 
113   hEff_short_eta->SetYTitle("Efficiency"); 
114   
115   // page[4]
116   TH1F *hY=new TH1F("hY","Y resolution",50,-0.5,0.5);hY->SetLineColor(4);
117   hY->SetLineWidth(2);
118   hY->SetXTitle("(cm)");
119   TH1F *hZ=new TH1F("hZ","Z resolution",80,-4,4);hZ->SetLineColor(4);
120   hZ->SetLineWidth(2);
121   hZ->SetXTitle("(cm)");
122   TH1F *hPhi=new TH1F("hPhi","PHI resolution",100,-20.,20.); 
123   hPhi->SetFillColor(4);
124   hPhi->SetXTitle("(mrad)");
125   TH1F *hLambda=new TH1F("hLambda","Lambda resolution",100,-100,100);
126   hLambda->SetFillColor(17);
127   hLambda->SetXTitle("(mrad)");
128   TH1F *hPt=new TH1F("hPt","Relative Pt resolution",30,-10.,10.);  
129   
130   // page[5]
131   TH1F *hY_n=new TH1F("hY_n","Normalized Y resolution",50,-0.5,0.5); hY_n->SetLineColor(4);
132   hY_n->SetLineWidth(2);
133   hY_n->SetXTitle("  ");
134   TH1F *hZ_n=new TH1F("hZ_n","Normalized Z resolution",50,-0.5,0.5); hZ_n->SetLineColor(2);
135   hZ_n->SetLineWidth(2);
136   hZ_n->SetXTitle("   ");
137   TH1F *hLambda_n=new TH1F("hLambda_n","Normalized Lambda resolution",50,-0.5,0.5);
138   hLambda_n->SetFillColor(17);
139   TH1F *hPt_n=new TH1F("hPt_n","Normalized Pt resolution",50,-0.5,0.5); 
140   
141
142   Int_t nEvent = 0;
143
144   // Load Seeds saved as MC tracks 
145   TObjArray mctarray(2000);
146   TFile *mctf=TFile::Open("AliTRDtrackableSeeds.root");
147   if (!mctf->IsOpen()) {cerr<<"Can't open AliTRDtrackableSeeds.root !\n"; return;}
148   TTree *mctracktree=(TTree*)mctf->Get("MCtracks");
149   TBranch *mctbranch=mctracktree->GetBranch("MCtracks");
150   Int_t const nMCtracks = (Int_t) mctracktree->GetEntries();
151   cerr<<"Found "<<nMCtracks<<" entries in the MC tracks tree"<<endl;
152   for (Int_t i=0; i<nMCtracks; i++) {
153     AliTRDmcTrack *ioMCtrack=new AliTRDmcTrack();
154     mctbranch->SetAddress(&ioMCtrack);
155     mctracktree->GetEvent(i);
156     mctarray.AddLast(ioMCtrack);
157   }
158   mctf->Close();                 
159
160   TFile *tf=TFile::Open("AliTRDtracks.root");
161
162   if (!tf->IsOpen()) {cerr<<"Can't open AliTRDtracks.root !\n"; return;}
163   TObjArray rtarray(2000);
164
165   char   tname[100];
166   sprintf(tname,"TRDb_%d",nEvent);     
167   TTree *tracktree=(TTree*)tf->Get(tname);
168
169   TBranch *tbranch=tracktree->GetBranch("tracks");
170
171   Int_t nRecTracks = (Int_t) tracktree->GetEntries();
172   cerr<<"Found "<<nRecTracks<<" entries in the track tree"<<endl;
173
174   for (Int_t i=0; i<nRecTracks; i++) {
175     AliTRDtrack *iotrack=new AliTRDtrack();
176     tbranch->SetAddress(&iotrack);
177     tracktree->GetEvent(i);
178     rtarray.AddLast(iotrack);
179   }
180   tf->Close();                 
181
182   //  return;
183
184   AliTRDmcTrack *mct;
185   AliTRDtrack *rt;
186   Int_t rtIndex[nMCtracks];
187   for(Int_t j = 0; j < nMCtracks; j++) {
188     mct = (AliTRDmcTrack*) mctarray.UncheckedAt(j);
189     rtIndex[j] = 0;
190     for (Int_t i=0; i<nRecTracks; i++) {
191       rt = (AliTRDtrack*) rtarray.UncheckedAt(i);
192       Int_t label = rt->GetSeedLabel();
193       if(mct->GetTrackIndex() == label) rtIndex[j] = i;
194     }
195   } 
196
197   // Load clusters
198
199   TFile *geofile =TFile::Open("AliTRDclusters.root");   
200   AliTRDtracker *Tracker = new AliTRDtracker(geofile);
201   Tracker->SetEventNumber(nEvent);
202
203   AliTRDgeometry *fGeom   = (AliTRDgeometry*) geofile->Get("TRDgeometry"); 
204   AliTRDparameter *fPar   = (AliTRDparameter*) geofile->Get("TRDparameter"); 
205   
206   Char_t *alifile = "AliTRDclusters.root";
207   TObjArray carray(2000);
208   TObjArray *ClustersArray = &carray;
209   Tracker->ReadClusters(ClustersArray,alifile);   
210
211
212   // Connect the AliRoot file containing Geometry, Kine, Hits, and Digits
213   alifile = "galice.root";
214   TFile *gafl = (TFile*) gROOT->GetListOfFiles()->FindObject(alifile);
215   if (!gafl) {
216     cout << "Open the ALIROOT-file " << alifile << endl;
217     gafl = new TFile(alifile);
218   }
219   else {
220     cout << alifile << " is already open" << endl;
221   }
222   gAlice = (AliRun*) gafl->Get("gAlice");
223   if (gAlice)
224     cout << "AliRun object found on file" << endl;
225   else
226     gAlice = new AliRun("gAlice","Alice test program");
227
228   AliTRDv1       *TRD = (AliTRDv1*) gAlice->GetDetector("TRD");    
229   const Int_t nparticles = gAlice->GetEvent(nEvent);
230   if (nparticles <= 0) return;
231
232   TParticle *p;
233   Bool_t electrons[300000];
234   for(Int_t i = 0; i < 300000; i++) electrons[i] = kFALSE;
235
236   Bool_t mark_electrons = kFALSE;
237   if(mark_electrons) {
238     printf("mark electrons\n");
239
240     for(Int_t i = nPrimaries; i < nparticles; i++) {
241       p = gAlice->Particle(i);
242       if(p->GetMass() > 0.01) continue;
243       if(p->GetMass() < 0.00001) continue;
244       electrons[i] = kTRUE;
245     }
246   }
247
248   AliTRDcluster *cl = 0;
249   Int_t nw, label, index, ti[3];
250   Int_t mct_tbwc, rt_tbwc, mct_max_gap, rt_max_gap, mct_sector, rt_sector; 
251   Int_t mct_max_tb, rt_max_tb, mct_min_tb, rt_min_tb;
252
253   Int_t det, plane, ltb, gtb, gap, max_gap, sector;
254   Double_t Pt, Px, Py, Pz;
255   Double_t mcPt, mcPx, mcPy, mcPz;
256   Double_t x,y,z, mcX;
257   Int_t rtClusters, rtCorrect;
258
259   Int_t nToFind_long, nFound_long, nToFind_short, nFound_short;
260
261   printf("\n");
262
263   Double_t dxAmp = (Double_t) fGeom->CamHght();   // Amplification region
264   Double_t dxDrift = (Double_t) fGeom->CdrHght(); // Drift region
265   Double_t dx = (Double_t) fPar->GetTimeBinSize();   
266
267   Int_t tbAmp = fPar->GetTimeBefore();
268   Int_t maxAmp = 0;
269   Int_t tbDrift = fPar->GetTimeMax();
270   Int_t maxDrift = (Int_t) ((dxDrift+0.000001)/dx);
271
272   tbDrift = TMath::Min(tbDrift,maxDrift);
273   tbAmp = TMath::Min(tbAmp,maxAmp);
274
275   const Int_t nPlanes = fGeom->Nplan();
276   const Int_t tbpp = Tracker->GetTimeBinsPerPlane();
277   const Int_t nTB = tbpp * nPlanes;
278   Int_t mask[nTB][2];
279
280   nToFind_long = 0; nFound_long = 0;
281   nToFind_short = 0; nFound_short = 0;
282
283   for(Int_t i=0; i < nMCtracks; i++) {
284     mct = (AliTRDmcTrack *) mctarray.UncheckedAt(i);
285     label = mct->GetTrackIndex();
286
287     // Waveform of the MC track
288     for(nw = 0; nw < nTB; nw++) { mask[nw][0] = -1; mask[nw][1] = -1; }
289     Int_t mct_ncl = mct->GetNumberOfClusters();
290
291     for(ltb = 0; ltb < kMAX_TB; ltb++) {
292       for(plane = 0; plane < nPlanes; plane++) {
293         for(Int_t n = 0; n < 2; n++) {
294           index = mct->GetClusterIndex(ltb,plane,n);
295           if(index < 0) continue; 
296           cl = (AliTRDcluster *) ClustersArray->UncheckedAt(index);
297
298           for(nw = 0; nw < 3; nw++) ti[nw] = cl->GetLabel(nw);
299
300           if((ti[0] != label) && (ti[1] != label) &&  (ti[2] != label)) {
301             printf("mc wrong track label: %d, %d, %d != %d \n",
302                    ti[0], ti[1], ti[2], label);
303           } 
304           det=cl->GetDetector();
305           if(fGeom->GetPlane(det) != plane) 
306             printf("cluster plane = %d != %d expected plane\n", 
307                    fGeom->GetPlane(det), plane);
308           if(cl->GetLocalTimeBin() != ltb) 
309             printf("cluster ltb = %d != %d expected ltb\n", 
310                    cl->GetLocalTimeBin(), ltb);
311           gtb = Tracker->GetGlobalTimeBin(0,plane,ltb);
312           mask[gtb][n] = index;
313         }
314       }
315     }
316     
317     for(plane = 0; plane < nPlanes; plane++) {
318       for(ltb = tbDrift-1; ltb >= -tbAmp; ltb--) {
319         gtb = Tracker->GetGlobalTimeBin(0,plane,ltb);
320         if(mask[gtb][0] > -1) break;
321       }
322       if(ltb >= -tbAmp) break;
323     }  
324     if((plane == nPlanes) && (ltb == -tbAmp-1)) {
325       // printf("warning: for track %d min tb is not found and set to %d!\n",
326       //         label, nTB-1);
327       mct_min_tb = nTB-1;
328       // for(Int_t tb = 0; tb<nTB; tb++) printf("gtb %d; cl index %d\n",tb,mask[tb]);
329     }
330     else {
331       mct_min_tb = Tracker->GetGlobalTimeBin(0,plane,ltb);
332     }
333
334     for(plane = nPlanes-1 ; plane>=0; plane--) {
335       for(ltb = -tbAmp; ltb < tbDrift; ltb++) {
336         gtb = Tracker->GetGlobalTimeBin(0,plane,ltb);
337         if(mask[gtb][0] > -1) break;
338       }
339       if(ltb < tbDrift) break;
340     }  
341     if((plane == -1) && (ltb == tbDrift)) {
342       //      printf("warning: for track %d max tb is not found and set to 0!\n",label);
343       //      for(Int_t tb = 0; tb<nTB; tb++) printf("gtb %d; cl index %d\n",tb,mask[tb]);
344       mct_max_tb = 0;
345       //      mcX = Tracker->GetX(0,0,tbDrift-1);
346     }
347     else {
348       mct_max_tb = Tracker-> GetGlobalTimeBin(0,plane,ltb);
349       //      mcX = Tracker->GetX(0,plane,ltb);
350       cl = (AliTRDcluster *) ClustersArray->UncheckedAt(mask[gtb][0]);
351       det=cl->GetDetector();
352       sector = fGeom->GetSector(det);  
353       mct_sector = sector;
354     }
355
356     mct_tbwc = 0;
357     mct_max_gap = 0;
358     gap = -1;
359     
360     for(nw = mct_min_tb; nw < mct_max_tb+1; nw++) {
361       gap++;
362       if(mask[nw][0] > -1) {
363         mct_tbwc++;
364         if(gap > mct_max_gap) mct_max_gap = gap;
365         gap = 0;
366       }
367     }
368
369     //  Waveform of the reconstructed track
370     if(rtIndex[i] >= 0) rt = (AliTRDtrack *) rtarray.UncheckedAt(rtIndex[i]);
371
372     for(nw = 0; nw < nTB; nw++) { mask[nw][0] = -1; mask[nw][1] = -1; }
373     Int_t rt_ncl = rt->GetNumberOfClusters();
374
375     for(Int_t n = 0; n < rt_ncl; n++) {
376       index = rt->GetClusterIndex(n);
377       cl = (AliTRDcluster *) ClustersArray->UncheckedAt(index);
378       
379       for(nw = 0; nw < 3; nw++) ti[nw] = cl->GetLabel(nw);
380       
381       if((ti[0] != label) && (ti[1] != label) &&  (ti[2] != label)) {
382         // printf("rt wrong track label: %d, %d, %d != %d \n", ti[0], ti[1], ti[2], label);
383         continue;
384       } 
385       
386       det=cl->GetDetector();
387       plane = fGeom->GetPlane(det); 
388       ltb = cl->GetLocalTimeBin(); 
389       gtb = Tracker->GetGlobalTimeBin(0,plane,ltb);
390       mask[gtb][0] = index;
391     }
392
393     for(plane = 0; plane < nPlanes; plane++) {
394       for(ltb = tbDrift-1; ltb >= -tbAmp; ltb--) {
395         gtb = Tracker->GetGlobalTimeBin(0,plane,ltb);
396         if(mask[gtb][0] > -1) break;
397       }
398       if(ltb >= -tbAmp) break;
399     }  
400     if((plane == nPlanes) && (ltb == -tbAmp-1)) {
401       // printf("warning: for track %d min tb is not found and set to %d!\n",
402       //             label, nTB-1);
403       rt_min_tb = nTB-1;
404       // for(Int_t tb = 0; tb<nTB; tb++) printf("gtb %d; cl index %d\n",tb,mask[tb]);
405     }
406     else {
407       rt_min_tb = Tracker->GetGlobalTimeBin(0,plane,ltb);
408     }
409
410     for(plane = nPlanes-1 ; plane>=0; plane--) {
411       for(ltb = -tbAmp; ltb < tbDrift; ltb++) {
412         gtb = Tracker->GetGlobalTimeBin(0,plane,ltb);
413         if(mask[gtb][0] > -1) break;
414       }
415       if(ltb < tbDrift) break;
416     }  
417     if((plane == -1) && (ltb == tbDrift)) {
418       // printf("warning: for track %d max tb is not found and set to 0!\n",label);
419       //      for(Int_t tb = 0; tb<nTB; tb++) printf("gtb %d; cl index %d\n",tb,mask[tb]);
420       rt_max_tb = 0;
421       //      mcX = Tracker->GetX(0,0,tbDrift-1);
422     }
423     else {
424       rt_max_tb = Tracker-> GetGlobalTimeBin(0,plane,ltb);
425       //      mcX = Tracker->GetX(0,plane,ltb);
426       cl = (AliTRDcluster *) ClustersArray->UncheckedAt(mask[gtb][0]);
427       det=cl->GetDetector();
428       sector = fGeom->GetSector(det);  
429       rt_sector = sector;
430     }
431
432     rt_tbwc = 0;
433     rt_max_gap = 0;
434     gap = -1;
435     
436     for(nw = rt_min_tb; nw < rt_max_tb+1; nw++) {
437       gap++;
438       if(mask[nw][0] > -1) {
439         rt_tbwc++;
440         if(gap > rt_max_gap) rt_max_gap = gap;
441         gap = 0;
442       }
443     }
444
445     // Fill the histoes
446
447     if(page[0]) {
448       hNcl->Fill((Float_t) mct_ncl);
449       hNtb->Fill((Float_t) mct_tbwc);
450       hNep->Fill((Float_t) mct_max_tb);
451       hNmg->Fill((Float_t) mct_max_gap);
452     }
453     if(page[1]) {
454       h2ep->Fill((Float_t) rt_max_tb, (Float_t) mct_max_tb);
455       h2ntb->Fill((Float_t) rt_tbwc, (Float_t) mct_tbwc);
456       h2mg->Fill((Float_t) rt_max_gap, (Float_t) mct_max_gap);
457     }
458     if(page[2]) {
459       p = gAlice->Particle(label);
460       hPt_all->Fill(p->Pt());
461       hEta_all->Fill(p->Eta());
462       if(mct_max_tb > 60) {
463         nToFind_long++;
464         hPt_long->Fill(p->Pt());
465         hEta_long->Fill(p->Eta());
466         if(((mct_max_tb - rt_max_tb) < 10) && 
467            (((Float_t) rt_tbwc) / ((Float_t) mct_tbwc) > 0.7)) {
468           nFound_long++;
469           hrtPt_long->Fill(p->Pt());
470           hrtEta_long->Fill(p->Eta());
471         }         
472       }
473       if((mct_max_tb < 60) && (mct_max_tb > 10)) {
474         nToFind_short++;
475         hPt_short->Fill(p->Pt());
476         hEta_short->Fill(p->Eta());
477         if(((mct_max_tb - rt_max_tb) < 10) && 
478            (((Float_t) rt_tbwc) / ((Float_t) mct_tbwc) > 0.7)) {
479           nFound_short++;
480           hrtPt_short->Fill(p->Pt());
481           hrtEta_short->Fill(p->Eta());
482         }         
483       }
484     }
485     if(page[4] && page[5]) {
486       if((mct_tbwc > 50) && (rt_tbwc > 50)) {
487         if(rt->GetSeedLabel() != label) {
488           printf("mct vs rt index mismatch: %d != %d \n",
489                  label, rt->GetSeedLabel());
490           return;
491         }
492         Pt = TMath::Abs(rt->GetPt()); 
493         Double_t cc = TMath::Abs(rt->GetSigmaC2()); 
494         mct->GetPxPyPzXYZ(mcPx,mcPy,mcPz,x,y,z,-1);
495         rt->GetPxPyPz(Px,Py,Pz);      
496
497         printf("\n\ntrack %d \n", label);
498         printf("rt Px, Py, Pz: %f, %f, %f \n", Px, Py, Pz); 
499         printf("mc Px, Py, Pz: %f, %f, %f \n", mcPx, mcPy, mcPz); 
500     
501         mcPt = TMath::Sqrt(mcPx * mcPx + mcPy * mcPy);
502         if(mcPt < 0.0001) mcPt = 0.0001;
503     
504         Float_t lamg=TMath::ATan2(mcPz,mcPt);
505         Float_t lam =TMath::ATan2(Pz,Pt);
506         if(TMath::Abs(mcPt) < 0.0001) printf("attempt to divide by mcPt = %f\n",mcPt);
507         else hPt_n->Fill((0.3*0.4/100*(1/Pt - 1/mcPt))/TMath::Sqrt(cc));
508     
509         Float_t phig=TMath::ATan2(mcPy,mcPx);
510         Float_t phi =TMath::ATan2(Py,Px);    
511         //      if(!(rt->PropagateTo(x))) continue;
512         //    if((mcPt > Pt_min) && (mcPt < Pt_max)) {
513         hLambda->Fill((lam - lamg)*1000.);
514         hLambda_n->Fill((lam - lamg)/TMath::Sqrt(rt->GetSigmaTgl2()));
515         if(TMath::Abs(mcPt) < 0.0001) printf("attempt to divide by mcPt = %f\n",mcPt);
516         else hPt->Fill((1/Pt - 1/mcPt)/(1/mcPt)*100.); 
517         hPhi->Fill((phi - phig)*1000.);
518         hY->Fill(rt->GetY() - y);
519         hZ->Fill(rt->GetZ() - z);
520         hY_n->Fill((rt->GetY() - y)/TMath::Sqrt(rt->GetSigmaY2()));
521         hZ_n->Fill((rt->GetZ() - z)/TMath::Sqrt(rt->GetSigmaZ2()));
522       }
523     }  
524   }
525
526   // plot pictures
527
528   if(page[0]) {
529     TCanvas *c0=new TCanvas("c0","",0,0,700,850);
530     gStyle->SetOptStat(111110);
531     c0->Divide(2,2);
532     c0->cd(1); gPad->SetLogy(); hNcl->Draw();
533     c0->cd(2); hNtb->Draw();
534     c0->cd(3); hNep->Draw();
535     c0->cd(4); hNmg->Draw();
536     c0->Print("c0.ps","ps"); 
537   }
538   if(page[1]) {
539     TCanvas *c1=new TCanvas("c1","",0,0,700,850);
540     gStyle->SetOptStat(0);
541     c1->Divide(2,2);
542     c1->cd(1); h2ep->Draw();
543     c1->cd(2); h2ntb->Draw();
544     c1->cd(3); h2mg->Draw();
545     //    c1->cd(4); hNmg->Draw();
546     c1->Print("c1.ps","ps"); 
547   }
548   if(page[2]) {
549     TCanvas *c2=new TCanvas("c2","",0,0,700,850);
550     gStyle->SetOptStat(0);
551     c2->Divide(2,2);
552     c2->cd(1); hPt_all->Draw(); hPt_long->Draw("same"); hPt_short->Draw("same"); 
553     c2->cd(2); hEta_all->Draw(); hEta_long->Draw("same"); hEta_short->Draw("same"); 
554     //    c2->cd(3); h2mg->Draw();
555     //    c2->cd(4); hNmg->Draw();
556     c2->Print("c2.ps","ps"); 
557   }
558   if(page[3]) {
559     TCanvas *c3=new TCanvas("c3","",0,0,700,850);
560     gStyle->SetOptStat(0);
561     c3->Divide(1,2);
562     c3->cd(1);
563     hrtPt_long->Sumw2(); hPt_long->Sumw2(); 
564     hEff_long->Divide(hrtPt_long,hPt_long,1,1.,"b");
565     hEff_long->SetMaximum(1.4);
566     hEff_long->SetYTitle("Matching Efficiency");
567     hEff_long->SetXTitle("Pt (GeV/c)");
568     hEff_long->Draw();          
569     hrtPt_short->Sumw2(); hPt_short->Sumw2(); 
570     hEff_short->Divide(hrtPt_short,hPt_short,1,1.,"b");
571     hEff_short->SetMaximum(1.4);
572     hEff_short->SetYTitle("Matching Efficiency");
573     hEff_short->SetXTitle("Pt (GeV/c)");
574     hEff_short->Draw("same");          
575
576     c3->cd(2);
577     hrtEta_long->Sumw2(); hEta_long->Sumw2(); 
578     hEff_long_eta->Divide(hrtEta_long,hEta_long,1,1.,"b");
579     hEff_long_eta->SetMaximum(1.4);
580     hEff_long_eta->SetYTitle("Matching Efficiency");
581     hEff_long_eta->SetXTitle("Eta");
582     hEff_long_eta->Draw();          
583     hrtEta_short->Sumw2(); hEta_short->Sumw2(); 
584     hEff_short_eta->Divide(hrtEta_short,hEta_short,1,1.,"b");
585     hEff_short_eta->SetMaximum(1.4);
586     hEff_short_eta->SetYTitle("Matching Efficiency");
587     hEff_short_eta->SetXTitle("Eta");
588     hEff_short_eta->Draw("same");          
589     c3->Print("c3.ps","ps"); 
590   }
591   if(page[4]) {
592     TCanvas *c4=new TCanvas("c4","",0,0,700,850);
593     gStyle->SetOptStat(111110);
594     c4->Divide(2,3);
595     c4->cd(1); hY->Draw();
596     c4->cd(2); hZ->Draw();
597     c4->cd(3); hPhi->Draw();
598     c4->cd(4); hLambda->Draw();
599     c4->cd(5); hPt->Draw();
600     c4->Print("c4.ps","ps"); 
601   }
602   if(page[5]) {
603     TCanvas *c5=new TCanvas("c5","",0,0,700,850);
604     gStyle->SetOptStat(111110);
605     c5->Divide(2,3);
606     c5->cd(1); hY_n->Draw();
607     c5->cd(2); hZ_n->Draw();
608     c5->cd(3); hLambda_n->Draw();
609     c5->cd(4); hPt_n->Draw();
610     c5->Print("c5.ps","ps"); 
611   }
612   printf("Efficiency (long) = %d/%d = %f\n",nFound_long,nToFind_long,
613          ((Float_t) nFound_long / (Float_t) nToFind_long));
614   printf("Efficiency (shrt) = %d/%d = %f\n",nFound_short,nToFind_short,
615          ((Float_t) nFound_short / (Float_t) nToFind_short));
616 }
617
618