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)
12 #include "AliQAChecker.h"
13 #include "AliGlobalQADataMaker.h"
14 #include "AliGeomManager.h"
15 #include "AliESDEvent.h"
17 #include "AliRawReader.h"
18 #include "AliESDVZERO.h"
19 #include "AliMultiplicity.h"
21 ClassImp(AliGlobalQADataMaker)
23 //____________________________________________________________________________
24 void AliGlobalQADataMaker::EndOfDetectorCycle(AliQAv1::TASKINDEX_t task, TObjArray ** list)
26 //Detector specific actions at end of cycle
28 AliQAChecker::Instance()->Run(AliQAv1::kGLOBAL, task, list) ;
31 //____________________________________________________________________________
32 void AliGlobalQADataMaker::InitRaws()
34 // create Raws histograms in Raws subdir
37 //____________________________________________________________________________
38 void AliGlobalQADataMaker::InitRecPoints() {
39 //------------------------------------------------------
40 // This function books the histograms of *track*residuals*
41 // as a part of global QA
42 //------------------------------------------------------
43 static Bool_t first = kTRUE ;
46 const Char_t *name[]={
47 "hGlobalSPD1ResidualsY","SPD1ResidualsZ",
48 "hGlobalSPD2ResidualsY","SPD2ResidualsZ",
49 "hGlobalSDD1ResidualsY","SDD1ResidualsZ",
50 "hGlobalSDD2ResidualsY","SDD2ResidualsZ",
51 "hGlobalSSD1ResidualsY","SSD1ResidualsZ",
52 "hGlobalSSD2ResidualsY","SSD2ResidualsZ",
54 "hGlobalTPC1ResidualsY","TPC1ResidualsZ",
55 "hGlobalTPC2ResidualsY","TPC2ResidualsZ",
57 "hGlobalTRD1ResidualsY","TRD1ResidualsZ",
58 "hGlobalTRD2ResidualsY","TRD2ResidualsZ",
59 "hGlobalTRD3ResidualsY","TRD3ResidualsZ",
60 "hGlobalTRD4ResidualsY","TRD4ResidualsZ",
61 "hGlobalTRD5ResidualsY","TRD5ResidualsZ",
62 "hGlobalTRD6ResidualsY","TRD6ResidualsZ",
64 "hGlobalTOFResidualsY","TOFResidualsZ",
66 "hGlobalPHOS1ResidualsY","PHOS1ResidualsZ",
67 "hGlobalPHOS2ResidualsY","PHOS2ResidualsZ",
69 "hGlobalHMPIDResidualsY","HMPIDResidualsZ",
71 "hGlobalMUONResidualsY","MUONResidualsZ",
73 "hGlobalEMCALResidualsY","EMCALResidualsZ"
75 const Char_t *title[]={
76 "SPD1 residuals Y","SPD1 residuals Z",
77 "SPD2 residuals Y","SPD2 residuals Z",
78 "SDD1 residuals Y","SDD1 residuals Z",
79 "SDD2 residuals Y","SDD2 residuals Z",
80 "SSD1 residuals Y","SSD1 residuals Z",
81 "SSD2 residuals Y","SSD2 residuals Z",
83 "TPC1 residuals Y","TPC1 residuals Z",
84 "TPC2 residuals Y","TPC2 residuals Z",
86 "TRD1 residuals Y","TRD1 residuals Z",
87 "TRD2 residuals Y","TRD2 residuals Z",
88 "TRD3 residuals Y","TRD3 residuals Z",
89 "TRD4 residuals Y","TRD4 residuals Z",
90 "TRD5 residuals Y","TRD5 residuals Z",
91 "TRD6 residuals Y","TRD6 residuals Z",
93 "TOF residuals Y","TOF residuals Z",
95 "PHOS1 residuals Y","PHOS1 residuals Z",
96 "PHOS2 residuals Y","PHOS2 residuals Z",
98 "HMPID residuals Y","HMPID residuals Z",
100 "MUON residuals Y","MUON residuals Z",
102 "EMCAL residuals Y","EMCAL residuals Z"
105 for (Int_t m=1; m<AliGeomManager::kLastLayer; m++) {
107 TH1F *h=new TH1F(name[i],title[i],100,-5.,5.);
108 Add2RecPointsList(h,i);
109 h=new TH1F(name[i+1],title[i+1],100,-5.,5.);
110 Add2RecPointsList(h,i+1);
114 new TH1F("hGlobalSSD1AbsoluteResidualsYNegZ",
115 "SSD1 Absolute Residuals Y Neg Z",100,-2.,2.),40);
117 new TH1F("hGlobalSSD1AbsoluteResidualsZNegZ",
118 "SSD1 Absolute Residuals Z Neg Z",100,-2.,2.),41);
120 new TH1F("hGlobalSSD1AbsoluteResidualsYPosZ",
121 "SSD1 Absolute Residuals Y Pos Z",100,-2.,2.),42);
123 new TH1F("hGlobalSSD1AbsoluteResidualsZPosZ",
124 "SSD1 Absolute Residuals Z Pos Z",100,-2.,2.),43);
128 new TH1F("hGlobalSSD2AbsoluteResidualsYNegZ",
129 "SSD2 Absolute Residuals Y Neg Z",100,-3.,3.),44);
131 new TH1F("hGlobalSSD2AbsoluteResidualsZNegZ",
132 "SSD2 Absolute Residuals Z Neg Z",100,-3.,3.),45);
134 new TH1F("hGlobalSSD2AbsoluteResidualsYPosZ",
135 "SSD2 Absolute Residuals Y Pos Z",100,-3.,3.),46);
137 new TH1F("hGlobalSSD2AbsoluteResidualsZPosZ",
138 "SSD2Absolute Residuals Z Pos Z",100,-3.,3.),47);
143 //____________________________________________________________________________
144 void AliGlobalQADataMaker::InitESDs() {
145 //------------------------------------------------------
146 // This function books the ESD QA histograms
147 // as a part of global QA
148 //------------------------------------------------------
150 const Bool_t expert = kTRUE ;
151 const Bool_t image = kTRUE ;
152 {// Cluster related QA
153 const Char_t *name[]={
154 "hGlobalFractionAssignedClustersITS",
155 "hGlobalFractionAssignedClustersTPC",
156 "hGlobalFractionAssignedClustersTRD",
157 "hGlobalClustersPerITSModule"
159 const Char_t *title[]={
160 "Fraction of the assigned clusters in ITS",
161 "Fraction of the assigned clusters in TPC",
162 "Fraction of the assigned clusters in TRD",
163 "Number of clusters per an ITS module"
165 Add2ESDsList(new TH1F(name[0],title[0],100,0.,2.),kClr0, !expert, image);
166 Add2ESDsList(new TH1F(name[1],title[1],100,0.,2.),kClr1, !expert, image);
167 Add2ESDsList(new TH1F(name[2],title[2],100,0.,2.),kClr2, !expert, image);
168 Add2ESDsList(new TH1F(name[3],title[3],2201,-0.5,2200.5),kClr3, !expert, image);
172 const Char_t *name[]={
173 "hGlobalTrackAzimuthe", // kTrk0
174 "hGlobalTrackEta", // kTrk1
175 "hGlobalTPCTrackpT", // kTrk2
176 "hGlobalTPCITSMatchedpT", // kTrk3
177 "hGlobalTPCTOFMatchedpT", // kTrk4
178 "hGlobalTPCITSMatchingProbability", // kTrk5
179 "hGlobalTPCTOFMatchingProbability", // kTrk6
180 "hGlobalTPCsideAposDCA", // kTrk7
181 "hGlobalTPCsideAnegDCA", // kTrk8
182 "hGlobalTPCsideCposDCA", // kTrk9
183 "hGlobalTPCsideCnegDCA" // kTrk10
185 const Char_t *title[]={
186 "Track azimuthal distribution (rad)", // kTrk0
187 "Track pseudo-rapidity distribution", // kTrk1
188 "TPC: track momentum distribution (GeV)", // kTrk2
189 "TPC-ITS matched: track momentum distribution (GeV)", // kTrk3
190 "TPC-TOF matched: track momentum distribution (GeV)", // kTrk4
191 "TPC-ITS track-matching probability", // kTrk5
192 "TPC-TOF track-matching probability", // kTrk6
193 "TPC side A: DCA for the positive tracks (mm)", // kTrk7
194 "TPC side A: DCA for the negative tracks (mm)", // kTrk8
195 "TPC side C: DCA for the positive tracks (mm)", // kTrk9
196 "TPC side C: DCA for the negative tracks (mm)" // kTrk10
198 Add2ESDsList(new TH1F(name[0],title[0],100, 0.,TMath::TwoPi()),kTrk0, !expert, image);
199 Add2ESDsList(new TH1F(name[1],title[1],100,-2.00,2.00),kTrk1, !expert, image);
200 Add2ESDsList(new TH1F(name[2],title[2],50, 0.20,5.00),kTrk2, !expert, image);
201 Add2ESDsList(new TH1F(name[3],title[3],50, 0.20,5.00),kTrk3, !expert, image);
202 Add2ESDsList(new TH1F(name[4],title[4],50, 0.20,5.00),kTrk4, !expert, image);
203 Add2ESDsList(new TH1F(name[5],title[5],50, 0.20,5.00),kTrk5, !expert, image);
204 Add2ESDsList(new TH1F(name[6],title[6],50, 0.20,5.00),kTrk6, !expert, image);
205 Add2ESDsList(new TH1F(name[7],title[7],50, -25.0,25.0),kTrk7, !expert, image);
206 Add2ESDsList(new TH1F(name[8],title[8],50, -25.0,25.0),kTrk8, !expert, image);
207 Add2ESDsList(new TH1F(name[9],title[9],50, -25.0,25.0),kTrk9, !expert, image);
208 Add2ESDsList(new TH1F(name[10],title[10],50, -25.0,25.0),kTrk10, !expert, image);
212 const Char_t *name[]={
213 "hGlobalPromptK0sMass",
214 "hGlobalOfflineK0sMass",
215 "hGlobalPromptLambda0Lambda0BarMass",
216 "hGlobalOfflineLambda0Lambda0BarMass"
218 const Char_t *title[]={
219 "On-the-fly K0s mass (GeV)",
220 "Offline K0s mass (GeV)",
221 "On-the-fly Lambda0 + Lambda0Bar mass (GeV)",
222 "Offline Lambda0 + Lambda0Bar mass (GeV)"
224 Add2ESDsList(new TH1F(name[0],title[0],50, 0.4477,0.5477),kK0on, !expert, image);
225 Add2ESDsList(new TH1F(name[1],title[1],50, 0.4477,0.5477),kK0off, !expert, image);
226 Add2ESDsList(new TH1F(name[2],title[2],50, 1.0657,1.1657),kL0on, !expert, image);
227 Add2ESDsList(new TH1F(name[3],title[3],50, 1.0657,1.1657),kL0off, !expert, image);
231 const Char_t *name[]={
234 "hGlobalTOFTrackingvsMeasured",
235 "hGlobalTPCdEdxvsMomentum"
237 const Char_t *title[]={
238 "ITS: dEdx (ADC) for particles with momentum 0.4 - 0.5 (GeV)",
239 "TPC: dEdx (ADC) for particles with momentum 0.4 - 0.5 (GeV)",
240 "TOF: tracking - measured (ps)",
241 "TPC: dEdx (A.U.) vs momentum (GeV)"
243 Add2ESDsList(new TH1F(name[0],title[0],50,0.00,200.),kPid0, !expert, image);
244 Add2ESDsList(new TH1F(name[1],title[1],50,0.00,100.),kPid1, !expert, image);
245 Add2ESDsList(new TH1F(name[2],title[2],50,-3500.,3500.),kPid2, !expert, image);
246 Add2ESDsList(new TH2F(name[3],title[3],1500,0.05,15.,700,0.,700.),kPid3,!expert,image);
248 {// Multiplicity related QA
249 const Char_t *name[]={
253 const Char_t *title[]={
254 "Multiplicity: V0A vs ITS",
255 "Multiplicity: V0C vs ITS"
257 TH2F *h0=new TH2F(name[0],title[0],41,-0.5,40.5, 33,-0.5,32.5);
258 Add2ESDsList(h0,kMlt0, !expert, image);
259 TH2F *h1=new TH2F(name[1],title[1],41,-0.5,40.5, 33,-0.5,32.5);
260 Add2ESDsList(h1,kMlt1, !expert, image);
265 //____________________________________________________________________________
266 void AliGlobalQADataMaker::MakeRaws(AliRawReader* rawReader)
268 //Fill prepared histograms with Raw digit properties
273 //____________________________________________________________________________
274 void AliGlobalQADataMaker::MakeESDs(AliESDEvent * event) {
275 //-----------------------------------------------------------
276 // This function fills the ESD QA histograms
277 // as a part of global QA
278 //-----------------------------------------------------------
280 const AliESDEvent *esd=event;
282 Int_t ntrk=esd->GetNumberOfTracks() ;
283 for (Int_t i=0; i<ntrk; i++) {
284 const AliESDtrack *track=esd->GetTrack(i);
286 // Cluster related QA
287 if (track->IsOn(AliESDtrack::kITSrefit)) {
288 Int_t n=track->GetITSclusters(0);
289 GetESDsData(kClr0)->Fill(Float_t(n)/6.); //6 is the number of ITS layers
292 for (Int_t i=0; i<6; i++) {
295 if (!track->GetITSModuleIndexInfo(i,idet,sts,xloc,zloc)) continue;
298 if ((sts==1)||(sts==2)||(sts==4)) GetESDsData(kClr3)->Fill(idet);
301 if (track->IsOn(AliESDtrack::kTPCrefit)) {
302 Int_t n =track->GetTPCNcls();
303 Int_t nf=track->GetTPCNclsF(); // number of crossed TPC pad rows
305 Double_t val = n*1.0/nf;
306 GetESDsData(kClr1)->Fill(val);
310 if (track->IsOn(AliESDtrack::kTRDrefit)) {
311 Int_t n=track->GetTRDclusters(0);
312 GetESDsData(kClr2)->Fill(Float_t(n)/(6*24));//(6*24) is the number of TRD time bins
315 Double_t p=track->GetP();
318 if (track->IsOn(AliESDtrack::kTPCrefit)) {
320 track->GetDZ(0.,0.,0.,esd->GetMagneticField(),dz);
321 if ((TMath::Abs(dz[0])<3.) && (TMath::Abs(dz[1])<3.)) { // beam pipe
322 Double_t phi=track->Phi();
323 GetESDsData(kTrk0)->Fill(phi);
324 Double_t y=track->Eta();
325 GetESDsData(kTrk1)->Fill(y);
327 if (TMath::Abs(y)<0.9) {
328 GetESDsData(kTrk2)->Fill(p);
329 if (track->IsOn(AliESDtrack::kITSrefit)) GetESDsData(kTrk3)->Fill(p);
330 //if (track->IsOn(AliESDtrack::kTOFout)) GetESDsData(kTrk4)->Fill(p);
331 if (track->GetTOFsignal()>0) GetESDsData(kTrk4)->Fill(p);
335 const AliExternalTrackParam *tpcTrack=track->GetTPCInnerParam();
336 const AliExternalTrackParam *innTrack=track->GetInnerParam();
339 const AliESDVertex *vtx=esd->GetPrimaryVertex();
340 Double_t xv=vtx->GetXv();
341 Double_t yv=vtx->GetYv();
342 Double_t zv=vtx->GetZv();
344 tpcTrack->GetDZ(xv,yv,zv,esd->GetMagneticField(),dz);
346 if (innTrack->GetZ() > 0)
347 if (innTrack->GetTgl()> 0) { // TPC side A
348 if (tpcTrack->GetSign() > 0) GetESDsData(kTrk7)->Fill(dz[0]);
349 else GetESDsData(kTrk8)->Fill(dz[0]);
351 if (innTrack->GetZ() < 0)
352 if (innTrack->GetTgl()< 0) { // TPC side C
353 if (tpcTrack->GetSign() > 0) GetESDsData(kTrk9)->Fill(dz[0]);
354 else GetESDsData(kTrk10)->Fill(dz[0]);
359 if ((p>0.4) && (p<0.5)) {
360 if (track->IsOn(AliESDtrack::kITSpid)) {
361 Double_t dedx=track->GetITSsignal();
362 GetESDsData(kPid0)->Fill(dedx);
364 if (track->IsOn(AliESDtrack::kTPCpid)) {
365 Double_t dedx=track->GetTPCsignal();
366 GetESDsData(kPid1)->Fill(dedx);
370 if (track->IsOn(AliESDtrack::kTOFpid)) {
372 track->GetIntegratedTimes(times);
373 Double_t tof=track->GetTOFsignal();
374 GetESDsData(kPid2)->Fill(times[2]-tof);
377 const AliExternalTrackParam *par=track->GetInnerParam();
379 Double_t pp=par->GetP();
380 Double_t dedx=track->GetTPCsignal();
381 TH2F *h = dynamic_cast<TH2F*>(GetESDsData(kPid3));
387 // Multiplicity related QA
388 AliESDVZERO *mltV0 =esd->GetVZEROData();
389 const AliMultiplicity *mltITS=esd->GetMultiplicity();
392 Short_t nv0a=mltV0->GetNbPMV0A();
393 Short_t nv0c=mltV0->GetNbPMV0C();
394 Int_t nits=mltITS->GetNumberOfTracklets();
395 TH2F *h0=dynamic_cast<TH2F*>(GetESDsData(kMlt0));
397 TH2F *h1=dynamic_cast<TH2F*>(GetESDsData(kMlt1));
402 TH1 *tpc=GetESDsData(kTrk2); tpc->Sumw2();
403 TH1 *its=GetESDsData(kTrk3); its->Sumw2();
404 TH1 *tof=GetESDsData(kTrk4); tof->Sumw2();
405 GetESDsData(kTrk5)->Divide(its,tpc,1,1.,"b");
406 GetESDsData(kTrk6)->Divide(tof,tpc,1,1.,"b");
409 Int_t nV0=esd->GetNumberOfV0s();
410 for (Int_t i=0; i<nV0; i++) {
412 AliESDv0 v0(*esd->GetV0(i));
414 v0.ChangeMassHypothesis(kK0Short);
415 mass=v0.GetEffMass();
416 if (v0.GetOnFlyStatus())
417 GetESDsData(kK0on)->Fill(mass);
419 GetESDsData(kK0off)->Fill(mass);
421 v0.ChangeMassHypothesis(kLambda0);
422 mass=v0.GetEffMass();
423 if (v0.GetOnFlyStatus())
424 GetESDsData(kL0on)->Fill(mass);
426 GetESDsData(kL0off)->Fill(mass);
428 v0.ChangeMassHypothesis(kLambda0Bar);
429 mass=v0.GetEffMass();
430 if (v0.GetOnFlyStatus())
431 GetESDsData(kL0on)->Fill(mass);
433 GetESDsData(kL0off)->Fill(mass);