1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
16 //==============================================================================
17 // AliHMPIDTaskQA - Class representing a quality check tool of HMPID
18 // A set of histograms is created.
19 //==============================================================================
21 #ifndef AliHMPIDTaskQA_CXX
22 #define AliHMPIDTaskQA_CXX
29 #include "TGraphErrors.h"
30 #include "AliAnalysisManager.h"
31 #include "AliESDInputHandler.h"
32 #include "AliMCEventHandler.h"
33 #include "AliMCEvent.h"
34 #include "AliESDtrack.h"
37 #include "AliHMPIDTaskQA.h"
39 ClassImp(AliHMPIDTaskQA)
41 //__________________________________________________________________________
42 AliHMPIDTaskQA::AliHMPIDTaskQA() :
43 fESD(0x0),fMC(0x0),fUseMC(kTRUE),
45 fHmpPesdPhmp(0x0),fHmpCkovPesd(0x0),fHmpCkovPhmp(0x0),
46 fHmpMipTrkDistX(0x0),fHmpMipCharge3cm(0x0),
66 for (Int_t i=0; i<7; i++)
67 fHmpMipTrkDistPosY[i] = fHmpMipTrkDistNegY[i] = 0x0;
70 //___________________________________________________________________________
71 AliHMPIDTaskQA::AliHMPIDTaskQA(const Char_t* name) :
72 AliAnalysisTaskSE(name),
73 fESD(0x0), fMC(0x0), fUseMC(kTRUE),
75 fHmpPesdPhmp(0x0),fHmpCkovPesd(0x0),fHmpCkovPhmp(0x0),
76 fHmpMipTrkDistX(0x0),fHmpMipCharge3cm(0x0),
94 // Constructor. Initialization of Inputs and Outputs
96 for (Int_t i=0; i<7; i++)
97 fHmpMipTrkDistPosY[i] = fHmpMipTrkDistNegY[i] = 0x0;
99 DefineOutput(1,TList::Class());
102 //___________________________________________________________________________
103 AliHMPIDTaskQA& AliHMPIDTaskQA::operator=(const AliHMPIDTaskQA& c)
106 // Assignment operator
109 AliAnalysisTaskSE::operator=(c);
113 fHmpHistList = c.fHmpHistList;
114 fHmpPesdPhmp = c.fHmpPesdPhmp;
115 fHmpCkovPesd = c.fHmpCkovPesd;
116 fHmpCkovPhmp = c.fHmpCkovPhmp;
117 fHmpMipTrkDistX = c.fHmpMipTrkDistX;
118 fHmpMipCharge3cm = c.fHmpMipCharge3cm;
119 fHmpTrkFlags = c.fHmpTrkFlags;
122 fPionEff = c.fPionEff;
123 fKaonEff = c.fKaonEff;
124 fProtEff = c.fProtEff;
125 fPionTot = c.fPionTot;
126 fKaonTot = c.fKaonTot;
127 fProtTot = c.fProtTot;
128 fPionNot = c.fPionNot;
129 fKaonNot = c.fKaonNot;
130 fProtNot = c.fProtNot;
131 fPionCon = c.fPionCon;
132 fKaonCon = c.fKaonCon;
133 fProtCon = c.fProtCon;
134 for (Int_t i=0; i<7; i++){
135 fHmpMipTrkDistPosY[i] = c.fHmpMipTrkDistPosY[i];
136 fHmpMipTrkDistNegY[i] = c.fHmpMipTrkDistNegY[i];
142 //___________________________________________________________________________
143 AliHMPIDTaskQA::AliHMPIDTaskQA(const AliHMPIDTaskQA& c) :
144 AliAnalysisTaskSE(c),
145 fESD(c.fESD),fMC(c.fMC),fUseMC(c.fUseMC),
146 fHmpHistList(c.fHmpHistList),
147 fHmpPesdPhmp(c.fHmpPesdPhmp),fHmpCkovPesd(c.fHmpCkovPesd),fHmpCkovPhmp(c.fHmpCkovPhmp),
148 fHmpMipTrkDistX(c.fHmpMipTrkDistX),
149 fHmpMipCharge3cm(c.fHmpMipCharge3cm),
150 fHmpTrkFlags(c.fHmpTrkFlags),
153 fPionEff(c.fPionEff),
154 fKaonEff(c.fKaonEff),
155 fProtEff(c.fProtEff),
156 fPionTot(c.fPionTot),
157 fKaonTot(c.fKaonTot),
158 fProtTot(c.fProtTot),
159 fPionNot(c.fPionNot),
160 fKaonNot(c.fKaonNot),
161 fProtNot(c.fProtNot),
162 fPionCon(c.fPionCon),
163 fKaonCon(c.fKaonCon),
169 for (Int_t i=0; i<7; i++){
170 fHmpMipTrkDistPosY[i] = c.fHmpMipTrkDistPosY[i];
171 fHmpMipTrkDistNegY[i] = c.fHmpMipTrkDistNegY[i];
175 //___________________________________________________________________________
176 AliHMPIDTaskQA::~AliHMPIDTaskQA() {
180 Info("~AliHMPIDTaskQA","Calling Destructor");
181 if (fHmpHistList /*&& !AliAnalysisManager::GetAnalysisManager()->IsProofMode()*/) delete fHmpHistList;
184 //___________________________________________________________________________
185 void AliHMPIDTaskQA::ConnectInputData(Option_t *option)
187 AliAnalysisTaskSE::ConnectInputData(option);
190 AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler*> (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
192 AliDebug(2,Form("ERROR: Could not get ESDInputHandler"));
194 fESD = esdH->GetEvent();
198 AliMCEventHandler *mcH = dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
200 AliDebug(2,Form("ERROR: Could not get MCEventHandler"));
203 fMC = mcH->MCEvent();
204 if (!fMC) AliDebug(2,Form("ERROR: Could not get MCEvent"));
208 //___________________________________________________________________________
209 void AliHMPIDTaskQA::UserExec(Option_t *)
211 Double_t priors[5]={1.,1.,1.,1.,1.}; //{0.01,0.01,0.83,0.10,0.5};
213 AliPID *pPid = new AliPID();
214 pPid->SetPriors(priors);
215 AliESDtrack *track=0;
217 AliStack* pStack = 0;
220 pStack = fMC->Stack();
224 // Main loop function, executed on Event basis
226 for (Int_t iTrack = 0; iTrack<fESD->GetNumberOfTracks(); iTrack++) {
228 track = fESD->GetTrack(iTrack);
230 Double_t rin[3], rout[3];
231 track->GetInnerXYZ(rin);
232 track->GetOuterXYZ(rout);
233 Double_t ktol = 0.001;
235 if(Equal(track->GetHMPIDsignal(),-20.,ktol)) fHmpTrkFlags->Fill(0);
236 else if(Equal(track->GetHMPIDsignal(),-9.,ktol)) fHmpTrkFlags->Fill(1);
237 else if(Equal(track->GetHMPIDsignal(),-5.,ktol)) fHmpTrkFlags->Fill(2);
238 else if(Equal(track->GetHMPIDsignal(),-11.,ktol)) fHmpTrkFlags->Fill(3);
239 else if(Equal(track->GetHMPIDsignal(),-22.,ktol)) fHmpTrkFlags->Fill(4);
240 else fHmpTrkFlags->Fill(4);
242 if(Equal(track->GetHMPIDsignal(),-20.,ktol)) continue;
243 if(track->GetHMPIDcluIdx() < 0) continue;
247 Float_t xpc, ypc, th, ph;
248 track->GetHMPIDmip(x,y,q,nph);
249 track->GetHMPIDtrk(xpc,ypc,th,ph);
251 if(Equal(x,0.,ktol) && Equal(y,0.,ktol) && Equal(xpc,0.,ktol) && Equal(ypc,0.,ktol)) continue;
253 Float_t sign = track->GetSign();
254 Int_t ch = track->GetHMPIDcluIdx()/1000000;
255 Double_t dist = TMath::Sqrt( (xpc-x)*(xpc-x) + (ypc - y)*(ypc - y));
256 fHmpMipTrkDistX->Fill(xpc - x);
257 if (sign > 0.) fHmpMipTrkDistPosY[ch]->Fill(ypc - y);
258 if (sign < 0.) fHmpMipTrkDistNegY[ch]->Fill(ypc - y);
259 Double_t pHmp[3] = {0}, pHmp3 = 0;
260 if (track->GetOuterHmpPxPyPz(pHmp)) pHmp3 = TMath::Sqrt(pHmp[0]*pHmp[0]+pHmp[1]*pHmp[1]+pHmp[2]*pHmp[2]);
261 if (dist <= 3.0) fHmpMipCharge3cm->Fill(q);
263 track->GetHMPIDpid(probs);
264 pPid->SetProbabilities(probs);
266 if ((label = track->GetLabel()) < 0) continue;
267 pPart = pStack->Particle(label);
270 if(track->GetHMPIDsignal() > 0 ){
271 if (pHmp3) fHmpPesdPhmp->Fill(track->P(),pHmp3);
272 fHmpCkovPesd->Fill(track->P(),track->GetHMPIDsignal());
273 if (pHmp3) fHmpCkovPhmp->Fill(pHmp3,track->GetHMPIDsignal());
275 if (fUseMC && dist<0.5 && TMath::Abs(th)<0.13){
276 if (!pStack->IsPhysicalPrimary(label)) continue;
277 if (track->Pt()<1. || track->Pt()>5.) continue;
278 Int_t pdgCode = TMath::Abs(pPart->GetPdgCode());
279 Int_t ptBin=(Int_t) (2*(track->Pt()-1));
280 if (pdgCode!=2212) fProtCon->Fill(ptBin);
282 fProtTot->Fill(ptBin);
283 fProtEff->Fill(ptBin,pPid->GetProbability(AliPID::kProton));
284 fPionNot->Fill(ptBin,pPid->GetProbability(AliPID::kPion));
285 fKaonNot->Fill(ptBin,pPid->GetProbability(AliPID::kKaon));
287 if (pdgCode!=211) fPionCon->Fill(ptBin);
288 if (pdgCode!=321) fKaonCon->Fill(ptBin);
291 Float_t weight=pPid->GetProbability(AliPID::kElectron)+
292 pPid->GetProbability(AliPID::kMuon)+
293 pPid->GetProbability(AliPID::kPion);
294 fPionTot->Fill(ptBin);
295 fPionEff->Fill(ptBin,weight);
296 fKaonNot->Fill(ptBin,pPid->GetProbability(AliPID::kKaon));
298 fProtNot->Fill(ptBin,pPid->GetProbability(AliPID::kProton));
302 fKaonTot->Fill(ptBin);
303 fKaonEff->Fill(ptBin,pPid->GetProbability(AliPID::kKaon));
304 fPionNot->Fill(ptBin,(pPid->GetProbability(AliPID::kPion)));
306 fProtNot->Fill(ptBin,(pPid->GetProbability(AliPID::kProton)));
313 /* PostData(0) is taken care of by AliAnalysisTaskSE */
314 PostData(1,fHmpHistList);
317 //___________________________________________________________________________
318 void AliHMPIDTaskQA::Terminate(Option_t*)
320 // The Terminate() function is the last function to be called during
321 // a query. It always runs on the client, it can be used to present
322 // the results graphically or save the results to file.
324 Info("Terminate"," ");
325 AliAnalysisTaskSE::Terminate();
329 //___________________________________________________________________________
330 void AliHMPIDTaskQA::UserCreateOutputObjects() {
332 //HERE ONE CAN CREATE OUTPUT OBJECTS
333 //TO BE SET BEFORE THE EXECUTION OF THE TASK
338 fHmpHistList = new TList();
339 fHmpHistList->SetOwner();
341 fHmpPesdPhmp = new TH2F("fHmpPesdPhmp","HMPID: ESD p - running p;HMP p (GeV/c);ESD p (Gev/c)",100,0,10,100,0,10);
342 fHmpHistList->Add(fHmpPesdPhmp);
344 fHmpCkovPesd = new TH2F("fHmpCkovPesd","HMPID: ThetaCherenkov vs P;p_esd (GeV/c);#Theta_C;Entries",100,0,10,110,0,1.1);
345 fHmpHistList->Add(fHmpCkovPesd);
347 fHmpCkovPhmp = new TH2F("fHmpCkovPhmp","HMPID: ThetaCherenkov vs P;p_hmp (GeV/c);#Theta_C;Entries",100,0,10,110,0,1.1);
348 fHmpHistList->Add(fHmpCkovPhmp);
350 fHmpMipTrkDistX = new TH1F("fHmpMipTrkDistX","HMPID MIP-Track distance in local X;distance (cm);Entries",800,-20,20);
351 fHmpHistList->Add(fHmpMipTrkDistX);
353 for (Int_t i=0; i<7; i++){
354 TString title=Form("MIP-Track distance in local Y, Chamber %d;distance (cm);Entries",i);
355 fHmpMipTrkDistPosY[i] = new TH1F(Form("fHmpMipTrkDistPosY%d",i),title.Data(),800,-20,20);
356 fHmpHistList->Add(fHmpMipTrkDistPosY[i]);
357 fHmpMipTrkDistNegY[i] = new TH1F(Form("fHmpMipTrkDistNegY%d",i),title.Data(),800,-20,20);
358 fHmpHistList->Add(fHmpMipTrkDistNegY[i]);
361 fHmpMipCharge3cm = new TH1F("fHmpMipCharge3cm","HMPID MIP Charge;MIP Charge (ADC);Entries",5001,-0.5,5000.5);
362 fHmpHistList->Add(fHmpMipCharge3cm);
364 fHmpTrkFlags = new TH1F("fHmpTrkFlags","HMPID track flags",6,0,6);
365 TString summary[6] = {"NotPerformed","MipDistCut", "MipQdcCut", "NoPhotAccept", "kNoRad", "other"};
366 for(Int_t ibin = 0; ibin < 6; ibin++) fHmpTrkFlags->GetXaxis()->SetBinLabel(ibin+1,Form("%i %s",ibin+1,summary[ibin].Data()));
367 fHmpHistList->Add(fHmpTrkFlags);
369 fPionEff = new TH1F("PionEff","Identified pions",fN1,0,fN1);
370 fKaonEff = new TH1F("KaonEff","Identified kaons",fN1,0,fN1);
371 fProtEff = new TH1F("ProtEff","Identified protons",fN2,0,fN2);
372 fPionTot = new TH1I("PionTot","Total MC pions",fN1,0,fN1);
373 fKaonTot = new TH1I("KaonTot","Total MC kaons",fN1,0,fN1);
374 fProtTot = new TH1I("ProtTot","Total MC protons",fN2,0,fN2);
375 fPionNot = new TH1F("PionNot","Misidentified pions",fN1,0,fN1);
376 fKaonNot = new TH1F("KaonNot","Misidentified kaons",fN1,0,fN1);
377 fProtNot = new TH1F("ProtNot","Misidentified protons",fN2,0,fN2);
378 fPionCon = new TH1I("PionCon","Total not MC pions",fN1,0,fN1);
379 fKaonCon = new TH1I("KaonCon","Total not MC kaons",fN1,0,fN1);
380 fProtCon = new TH1I("ProtCon","Total not MC protons",fN2,0,fN2);
382 fHmpHistList->Add(fPionEff); fHmpHistList->Add(fKaonEff); fHmpHistList->Add(fProtEff);
383 fHmpHistList->Add(fPionTot); fHmpHistList->Add(fKaonTot); fHmpHistList->Add(fProtTot);
384 fHmpHistList->Add(fPionNot); fHmpHistList->Add(fKaonNot); fHmpHistList->Add(fProtNot);
385 fHmpHistList->Add(fPionCon); fHmpHistList->Add(fKaonCon); fHmpHistList->Add(fProtCon);
387 PostData(1,fHmpHistList);
390 //____________________________________________________________________________________________________________________________________
391 Bool_t AliHMPIDTaskQA::Equal(Double_t x, Double_t y, Double_t tolerance)
393 return abs(x - y) <= tolerance ;