]> git.uio.no Git - u/mrichter/AliRoot.git/blob - STEER/AliGlobalQADataMaker.cxx
Moved AliLHCDipValT and AliLHCData to from STEERBase to STEER
[u/mrichter/AliRoot.git] / STEER / AliGlobalQADataMaker.cxx
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
8 #include <TPDGCode.h>
9 #include <TH1F.h>
10 #include <TH2F.h>
11
12 #include "AliQAChecker.h"
13 #include "AliGlobalQADataMaker.h"
14 #include "AliGeomManager.h"
15 #include "AliESDEvent.h"
16 #include "AliESDv0.h"
17 #include "AliRawReader.h"
18 #include "AliESDVZERO.h"
19 #include "AliMultiplicity.h" 
20
21 ClassImp(AliGlobalQADataMaker)
22  
23 //____________________________________________________________________________ 
24 void AliGlobalQADataMaker::EndOfDetectorCycle(AliQAv1::TASKINDEX_t task, TObjArray ** list)
25 {
26   //Detector specific actions at end of cycle
27   // do the QA checking
28   AliQAChecker::Instance()->Run(AliQAv1::kGLOBAL, task, list) ;  
29 }
30
31 //____________________________________________________________________________ 
32 void AliGlobalQADataMaker::InitRaws()
33 {
34   // create Raws histograms in Raws subdir
35 }
36
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 ; 
44   if ( ! first ) 
45     return ; 
46   const Char_t *name[]={
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[]={
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",
82     
83     "TPC1 residuals Y","TPC1 residuals Z",
84     "TPC2 residuals Y","TPC2 residuals Z",
85     
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",
92     
93     "TOF residuals Y","TOF residuals Z",
94     
95     "PHOS1 residuals Y","PHOS1 residuals Z",
96     "PHOS2 residuals Y","PHOS2 residuals Z",
97     
98     "HMPID residuals Y","HMPID residuals Z",
99     
100     "MUON residuals Y","MUON residuals Z",
101     
102     "EMCAL residuals Y","EMCAL residuals Z"
103   };
104   
105   for (Int_t m=1; m<AliGeomManager::kLastLayer; m++) {
106     Int_t i=2*m-2;
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);    
111   }
112
113   Add2RecPointsList(
114   new TH1F("hGlobalSSD1AbsoluteResidualsYNegZ",
115            "SSD1 Absolute Residuals Y Neg Z",100,-2.,2.),40);
116   Add2RecPointsList(
117   new TH1F("hGlobalSSD1AbsoluteResidualsZNegZ",
118            "SSD1 Absolute Residuals Z Neg Z",100,-2.,2.),41);
119   Add2RecPointsList(
120   new TH1F("hGlobalSSD1AbsoluteResidualsYPosZ",
121            "SSD1 Absolute Residuals Y Pos Z",100,-2.,2.),42);
122   Add2RecPointsList(
123   new TH1F("hGlobalSSD1AbsoluteResidualsZPosZ",
124            "SSD1 Absolute Residuals Z Pos Z",100,-2.,2.),43);
125
126
127   Add2RecPointsList(
128   new TH1F("hGlobalSSD2AbsoluteResidualsYNegZ",
129            "SSD2 Absolute Residuals Y Neg Z",100,-3.,3.),44);
130   Add2RecPointsList(
131   new TH1F("hGlobalSSD2AbsoluteResidualsZNegZ",
132            "SSD2 Absolute Residuals Z Neg Z",100,-3.,3.),45);
133   Add2RecPointsList(
134   new TH1F("hGlobalSSD2AbsoluteResidualsYPosZ",
135            "SSD2 Absolute Residuals Y Pos Z",100,-3.,3.),46);
136   Add2RecPointsList(
137   new TH1F("hGlobalSSD2AbsoluteResidualsZPosZ",
138            "SSD2Absolute Residuals Z Pos Z",100,-3.,3.),47);
139   
140   first = kFALSE ; 
141 }
142
143 //____________________________________________________________________________ 
144 void AliGlobalQADataMaker::InitESDs() {
145   //------------------------------------------------------
146   // This function books the ESD QA histograms
147   // as a part of global QA
148   //------------------------------------------------------
149
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"
158     };
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"
164     };
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);
169   }
170
171   {// Track related QA
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
184   };
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
197     };
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);
209   }
210
211   {// V0 related QA
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     };
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);
228   }
229
230   {// PID related QA
231   const Char_t *name[]={
232     "hGlobalITSdEdx",
233     "hGlobalTPCdEdx",
234     "hGlobalTOFTrackingvsMeasured",
235     "hGlobalTPCdEdxvsMomentum"
236    };
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)"
242      };
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);
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     };
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);
261   }
262
263 }
264
265 //____________________________________________________________________________
266 void AliGlobalQADataMaker::MakeRaws(AliRawReader* rawReader)
267 {
268   //Fill prepared histograms with Raw digit properties
269   rawReader->Reset() ;
270
271 }
272
273 //____________________________________________________________________________ 
274 void AliGlobalQADataMaker::MakeESDs(AliESDEvent * event) {
275   //-----------------------------------------------------------
276   // This function fills the ESD QA histograms
277   // as a part of global QA
278   //-----------------------------------------------------------
279
280   const AliESDEvent *esd=event;
281
282   Int_t ntrk=esd->GetNumberOfTracks() ; 
283   for (Int_t i=0; i<ntrk; i++) {
284     const AliESDtrack *track=esd->GetTrack(i);
285
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
290     }
291
292     for (Int_t j=0; j<6; ++j) {
293       Int_t idet, sts;
294       Float_t xloc,zloc;
295       if (!track->GetITSModuleIndexInfo(j,idet,sts,xloc,zloc)) continue;
296       if (j>=2) idet+=240;
297       if (j>=4) idet+=260;
298       if ((sts==1)||(sts==2)||(sts==4)) GetESDsData(kClr3)->Fill(idet);  
299     }
300
301     if (track->IsOn(AliESDtrack::kTPCrefit)) {
302       Int_t n =track->GetTPCNcls();
303       Int_t nf=track->GetTPCNclsF();      // number of crossed TPC pad rows
304       if (nf>0) {
305         Double_t val = n*1.0/nf; 
306         GetESDsData(kClr1)->Fill(val); 
307       }
308     }
309
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
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);
324         Double_t y=track->Eta();
325         GetESDsData(kTrk1)->Fill(y);
326
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);
332         }
333       }
334     }
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     }
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       }
368     }
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     }
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  
385   }
386
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
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");
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();
416     if (v0.GetOnFlyStatus())
417        GetESDsData(kK0on)->Fill(mass);
418     else
419        GetESDsData(kK0off)->Fill(mass);
420
421     v0.ChangeMassHypothesis(kLambda0);
422     mass=v0.GetEffMass();
423     if (v0.GetOnFlyStatus())
424        GetESDsData(kL0on)->Fill(mass);
425     else
426        GetESDsData(kL0off)->Fill(mass);
427
428     v0.ChangeMassHypothesis(kLambda0Bar);
429     mass=v0.GetEffMass();
430     if (v0.GetOnFlyStatus())
431        GetESDsData(kL0on)->Fill(mass);
432     else
433        GetESDsData(kL0off)->Fill(mass);
434   }
435
436 }