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 "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",
48 "TPC1 residuals Y","TPC1 residuals Z",
49 "TPC2 residuals Y","TPC2 residuals Z",
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",
58 "TOF residuals Y","TOF residuals Z",
60 "PHOS1 residuals Y","PHOS1 residuals Z",
61 "PHOS2 residuals Y","PHOS2 residuals Z",
63 "HMPID residuals Y","HMPID residuals Z",
65 "MUON residuals Y","MUON residuals Z",
67 "EMCAL residuals Y","EMCAL residuals Z"
70 for (Int_t m=1; m<AliGeomManager::kLastLayer; m++) {
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);
79 new TH1F("SSD1 absolute residuals Y for Z<0 (cm)",
80 "SSD1 absolute residuals Y for Z<0 (cm)",100,-2.,2.),40);
82 new TH1F("SSD1 absolute residuals Z for Z<0 (cm)",
83 "SSD1 absolute residuals Z for Z<0 (cm)",100,-2.,2.),41);
85 new TH1F("SSD1 absolute residuals Y for Z>0 (cm)",
86 "SSD1 absolute residuals Y for Z>0 (cm)",100,-2.,2.),42);
88 new TH1F("SSD1 absolute residuals Z for Z>0 (cm)",
89 "SSD1 absolute residuals Z for Z>0 (cm)",100,-2.,2.),43);
93 new TH1F("SSD2 absolute residuals Y for Z<0 (cm)",
94 "SSD2 absolute residuals Y for Z<0 (cm)",100,-3.,3.),44);
96 new TH1F("SSD2 absolute residuals Z for Z<0 (cm)",
97 "SSD2 absolute residuals Z for Z<0 (cm)",100,-3.,3.),45);
99 new TH1F("SSD2 absolute residuals Y for Z>0 (cm)",
100 "SSD2 absolute residuals Y for Z>0 (cm)",100,-3.,3.),46);
102 new TH1F("SSD2 absolute residuals Z for Z>0 (cm)",
103 "SSD2 absolute residuals Z for Z>0 (cm)",100,-3.,3.),47);
107 //____________________________________________________________________________
108 void AliGlobalQADataMaker::InitESDs() {
109 //------------------------------------------------------
110 // This function books the ESD QA histograms
111 // as a part of global QA
112 //------------------------------------------------------
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"
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);
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
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);
145 const Char_t *name[]={
146 "On-the-fly K0s mass (GeV)",
147 "Offline K0s mass (GeV)",
148 "On-the-fly Lambda0 + Lambda0Bar mass (GeV)",
149 "Offline Lambda0 + Lambda0Bar mass (GeV)"
151 Add2ESDsList(new TH1F(name[0],name[0],50, 0.4477,0.5477),kK0on);
152 Add2ESDsList(new TH1F(name[1],name[1],50, 0.4477,0.5477),kK0off);
153 Add2ESDsList(new TH1F(name[2],name[2],50, 1.0657,1.1657),kL0on);
154 Add2ESDsList(new TH1F(name[3],name[3],50, 1.0657,1.1657),kL0off);
158 const Char_t *name[]={
159 "ITS: dEdx (ADC) for particles with momentum 0.4 - 0.5 (GeV)",
160 "TPC: dEdx (ADC) for particles with momentum 0.4 - 0.5 (GeV)",
161 "TOF: tracking - measured (ps)"
163 Add2ESDsList(new TH1F(name[0],name[0],50,0.00,200.),kPid0);
164 Add2ESDsList(new TH1F(name[1],name[1],50,0.00,100.),kPid1);
165 Add2ESDsList(new TH1F(name[2],name[2],50,-3500.,3500.),kPid2);
170 //____________________________________________________________________________
171 void AliGlobalQADataMaker::MakeRaws(AliRawReader* rawReader)
173 //Fill prepared histograms with Raw digit properties
178 //____________________________________________________________________________
179 void AliGlobalQADataMaker::MakeESDs(AliESDEvent * event) {
180 //-----------------------------------------------------------
181 // This function fills the ESD QA histograms
182 // as a part of global QA
183 //-----------------------------------------------------------
184 // Check id histograms already created for this Event Specie
185 if ( ! GetESDsData(kClr0) )
188 const AliESDEvent *esd=event;
190 Int_t ntrk=esd->GetNumberOfTracks() ;
191 for (Int_t i=0; i<ntrk; i++) {
192 const AliESDtrack *track=esd->GetTrack(i);
194 // Cluster related QA
195 if (track->IsOn(AliESDtrack::kITSrefit)) {
196 Int_t n=track->GetITSclusters(0);
197 GetESDsData(kClr0)->Fill(Float_t(n)/6.); //6 is the number of ITS layers
200 if (track->IsOn(AliESDtrack::kTPCrefit)) {
201 Int_t n =track->GetTPCNcls();
202 Int_t nf=track->GetTPCNclsF(); // number of crossed TPC pad rows
204 Double_t val = n*1.0/nf;
205 GetESDsData(kClr1)->Fill(val);
209 if (track->IsOn(AliESDtrack::kTRDrefit)) {
210 Int_t n=track->GetTRDclusters(0);
211 GetESDsData(kClr2)->Fill(Float_t(n)/(6*24));//(6*24) is the number of TRD time bins
214 Double_t p=track->GetP();
217 if (track->IsOn(AliESDtrack::kTPCrefit)) {
219 track->GetDZ(0.,0.,0.,esd->GetMagneticField(),dz);
220 if ((TMath::Abs(dz[0])<3.) && (TMath::Abs(dz[1])<3.)) { // beam pipe
221 Double_t phi=track->Phi();
222 GetESDsData(kTrk0)->Fill(phi);
223 Double_t y=track->Eta();
224 GetESDsData(kTrk1)->Fill(y);
226 if (TMath::Abs(y)<0.9) {
227 GetESDsData(kTrk2)->Fill(p);
228 if (track->IsOn(AliESDtrack::kITSrefit)) GetESDsData(kTrk3)->Fill(p);
229 //if (track->IsOn(AliESDtrack::kTOFout)) GetESDsData(kTrk4)->Fill(p);
230 if (track->GetTOFsignal()>0) GetESDsData(kTrk4)->Fill(p);
236 if ((p>0.4) && (p<0.5)) {
237 if (track->IsOn(AliESDtrack::kITSpid)) {
238 Double_t dedx=track->GetITSsignal();
239 GetESDsData(kPid0)->Fill(dedx);
241 if (track->IsOn(AliESDtrack::kTPCpid)) {
242 Double_t dedx=track->GetTPCsignal();
243 GetESDsData(kPid1)->Fill(dedx);
247 if (track->IsOn(AliESDtrack::kTOFpid)) {
249 track->GetIntegratedTimes(times);
250 Double_t tof=track->GetTOFsignal();
251 GetESDsData(kPid2)->Fill(times[2]-tof);
256 TH1 *tpc=GetESDsData(kTrk2); tpc->Sumw2();
257 TH1 *its=GetESDsData(kTrk3); its->Sumw2();
258 TH1 *tof=GetESDsData(kTrk4); tof->Sumw2();
259 GetESDsData(kTrk5)->Divide(its,tpc,1,1.,"b");
260 GetESDsData(kTrk6)->Divide(tof,tpc,1,1.,"b");
263 Int_t nV0=esd->GetNumberOfV0s();
264 for (Int_t i=0; i<nV0; i++) {
266 AliESDv0 v0(*esd->GetV0(i));
268 v0.ChangeMassHypothesis(kK0Short);
269 mass=v0.GetEffMass();
270 if (v0.GetOnFlyStatus())
271 GetESDsData(kK0on)->Fill(mass);
273 GetESDsData(kK0off)->Fill(mass);
275 v0.ChangeMassHypothesis(kLambda0);
276 mass=v0.GetEffMass();
277 if (v0.GetOnFlyStatus())
278 GetESDsData(kL0on)->Fill(mass);
280 GetESDsData(kL0off)->Fill(mass);
282 v0.ChangeMassHypothesis(kLambda0Bar);
283 mass=v0.GetEffMass();
284 if (v0.GetOnFlyStatus())
285 GetESDsData(kL0on)->Fill(mass);
287 GetESDsData(kL0off)->Fill(mass);