2 /**************************************************************************
3 * Authors : Iouri Belikov, Antonin Maire
4 * Contributors are mentioned in the code where appropriate. *
6 * Permission to use, copy, modify and distribute this software and its *
7 * documentation strictly for non-commercial purposes is hereby granted *
8 * without fee, provided that the above copyright notice appears in all *
9 * copies and that both the copyright notice and this permission notice *
10 * appear in the supporting documentation. The authors make no claims *
11 * about the suitability of this software for any purpose. It is *
12 * provided "as is" without express or implied warranty. *
13 **************************************************************************/
15 //-----------------------------------------------------------------
16 // AliAnalysisTaskGlobalQA class
17 // This task is for running the GlobalQA over already existing ESDs
18 // Origin: I.Belikov, Iouri.Belikov@cern.ch, June 2009
19 //-----------------------------------------------------------------
29 #include "AliAnalysisManager.h"
31 #include "AliESDEvent.h"
33 #include "AliESDInputHandler.h"
35 #include "AliAnalysisTaskGlobalQA.h"
38 // Run the GlobalQA analysis over already existing ESDs
39 // Origin: Iouri.Belikov@cern.ch
42 ClassImp(AliAnalysisTaskGlobalQA)
44 //________________________________________________________________________
45 AliAnalysisTaskGlobalQA::AliAnalysisTaskGlobalQA() :
46 AliAnalysisTaskSE("GlobalQA"),
49 // Default Constructor
51 DefineOutput(1, TObjArray::Class());
54 //________________________________________________________________________
55 void AliAnalysisTaskGlobalQA::UserCreateOutputObjects()
57 // Create the histograms
60 fArrayQA = new TObjArray(kLast);
63 {// Cluster related QA
64 const Char_t *name[]={
65 "hGlobalFractionAssignedClustersITS",
66 "hGlobalFractionAssignedClustersTPC",
67 "hGlobalFractionAssignedClustersTRD"
69 const Char_t *title[]={
70 "Fraction of the assigned clusters in ITS",
71 "Fraction of the assigned clusters in TPC",
72 "Fraction of the assigned clusters in TRD"
74 Add2ESDsList(new TH1F(name[0],title[0],100,0.,2.),kClr0);
75 Add2ESDsList(new TH1F(name[1],title[1],100,0.,2.),kClr1);
76 Add2ESDsList(new TH1F(name[2],title[2],100,0.,2.),kClr2);
80 const Char_t *name[]={
81 "hGlobalTrackAzimuthe", // kTrk0
82 "hGlobalTrackEta", // kTrk1
83 "hGlobalTPCTrackpT", // kTrk2
84 "hGlobalTPCITSMatchedpT", // kTrk3
85 "hGlobalTPCTOFMatchedpT", // kTrk4
86 "hGlobalTPCITSMatchingProbability", // kTrk5
87 "hGlobalTPCTOFMatchingProbability", // kTrk6
88 "hGlobalTPCsideAposDCA", // kTrk7
89 "hGlobalTPCsideAnegDCA", // kTrk8
90 "hGlobalTPCsideCposDCA", // kTrk9
91 "hGlobalTPCsideCnegDCA" // kTrk10
93 const Char_t *title[]={
94 "Track azimuthal distribution (rad)", // kTrk0
95 "Track pseudo-rapidity distribution", // kTrk1
96 "TPC: track momentum distribution (GeV)", // kTrk2
97 "TPC-ITS matched: track momentum distribution (GeV)", // kTrk3
98 "TPC-TOF matched: track momentum distribution (GeV)", // kTrk4
99 "TPC-ITS track-matching probability", // kTrk5
100 "TPC-TOF track-matching probability" // kTrk6
101 "TPC side A: DCA for the positive tracks (mm)", // kTrk7
102 "TPC side A: DCA for the negative tracks (mm)", // kTrk8
103 "TPC side C: DCA for the positive tracks (mm)", // kTrk9
104 "TPC side C: DCA for the negative tracks (mm)" // kTrk10
106 Add2ESDsList(new TH1F(name[0],title[0],100, 0.,TMath::TwoPi()),kTrk0);
107 Add2ESDsList(new TH1F(name[1],title[1],100,-2.00,2.00),kTrk1);
108 Add2ESDsList(new TH1F(name[2],title[2],50, 0.20,5.00),kTrk2);
109 Add2ESDsList(new TH1F(name[3],title[3],50, 0.20,5.00),kTrk3);
110 Add2ESDsList(new TH1F(name[4],title[4],50, 0.20,5.00),kTrk4);
111 Add2ESDsList(new TH1F(name[5],title[5],50, 0.20,5.00),kTrk5);
112 Add2ESDsList(new TH1F(name[6],title[6],50, 0.20,5.00),kTrk6);
113 Add2ESDsList(new TH1F(name[7],title[7],50, -25.0,25.0),kTrk7);
114 Add2ESDsList(new TH1F(name[8],title[8],50, -25.0,25.0),kTrk8);
115 Add2ESDsList(new TH1F(name[9],title[9],50, -25.0,25.0),kTrk9);
116 Add2ESDsList(new TH1F(name[10],title[10],50, -25.0,25.0),kTrk10);
120 const Char_t *name[]={
121 "hGlobalPromptK0sMass",
122 "hGlobalOfflineK0sMass",
123 "hGlobalPromptLambda0Lambda0BarMass",
124 "hGlobalOfflineLambda0Lambda0BarMass"
126 const Char_t *title[]={
127 "On-the-fly K0s mass (GeV)",
128 "Offline K0s mass (GeV)",
129 "On-the-fly Lambda0 + Lambda0Bar mass (GeV)",
130 "Offline Lambda0 + Lambda0Bar mass (GeV)"
132 Add2ESDsList(new TH1F(name[0],title[0],50, 0.4477,0.5477),kK0on);
133 Add2ESDsList(new TH1F(name[1],title[1],50, 0.4477,0.5477),kK0off);
134 Add2ESDsList(new TH1F(name[2],title[2],50, 1.0657,1.1657),kL0on);
135 Add2ESDsList(new TH1F(name[3],title[3],50, 1.0657,1.1657),kL0off);
139 const Char_t *name[]={
142 "hGlobalTOFTrackingvsMeasured",
143 "hGlobalTPCdEdxvsMomentum"
145 const Char_t *title[]={
146 "ITS: dEdx (A.U.) for particles with momentum 0.4 - 0.5 (GeV)",
147 "TPC: dEdx (A.U.) for particles with momentum 0.4 - 0.5 (GeV)",
148 "TOF: tracking - measured (ps)",
149 "TPC: dEdx (A.U.) vs momentum (GeV)"
151 Add2ESDsList(new TH1F(name[0],title[0],50,0.00,200.),kPid0);
152 Add2ESDsList(new TH1F(name[1],title[1],50,0.00,100.),kPid1);
153 Add2ESDsList(new TH1F(name[2],title[2],50,-3500.,3500.),kPid2);
154 Add2ESDsList(new TH2F(name[3],title[3],1500,0.05,15.,700,0.,700.),kPid3);
159 //________________________________________________________________________
160 void AliAnalysisTaskGlobalQA::UserExec(Option_t *)
163 // Called for each event
165 const AliESDEvent *esd=(const AliESDEvent *)InputEvent();
168 Printf("ERROR: ESD is not available");
172 for (Int_t iTracks = 0; iTracks < esd->GetNumberOfTracks(); iTracks++) {
173 AliESDtrack* track = esd->GetTrack(iTracks);
175 Printf("ERROR: Could not receive track %d", iTracks);
180 // Cluster related QA
181 if (track->IsOn(AliESDtrack::kITSrefit)) {
182 Int_t n=track->GetITSclusters(0);
183 GetESDsData(kClr0)->Fill(Float_t(n)/6.); //6 is the number of ITS layers
186 if (track->IsOn(AliESDtrack::kTPCrefit)) {
187 Int_t n =track->GetTPCNcls();
188 Int_t nf=track->GetTPCNclsF(); // number of crossed TPC pad rows
190 Double_t val = n*1.0/nf;
191 GetESDsData(kClr1)->Fill(val);
195 if (track->IsOn(AliESDtrack::kTRDrefit)) {
196 Int_t n=track->GetTRDclusters(0);
197 GetESDsData(kClr2)->Fill(Float_t(n)/(6*24));//(6*24) is the number of TRD time bins
200 Double_t p=track->GetP();
203 if (track->IsOn(AliESDtrack::kTPCrefit)) {
205 track->GetDZ(0.,0.,0.,esd->GetMagneticField(),dz);
206 if ((TMath::Abs(dz[0])<3.) && (TMath::Abs(dz[1])<3.)) { // beam pipe
207 Double_t phi=track->Phi();
208 GetESDsData(kTrk0)->Fill(phi);
209 Double_t y=track->Eta();
210 GetESDsData(kTrk1)->Fill(y);
212 if (TMath::Abs(y)<0.9) {
213 GetESDsData(kTrk2)->Fill(p);
214 if (track->IsOn(AliESDtrack::kITSrefit)) GetESDsData(kTrk3)->Fill(p);
215 //if (track->IsOn(AliESDtrack::kTOFout)) GetESDsData(kTrk4)->Fill(p);
216 if (track->GetTOFsignal()>0) GetESDsData(kTrk4)->Fill(p);
220 const AliExternalTrackParam *tpcTrack=track->GetTPCInnerParam();
221 const AliExternalTrackParam *innTrack=track->GetInnerParam();
224 const AliESDVertex *vtx=esd->GetPrimaryVertex();
225 Double_t xv=vtx->GetXv();
226 Double_t yv=vtx->GetYv();
227 Double_t zv=vtx->GetZv();
229 tpcTrack->GetDZ(xv,yv,zv,esd->GetMagneticField(),dz);
231 if (innTrack->GetZ() > 0)
232 if (innTrack->GetTgl()> 0) { // TPC side A
233 if (tpcTrack->GetSign() > 0) GetESDsData(kTrk7)->Fill(dz[0]);
234 else GetESDsData(kTrk8)->Fill(dz[0]);
236 if (innTrack->GetZ() < 0)
237 if (innTrack->GetTgl()< 0) { // TPC side C
238 if (tpcTrack->GetSign() > 0) GetESDsData(kTrk9)->Fill(dz[0]);
239 else GetESDsData(kTrk10)->Fill(dz[0]);
244 if ((p>0.4) && (p<0.5)) {
245 if (track->IsOn(AliESDtrack::kITSpid)) {
246 Double_t dedx=track->GetITSsignal();
247 GetESDsData(kPid0)->Fill(dedx);
249 if (track->IsOn(AliESDtrack::kTPCpid)) {
250 Double_t dedx=track->GetTPCsignal();
251 GetESDsData(kPid1)->Fill(dedx);
255 if (track->IsOn(AliESDtrack::kTOFpid)) {
257 track->GetIntegratedTimes(times);
258 Double_t tof=track->GetTOFsignal();
259 GetESDsData(kPid2)->Fill(times[2]-tof);
262 const AliExternalTrackParam *par=track->GetInnerParam();
264 Double_t pp=par->GetP();
265 Double_t dedx=track->GetTPCsignal();
266 TH2F *h = dynamic_cast<TH2F*>(GetESDsData(kPid3));
272 Int_t nV0=esd->GetNumberOfV0s();
273 for (Int_t i=0; i<nV0; i++) {
275 AliESDv0 v0(*esd->GetV0(i));
277 v0.ChangeMassHypothesis(kK0Short);
278 mass=v0.GetEffMass();
279 if (v0.GetOnFlyStatus())
280 GetESDsData(kK0on)->Fill(mass);
282 GetESDsData(kK0off)->Fill(mass);
284 v0.ChangeMassHypothesis(kLambda0);
285 mass=v0.GetEffMass();
286 if (v0.GetOnFlyStatus())
287 GetESDsData(kL0on)->Fill(mass);
289 GetESDsData(kL0off)->Fill(mass);
291 v0.ChangeMassHypothesis(kLambda0Bar);
292 mass=v0.GetEffMass();
293 if (v0.GetOnFlyStatus())
294 GetESDsData(kL0on)->Fill(mass);
296 GetESDsData(kL0off)->Fill(mass);
300 PostData(1, fArrayQA);
303 //________________________________________________________________________
304 void AliAnalysisTaskGlobalQA::Terminate(Option_t *)
306 // Draw the results on the screen
307 // Called once at the end of the query
309 fArrayQA=(TObjArray*)GetOutputData(1);
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");
317 TH1 *hTPCdEdxMIP = GetESDsData(kPid1);
319 Printf("ERROR: hTPCdEdxMIP not available");
323 TH2 *hTPCdEdxVsP = dynamic_cast<TH2*>(GetESDsData(kPid3));
325 Printf("ERROR: hTPCdEdxVsP not available");
329 TCanvas *c2=new TCanvas("c2","",320,32,530,590);
331 TPad *p6=new TPad("p6","",0.,0.,1.,.5); p6->Draw(); p6->cd();
332 p6->SetFillColor(42); p6->SetFrameFillColor(10);
333 hTPCdEdxMIP->SetFillColor(2); hTPCdEdxMIP->SetFillStyle(3005);
334 if (hTPCdEdxMIP->GetEntries()<333)
335 hTPCdEdxMIP->DrawCopy("E");
337 hTPCdEdxMIP->Fit("gaus");
340 TPad *p7=new TPad("p7","",0.,0.5,1.,1.); p7->Draw(); p7->cd(); p7->SetLogx();
341 p7->SetFillColor(42); p7->SetFrameFillColor(10);
342 hTPCdEdxVsP->DrawCopy();