]> git.uio.no Git - u/mrichter/AliRoot.git/blame - STEER/AliGlobalQADataMaker.cxx
Fixes for bug #61369: Patch to fix some warnings in STEER
[u/mrichter/AliRoot.git] / STEER / AliGlobalQADataMaker.cxx
CommitLineData
c0af1be2 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
542c6c71 8#include <TPDGCode.h>
c0af1be2 9#include <TH1F.h>
2937b8ff 10#include <TH2F.h>
c0af1be2 11
fb774831 12#include "AliQAChecker.h"
c0af1be2 13#include "AliGlobalQADataMaker.h"
14#include "AliGeomManager.h"
d7259b2e 15#include "AliESDEvent.h"
542c6c71 16#include "AliESDv0.h"
fb774831 17#include "AliRawReader.h"
2937b8ff 18#include "AliESDVZERO.h"
19#include "AliMultiplicity.h"
c0af1be2 20
21ClassImp(AliGlobalQADataMaker)
22
fb774831 23//____________________________________________________________________________
4e25ac79 24void AliGlobalQADataMaker::EndOfDetectorCycle(AliQAv1::TASKINDEX_t task, TObjArray ** list)
fb774831 25{
26 //Detector specific actions at end of cycle
27 // do the QA checking
4e25ac79 28 AliQAChecker::Instance()->Run(AliQAv1::kGLOBAL, task, list) ;
fb774831 29}
30
31//____________________________________________________________________________
32void AliGlobalQADataMaker::InitRaws()
33{
34 // create Raws histograms in Raws subdir
35}
36
37//____________________________________________________________________________
c0af1be2 38void AliGlobalQADataMaker::InitRecPoints() {
39 //------------------------------------------------------
d7259b2e 40 // This function books the histograms of *track*residuals*
c0af1be2 41 // as a part of global QA
42 //------------------------------------------------------
ebb9ea7c 43 static Bool_t first = kTRUE ;
44 if ( ! first )
45 return ;
a6e0ebfe 46 const Char_t *name[]={
dd1b15c4 47 "hGlobalSPD1ResidualsY","SPD1ResidualsZ",
48 "hGlobalSPD2ResidualsY","SPD2ResidualsZ",
49 "hGlobalSDD1ResidualsY","SDD1ResidualsZ",
50 "hGlobalSDD2ResidualsY","SDD2ResidualsZ",
51 "hGlobalSSD1ResidualsY","SSD1ResidualsZ",
52 "hGlobalSSD2ResidualsY","SSD2ResidualsZ",
53
54 "hGlobalTPC1ResidualsY","TPC1ResidualsZ",
55 "hGlobalTPC2ResidualsY","TPC2ResidualsZ",
56
57 "hGlobalTRD1ResidualsY","TRD1ResidualsZ",
58 "hGlobalTRD2ResidualsY","TRD2ResidualsZ",
59 "hGlobalTRD3ResidualsY","TRD3ResidualsZ",
60 "hGlobalTRD4ResidualsY","TRD4ResidualsZ",
61 "hGlobalTRD5ResidualsY","TRD5ResidualsZ",
62 "hGlobalTRD6ResidualsY","TRD6ResidualsZ",
63
64 "hGlobalTOFResidualsY","TOFResidualsZ",
65
66 "hGlobalPHOS1ResidualsY","PHOS1ResidualsZ",
67 "hGlobalPHOS2ResidualsY","PHOS2ResidualsZ",
68
69 "hGlobalHMPIDResidualsY","HMPIDResidualsZ",
70
71 "hGlobalMUONResidualsY","MUONResidualsZ",
72
73 "hGlobalEMCALResidualsY","EMCALResidualsZ"
74 };
75 const Char_t *title[]={
c0af1be2 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",
dd1b15c4 82
c0af1be2 83 "TPC1 residuals Y","TPC1 residuals Z",
84 "TPC2 residuals Y","TPC2 residuals Z",
dd1b15c4 85
c0af1be2 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",
dd1b15c4 92
c0af1be2 93 "TOF residuals Y","TOF residuals Z",
dd1b15c4 94
c0af1be2 95 "PHOS1 residuals Y","PHOS1 residuals Z",
96 "PHOS2 residuals Y","PHOS2 residuals Z",
dd1b15c4 97
c0af1be2 98 "HMPID residuals Y","HMPID residuals Z",
dd1b15c4 99
c0af1be2 100 "MUON residuals Y","MUON residuals Z",
dd1b15c4 101
c0af1be2 102 "EMCAL residuals Y","EMCAL residuals Z"
103 };
dd1b15c4 104
c0af1be2 105 for (Int_t m=1; m<AliGeomManager::kLastLayer; m++) {
106 Int_t i=2*m-2;
dd1b15c4 107 TH1F *h=new TH1F(name[i],title[i],100,-5.,5.);
c0af1be2 108 Add2RecPointsList(h,i);
dd1b15c4 109 h=new TH1F(name[i+1],title[i+1],100,-5.,5.);
c0af1be2 110 Add2RecPointsList(h,i+1);
111 }
a935c6c0 112
49ab451d 113 Add2RecPointsList(
dd1b15c4 114 new TH1F("hGlobalSSD1AbsoluteResidualsYNegZ",
115 "SSD1 Absolute Residuals Y Neg Z",100,-2.,2.),40);
a935c6c0 116 Add2RecPointsList(
dd1b15c4 117 new TH1F("hGlobalSSD1AbsoluteResidualsZNegZ",
118 "SSD1 Absolute Residuals Z Neg Z",100,-2.,2.),41);
49ab451d 119 Add2RecPointsList(
dd1b15c4 120 new TH1F("hGlobalSSD1AbsoluteResidualsYPosZ",
121 "SSD1 Absolute Residuals Y Pos Z",100,-2.,2.),42);
a935c6c0 122 Add2RecPointsList(
dd1b15c4 123 new TH1F("hGlobalSSD1AbsoluteResidualsZPosZ",
124 "SSD1 Absolute Residuals Z Pos Z",100,-2.,2.),43);
49ab451d 125
126
127 Add2RecPointsList(
dd1b15c4 128 new TH1F("hGlobalSSD2AbsoluteResidualsYNegZ",
129 "SSD2 Absolute Residuals Y Neg Z",100,-3.,3.),44);
a935c6c0 130 Add2RecPointsList(
dd1b15c4 131 new TH1F("hGlobalSSD2AbsoluteResidualsZNegZ",
132 "SSD2 Absolute Residuals Z Neg Z",100,-3.,3.),45);
49ab451d 133 Add2RecPointsList(
dd1b15c4 134 new TH1F("hGlobalSSD2AbsoluteResidualsYPosZ",
135 "SSD2 Absolute Residuals Y Pos Z",100,-3.,3.),46);
a935c6c0 136 Add2RecPointsList(
dd1b15c4 137 new TH1F("hGlobalSSD2AbsoluteResidualsZPosZ",
138 "SSD2Absolute Residuals Z Pos Z",100,-3.,3.),47);
a935c6c0 139
ebb9ea7c 140 first = kFALSE ;
c0af1be2 141}
d7259b2e 142
fb774831 143//____________________________________________________________________________
d7259b2e 144void AliGlobalQADataMaker::InitESDs() {
145 //------------------------------------------------------
146 // This function books the ESD QA histograms
147 // as a part of global QA
148 //------------------------------------------------------
542c6c71 149
f728e025 150 const Bool_t expert = kTRUE ;
151 const Bool_t image = kTRUE ;
152 {// Cluster related QA
dd1b15c4 153 const Char_t *name[]={
154 "hGlobalFractionAssignedClustersITS",
155 "hGlobalFractionAssignedClustersTPC",
2937b8ff 156 "hGlobalFractionAssignedClustersTRD",
157 "hGlobalClustersPerITSModule"
dd1b15c4 158 };
159 const Char_t *title[]={
160 "Fraction of the assigned clusters in ITS",
161 "Fraction of the assigned clusters in TPC",
2937b8ff 162 "Fraction of the assigned clusters in TRD",
163 "Number of clusters per an ITS module"
dd1b15c4 164 };
f728e025 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);
0428b94a 168 Add2ESDsList(new TH1F(name[3],title[3],2201,-0.5,2200.5),kClr3, !expert, image);
542c6c71 169 }
170
171 {// Track related QA
dd1b15c4 172 const Char_t *name[]={
173 "hGlobalTrackAzimuthe", // kTrk0
174 "hGlobalTrackEta", // kTrk1
175 "hGlobalTPCTrackpT", // kTrk2
176 "hGlobalTPCITSMatchedpT", // kTrk3
177 "hGlobalTPCTOFMatchedpT", // kTrk4
178 "hGlobalTPCITSMatchingProbability", // kTrk5
8336b059 179 "hGlobalTPCTOFMatchingProbability", // kTrk6
180 "hGlobalTPCsideAposDCA", // kTrk7
181 "hGlobalTPCsideAnegDCA", // kTrk8
182 "hGlobalTPCsideCposDCA", // kTrk9
183 "hGlobalTPCsideCnegDCA" // kTrk10
542c6c71 184 };
dd1b15c4 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
8336b059 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
dd1b15c4 197 };
f728e025 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);
542c6c71 209 }
210
211 {// V0 related QA
dd1b15c4 212 const Char_t *name[]={
213 "hGlobalPromptK0sMass",
214 "hGlobalOfflineK0sMass",
215 "hGlobalPromptLambda0Lambda0BarMass",
216 "hGlobalOfflineLambda0Lambda0BarMass"
217 };
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)"
223 };
f728e025 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);
542c6c71 228 }
229
230 {// PID related QA
a6e0ebfe 231 const Char_t *name[]={
c9622234 232 "hGlobalITSdEdx",
233 "hGlobalTPCdEdx",
2937b8ff 234 "hGlobalTOFTrackingvsMeasured",
235 "hGlobalTPCdEdxvsMomentum"
236 };
dd1b15c4 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)",
2937b8ff 240 "TOF: tracking - measured (ps)",
241 "TPC: dEdx (A.U.) vs momentum (GeV)"
242 };
f728e025 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);
2937b8ff 246 Add2ESDsList(new TH2F(name[3],title[3],1500,0.05,15.,700,0.,700.),kPid3,!expert,image);
247 }
248 {// Multiplicity related QA
249 const Char_t *name[]={
250 "hGlobalV0AvsITS",
251 "hGlobalV0CvsITS"
252 };
253 const Char_t *title[]={
254 "Multiplicity: V0A vs ITS",
255 "Multiplicity: V0C vs ITS"
256 };
0428b94a 257 TH2F *h0=new TH2F(name[0],title[0],41,-0.5,40.5, 33,-0.5,32.5);
2937b8ff 258 Add2ESDsList(h0,kMlt0, !expert, image);
0428b94a 259 TH2F *h1=new TH2F(name[1],title[1],41,-0.5,40.5, 33,-0.5,32.5);
2937b8ff 260 Add2ESDsList(h1,kMlt1, !expert, image);
542c6c71 261 }
262
d7259b2e 263}
264
fb774831 265//____________________________________________________________________________
266void AliGlobalQADataMaker::MakeRaws(AliRawReader* rawReader)
267{
268 //Fill prepared histograms with Raw digit properties
269 rawReader->Reset() ;
270
271}
272
273//____________________________________________________________________________
542c6c71 274void AliGlobalQADataMaker::MakeESDs(AliESDEvent * event) {
d7259b2e 275 //-----------------------------------------------------------
276 // This function fills the ESD QA histograms
277 // as a part of global QA
278 //-----------------------------------------------------------
c9622234 279
542c6c71 280 const AliESDEvent *esd=event;
281
d7259b2e 282 Int_t ntrk=esd->GetNumberOfTracks() ;
283 for (Int_t i=0; i<ntrk; i++) {
542c6c71 284 const AliESDtrack *track=esd->GetTrack(i);
d7259b2e 285
542c6c71 286 // Cluster related QA
d7259b2e 287 if (track->IsOn(AliESDtrack::kITSrefit)) {
288 Int_t n=track->GetITSclusters(0);
542c6c71 289 GetESDsData(kClr0)->Fill(Float_t(n)/6.); //6 is the number of ITS layers
d7259b2e 290 }
291
ff355e43 292 for (Int_t j=0; j<6; ++j) {
2937b8ff 293 Int_t idet, sts;
294 Float_t xloc,zloc;
ff355e43 295 if (!track->GetITSModuleIndexInfo(j,idet,sts,xloc,zloc)) continue;
296 if (j>=2) idet+=240;
297 if (j>=4) idet+=260;
2937b8ff 298 if ((sts==1)||(sts==2)||(sts==4)) GetESDsData(kClr3)->Fill(idet);
299 }
300
d7259b2e 301 if (track->IsOn(AliESDtrack::kTPCrefit)) {
302 Int_t n =track->GetTPCNcls();
303 Int_t nf=track->GetTPCNclsF(); // number of crossed TPC pad rows
1aaf4118 304 if (nf>0) {
305 Double_t val = n*1.0/nf;
306 GetESDsData(kClr1)->Fill(val);
307 }
d7259b2e 308 }
309
310 if (track->IsOn(AliESDtrack::kTRDrefit)) {
311 Int_t n=track->GetTRDclusters(0);
e3bd5382 312 GetESDsData(kClr2)->Fill(Float_t(n)/(6*24));//(6*24) is the number of TRD time bins
542c6c71 313 }
314
315 Double_t p=track->GetP();
316
317 // Track related QA
318 if (track->IsOn(AliESDtrack::kTPCrefit)) {
319 Float_t dz[2];
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);
44f14df0 324 Double_t y=track->Eta();
542c6c71 325 GetESDsData(kTrk1)->Fill(y);
326
cecff4fc 327 if (TMath::Abs(y)<0.9) {
328 GetESDsData(kTrk2)->Fill(p);
329 if (track->IsOn(AliESDtrack::kITSrefit)) GetESDsData(kTrk3)->Fill(p);
4d9ba05c 330 //if (track->IsOn(AliESDtrack::kTOFout)) GetESDsData(kTrk4)->Fill(p);
331 if (track->GetTOFsignal()>0) GetESDsData(kTrk4)->Fill(p);
cecff4fc 332 }
542c6c71 333 }
334 }
8336b059 335 const AliExternalTrackParam *tpcTrack=track->GetTPCInnerParam();
336 const AliExternalTrackParam *innTrack=track->GetInnerParam();
337 if (tpcTrack)
338 if (innTrack) {
339 const AliESDVertex *vtx=esd->GetPrimaryVertex();
340 Double_t xv=vtx->GetXv();
341 Double_t yv=vtx->GetYv();
342 Double_t zv=vtx->GetZv();
343 Float_t dz[2];
344 tpcTrack->GetDZ(xv,yv,zv,esd->GetMagneticField(),dz);
345 dz[0]*=10.; // in mm
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]);
350 }
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]);
355 }
356 }
542c6c71 357
358 // PID related QA
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);
363 }
364 if (track->IsOn(AliESDtrack::kTPCpid)) {
365 Double_t dedx=track->GetTPCsignal();
366 GetESDsData(kPid1)->Fill(dedx);
367 }
d7259b2e 368 }
542c6c71 369 if (p>1.0) {
370 if (track->IsOn(AliESDtrack::kTOFpid)) {
371 Double_t times[10];
372 track->GetIntegratedTimes(times);
373 Double_t tof=track->GetTOFsignal();
374 GetESDsData(kPid2)->Fill(times[2]-tof);
375 }
376 }
2937b8ff 377 const AliExternalTrackParam *par=track->GetInnerParam();
378 if (par) {
379 Double_t pp=par->GetP();
380 Double_t dedx=track->GetTPCsignal();
381 TH2F *h = dynamic_cast<TH2F*>(GetESDsData(kPid3));
382 h->Fill(pp,dedx);
383 }
384
542c6c71 385 }
d7259b2e 386
2937b8ff 387 // Multiplicity related QA
388 AliESDVZERO *mltV0 =esd->GetVZEROData();
389 const AliMultiplicity *mltITS=esd->GetMultiplicity();
390 if (mltV0)
391 if (mltITS) {
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));
396 h0->Fill(nits,nv0a);
397 TH2F *h1=dynamic_cast<TH2F*>(GetESDsData(kMlt1));
398 h1->Fill(nits,nv0c);
399 }
400
401
cecff4fc 402 TH1 *tpc=GetESDsData(kTrk2); tpc->Sumw2();
403 TH1 *its=GetESDsData(kTrk3); its->Sumw2();
404 TH1 *tof=GetESDsData(kTrk4); tof->Sumw2();
542c6c71 405 GetESDsData(kTrk5)->Divide(its,tpc,1,1.,"b");
406 GetESDsData(kTrk6)->Divide(tof,tpc,1,1.,"b");
407
408 // V0 related QA
409 Int_t nV0=esd->GetNumberOfV0s();
410 for (Int_t i=0; i<nV0; i++) {
411 Double_t mass;
412 AliESDv0 v0(*esd->GetV0(i));
413
414 v0.ChangeMassHypothesis(kK0Short);
415 mass=v0.GetEffMass();
b72280b3 416 if (v0.GetOnFlyStatus())
417 GetESDsData(kK0on)->Fill(mass);
418 else
419 GetESDsData(kK0off)->Fill(mass);
542c6c71 420
421 v0.ChangeMassHypothesis(kLambda0);
422 mass=v0.GetEffMass();
b72280b3 423 if (v0.GetOnFlyStatus())
424 GetESDsData(kL0on)->Fill(mass);
425 else
426 GetESDsData(kL0off)->Fill(mass);
542c6c71 427
428 v0.ChangeMassHypothesis(kLambda0Bar);
429 mass=v0.GetEffMass();
b72280b3 430 if (v0.GetOnFlyStatus())
431 GetESDsData(kL0on)->Fill(mass);
432 else
433 GetESDsData(kL0off)->Fill(mass);
d7259b2e 434 }
542c6c71 435
f92b626a 436}