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)
11 #include "AliQAChecker.h"
12 #include "AliGlobalQADataMaker.h"
13 #include "AliGeomManager.h"
14 #include "AliESDEvent.h"
16 #include "AliRawReader.h"
18 ClassImp(AliGlobalQADataMaker)
20 //____________________________________________________________________________
21 void AliGlobalQADataMaker::EndOfDetectorCycle(AliQAv1::TASKINDEX_t task, TObjArray ** list)
23 //Detector specific actions at end of cycle
25 AliQAChecker::Instance()->Run(AliQAv1::kGLOBAL, task, list) ;
28 //____________________________________________________________________________
29 void AliGlobalQADataMaker::InitRaws()
31 // create Raws histograms in Raws subdir
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",
48 "hGlobalTPC1ResidualsY","TPC1ResidualsZ",
49 "hGlobalTPC2ResidualsY","TPC2ResidualsZ",
51 "hGlobalTRD1ResidualsY","TRD1ResidualsZ",
52 "hGlobalTRD2ResidualsY","TRD2ResidualsZ",
53 "hGlobalTRD3ResidualsY","TRD3ResidualsZ",
54 "hGlobalTRD4ResidualsY","TRD4ResidualsZ",
55 "hGlobalTRD5ResidualsY","TRD5ResidualsZ",
56 "hGlobalTRD6ResidualsY","TRD6ResidualsZ",
58 "hGlobalTOFResidualsY","TOFResidualsZ",
60 "hGlobalPHOS1ResidualsY","PHOS1ResidualsZ",
61 "hGlobalPHOS2ResidualsY","PHOS2ResidualsZ",
63 "hGlobalHMPIDResidualsY","HMPIDResidualsZ",
65 "hGlobalMUONResidualsY","MUONResidualsZ",
67 "hGlobalEMCALResidualsY","EMCALResidualsZ"
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",
77 "TPC1 residuals Y","TPC1 residuals Z",
78 "TPC2 residuals Y","TPC2 residuals Z",
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",
87 "TOF residuals Y","TOF residuals Z",
89 "PHOS1 residuals Y","PHOS1 residuals Z",
90 "PHOS2 residuals Y","PHOS2 residuals Z",
92 "HMPID residuals Y","HMPID residuals Z",
94 "MUON residuals Y","MUON residuals Z",
96 "EMCAL residuals Y","EMCAL residuals Z"
99 for (Int_t m=1; m<AliGeomManager::kLastLayer; m++) {
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);
108 new TH1F("hGlobalSSD1AbsoluteResidualsYNegZ",
109 "SSD1 Absolute Residuals Y Neg Z",100,-2.,2.),40);
111 new TH1F("hGlobalSSD1AbsoluteResidualsZNegZ",
112 "SSD1 Absolute Residuals Z Neg Z",100,-2.,2.),41);
114 new TH1F("hGlobalSSD1AbsoluteResidualsYPosZ",
115 "SSD1 Absolute Residuals Y Pos Z",100,-2.,2.),42);
117 new TH1F("hGlobalSSD1AbsoluteResidualsZPosZ",
118 "SSD1 Absolute Residuals Z Pos Z",100,-2.,2.),43);
122 new TH1F("hGlobalSSD2AbsoluteResidualsYNegZ",
123 "SSD2 Absolute Residuals Y Neg Z",100,-3.,3.),44);
125 new TH1F("hGlobalSSD2AbsoluteResidualsZNegZ",
126 "SSD2 Absolute Residuals Z Neg Z",100,-3.,3.),45);
128 new TH1F("hGlobalSSD2AbsoluteResidualsYPosZ",
129 "SSD2 Absolute Residuals Y Pos Z",100,-3.,3.),46);
131 new TH1F("hGlobalSSD2AbsoluteResidualsZPosZ",
132 "SSD2Absolute Residuals Z Pos Z",100,-3.,3.),47);
136 //____________________________________________________________________________
137 void AliGlobalQADataMaker::InitESDs() {
138 //------------------------------------------------------
139 // This function books the ESD QA histograms
140 // as a part of global QA
141 //------------------------------------------------------
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"
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"
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);
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
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
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);
202 const Char_t *name[]={
203 "hGlobalPromptK0sMass",
204 "hGlobalOfflineK0sMass",
205 "hGlobalPromptLambda0Lambda0BarMass",
206 "hGlobalOfflineLambda0Lambda0BarMass"
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)"
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);
221 const Char_t *name[]={
224 "hGlobalTOFTrackingvsMeasured"
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)"
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);
238 //____________________________________________________________________________
239 void AliGlobalQADataMaker::MakeRaws(AliRawReader* rawReader)
241 //Fill prepared histograms with Raw digit properties
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) )
257 const AliESDEvent *esd=event;
259 Int_t ntrk=esd->GetNumberOfTracks() ;
260 for (Int_t i=0; i<ntrk; i++) {
261 const AliESDtrack *track=esd->GetTrack(i);
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
269 if (track->IsOn(AliESDtrack::kTPCrefit)) {
270 Int_t n =track->GetTPCNcls();
271 Int_t nf=track->GetTPCNclsF(); // number of crossed TPC pad rows
273 Double_t val = n*1.0/nf;
274 GetESDsData(kClr1)->Fill(val);
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
283 Double_t p=track->GetP();
286 if (track->IsOn(AliESDtrack::kTPCrefit)) {
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);
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);
303 const AliExternalTrackParam *tpcTrack=track->GetTPCInnerParam();
304 const AliExternalTrackParam *innTrack=track->GetInnerParam();
307 const AliESDVertex *vtx=esd->GetPrimaryVertex();
308 Double_t xv=vtx->GetXv();
309 Double_t yv=vtx->GetYv();
310 Double_t zv=vtx->GetZv();
312 tpcTrack->GetDZ(xv,yv,zv,esd->GetMagneticField(),dz);
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]);
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]);
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);
332 if (track->IsOn(AliESDtrack::kTPCpid)) {
333 Double_t dedx=track->GetTPCsignal();
334 GetESDsData(kPid1)->Fill(dedx);
338 if (track->IsOn(AliESDtrack::kTOFpid)) {
340 track->GetIntegratedTimes(times);
341 Double_t tof=track->GetTOFsignal();
342 GetESDsData(kPid2)->Fill(times[2]-tof);
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");
354 Int_t nV0=esd->GetNumberOfV0s();
355 for (Int_t i=0; i<nV0; i++) {
357 AliESDv0 v0(*esd->GetV0(i));
359 v0.ChangeMassHypothesis(kK0Short);
360 mass=v0.GetEffMass();
361 if (v0.GetOnFlyStatus())
362 GetESDsData(kK0on)->Fill(mass);
364 GetESDsData(kK0off)->Fill(mass);
366 v0.ChangeMassHypothesis(kLambda0);
367 mass=v0.GetEffMass();
368 if (v0.GetOnFlyStatus())
369 GetESDsData(kL0on)->Fill(mass);
371 GetESDsData(kL0off)->Fill(mass);
373 v0.ChangeMassHypothesis(kLambda0Bar);
374 mass=v0.GetEffMass();
375 if (v0.GetOnFlyStatus())
376 GetESDsData(kL0on)->Fill(mass);
378 GetESDsData(kL0off)->Fill(mass);