]> git.uio.no Git - u/mrichter/AliRoot.git/blob - STEER/AliGlobalQADataMaker.cxx
AliAODEvent: corrected copy constructor and assignment operator. This do not work...
[u/mrichter/AliRoot.git] / STEER / AliGlobalQADataMaker.cxx
1 /*
2  The class for calculating the global (not detector specific) quality assurance.
3  It reuses the following TLists from its base class 
4     AliQADataMaker::fRecPointsQAList (for keeping the track residuals)
5     AliQADataMaker::fESDsQAList      (for keeping global ESD QA data)
6 */
7
8 #include <TPDGCode.h>
9 #include <TH1F.h>
10
11 #include "AliQAChecker.h"
12 #include "AliGlobalQADataMaker.h"
13 #include "AliGeomManager.h"
14 #include "AliESDEvent.h"
15 #include "AliESDv0.h"
16 #include "AliRawReader.h"
17
18 ClassImp(AliGlobalQADataMaker)
19  
20 //____________________________________________________________________________ 
21 void AliGlobalQADataMaker::EndOfDetectorCycle(AliQAv1::TASKINDEX_t task, TObjArray ** list)
22 {
23   //Detector specific actions at end of cycle
24   // do the QA checking
25   AliQAChecker::Instance()->Run(AliQAv1::kGLOBAL, task, list) ;  
26 }
27
28 //____________________________________________________________________________ 
29 void AliGlobalQADataMaker::InitRaws()
30 {
31   // create Raws histograms in Raws subdir
32 }
33
34 //____________________________________________________________________________ 
35 void AliGlobalQADataMaker::InitRecPoints() {
36   //------------------------------------------------------
37   // This function books the histograms of *track*residuals*
38   // as a part of global QA
39   //------------------------------------------------------
40   const Char_t *name[]={
41     "hGlobalSPD1ResidualsY","SPD1ResidualsZ",
42     "hGlobalSPD2ResidualsY","SPD2ResidualsZ",
43     "hGlobalSDD1ResidualsY","SDD1ResidualsZ",
44     "hGlobalSDD2ResidualsY","SDD2ResidualsZ",
45     "hGlobalSSD1ResidualsY","SSD1ResidualsZ",
46     "hGlobalSSD2ResidualsY","SSD2ResidualsZ",
47     
48     "hGlobalTPC1ResidualsY","TPC1ResidualsZ",
49     "hGlobalTPC2ResidualsY","TPC2ResidualsZ",
50     
51     "hGlobalTRD1ResidualsY","TRD1ResidualsZ",
52     "hGlobalTRD2ResidualsY","TRD2ResidualsZ",
53     "hGlobalTRD3ResidualsY","TRD3ResidualsZ",
54     "hGlobalTRD4ResidualsY","TRD4ResidualsZ",
55     "hGlobalTRD5ResidualsY","TRD5ResidualsZ",
56     "hGlobalTRD6ResidualsY","TRD6ResidualsZ",
57     
58     "hGlobalTOFResidualsY","TOFResidualsZ",
59     
60     "hGlobalPHOS1ResidualsY","PHOS1ResidualsZ",
61     "hGlobalPHOS2ResidualsY","PHOS2ResidualsZ",
62     
63     "hGlobalHMPIDResidualsY","HMPIDResidualsZ",
64     
65     "hGlobalMUONResidualsY","MUONResidualsZ",
66     
67     "hGlobalEMCALResidualsY","EMCALResidualsZ"
68   };
69   const Char_t *title[]={
70     "SPD1 residuals Y","SPD1 residuals Z",
71     "SPD2 residuals Y","SPD2 residuals Z",
72     "SDD1 residuals Y","SDD1 residuals Z",
73     "SDD2 residuals Y","SDD2 residuals Z",
74     "SSD1 residuals Y","SSD1 residuals Z",
75     "SSD2 residuals Y","SSD2 residuals Z",
76     
77     "TPC1 residuals Y","TPC1 residuals Z",
78     "TPC2 residuals Y","TPC2 residuals Z",
79     
80     "TRD1 residuals Y","TRD1 residuals Z",
81     "TRD2 residuals Y","TRD2 residuals Z",
82     "TRD3 residuals Y","TRD3 residuals Z",
83     "TRD4 residuals Y","TRD4 residuals Z",
84     "TRD5 residuals Y","TRD5 residuals Z",
85     "TRD6 residuals Y","TRD6 residuals Z",
86     
87     "TOF residuals Y","TOF residuals Z",
88     
89     "PHOS1 residuals Y","PHOS1 residuals Z",
90     "PHOS2 residuals Y","PHOS2 residuals Z",
91     
92     "HMPID residuals Y","HMPID residuals Z",
93     
94     "MUON residuals Y","MUON residuals Z",
95     
96     "EMCAL residuals Y","EMCAL residuals Z"
97   };
98   
99   for (Int_t m=1; m<AliGeomManager::kLastLayer; m++) {
100     Int_t i=2*m-2;
101     TH1F *h=new TH1F(name[i],title[i],100,-5.,5.);
102     Add2RecPointsList(h,i);    
103     h=new TH1F(name[i+1],title[i+1],100,-5.,5.);
104     Add2RecPointsList(h,i+1);    
105   }
106
107   Add2RecPointsList(
108   new TH1F("hGlobalSSD1AbsoluteResidualsYNegZ",
109            "SSD1 Absolute Residuals Y Neg Z",100,-2.,2.),40);
110   Add2RecPointsList(
111   new TH1F("hGlobalSSD1AbsoluteResidualsZNegZ",
112            "SSD1 Absolute Residuals Z Neg Z",100,-2.,2.),41);
113   Add2RecPointsList(
114   new TH1F("hGlobalSSD1AbsoluteResidualsYPosZ",
115            "SSD1 Absolute Residuals Y Pos Z",100,-2.,2.),42);
116   Add2RecPointsList(
117   new TH1F("hGlobalSSD1AbsoluteResidualsZPosZ",
118            "SSD1 Absolute Residuals Z Pos Z",100,-2.,2.),43);
119
120
121   Add2RecPointsList(
122   new TH1F("hGlobalSSD2AbsoluteResidualsYNegZ",
123            "SSD2 Absolute Residuals Y Neg Z",100,-3.,3.),44);
124   Add2RecPointsList(
125   new TH1F("hGlobalSSD2AbsoluteResidualsZNegZ",
126            "SSD2 Absolute Residuals Z Neg Z",100,-3.,3.),45);
127   Add2RecPointsList(
128   new TH1F("hGlobalSSD2AbsoluteResidualsYPosZ",
129            "SSD2 Absolute Residuals Y Pos Z",100,-3.,3.),46);
130   Add2RecPointsList(
131   new TH1F("hGlobalSSD2AbsoluteResidualsZPosZ",
132            "SSD2Absolute Residuals Z Pos Z",100,-3.,3.),47);
133   
134 }
135
136 //____________________________________________________________________________ 
137 void AliGlobalQADataMaker::InitESDs() {
138   //------------------------------------------------------
139   // This function books the ESD QA histograms
140   // as a part of global QA
141   //------------------------------------------------------
142
143   const Bool_t expert   = kTRUE ; 
144   const Bool_t image    = kTRUE ; 
145  {// Cluster related QA
146     const Char_t *name[]={
147       "hGlobalFractionAssignedClustersITS",
148       "hGlobalFractionAssignedClustersTPC",
149       "hGlobalFractionAssignedClustersTRD"
150     };
151     const Char_t *title[]={
152       "Fraction of the assigned clusters in ITS",
153       "Fraction of the assigned clusters in TPC",
154       "Fraction of the assigned clusters in TRD"
155     };
156     Add2ESDsList(new TH1F(name[0],title[0],100,0.,2.),kClr0, !expert, image);
157     Add2ESDsList(new TH1F(name[1],title[1],100,0.,2.),kClr1, !expert, image);
158     Add2ESDsList(new TH1F(name[2],title[2],100,0.,2.),kClr2, !expert, image);
159   }
160
161   {// Track related QA
162     const Char_t *name[]={
163       "hGlobalTrackAzimuthe",                               // kTrk0
164       "hGlobalTrackEta",                                    // kTrk1
165       "hGlobalTPCTrackpT",                                  // kTrk2
166       "hGlobalTPCITSMatchedpT",                             // kTrk3
167       "hGlobalTPCTOFMatchedpT",                             // kTrk4
168       "hGlobalTPCITSMatchingProbability",                   // kTrk5
169       "hGlobalTPCTOFMatchingProbability",                   // kTrk6
170       "hGlobalTPCsideAposDCA",                              // kTrk7
171       "hGlobalTPCsideAnegDCA",                              // kTrk8
172       "hGlobalTPCsideCposDCA",                              // kTrk9
173       "hGlobalTPCsideCnegDCA"                               // kTrk10
174   };
175     const Char_t *title[]={
176       "Track azimuthal distribution (rad)",                   // kTrk0
177       "Track pseudo-rapidity distribution",                   // kTrk1
178       "TPC: track momentum distribution (GeV)",               // kTrk2
179       "TPC-ITS matched: track momentum distribution (GeV)",   // kTrk3
180       "TPC-TOF matched: track momentum distribution (GeV)",   // kTrk4
181       "TPC-ITS track-matching probability",                   // kTrk5
182       "TPC-TOF track-matching probability",                   // kTrk6
183       "TPC side A: DCA for the positive tracks (mm)",         // kTrk7
184       "TPC side A: DCA for the negative tracks (mm)",         // kTrk8
185       "TPC side C: DCA for the positive tracks (mm)",         // kTrk9
186       "TPC side C: DCA for the negative tracks (mm)"          // kTrk10
187     };
188   Add2ESDsList(new TH1F(name[0],title[0],100, 0.,TMath::TwoPi()),kTrk0, !expert, image);
189   Add2ESDsList(new TH1F(name[1],title[1],100,-2.00,2.00),kTrk1, !expert, image);
190   Add2ESDsList(new TH1F(name[2],title[2],50,  0.20,5.00),kTrk2, !expert, image);
191   Add2ESDsList(new TH1F(name[3],title[3],50,  0.20,5.00),kTrk3, !expert, image);
192   Add2ESDsList(new TH1F(name[4],title[4],50,  0.20,5.00),kTrk4, !expert, image);
193   Add2ESDsList(new TH1F(name[5],title[5],50,  0.20,5.00),kTrk5, !expert, image);
194   Add2ESDsList(new TH1F(name[6],title[6],50,  0.20,5.00),kTrk6, !expert, image);
195   Add2ESDsList(new TH1F(name[7],title[7],50, -25.0,25.0),kTrk7, !expert, image);
196   Add2ESDsList(new TH1F(name[8],title[8],50, -25.0,25.0),kTrk8, !expert, image);
197   Add2ESDsList(new TH1F(name[9],title[9],50, -25.0,25.0),kTrk9, !expert, image);
198   Add2ESDsList(new TH1F(name[10],title[10],50, -25.0,25.0),kTrk10, !expert, image);
199   }
200
201   {// V0 related QA
202     const Char_t *name[]={
203       "hGlobalPromptK0sMass",
204       "hGlobalOfflineK0sMass",
205       "hGlobalPromptLambda0Lambda0BarMass",
206       "hGlobalOfflineLambda0Lambda0BarMass"
207     };
208     const Char_t *title[]={
209       "On-the-fly K0s mass (GeV)",
210       "Offline K0s mass (GeV)",
211       "On-the-fly Lambda0 + Lambda0Bar mass (GeV)",
212       "Offline Lambda0 + Lambda0Bar mass (GeV)"
213     };
214     Add2ESDsList(new TH1F(name[0],title[0],50,  0.4477,0.5477),kK0on, !expert, image);
215     Add2ESDsList(new TH1F(name[1],title[1],50,  0.4477,0.5477),kK0off, !expert, image);
216     Add2ESDsList(new TH1F(name[2],title[2],50,  1.0657,1.1657),kL0on, !expert, image);
217     Add2ESDsList(new TH1F(name[3],title[3],50,  1.0657,1.1657),kL0off, !expert, image);
218   }
219
220   {// PID related QA
221   const Char_t *name[]={
222     "hGlobalITSdEdx",
223     "hGlobalTPCdEdx",
224     "hGlobalTOFTrackingvsMeasured"
225   };
226     const Char_t *title[]={
227       "ITS: dEdx (ADC) for particles with momentum 0.4 - 0.5 (GeV)",
228       "TPC: dEdx (ADC) for particles with momentum 0.4 - 0.5 (GeV)",
229       "TOF: tracking - measured (ps)"
230     };
231     Add2ESDsList(new TH1F(name[0],title[0],50,0.00,200.),kPid0, !expert, image);
232     Add2ESDsList(new TH1F(name[1],title[1],50,0.00,100.),kPid1, !expert, image);
233     Add2ESDsList(new TH1F(name[2],title[2],50,-3500.,3500.),kPid2, !expert, image);
234   }
235
236 }
237
238 //____________________________________________________________________________
239 void AliGlobalQADataMaker::MakeRaws(AliRawReader* rawReader)
240 {
241   //Fill prepared histograms with Raw digit properties
242   rawReader->Reset() ;
243
244 }
245
246 //____________________________________________________________________________ 
247 void AliGlobalQADataMaker::MakeESDs(AliESDEvent * event) {
248   //-----------------------------------------------------------
249   // This function fills the ESD QA histograms
250   // as a part of global QA
251   //-----------------------------------------------------------
252   // Check id histograms already created for this Event Specie
253   if ( ! GetESDsData(kClr0) )
254     InitESDs() ;
255
256
257   const AliESDEvent *esd=event;
258
259   Int_t ntrk=esd->GetNumberOfTracks() ; 
260   for (Int_t i=0; i<ntrk; i++) {
261     const AliESDtrack *track=esd->GetTrack(i);
262
263     // Cluster related QA
264     if (track->IsOn(AliESDtrack::kITSrefit)) {
265       Int_t n=track->GetITSclusters(0);
266       GetESDsData(kClr0)->Fill(Float_t(n)/6.); //6 is the number of ITS layers
267     }
268
269     if (track->IsOn(AliESDtrack::kTPCrefit)) {
270       Int_t n =track->GetTPCNcls();
271       Int_t nf=track->GetTPCNclsF();      // number of crossed TPC pad rows
272       if (nf>0) {
273         Double_t val = n*1.0/nf; 
274         GetESDsData(kClr1)->Fill(val); 
275       }
276     }
277
278     if (track->IsOn(AliESDtrack::kTRDrefit)) {
279       Int_t n=track->GetTRDclusters(0);
280       GetESDsData(kClr2)->Fill(Float_t(n)/(6*24));//(6*24) is the number of TRD time bins
281     }
282
283     Double_t p=track->GetP();
284
285     // Track related QA
286     if (track->IsOn(AliESDtrack::kTPCrefit)) {
287       Float_t dz[2]; 
288       track->GetDZ(0.,0.,0.,esd->GetMagneticField(),dz); 
289       if ((TMath::Abs(dz[0])<3.) && (TMath::Abs(dz[1])<3.)) { // beam pipe
290         Double_t phi=track->Phi();
291         GetESDsData(kTrk0)->Fill(phi);
292         Double_t y=track->Eta();
293         GetESDsData(kTrk1)->Fill(y);
294
295         if (TMath::Abs(y)<0.9) {
296            GetESDsData(kTrk2)->Fill(p);
297            if (track->IsOn(AliESDtrack::kITSrefit)) GetESDsData(kTrk3)->Fill(p);
298           //if (track->IsOn(AliESDtrack::kTOFout)) GetESDsData(kTrk4)->Fill(p);
299            if (track->GetTOFsignal()>0) GetESDsData(kTrk4)->Fill(p);
300         }
301       }
302     }
303     const AliExternalTrackParam *tpcTrack=track->GetTPCInnerParam();
304     const AliExternalTrackParam *innTrack=track->GetInnerParam();
305     if (tpcTrack)
306     if (innTrack) {
307        const AliESDVertex *vtx=esd->GetPrimaryVertex();
308        Double_t xv=vtx->GetXv();
309        Double_t yv=vtx->GetYv();
310        Double_t zv=vtx->GetZv();
311        Float_t dz[2];
312        tpcTrack->GetDZ(xv,yv,zv,esd->GetMagneticField(),dz);
313        dz[0]*=10.; // in mm
314        if (innTrack->GetZ()  > 0)
315        if (innTrack->GetTgl()> 0) { // TPC side A
316           if (tpcTrack->GetSign() > 0) GetESDsData(kTrk7)->Fill(dz[0]);
317           else                         GetESDsData(kTrk8)->Fill(dz[0]);
318        }
319        if (innTrack->GetZ()  < 0)
320        if (innTrack->GetTgl()< 0) { // TPC side C
321           if (tpcTrack->GetSign() > 0) GetESDsData(kTrk9)->Fill(dz[0]);
322           else                         GetESDsData(kTrk10)->Fill(dz[0]);
323        }
324     }
325
326     // PID related QA
327     if ((p>0.4) && (p<0.5)) {
328       if (track->IsOn(AliESDtrack::kITSpid)) {
329         Double_t dedx=track->GetITSsignal();
330         GetESDsData(kPid0)->Fill(dedx);
331       }
332       if (track->IsOn(AliESDtrack::kTPCpid)) {
333         Double_t dedx=track->GetTPCsignal();
334         GetESDsData(kPid1)->Fill(dedx);
335       }
336     }
337     if (p>1.0) {
338       if (track->IsOn(AliESDtrack::kTOFpid)) {
339         Double_t times[10];
340         track->GetIntegratedTimes(times);
341         Double_t tof=track->GetTOFsignal();
342         GetESDsData(kPid2)->Fill(times[2]-tof);
343       }
344     }
345   }
346
347   TH1 *tpc=GetESDsData(kTrk2); tpc->Sumw2();
348   TH1 *its=GetESDsData(kTrk3); its->Sumw2();
349   TH1 *tof=GetESDsData(kTrk4); tof->Sumw2();
350   GetESDsData(kTrk5)->Divide(its,tpc,1,1.,"b");
351   GetESDsData(kTrk6)->Divide(tof,tpc,1,1.,"b");
352
353   // V0 related QA
354   Int_t nV0=esd->GetNumberOfV0s();
355   for (Int_t i=0; i<nV0; i++) {
356     Double_t mass;
357     AliESDv0 v0(*esd->GetV0(i));
358
359     v0.ChangeMassHypothesis(kK0Short);
360     mass=v0.GetEffMass();
361     if (v0.GetOnFlyStatus())
362        GetESDsData(kK0on)->Fill(mass);
363     else
364        GetESDsData(kK0off)->Fill(mass);
365
366     v0.ChangeMassHypothesis(kLambda0);
367     mass=v0.GetEffMass();
368     if (v0.GetOnFlyStatus())
369        GetESDsData(kL0on)->Fill(mass);
370     else
371        GetESDsData(kL0off)->Fill(mass);
372
373     v0.ChangeMassHypothesis(kLambda0Bar);
374     mass=v0.GetEffMass();
375     if (v0.GetOnFlyStatus())
376        GetESDsData(kL0on)->Fill(mass);
377     else
378        GetESDsData(kL0off)->Fill(mass);
379   }
380
381 }