]> git.uio.no Git - u/mrichter/AliRoot.git/blob - STEER/AliGlobalQADataMaker.cxx
Increment version number
[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   {// Cluster related QA
144     const Char_t *name[]={
145       "hGlobalFractionAssignedClustersITS",
146       "hGlobalFractionAssignedClustersTPC",
147       "hGlobalFractionAssignedClustersTRD"
148     };
149     const Char_t *title[]={
150       "Fraction of the assigned clusters in ITS",
151       "Fraction of the assigned clusters in TPC",
152       "Fraction of the assigned clusters in TRD"
153     };
154     Add2ESDsList(new TH1F(name[0],title[0],100,0.,2.),kClr0);
155     Add2ESDsList(new TH1F(name[1],title[1],100,0.,2.),kClr1);
156     Add2ESDsList(new TH1F(name[2],title[2],100,0.,2.),kClr2);
157   }
158
159   {// Track related QA
160     const Char_t *name[]={
161       "hGlobalTrackAzimuthe",                               // kTrk0
162       "hGlobalTrackEta",                                    // kTrk1
163       "hGlobalTPCTrackpT",                                  // kTrk2
164       "hGlobalTPCITSMatchedpT",                             // kTrk3
165       "hGlobalTPCTOFMatchedpT",                             // kTrk4
166       "hGlobalTPCITSMatchingProbability",                   // kTrk5
167       "hGlobalTPCTOFMatchingProbability"                    // kTrk6
168   };
169     const Char_t *title[]={
170       "Track azimuthal distribution (rad)",                   // kTrk0
171       "Track pseudo-rapidity distribution",                   // kTrk1
172       "TPC: track momentum distribution (GeV)",               // kTrk2
173       "TPC-ITS matched: track momentum distribution (GeV)",   // kTrk3
174       "TPC-TOF matched: track momentum distribution (GeV)",   // kTrk4
175       "TPC-ITS track-matching probability",                   // kTrk5
176       "TPC-TOF track-matching probability"                    // kTrk6
177     };
178   Add2ESDsList(new TH1F(name[0],title[0],100, 0.,TMath::TwoPi()),kTrk0);
179   Add2ESDsList(new TH1F(name[1],title[1],100,-2.00,2.00),kTrk1);
180   Add2ESDsList(new TH1F(name[2],title[2],50,  0.20,5.00),kTrk2);
181   Add2ESDsList(new TH1F(name[3],title[3],50,  0.20,5.00),kTrk3);
182   Add2ESDsList(new TH1F(name[4],title[4],50,  0.20,5.00),kTrk4);
183   Add2ESDsList(new TH1F(name[5],title[5],50,  0.20,5.00),kTrk5);
184   Add2ESDsList(new TH1F(name[6],title[6],50,  0.20,5.00),kTrk6);
185   }
186
187   {// V0 related QA
188     const Char_t *name[]={
189       "hGlobalPromptK0sMass",
190       "hGlobalOfflineK0sMass",
191       "hGlobalPromptLambda0Lambda0BarMass",
192       "hGlobalOfflineLambda0Lambda0BarMass"
193     };
194     const Char_t *title[]={
195       "On-the-fly K0s mass (GeV)",
196       "Offline K0s mass (GeV)",
197       "On-the-fly Lambda0 + Lambda0Bar mass (GeV)",
198       "Offline Lambda0 + Lambda0Bar mass (GeV)"
199     };
200     Add2ESDsList(new TH1F(name[0],title[0],50,  0.4477,0.5477),kK0on);
201     Add2ESDsList(new TH1F(name[1],title[1],50,  0.4477,0.5477),kK0off);
202     Add2ESDsList(new TH1F(name[2],title[2],50,  1.0657,1.1657),kL0on);
203     Add2ESDsList(new TH1F(name[3],title[3],50,  1.0657,1.1657),kL0off);
204   }
205
206   {// PID related QA
207   const Char_t *name[]={
208     "hGlobalITSdEdx",
209     "hGlobalTPCdEdx",
210     "hGlobalTOFTrackingvsMeasured"
211   };
212     const Char_t *title[]={
213       "ITS: dEdx (ADC) for particles with momentum 0.4 - 0.5 (GeV)",
214       "TPC: dEdx (ADC) for particles with momentum 0.4 - 0.5 (GeV)",
215       "TOF: tracking - measured (ps)"
216     };
217     Add2ESDsList(new TH1F(name[0],title[0],50,0.00,200.),kPid0);
218     Add2ESDsList(new TH1F(name[1],title[1],50,0.00,100.),kPid1);
219     Add2ESDsList(new TH1F(name[2],title[2],50,-3500.,3500.),kPid2);
220   }
221
222 }
223
224 //____________________________________________________________________________
225 void AliGlobalQADataMaker::MakeRaws(AliRawReader* rawReader)
226 {
227   //Fill prepared histograms with Raw digit properties
228   rawReader->Reset() ;
229
230 }
231
232 //____________________________________________________________________________ 
233 void AliGlobalQADataMaker::MakeESDs(AliESDEvent * event) {
234   //-----------------------------------------------------------
235   // This function fills the ESD QA histograms
236   // as a part of global QA
237   //-----------------------------------------------------------
238   // Check id histograms already created for this Event Specie
239   if ( ! GetESDsData(kClr0) )
240     InitESDs() ;
241
242
243   const AliESDEvent *esd=event;
244
245   Int_t ntrk=esd->GetNumberOfTracks() ; 
246   for (Int_t i=0; i<ntrk; i++) {
247     const AliESDtrack *track=esd->GetTrack(i);
248
249     // Cluster related QA
250     if (track->IsOn(AliESDtrack::kITSrefit)) {
251       Int_t n=track->GetITSclusters(0);
252       GetESDsData(kClr0)->Fill(Float_t(n)/6.); //6 is the number of ITS layers
253     }
254
255     if (track->IsOn(AliESDtrack::kTPCrefit)) {
256       Int_t n =track->GetTPCNcls();
257       Int_t nf=track->GetTPCNclsF();      // number of crossed TPC pad rows
258       if (nf>0) {
259         Double_t val = n*1.0/nf; 
260         GetESDsData(kClr1)->Fill(val); 
261       }
262     }
263
264     if (track->IsOn(AliESDtrack::kTRDrefit)) {
265       Int_t n=track->GetTRDclusters(0);
266       GetESDsData(kClr2)->Fill(Float_t(n)/(6*24));//(6*24) is the number of TRD time bins
267     }
268
269     Double_t p=track->GetP();
270
271     // Track related QA
272     if (track->IsOn(AliESDtrack::kTPCrefit)) {
273       Float_t dz[2]; 
274       track->GetDZ(0.,0.,0.,esd->GetMagneticField(),dz); 
275       if ((TMath::Abs(dz[0])<3.) && (TMath::Abs(dz[1])<3.)) { // beam pipe
276         Double_t phi=track->Phi();
277         GetESDsData(kTrk0)->Fill(phi);
278         Double_t y=track->Eta();
279         GetESDsData(kTrk1)->Fill(y);
280
281         if (TMath::Abs(y)<0.9) {
282            GetESDsData(kTrk2)->Fill(p);
283            if (track->IsOn(AliESDtrack::kITSrefit)) GetESDsData(kTrk3)->Fill(p);
284           //if (track->IsOn(AliESDtrack::kTOFout)) GetESDsData(kTrk4)->Fill(p);
285            if (track->GetTOFsignal()>0) GetESDsData(kTrk4)->Fill(p);
286         }
287       }
288     }
289
290     // PID related QA
291     if ((p>0.4) && (p<0.5)) {
292       if (track->IsOn(AliESDtrack::kITSpid)) {
293         Double_t dedx=track->GetITSsignal();
294         GetESDsData(kPid0)->Fill(dedx);
295       }
296       if (track->IsOn(AliESDtrack::kTPCpid)) {
297         Double_t dedx=track->GetTPCsignal();
298         GetESDsData(kPid1)->Fill(dedx);
299       }
300     }
301     if (p>1.0) {
302       if (track->IsOn(AliESDtrack::kTOFpid)) {
303         Double_t times[10];
304         track->GetIntegratedTimes(times);
305         Double_t tof=track->GetTOFsignal();
306         GetESDsData(kPid2)->Fill(times[2]-tof);
307       }
308     }
309   }
310
311   TH1 *tpc=GetESDsData(kTrk2); tpc->Sumw2();
312   TH1 *its=GetESDsData(kTrk3); its->Sumw2();
313   TH1 *tof=GetESDsData(kTrk4); tof->Sumw2();
314   GetESDsData(kTrk5)->Divide(its,tpc,1,1.,"b");
315   GetESDsData(kTrk6)->Divide(tof,tpc,1,1.,"b");
316
317   // V0 related QA
318   Int_t nV0=esd->GetNumberOfV0s();
319   for (Int_t i=0; i<nV0; i++) {
320     Double_t mass;
321     AliESDv0 v0(*esd->GetV0(i));
322
323     v0.ChangeMassHypothesis(kK0Short);
324     mass=v0.GetEffMass();
325     if (v0.GetOnFlyStatus())
326        GetESDsData(kK0on)->Fill(mass);
327     else
328        GetESDsData(kK0off)->Fill(mass);
329
330     v0.ChangeMassHypothesis(kLambda0);
331     mass=v0.GetEffMass();
332     if (v0.GetOnFlyStatus())
333        GetESDsData(kL0on)->Fill(mass);
334     else
335        GetESDsData(kL0off)->Fill(mass);
336
337     v0.ChangeMassHypothesis(kLambda0Bar);
338     mass=v0.GetEffMass();
339     if (v0.GetOnFlyStatus())
340        GetESDsData(kL0on)->Fill(mass);
341     else
342        GetESDsData(kL0off)->Fill(mass);
343   }
344
345 }