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 // AliHMPIDAnalysysTask - Class representing a basic analysis tool of HMPID data
18 // A set of histograms is created.
19 //==============================================================================
21 // By means of AliHMPIDAnalysisTask.C macro it is possible to use this class
22 // to perform the analysis on local data, on data on alien using local machine
25 #ifndef AliHMPIDAnalysisTASK_CXX
26 #define AliHMPIDAnalysisTASK_CXX
33 #include "TGraphErrors.h"
34 #include "AliPIDResponse.h"
36 #include "AliVEvent.h"
37 #include "AliVParticle.h"
38 #include "AliVTrack.h"
39 #include "AliESDtrackCuts.h"
40 #include "AliAnalysisFilter.h"
41 #include "AliAnalysisManager.h"
42 #include "AliESDInputHandler.h"
43 #include "AliMCEventHandler.h"
44 #include "AliMCEvent.h"
45 #include "AliESDtrack.h"
48 #include "AliHMPIDAnalysisTask.h"
50 ClassImp(AliHMPIDAnalysisTask)
52 //__________________________________________________________________________
53 AliHMPIDAnalysisTask::AliHMPIDAnalysisTask() :
54 fESD(0x0),fMC(0x0),fUseMC(kTRUE),
66 for (Int_t i=0; i<69; i++) fVar[i]=0;
69 //___________________________________________________________________________
70 AliHMPIDAnalysisTask::AliHMPIDAnalysisTask(const Char_t* name) :
71 AliAnalysisTaskSE(name),
72 fESD(0x0), fMC(0x0), fUseMC(kTRUE),
82 // Constructor. Initialization of Inputs and Outputs
84 for (Int_t i=0; i<69; i++) fVar[i]=0;
86 DefineOutput(1,TList::Class());
87 DefineOutput(2,TTree::Class());
90 //___________________________________________________________________________
91 AliHMPIDAnalysisTask& AliHMPIDAnalysisTask::operator=(const AliHMPIDAnalysisTask& c)
94 // Assignment operator
97 AliAnalysisTaskSE::operator=(c);
101 fHmpHistList = c.fHmpHistList;
102 fHmpNevents = c.fHmpNevents;
103 fZvertex = c.fZvertex;
104 fPIDResponse = c.fPIDResponse;
105 fTrackCuts = c.fTrackCuts;
106 fTrackFilter = c.fTrackFilter;
108 for (Int_t i=0; i<69; i++) fVar[i]=c.fVar[i];
113 //___________________________________________________________________________
114 AliHMPIDAnalysisTask::AliHMPIDAnalysisTask(const AliHMPIDAnalysisTask& c) :
115 AliAnalysisTaskSE(c),
116 fESD(c.fESD),fMC(c.fMC),fUseMC(c.fUseMC),
117 fHmpHistList(c.fHmpHistList),
118 fHmpNevents(c.fHmpNevents),
119 fZvertex(c.fZvertex),
120 fPIDResponse(c.fPIDResponse),
121 fTrackCuts(c.fTrackCuts),
122 fTrackFilter(c.fTrackFilter),
128 for (Int_t i=0; i<69; i++) fVar[i]=c.fVar[i];
131 //___________________________________________________________________________
132 AliHMPIDAnalysisTask::~AliHMPIDAnalysisTask() {
136 Info("~AliHMPIDAnalysisTask","Calling Destructor");
137 if (fHmpHistList && !AliAnalysisManager::GetAnalysisManager()->IsProofMode()) delete fHmpHistList;
140 //___________________________________________________________________________
141 void AliHMPIDAnalysisTask::ConnectInputData(Option_t *)
145 AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler*> (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
147 AliDebug(2,Form("ERROR: Could not get ESDInputHandler"));
149 fESD = esdH->GetEvent();
150 fPIDResponse = esdH->GetPIDResponse();
154 AliMCEventHandler *mcH = dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
156 AliDebug(2,Form("ERROR: Could not get MCEventHandler"));
159 fMC = mcH->MCEvent();
160 if (!fMC) AliDebug(2,Form("ERROR: Could not get MCEvent"));
163 fTrackCuts = new AliESDtrackCuts("fTrackCuts", "Standard");
164 fTrackCuts->SetAcceptKinkDaughters(kFALSE);
165 fTrackCuts->SetMinNClustersTPC(80);
166 fTrackCuts->SetMaxChi2PerClusterTPC(4);
167 fTrackCuts->SetMaxDCAToVertexXY(3);
168 fTrackCuts->SetMaxDCAToVertexZ(3);
169 fTrackCuts->SetRequireTPCRefit(kTRUE);
170 fTrackCuts->SetRequireITSRefit(kTRUE);
171 fTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,AliESDtrackCuts::kAny);
173 fTrackFilter = new AliAnalysisFilter("trackFilter");
174 fTrackFilter->AddCuts(fTrackCuts);
177 //***************************************************************************************************************************************************************************
178 void AliHMPIDAnalysisTask::UserExec(Option_t *)
181 fHmpNevents->Fill(0);
183 const AliESDVertex *vertex = fESD->GetPrimaryVertexTracks();
185 if(!vertex || !vertex->GetStatus() || vertex->GetNContributors()<1) {
188 vertex = fESD->GetPrimaryVertexSPD();
190 PostData(1,fHmpHistList);
194 if(!vertex->GetStatus()){
195 PostData(1,fHmpHistList);
199 if(vertex->GetNContributors()<1){
200 PostData(1,fHmpHistList);
206 Double_t vtxPos[3] = {999, 999, 999};
207 if(vertex) vertex->GetXYZ(vtxPos);
209 fHmpNevents->Fill(1);
211 fZvertex->Fill(vtxPos[2]);
214 PostData(1,fHmpHistList);
219 Double_t probsHMP[5], probsTPC[5], probsTOF[5];
220 Float_t nSigmasTOF[5], nSigmasTPC[5];
222 AliESDtrack *track = 0;
224 Double_t ktol = 0.001;
225 Double_t r[3], rin[3], rout[3];
228 // Main loop function, executed on Event basis
230 for (Int_t iTrack = 0; iTrack<fESD->GetNumberOfTracks(); iTrack++) {
232 track = fESD->GetTrack(iTrack);
235 //if(!fTrackFilter->IsSelected(track)) continue;
236 //if(!track->GetStatus() || !AliESDtrack::kTOFout || !AliESDtrack::kTIME || track->GetTOFsignal()<12000 || track->GetTOFsignal()>200000 || track->GetIntegratedLength()<365) continue;
239 track->GetInnerXYZ(rin);
240 track->GetOuterXYZ(rout);
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 Int_t ITSrefit = track->IsOn(AliESDtrack::kITSrefit);
252 Int_t TPCrefit = track->IsOn(AliESDtrack::kTPCrefit);
254 if(Equal(x,0.,ktol) && Equal(y,0.,ktol) && Equal(xpc,0.,ktol) && Equal(ypc,0.,ktol)) continue;
256 Double_t pHmp[3] = {0}, pHmp3 = 0;
257 if (track->GetOuterHmpPxPyPz(pHmp)) pHmp3 = TMath::Sqrt(pHmp[0]*pHmp[0]+pHmp[1]*pHmp[1]+pHmp[2]*pHmp[2]);
261 track->GetImpactParameters(b,bCov);
263 track->GetHMPIDpid(probsHMP);
264 fPIDResponse->ComputeTOFProbability(track,AliPID::kSPECIES,probsTOF);
265 fPIDResponse->ComputeTPCProbability(track,AliPID::kSPECIES,probsTPC);
267 for(Int_t ispecie=0; ispecie<AliPID::kSPECIES; ispecie++){
268 nSigmasTOF[ispecie] = fPIDResponse->NumberOfSigmasTOF((AliVTrack*)track,(AliPID::EParticleType)ispecie);
269 nSigmasTPC[ispecie] = fPIDResponse->NumberOfSigmasTPC((AliVTrack*)track,(AliPID::EParticleType)ispecie);
272 fVar[0] = track->GetHMPIDcluIdx()/1000000;
274 fVar[2] = (Float_t)track->P();
279 fVar[7] = (Float_t)track->GetHMPIDsignal();
283 fVar[11] = (Float_t)track->GetSign();
284 fVar[12] = (Float_t)nph;
285 fVar[13] = (Float_t)track->GetNcls(1);
286 fVar[14] = (Float_t)probsHMP[0];
287 fVar[15] = (Float_t)probsHMP[1];
288 fVar[16] = (Float_t)probsHMP[2];
289 fVar[17] = (Float_t)probsHMP[3];
290 fVar[18] = (Float_t)probsHMP[4];
291 fVar[19] = (Float_t)track->GetTOFsignal();
292 fVar[20] = (Float_t)track->GetKinkIndex(0);
293 fVar[21] = (Float_t)track->Xv();
294 fVar[22] = (Float_t)track->Yv();
295 fVar[23] = (Float_t)track->Zv();
296 fVar[24] = (Float_t)track->GetTPCchi2();
299 fVar[27] = track->GetHMPIDcluIdx()%1000000/1000;
300 fVar[28] = vtxPos[0];
301 fVar[29] = vtxPos[1];
302 fVar[30] = vtxPos[2];
303 fVar[31] = (Float_t)ITSrefit;
304 fVar[32] = (Float_t)TPCrefit;
305 fVar[33] = (Float_t)track->Eta();
306 fVar[34] = (Float_t)r[0];
307 fVar[35] = (Float_t)r[1];
308 fVar[36] = (Float_t)r[2];
309 fVar[37] = (Float_t)rout[0];
310 fVar[38] = (Float_t)rout[1];
311 fVar[39] = (Float_t)rout[2];
312 fVar[40] = (Float_t)pHmp[0];
313 fVar[41] = (Float_t)pHmp[1];
314 fVar[42] = (Float_t)pHmp[2];
315 fVar[43] = (Float_t)track->Px();
316 fVar[44] = (Float_t)track->Py();
317 fVar[45] = (Float_t)track->Pz();
318 fVar[46] = (Float_t)track->GetTPCClusterInfo(2,1);
319 fVar[47] = (Float_t)track->GetTPCNclsF();
320 fVar[48] = nSigmasTOF[0];
321 fVar[49] = nSigmasTOF[1];
322 fVar[50] = nSigmasTOF[2];
323 fVar[51] = nSigmasTOF[3];
324 fVar[52] = nSigmasTOF[4];
325 fVar[53] = nSigmasTPC[0];
326 fVar[54] = nSigmasTPC[1];
327 fVar[55] = nSigmasTPC[2];
328 fVar[56] = nSigmasTPC[3];
329 fVar[57] = nSigmasTPC[4];
330 fVar[58] = (Float_t)probsTOF[0];
331 fVar[59] = (Float_t)probsTOF[1];
332 fVar[60] = (Float_t)probsTOF[2];
333 fVar[61] = (Float_t)probsTOF[3];
334 fVar[62] = (Float_t)probsTOF[4];
335 fVar[63] = (Float_t)probsTPC[0];
336 fVar[64] = (Float_t)probsTPC[1];
337 fVar[65] = (Float_t)probsTPC[2];
338 fVar[66] = (Float_t)probsTPC[3];
339 fVar[67] = (Float_t)probsTPC[4];
340 fVar[68] = (Float_t)track->GetHMPIDchi2();
346 /* PostData(0) is taken care of by AliAnalysisTaskSE */
347 PostData(1,fHmpHistList);
350 //___________________________________________________________________________
351 void AliHMPIDAnalysisTask::Terminate(Option_t*)
353 // The Terminate() function is the last function to be called during
354 // a query. It always runs on the client, it can be used to present
355 // the results graphically or save the results to file.
357 Info("Terminate"," ");
361 fHmpHistList = dynamic_cast<TList*> (GetOutputData(1));
364 AliError("Histogram List is not available");
369 AliAnalysisTaskSE::Terminate();
372 //___________________________________________________________________________
373 void AliHMPIDAnalysisTask::UserCreateOutputObjects() {
375 //HERE ONE CAN CREATE OUTPUT OBJECTS
376 //TO BE SET BEFORE THE EXECUTION OF THE TASK
381 fHmpHistList = new TList();
382 fHmpHistList->SetOwner();
384 fHmpNevents = new TH1F("fHmpNevents","Number of events",2,0,2);
385 fHmpHistList->Add(fHmpNevents);
387 fZvertex = new TH1F("fZvertex","Z primary vertex distribution",4000,-20,20);
388 fHmpHistList->Add(fZvertex);
391 fTree = new TTree("Tree","Tree with data");
392 fTree->Branch("Chamber",&fVar[0]);
393 fTree->Branch("pHmp3",&fVar[1]);
394 fTree->Branch("P",&fVar[2]);
395 fTree->Branch("Xpc",&fVar[3]);
396 fTree->Branch("Ypc",&fVar[4]);
397 fTree->Branch("X",&fVar[5]);
398 fTree->Branch("Y",&fVar[6]);
399 fTree->Branch("HMPIDsignal",&fVar[7]);
400 fTree->Branch("Charge",&fVar[8]);
401 fTree->Branch("Theta",&fVar[9]);
402 fTree->Branch("Phi",&fVar[10]);
403 fTree->Branch("Sign",&fVar[11]);
404 fTree->Branch("NumPhotons",&fVar[12]);
405 fTree->Branch("NumTPCclust",&fVar[13]);
406 fTree->Branch("ProbHMP0",&fVar[14]);
407 fTree->Branch("ProbHMP1",&fVar[15]);
408 fTree->Branch("ProbHMP2",&fVar[16]);
409 fTree->Branch("ProbHMP3",&fVar[17]);
410 fTree->Branch("ProbHMP4",&fVar[18]);
411 fTree->Branch("TOFsignal",&fVar[19]);
412 fTree->Branch("KinkIndex",&fVar[20]);
413 fTree->Branch("Xv",&fVar[21]);
414 fTree->Branch("Yv",&fVar[22]);
415 fTree->Branch("Zv",&fVar[23]);
416 fTree->Branch("TPCchi2",&fVar[24]);
417 fTree->Branch("b0",&fVar[25]);
418 fTree->Branch("b1",&fVar[26]);
419 fTree->Branch("ClustSize",&fVar[27]);
420 fTree->Branch("PrimVertexX",&fVar[28]);
421 fTree->Branch("PrimVertexY",&fVar[29]);
422 fTree->Branch("PrimVertexZ",&fVar[30]);
423 fTree->Branch("ITSrefit",&fVar[31]);
424 fTree->Branch("TPCrefit",&fVar[32]);
425 fTree->Branch("Eta",&fVar[33]);
426 fTree->Branch("xTrack",&fVar[34]);
427 fTree->Branch("yTrack",&fVar[35]);
428 fTree->Branch("zTrack",&fVar[36]);
429 fTree->Branch("xOuterTrack",&fVar[37]);
430 fTree->Branch("yOuterTrack",&fVar[38]);
431 fTree->Branch("zOuterTrack",&fVar[39]);
432 fTree->Branch("pHmpX",&fVar[40]);
433 fTree->Branch("pHmpY",&fVar[41]);
434 fTree->Branch("pHmpZ",&fVar[42]);
435 fTree->Branch("Px",&fVar[43]);
436 fTree->Branch("Py",&fVar[44]);
437 fTree->Branch("Pz",&fVar[45]);
438 fTree->Branch("nCrossedRowsTPC",&fVar[46]);
439 fTree->Branch("findableClustTPC",&fVar[47]);
440 fTree->Branch("NSigmasTOF0",&fVar[48]);
441 fTree->Branch("NSigmasTOF1",&fVar[49]);
442 fTree->Branch("NSigmasTOF2",&fVar[50]);
443 fTree->Branch("NSigmasTOF3",&fVar[51]);
444 fTree->Branch("NSigmasTOF4",&fVar[52]);
445 fTree->Branch("NSigmasTPC0",&fVar[53]);
446 fTree->Branch("NSigmasTPC1",&fVar[54]);
447 fTree->Branch("NSigmasTPC2",&fVar[55]);
448 fTree->Branch("NSigmasTPC3",&fVar[56]);
449 fTree->Branch("NSigmasTPC4",&fVar[57]);
450 fTree->Branch("ProbTOF0",&fVar[58]);
451 fTree->Branch("ProbTOF1",&fVar[59]);
452 fTree->Branch("ProbTOF2",&fVar[60]);
453 fTree->Branch("ProbTOF3",&fVar[61]);
454 fTree->Branch("ProbTOF4",&fVar[62]);
455 fTree->Branch("ProbTPC0",&fVar[63]);
456 fTree->Branch("ProbTPC1",&fVar[64]);
457 fTree->Branch("ProbTPC2",&fVar[65]);
458 fTree->Branch("ProbTPC3",&fVar[66]);
459 fTree->Branch("ProbTPC4",&fVar[67]);
460 fTree->Branch("HmpSigma",&fVar[68]);
462 PostData(1,fHmpHistList);
466 //____________________________________________________________________________________________________________________________________
467 Bool_t AliHMPIDAnalysisTask::Equal(Double_t x, Double_t y, Double_t tolerance)
469 return abs(x - y) <= tolerance ;