azimuthal histogram should be from 0 to 2 pi
[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(AliQA::TASKINDEX_t task, TObjArray ** list)
22 {
23   //Detector specific actions at end of cycle
24   // do the QA checking
25   AliQAChecker::Instance()->Run(AliQA::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     "SPD1 residuals Y","SPD1 residuals Z",
42     "SPD2 residuals Y","SPD2 residuals Z",
43     "SDD1 residuals Y","SDD1 residuals Z",
44     "SDD2 residuals Y","SDD2 residuals Z",
45     "SSD1 residuals Y","SSD1 residuals Z",
46     "SSD2 residuals Y","SSD2 residuals Z",
47
48     "TPC1 residuals Y","TPC1 residuals Z",
49     "TPC2 residuals Y","TPC2 residuals Z",
50
51     "TRD1 residuals Y","TRD1 residuals Z",
52     "TRD2 residuals Y","TRD2 residuals Z",
53     "TRD3 residuals Y","TRD3 residuals Z",
54     "TRD4 residuals Y","TRD4 residuals Z",
55     "TRD5 residuals Y","TRD5 residuals Z",
56     "TRD6 residuals Y","TRD6 residuals Z",
57
58     "TOF residuals Y","TOF residuals Z",
59
60     "PHOS1 residuals Y","PHOS1 residuals Z",
61     "PHOS2 residuals Y","PHOS2 residuals Z",
62
63     "HMPID residuals Y","HMPID residuals Z",
64
65     "MUON residuals Y","MUON residuals Z",
66
67     "EMCAL residuals Y","EMCAL residuals Z"
68   };
69
70   for (Int_t m=1; m<AliGeomManager::kLastLayer; m++) {
71     Int_t i=2*m-2;
72     TH1F *h=new TH1F(name[i],name[i],100,-5.,5.);
73     Add2RecPointsList(h,i);    
74     h=new TH1F(name[i+1],name[i+1],100,-5.,5.);
75     Add2RecPointsList(h,i+1);    
76   }
77
78   Add2RecPointsList(
79   new TH1F("SSD1 absolute residuals Y for Z<0 (cm)",
80            "SSD1 absolute residuals Y for Z<0 (cm)",100,-2.,2.),40);
81   Add2RecPointsList(
82   new TH1F("SSD1 absolute residuals Z for Z<0 (cm)",
83            "SSD1 absolute residuals Z for Z<0 (cm)",100,-2.,2.),41);
84   Add2RecPointsList(
85   new TH1F("SSD1 absolute residuals Y for Z>0 (cm)",
86            "SSD1 absolute residuals Y for Z>0 (cm)",100,-2.,2.),42);
87   Add2RecPointsList(
88   new TH1F("SSD1 absolute residuals Z for Z>0 (cm)",
89            "SSD1 absolute residuals Z for Z>0 (cm)",100,-2.,2.),43);
90
91
92   Add2RecPointsList(
93   new TH1F("SSD2 absolute residuals Y for Z<0 (cm)",
94            "SSD2 absolute residuals Y for Z<0 (cm)",100,-3.,3.),44);
95   Add2RecPointsList(
96   new TH1F("SSD2 absolute residuals Z for Z<0 (cm)",
97            "SSD2 absolute residuals Z for Z<0 (cm)",100,-3.,3.),45);
98   Add2RecPointsList(
99   new TH1F("SSD2 absolute residuals Y for Z>0 (cm)",
100            "SSD2 absolute residuals Y for Z>0 (cm)",100,-3.,3.),46);
101   Add2RecPointsList(
102   new TH1F("SSD2 absolute residuals Z for Z>0 (cm)",
103            "SSD2 absolute residuals Z for Z>0 (cm)",100,-3.,3.),47);
104   
105 }
106
107 //____________________________________________________________________________ 
108 void AliGlobalQADataMaker::InitESDs() {
109   //------------------------------------------------------
110   // This function books the ESD QA histograms
111   // as a part of global QA
112   //------------------------------------------------------
113
114   {// Cluster related QA
115   const Char_t *name[]={
116     "Fraction of the assigned clusters in ITS",
117     "Fraction of the assigned clusters in TPC",
118     "Fraction of the assigned clusters in TRD"
119   };
120   Add2ESDsList(new TH1F(name[0],name[0],100,0.,2.),kClr0);
121   Add2ESDsList(new TH1F(name[1],name[1],100,0.,2.),kClr1);
122   Add2ESDsList(new TH1F(name[2],name[2],100,0.,2.),kClr2);
123   }
124
125   {// Track related QA
126   const Char_t *name[]={
127     "Track azimuthal distribution (rad)",                   // kTrk0
128     "Track pseudo-rapidity distribution",                   // kTrk1
129     "TPC: track momentum distribution (GeV)",               // kTrk2
130     "TPC-ITS matched: track momentum distribution (GeV)",   // kTrk3
131     "TPC-TOF matched: track momentum distribution (GeV)",   // kTrk4
132     "TPC-ITS track-matching probability",                   // kTrk5
133     "TPC-TOF track-matching probability"                    // kTrk6
134   };
135   Add2ESDsList(new TH1F(name[0],name[0],100, 0.,TMath::TwoPi()),kTrk0);
136   Add2ESDsList(new TH1F(name[1],name[1],100,-2.00,2.00),kTrk1);
137   Add2ESDsList(new TH1F(name[2],name[2],50,  0.20,5.00),kTrk2);
138   Add2ESDsList(new TH1F(name[3],name[3],50,  0.20,5.00),kTrk3);
139   Add2ESDsList(new TH1F(name[4],name[4],50,  0.20,5.00),kTrk4);
140   Add2ESDsList(new TH1F(name[5],name[5],50,  0.20,5.00),kTrk5);
141   Add2ESDsList(new TH1F(name[6],name[6],50,  0.20,5.00),kTrk6);
142   }
143
144   {// V0 related QA
145   const Char_t *name[]={
146     "K0s mass (GeV)",
147     "Lambda0 + Lambda0Bar mass (GeV)"
148   };
149   Add2ESDsList(new TH1F(name[0],name[0],50,  0.4477,0.5477),kV0s0);
150   Add2ESDsList(new TH1F(name[1],name[1],50,  1.0657,1.1657),kV0s1);
151   }
152
153   {// PID related QA
154   const Char_t *name[]={
155     "ITS: dEdx (ADC) for particles with momentum 0.4 - 0.5 (GeV)",
156     "TPC: dEdx (ADC) for particles with momentum 0.4 - 0.5 (GeV)",
157     "TOF: tracking - measured (ps)"
158   };
159   Add2ESDsList(new TH1F(name[0],name[0],50,0.00,200.),kPid0);
160   Add2ESDsList(new TH1F(name[1],name[1],50,0.00,100.),kPid1);
161   Add2ESDsList(new TH1F(name[2],name[2],50,-3500.,3500.),kPid2);
162   }
163
164 }
165
166 //____________________________________________________________________________
167 void AliGlobalQADataMaker::MakeRaws(AliRawReader* rawReader)
168 {
169   //Fill prepared histograms with Raw digit properties
170   rawReader->Reset() ;
171
172 }
173
174 //____________________________________________________________________________ 
175 void AliGlobalQADataMaker::MakeESDs(AliESDEvent * event) {
176   //-----------------------------------------------------------
177   // This function fills the ESD QA histograms
178   // as a part of global QA
179   //-----------------------------------------------------------
180   const AliESDEvent *esd=event;
181
182   Int_t ntrk=esd->GetNumberOfTracks() ; 
183   for (Int_t i=0; i<ntrk; i++) {
184     const AliESDtrack *track=esd->GetTrack(i);
185
186     // Cluster related QA
187     if (track->IsOn(AliESDtrack::kITSrefit)) {
188       Int_t n=track->GetITSclusters(0);
189       GetESDsData(kClr0)->Fill(Float_t(n)/6.); //6 is the number of ITS layers
190     }
191
192     if (track->IsOn(AliESDtrack::kTPCrefit)) {
193       Int_t n =track->GetTPCNcls();
194       Int_t nf=track->GetTPCNclsF();      // number of crossed TPC pad rows
195       if (nf>0) {
196         Double_t val = n*1.0/nf; 
197         GetESDsData(kClr1)->Fill(val); 
198       }
199     }
200
201     if (track->IsOn(AliESDtrack::kTRDrefit)) {
202       Int_t n=track->GetTRDclusters(0);
203       GetESDsData(kClr2)->Fill(Float_t(n)/(6*24));//(6*24) is the number of TRD time bins
204     }
205
206     Double_t p=track->GetP();
207
208     // Track related QA
209     if (track->IsOn(AliESDtrack::kTPCrefit)) {
210       Float_t dz[2]; 
211       track->GetDZ(0.,0.,0.,esd->GetMagneticField(),dz); 
212       if ((TMath::Abs(dz[0])<3.) && (TMath::Abs(dz[1])<3.)) { // beam pipe
213         Double_t phi=track->Phi();
214         GetESDsData(kTrk0)->Fill(phi);
215         Double_t y=track->Eta();
216         GetESDsData(kTrk1)->Fill(y);
217
218         if (TMath::Abs(y)<0.9) {
219            GetESDsData(kTrk2)->Fill(p);
220            if (track->IsOn(AliESDtrack::kITSrefit)) GetESDsData(kTrk3)->Fill(p);
221            if (track->IsOn(AliESDtrack::kTOFout)) GetESDsData(kTrk4)->Fill(p);
222         }
223       }
224     }
225
226     // PID related QA
227     if ((p>0.4) && (p<0.5)) {
228       if (track->IsOn(AliESDtrack::kITSpid)) {
229         Double_t dedx=track->GetITSsignal();
230         GetESDsData(kPid0)->Fill(dedx);
231       }
232       if (track->IsOn(AliESDtrack::kTPCpid)) {
233         Double_t dedx=track->GetTPCsignal();
234         GetESDsData(kPid1)->Fill(dedx);
235       }
236     }
237     if (p>1.0) {
238       if (track->IsOn(AliESDtrack::kTOFpid)) {
239         Double_t times[10];
240         track->GetIntegratedTimes(times);
241         Double_t tof=track->GetTOFsignal();
242         GetESDsData(kPid2)->Fill(times[2]-tof);
243       }
244     }
245   }
246
247   TH1 *tpc=GetESDsData(kTrk2); tpc->Sumw2();
248   TH1 *its=GetESDsData(kTrk3); its->Sumw2();
249   TH1 *tof=GetESDsData(kTrk4); tof->Sumw2();
250   GetESDsData(kTrk5)->Divide(its,tpc,1,1.,"b");
251   GetESDsData(kTrk6)->Divide(tof,tpc,1,1.,"b");
252
253   // V0 related QA
254   Int_t nV0=esd->GetNumberOfV0s();
255   for (Int_t i=0; i<nV0; i++) {
256     Double_t mass;
257     AliESDv0 v0(*esd->GetV0(i));
258
259     v0.ChangeMassHypothesis(kK0Short);
260     mass=v0.GetEffMass();
261     GetESDsData(kV0s0)->Fill(mass);
262
263     v0.ChangeMassHypothesis(kLambda0);
264     mass=v0.GetEffMass();
265     GetESDsData(kV0s1)->Fill(mass);
266
267     v0.ChangeMassHypothesis(kLambda0Bar);
268     mass=v0.GetEffMass();
269     GetESDsData(kV0s1)->Fill(mass);
270   }
271
272 }