]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWGLF/SPECTRA/PiKaPr/HMPID/AliHMPIDAnalysisTask.cxx
end-of-line normalization
[u/mrichter/AliRoot.git] / PWGLF / SPECTRA / PiKaPr / HMPID / AliHMPIDAnalysisTask.cxx
CommitLineData
a65a7e70 1/**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3 * *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
6 * *
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 **************************************************************************/
15
16//==============================================================================
17// AliHMPIDAnalysysTask - Class representing a basic analysis tool of HMPID data
18// A set of histograms is created.
19//==============================================================================
20//
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
23// and on CAF.
24
25#ifndef AliHMPIDAnalysisTASK_CXX
26#define AliHMPIDAnalysisTASK_CXX
27
28
29#include "TH1.h"
30#include "TH2.h"
31#include "TFile.h"
32#include "TCanvas.h"
33#include "TGraphErrors.h"
34#include "AliPIDResponse.h"
35#include "AliPID.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"
46#include "AliPID.h"
47#include "AliLog.h"
48#include "AliHMPIDAnalysisTask.h"
49
50ClassImp(AliHMPIDAnalysisTask)
51
52//__________________________________________________________________________
53AliHMPIDAnalysisTask::AliHMPIDAnalysisTask() :
54 fESD(0x0),fMC(0x0),fUseMC(kTRUE),
55 fHmpHistList(0x0),
56 fHmpNevents(0x0),
57 fZvertex(0x0),
58 fPIDResponse(0x0),
59 fTrackCuts(0x0),
60 fTrackFilter(0x0),
61 fTree(0x0)
62{
63 //
64 //Default ctor
65 //
66 for (Int_t i=0; i<69; i++) fVar[i]=0;
67}
68
69//___________________________________________________________________________
70AliHMPIDAnalysisTask::AliHMPIDAnalysisTask(const Char_t* name) :
71 AliAnalysisTaskSE(name),
72 fESD(0x0), fMC(0x0), fUseMC(kTRUE),
73 fHmpHistList(0x0),
74 fHmpNevents(0x0),
75 fZvertex(0x0),
76 fPIDResponse(0x0),
77 fTrackCuts(0x0),
78 fTrackFilter(0x0),
79 fTree(0x0)
80{
81 //
82 // Constructor. Initialization of Inputs and Outputs
83 //
84 for (Int_t i=0; i<69; i++) fVar[i]=0;
85
86 DefineOutput(1,TList::Class());
87 DefineOutput(2,TTree::Class());
88}
89
90//___________________________________________________________________________
91AliHMPIDAnalysisTask& AliHMPIDAnalysisTask::operator=(const AliHMPIDAnalysisTask& c)
92{
93 //
94 // Assignment operator
95 //
96 if (this!=&c) {
97 AliAnalysisTaskSE::operator=(c);
98 fESD = c.fESD;
99 fMC = c.fMC;
100 fUseMC = c.fUseMC;
101 fHmpHistList = c.fHmpHistList;
102 fHmpNevents = c.fHmpNevents;
103 fZvertex = c.fZvertex;
104 fPIDResponse = c.fPIDResponse;
105 fTrackCuts = c.fTrackCuts;
106 fTrackFilter = c.fTrackFilter;
107 fTree = c.fTree;
108 for (Int_t i=0; i<69; i++) fVar[i]=c.fVar[i];
109 }
110 return *this;
111}
112
113//___________________________________________________________________________
114AliHMPIDAnalysisTask::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),
123 fTree(c.fTree)
124{
125 //
126 // Copy Constructor
127 //
128 for (Int_t i=0; i<69; i++) fVar[i]=c.fVar[i];
129}
130
131//___________________________________________________________________________
132AliHMPIDAnalysisTask::~AliHMPIDAnalysisTask() {
133 //
134 //destructor
135 //
136 Info("~AliHMPIDAnalysisTask","Calling Destructor");
137 if (fHmpHistList && !AliAnalysisManager::GetAnalysisManager()->IsProofMode()) delete fHmpHistList;
138}
139
140//___________________________________________________________________________
141void AliHMPIDAnalysisTask::ConnectInputData(Option_t *)
142{
143 // Connect ESD here
144
145 AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler*> (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
146 if (!esdH) {
147 AliDebug(2,Form("ERROR: Could not get ESDInputHandler"));
148 } else
149 fESD = esdH->GetEvent();
150 fPIDResponse = esdH->GetPIDResponse();
151
152 if (fUseMC){
153 // Connect MC
154 AliMCEventHandler *mcH = dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
155 if (!mcH) {
156 AliDebug(2,Form("ERROR: Could not get MCEventHandler"));
157 fUseMC = kFALSE;
158 } else
159 fMC = mcH->MCEvent();
160 if (!fMC) AliDebug(2,Form("ERROR: Could not get MCEvent"));
161 }
162
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);
172
173 fTrackFilter = new AliAnalysisFilter("trackFilter");
174 fTrackFilter->AddCuts(fTrackCuts);
175
176}
177//***************************************************************************************************************************************************************************
178void AliHMPIDAnalysisTask::UserExec(Option_t *)
179{
180
181 fHmpNevents->Fill(0);
182
183 const AliESDVertex *vertex = fESD->GetPrimaryVertexTracks();
184
185 if(!vertex || !vertex->GetStatus() || vertex->GetNContributors()<1) {
186
187 // SPD vertex
188 vertex = fESD->GetPrimaryVertexSPD();
189 if(!vertex) {
190 PostData(1,fHmpHistList);
191 PostData(2,fTree);
192 return;
193 }
194 if(!vertex->GetStatus()){
195 PostData(1,fHmpHistList);
196 PostData(2,fTree);
197 return;
198 }
199 if(vertex->GetNContributors()<1){
200 PostData(1,fHmpHistList);
201 PostData(2,fTree);
202 return;
203 }
204 }
205
206 Double_t vtxPos[3] = {999, 999, 999};
207 if(vertex) vertex->GetXYZ(vtxPos);
208
209 fHmpNevents->Fill(1);
210
211 fZvertex->Fill(vtxPos[2]);
212
213 if(!fPIDResponse){
214 PostData(1,fHmpHistList);
215 PostData(2,fTree);
216 return;
217 }
218
219 Double_t probsHMP[5], probsTPC[5], probsTOF[5];
220 Float_t nSigmasTOF[5], nSigmasTPC[5];
221
222 AliESDtrack *track = 0;
223
224 Double_t ktol = 0.001;
225 Double_t r[3], rin[3], rout[3];
226
227 //
228 // Main loop function, executed on Event basis
229 //
230 for (Int_t iTrack = 0; iTrack<fESD->GetNumberOfTracks(); iTrack++) {
231
232 track = fESD->GetTrack(iTrack);
233 if(!track) continue;
234
235 //if(!fTrackFilter->IsSelected(track)) continue;
236 //if(!track->GetStatus() || !AliESDtrack::kTOFout || !AliESDtrack::kTIME || track->GetTOFsignal()<12000 || track->GetTOFsignal()>200000 || track->GetIntegratedLength()<365) continue;
237
238 track->GetXYZ(r);
239 track->GetInnerXYZ(rin);
240 track->GetOuterXYZ(rout);
241
242 if(Equal(track->GetHMPIDsignal(),-20.,ktol)) continue;
243 if(track->GetHMPIDcluIdx() < 0) continue;
244
245 Int_t q, nph;
246 Float_t x, y;
247 Float_t xpc, ypc, th, ph;
248 track->GetHMPIDmip(x,y,q,nph);
249 track->GetHMPIDtrk(xpc,ypc,th,ph);
250
251 Int_t ITSrefit = track->IsOn(AliESDtrack::kITSrefit);
252 Int_t TPCrefit = track->IsOn(AliESDtrack::kTPCrefit);
253
254 if(Equal(x,0.,ktol) && Equal(y,0.,ktol) && Equal(xpc,0.,ktol) && Equal(ypc,0.,ktol)) continue;
255
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]);
258
259 Float_t b[2];
260 Float_t bCov[3];
261 track->GetImpactParameters(b,bCov);
262
263 track->GetHMPIDpid(probsHMP);
264 fPIDResponse->ComputeTOFProbability(track,AliPID::kSPECIES,probsTOF);
265 fPIDResponse->ComputeTPCProbability(track,AliPID::kSPECIES,probsTPC);
266
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);
270 }
271
272 fVar[0] = track->GetHMPIDcluIdx()/1000000;
273 fVar[1] = pHmp3;
274 fVar[2] = (Float_t)track->P();
275 fVar[3] = xpc;
276 fVar[4] = ypc;
277 fVar[5] = x;
278 fVar[6] = y;
279 fVar[7] = (Float_t)track->GetHMPIDsignal();
280 fVar[8] = q;
281 fVar[9] = th;
282 fVar[10] = ph;
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();
297 fVar[25] = b[0];
298 fVar[26] = b[1];
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();
341
342 fTree->Fill();
343
344 }//track loop
345
346 /* PostData(0) is taken care of by AliAnalysisTaskSE */
347 PostData(1,fHmpHistList);
348 PostData(2,fTree);
349}
350//___________________________________________________________________________
351void AliHMPIDAnalysisTask::Terminate(Option_t*)
352{
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.
356
357 Info("Terminate"," ");
358
359 if (!fUseMC) return;
360
361 fHmpHistList = dynamic_cast<TList*> (GetOutputData(1));
362
363 if (!fHmpHistList) {
364 AliError("Histogram List is not available");
365 return;
366 }
367
368
369 AliAnalysisTaskSE::Terminate();
370
371}
372//___________________________________________________________________________
373void AliHMPIDAnalysisTask::UserCreateOutputObjects() {
374 //
375 //HERE ONE CAN CREATE OUTPUT OBJECTS
376 //TO BE SET BEFORE THE EXECUTION OF THE TASK
377 //
378
379 //slot #1
380// OpenFile(1);
381 fHmpHistList = new TList();
382 fHmpHistList->SetOwner();
383
384 fHmpNevents = new TH1F("fHmpNevents","Number of events",2,0,2);
385 fHmpHistList->Add(fHmpNevents);
386
387 fZvertex = new TH1F("fZvertex","Z primary vertex distribution",4000,-20,20);
388 fHmpHistList->Add(fZvertex);
389
390// OpenFile(2);
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]);
461
462 PostData(1,fHmpHistList);
463 PostData(2,fTree);
464}
465
466//____________________________________________________________________________________________________________________________________
467Bool_t AliHMPIDAnalysisTask::Equal(Double_t x, Double_t y, Double_t tolerance)
468{
469 return abs(x - y) <= tolerance ;
470}
471
472#endif