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 {// Cluster related QA
144 const Char_t *name[]={
145 "hGlobalFractionAssignedClustersITS",
146 "hGlobalFractionAssignedClustersTPC",
147 "hGlobalFractionAssignedClustersTRD"
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"
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);
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
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
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);
188 const Char_t *name[]={
189 "hGlobalPromptK0sMass",
190 "hGlobalOfflineK0sMass",
191 "hGlobalPromptLambda0Lambda0BarMass",
192 "hGlobalOfflineLambda0Lambda0BarMass"
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)"
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);
207 const Char_t *name[]={
210 "hGlobalTOFTrackingvsMeasured"
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)"
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);
224 //____________________________________________________________________________
225 void AliGlobalQADataMaker::MakeRaws(AliRawReader* rawReader)
227 //Fill prepared histograms with Raw digit properties
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) )
243 const AliESDEvent *esd=event;
245 Int_t ntrk=esd->GetNumberOfTracks() ;
246 for (Int_t i=0; i<ntrk; i++) {
247 const AliESDtrack *track=esd->GetTrack(i);
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
255 if (track->IsOn(AliESDtrack::kTPCrefit)) {
256 Int_t n =track->GetTPCNcls();
257 Int_t nf=track->GetTPCNclsF(); // number of crossed TPC pad rows
259 Double_t val = n*1.0/nf;
260 GetESDsData(kClr1)->Fill(val);
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
269 Double_t p=track->GetP();
272 if (track->IsOn(AliESDtrack::kTPCrefit)) {
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);
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);
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);
296 if (track->IsOn(AliESDtrack::kTPCpid)) {
297 Double_t dedx=track->GetTPCsignal();
298 GetESDsData(kPid1)->Fill(dedx);
302 if (track->IsOn(AliESDtrack::kTOFpid)) {
304 track->GetIntegratedTimes(times);
305 Double_t tof=track->GetTOFsignal();
306 GetESDsData(kPid2)->Fill(times[2]-tof);
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");
318 Int_t nV0=esd->GetNumberOfV0s();
319 for (Int_t i=0; i<nV0; i++) {
321 AliESDv0 v0(*esd->GetV0(i));
323 v0.ChangeMassHypothesis(kK0Short);
324 mass=v0.GetEffMass();
325 if (v0.GetOnFlyStatus())
326 GetESDsData(kK0on)->Fill(mass);
328 GetESDsData(kK0off)->Fill(mass);
330 v0.ChangeMassHypothesis(kLambda0);
331 mass=v0.GetEffMass();
332 if (v0.GetOnFlyStatus())
333 GetESDsData(kL0on)->Fill(mass);
335 GetESDsData(kL0off)->Fill(mass);
337 v0.ChangeMassHypothesis(kLambda0Bar);
338 mass=v0.GetEffMass();
339 if (v0.GetOnFlyStatus())
340 GetESDsData(kL0on)->Fill(mass);
342 GetESDsData(kL0off)->Fill(mass);