3c538586 |
1 | /**************************************************************************\r |
2 | * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *\r |
3 | * *\r |
4 | * Author: Ana Marin, Kathrin Koch, Kenneth Aamodt *\r |
5 | * Version 1.0 *\r |
6 | * *\r |
7 | * Permission to use, copy, modify and distribute this software and its *\r |
8 | * documentation strictly for non-commercial purposes is hereby granted *\r |
9 | * without fee, provided that the above copyright notice appears in all *\r |
10 | * copies and that both the copyright notice and this permission notice *\r |
11 | * appear in the supporting documentation. The authors make no claims *\r |
12 | * about the suitability of this software for any purpose. It is *\r |
13 | * provided "as is" without express or implied warranty. *\r |
14 | **************************************************************************/\r |
15 | \r |
16 | ////////////////////////////////////////////////\r |
17 | //--------------------------------------------- \r |
18 | // Class used to do analysis on conversion pairs\r |
19 | //---------------------------------------------\r |
20 | ////////////////////////////////////////////////\r |
21 | \r |
22 | // --- ROOT system ---\r |
23 | #include <TMath.h>\r |
24 | \r |
25 | //---- ANALYSIS system ----\r |
26 | #include "AliV0Reader.h"\r |
27 | #include "AliAnalysisManager.h"\r |
28 | #include "AliESDInputHandler.h"\r |
29 | #include "AliMCEvent.h"\r |
30 | #include "AliKFVertex.h"\r |
31 | \r |
32 | #include "AliStack.h"\r |
33 | #include "AliMCEventHandler.h"\r |
34 | \r |
35 | \r |
36 | class iostream;\r |
37 | class AliESDv0;\r |
38 | class TFormula;\r |
39 | \r |
40 | using namespace std;\r |
41 | \r |
42 | ClassImp(AliV0Reader)\r |
43 | \r |
44 | \r |
45 | \r |
46 | AliV0Reader::AliV0Reader() :\r |
47 | TObject(),\r |
48 | fMCStack(NULL),\r |
49 | fMCTruth(NULL),\r |
50 | fChain(NULL),\r |
51 | fESDHandler(NULL),\r |
52 | fESDEvent(NULL),\r |
53 | fHistograms(NULL),\r |
54 | fCurrentV0IndexNumber(0),\r |
55 | fCurrentV0(NULL),\r |
56 | fCurrentNegativeKFParticle(NULL),\r |
57 | fCurrentPositiveKFParticle(NULL),\r |
58 | fCurrentMotherKFCandidate(NULL),\r |
59 | fCurrentNegativeESDTrack(NULL),\r |
60 | fCurrentPositiveESDTrack(NULL),\r |
61 | fNegativeTrackLorentzVector(NULL),\r |
62 | fPositiveTrackLorentzVector(NULL),\r |
63 | fMotherCandidateLorentzVector(NULL),\r |
64 | fCurrentXValue(0),\r |
65 | fCurrentYValue(0),\r |
66 | fCurrentZValue(0),\r |
67 | fPositiveTrackPID(0),\r |
68 | fNegativeTrackPID(0),\r |
69 | fNegativeMCParticle(NULL),\r |
70 | fPositiveMCParticle(NULL),\r |
71 | fMotherMCParticle(NULL),\r |
72 | fMotherCandidateKFMass(0),\r |
73 | fMotherCandidateKFWidth(0),\r |
74 | fUseKFParticle(kTRUE),\r |
75 | fUseESDTrack(kFALSE),\r |
76 | fDoMC(kFALSE),\r |
77 | fMaxR(10000),// 100 meter(outside of ALICE)\r |
78 | fEtaCut(0.),\r |
79 | fPtCut(0.),\r |
80 | fChi2CutConversion(0.),\r |
81 | fChi2CutMeson(0.),\r |
82 | fPIDProbabilityCutNegativeParticle(0),\r |
83 | fPIDProbabilityCutPositiveParticle(0),\r |
84 | fXVertexCut(0.),\r |
85 | fYVertexCut(0.),\r |
86 | fZVertexCut(0.),\r |
87 | fNSigmaMass(0.),\r |
88 | fUseImprovedVertex(kFALSE),\r |
89 | fCurrentEventGoodV0s(),\r |
90 | fPreviousEventGoodV0s()\r |
91 | {\r |
92 | \r |
93 | }\r |
94 | \r |
95 | \r |
96 | AliV0Reader::AliV0Reader(const AliV0Reader & original) :\r |
97 | TObject(original),\r |
98 | fMCStack(original.fMCStack),\r |
99 | fMCTruth(original.fMCTruth),\r |
100 | fChain(original.fChain),\r |
101 | fESDHandler(original.fESDHandler),\r |
102 | fESDEvent(original.fESDEvent),\r |
103 | fHistograms(original.fHistograms),\r |
104 | fCurrentV0IndexNumber(original.fCurrentV0IndexNumber),\r |
105 | fCurrentV0(original.fCurrentV0),\r |
106 | fCurrentNegativeKFParticle(original.fCurrentNegativeKFParticle),\r |
107 | fCurrentPositiveKFParticle(original.fCurrentPositiveKFParticle),\r |
108 | fCurrentMotherKFCandidate(original.fCurrentMotherKFCandidate),\r |
109 | fCurrentNegativeESDTrack(original.fCurrentNegativeESDTrack),\r |
110 | fCurrentPositiveESDTrack(original.fCurrentPositiveESDTrack),\r |
111 | fNegativeTrackLorentzVector(original.fNegativeTrackLorentzVector),\r |
112 | fPositiveTrackLorentzVector(original.fPositiveTrackLorentzVector),\r |
113 | fMotherCandidateLorentzVector(original.fMotherCandidateLorentzVector),\r |
114 | fCurrentXValue(original.fCurrentXValue),\r |
115 | fCurrentYValue(original.fCurrentYValue),\r |
116 | fCurrentZValue(original.fCurrentZValue),\r |
117 | fPositiveTrackPID(original.fPositiveTrackPID),\r |
118 | fNegativeTrackPID(original.fNegativeTrackPID),\r |
119 | fNegativeMCParticle(original.fNegativeMCParticle),\r |
120 | fPositiveMCParticle(original.fPositiveMCParticle),\r |
121 | fMotherMCParticle(original.fMotherMCParticle),\r |
122 | fMotherCandidateKFMass(original.fMotherCandidateKFMass),\r |
123 | fMotherCandidateKFWidth(original.fMotherCandidateKFWidth),\r |
124 | fUseKFParticle(kTRUE),\r |
125 | fUseESDTrack(kFALSE),\r |
126 | fDoMC(kFALSE),\r |
127 | fMaxR(original.fMaxR),\r |
128 | fEtaCut(original.fEtaCut),\r |
129 | fPtCut(original.fPtCut),\r |
130 | fChi2CutConversion(original.fChi2CutConversion),\r |
131 | fChi2CutMeson(original.fChi2CutMeson),\r |
132 | fPIDProbabilityCutNegativeParticle(original.fPIDProbabilityCutNegativeParticle),\r |
133 | fPIDProbabilityCutPositiveParticle(original.fPIDProbabilityCutPositiveParticle),\r |
134 | fXVertexCut(original.fXVertexCut),\r |
135 | fYVertexCut(original.fYVertexCut),\r |
136 | fZVertexCut(original.fZVertexCut),\r |
137 | fNSigmaMass(original.fNSigmaMass),\r |
138 | fUseImprovedVertex(original.fUseImprovedVertex),\r |
139 | fCurrentEventGoodV0s(original.fCurrentEventGoodV0s),\r |
140 | fPreviousEventGoodV0s(original.fPreviousEventGoodV0s)\r |
141 | {\r |
142 | \r |
143 | }\r |
144 | \r |
145 | \r |
146 | AliV0Reader & AliV0Reader::operator = (const AliV0Reader & /*source*/)\r |
147 | {\r |
148 | // assignment operator\r |
149 | return *this;\r |
150 | }\r |
151 | \r |
152 | void AliV0Reader::Initialize(){\r |
153 | //see header file for documentation\r |
154 | \r |
155 | // Get the input handler from the manager\r |
156 | fESDHandler = (AliESDInputHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());\r |
157 | if(fESDHandler == NULL){\r |
158 | //print warning here\r |
159 | }\r |
160 | \r |
161 | // Get pointer to esd event from input handler\r |
162 | fESDEvent = fESDHandler->GetEvent();\r |
163 | if(fESDEvent == NULL){\r |
164 | //print warning here\r |
165 | }\r |
166 | \r |
167 | //Get pointer to MCTruth\r |
168 | fMCTruth = (AliMCEventHandler*)((AliAnalysisManager::GetAnalysisManager())->GetMCtruthEventHandler());\r |
169 | if(fMCTruth == NULL){\r |
170 | //print warning here\r |
171 | }\r |
172 | \r |
173 | //Get pointer to the mc stack\r |
174 | fMCStack = fMCTruth->MCEvent()->Stack();\r |
175 | if(fMCStack == NULL){\r |
176 | //print warning here\r |
177 | }\r |
178 | \r |
179 | AliKFParticle::SetField(fESDEvent->GetMagneticField());\r |
180 | \r |
181 | }\r |
182 | \r |
183 | AliESDv0* AliV0Reader::GetV0(Int_t index){\r |
184 | //see header file for documentation\r |
185 | \r |
186 | fCurrentV0 = fESDEvent->GetV0(index);\r |
187 | UpdateV0Information();\r |
188 | return fCurrentV0;\r |
189 | }\r |
190 | \r |
191 | \r |
192 | Bool_t AliV0Reader::NextV0(){\r |
193 | //see header file for documentation\r |
194 | \r |
195 | Bool_t iResult=kFALSE;\r |
196 | while(fCurrentV0IndexNumber<fESDEvent->GetNumberOfV0s()){\r |
197 | fCurrentV0 = fESDEvent->GetV0(fCurrentV0IndexNumber);\r |
198 | \r |
199 | //checks if on the fly mode is set\r |
200 | if ( !fCurrentV0->GetOnFlyStatus() ){\r |
201 | fCurrentV0IndexNumber++;\r |
202 | fHistograms->FillHistogram("V0MassDebugCut1",GetMotherCandidateMass());\r |
203 | continue;\r |
204 | }\r |
205 | \r |
206 | if(fESDEvent->GetPrimaryVertex()->GetNContributors()<=0) {//checks if we have a vertex\r |
207 | fCurrentV0IndexNumber++;\r |
208 | fHistograms->FillHistogram("V0MassDebugCut2",GetMotherCandidateMass());\r |
209 | continue;\r |
210 | }\r |
211 | \r |
212 | if(CheckPIDProbability(fPIDProbabilityCutNegativeParticle,fPIDProbabilityCutPositiveParticle)==kFALSE){\r |
213 | fCurrentV0IndexNumber++;\r |
214 | fHistograms->FillHistogram("V0MassDebugCut3",GetMotherCandidateMass());\r |
215 | continue;\r |
216 | }\r |
217 | \r |
218 | \r |
219 | fCurrentV0->GetXYZ(fCurrentXValue,fCurrentYValue,fCurrentZValue);\r |
220 | \r |
221 | if(GetXYRadius()>fMaxR){ // cuts on distance from collision point\r |
222 | fCurrentV0IndexNumber++;\r |
223 | fHistograms->FillHistogram("V0MassDebugCut4",GetMotherCandidateMass());\r |
224 | continue;\r |
225 | }\r |
226 | \r |
227 | UpdateV0Information();\r |
228 | \r |
229 | if(fUseKFParticle){\r |
230 | if(fCurrentMotherKFCandidate->GetNDF()<=0){\r |
231 | fCurrentV0IndexNumber++;\r |
232 | fHistograms->FillHistogram("V0MassDebugCut5",GetMotherCandidateMass());\r |
233 | continue;\r |
234 | }\r |
235 | Double_t chi2V0 = fCurrentMotherKFCandidate->GetChi2()/fCurrentMotherKFCandidate->GetNDF();\r |
236 | if(chi2V0 > fChi2CutConversion || chi2V0 <=0){\r |
237 | fCurrentV0IndexNumber++;\r |
238 | fHistograms->FillHistogram("V0MassDebugCut6",GetMotherCandidateMass());\r |
239 | continue;\r |
240 | }\r |
241 | \r |
242 | if(TMath::Abs(fMotherCandidateLorentzVector->Eta())> fEtaCut){\r |
243 | fCurrentV0IndexNumber++;\r |
244 | fHistograms->FillHistogram("V0MassDebugCut7",GetMotherCandidateMass());\r |
245 | continue;\r |
246 | }\r |
247 | \r |
248 | if(fMotherCandidateLorentzVector->Pt()<fPtCut){\r |
249 | fCurrentV0IndexNumber++;\r |
250 | fHistograms->FillHistogram("V0MassDebugCut8",GetMotherCandidateMass());\r |
251 | continue;\r |
252 | }\r |
253 | \r |
254 | }\r |
255 | else if(fUseESDTrack){\r |
256 | //TODO\r |
257 | }\r |
258 | \r |
259 | iResult=kTRUE;//means we have a v0 who survived all the cuts applied\r |
260 | \r |
261 | fCurrentV0IndexNumber++;\r |
262 | \r |
263 | break;\r |
264 | }\r |
265 | return iResult; \r |
266 | }\r |
267 | \r |
268 | void AliV0Reader::UpdateV0Information(){\r |
269 | //see header file for documentation\r |
270 | \r |
271 | if(fCurrentNegativeKFParticle != NULL){\r |
272 | delete fCurrentNegativeKFParticle;\r |
273 | }\r |
274 | fCurrentNegativeKFParticle = new AliKFParticle(*(fCurrentV0->GetParamN()),fNegativeTrackPID);\r |
275 | \r |
276 | if(fCurrentPositiveKFParticle != NULL){\r |
277 | delete fCurrentPositiveKFParticle;\r |
278 | }\r |
279 | fCurrentPositiveKFParticle = new AliKFParticle(*(fCurrentV0->GetParamP()),fPositiveTrackPID);\r |
280 | \r |
281 | if(fCurrentMotherKFCandidate != NULL){\r |
282 | delete fCurrentMotherKFCandidate;\r |
283 | }\r |
284 | fCurrentMotherKFCandidate = new AliKFParticle(*fCurrentNegativeKFParticle,*fCurrentPositiveKFParticle);\r |
285 | \r |
286 | fCurrentNegativeESDTrack = fESDEvent->GetTrack(fCurrentV0->GetNindex());\r |
287 | \r |
288 | fCurrentPositiveESDTrack = fESDEvent->GetTrack(fCurrentV0->GetPindex());\r |
289 | \r |
290 | if(fPositiveTrackPID==-11 && fNegativeTrackPID==11){\r |
291 | fCurrentMotherKFCandidate->SetMassConstraint(0,fNSigmaMass);\r |
292 | }\r |
293 | \r |
294 | if(fUseImprovedVertex == kTRUE){\r |
295 | AliKFVertex primaryVertexImproved(*GetPrimaryVertex());\r |
296 | primaryVertexImproved+=*fCurrentMotherKFCandidate;\r |
297 | fCurrentMotherKFCandidate->SetProductionVertex(primaryVertexImproved);\r |
298 | }\r |
299 | \r |
300 | fCurrentMotherKFCandidate->GetMass(fMotherCandidateKFMass,fMotherCandidateKFWidth);\r |
301 | \r |
302 | \r |
303 | if(fNegativeTrackLorentzVector != NULL){\r |
304 | delete fNegativeTrackLorentzVector;\r |
305 | }\r |
306 | if(fUseKFParticle){\r |
307 | fNegativeTrackLorentzVector = new TLorentzVector(fCurrentNegativeKFParticle->Px(),fCurrentNegativeKFParticle->Py(),fCurrentNegativeKFParticle->Pz());\r |
308 | }\r |
309 | else if(fUseESDTrack){\r |
310 | fNegativeTrackLorentzVector = new TLorentzVector(fCurrentNegativeESDTrack->Px(),fCurrentNegativeESDTrack->Py(),fCurrentNegativeESDTrack->Pz());\r |
311 | }\r |
312 | \r |
313 | if(fPositiveTrackLorentzVector != NULL){\r |
314 | delete fPositiveTrackLorentzVector;\r |
315 | }\r |
316 | if(fUseKFParticle){\r |
317 | fPositiveTrackLorentzVector = new TLorentzVector(fCurrentPositiveKFParticle->Px(),fCurrentPositiveKFParticle->Py(),fCurrentPositiveKFParticle->Pz());\r |
318 | }\r |
319 | else if(fUseESDTrack){\r |
320 | fPositiveTrackLorentzVector = new TLorentzVector(fCurrentPositiveESDTrack->Px(),fCurrentPositiveESDTrack->Py(),fCurrentPositiveESDTrack->Pz());\r |
321 | }\r |
322 | \r |
323 | if(fMotherCandidateLorentzVector != NULL){\r |
324 | delete fMotherCandidateLorentzVector;\r |
325 | }\r |
326 | if(fUseKFParticle){\r |
327 | fMotherCandidateLorentzVector = new TLorentzVector(*fNegativeTrackLorentzVector + *fPositiveTrackLorentzVector);\r |
328 | }\r |
329 | else if(fUseESDTrack){\r |
330 | fMotherCandidateLorentzVector = new TLorentzVector(*fNegativeTrackLorentzVector + *fPositiveTrackLorentzVector);\r |
331 | }\r |
332 | \r |
333 | if(fPositiveTrackPID==-11 && fNegativeTrackPID==11){\r |
334 | fMotherCandidateLorentzVector->SetXYZM(fMotherCandidateLorentzVector->Px() ,fMotherCandidateLorentzVector->Py(),fMotherCandidateLorentzVector->Pz(),0.); \r |
335 | }\r |
336 | \r |
337 | if(fDoMC == kTRUE){\r |
338 | fNegativeMCParticle = fMCStack->Particle(TMath::Abs(fESDEvent->GetTrack(fCurrentV0->GetNindex())->GetLabel()));\r |
339 | fPositiveMCParticle = fMCStack->Particle(TMath::Abs(fESDEvent->GetTrack(fCurrentV0->GetPindex())->GetLabel()));\r |
340 | }\r |
341 | fCurrentEventGoodV0s.push_back(*fCurrentMotherKFCandidate);\r |
342 | }\r |
343 | \r |
344 | Bool_t AliV0Reader::HasSameMCMother(){\r |
345 | //see header file for documentation\r |
346 | \r |
347 | Bool_t iResult = kFALSE;\r |
348 | if(fDoMC == kTRUE){\r |
349 | if(fNegativeMCParticle != NULL && fPositiveMCParticle != NULL){\r |
350 | if(fNegativeMCParticle->GetMother(0) == fPositiveMCParticle->GetMother(0))\r |
351 | fMotherMCParticle = fMCStack->Particle(fPositiveMCParticle->GetMother(0));\r |
352 | iResult = kTRUE;\r |
353 | }\r |
354 | }\r |
355 | return iResult;\r |
356 | }\r |
357 | \r |
358 | Bool_t AliV0Reader::CheckPIDProbability(Double_t negProbCut, Double_t posProbCut){\r |
359 | //see header file for documentation\r |
360 | \r |
361 | Bool_t iResult=kFALSE;\r |
362 | \r |
363 | Double_t *posProbArray = new Double_t[10];\r |
364 | Double_t *negProbArray = new Double_t[10];\r |
365 | AliESDtrack* negTrack = fESDEvent->GetTrack(fCurrentV0->GetNindex());\r |
366 | AliESDtrack* posTrack = fESDEvent->GetTrack(fCurrentV0->GetPindex());\r |
367 | \r |
368 | negTrack->GetTPCpid(negProbArray);\r |
369 | posTrack->GetTPCpid(posProbArray);\r |
370 | \r |
371 | if(negProbArray!=NULL && posProbArray!=NULL){\r |
372 | if(negProbArray[GetSpeciesIndex(-1)]>=negProbCut && posProbArray[GetSpeciesIndex(1)]>=posProbCut){\r |
373 | iResult=kTRUE;\r |
374 | }\r |
375 | }\r |
376 | delete [] posProbArray;\r |
377 | delete [] negProbArray;\r |
378 | return iResult;\r |
379 | }\r |
380 | \r |
381 | void AliV0Reader::UpdateEventByEventData(){\r |
382 | //see header file for documentation\r |
383 | \r |
384 | if(fCurrentEventGoodV0s.size() >0 ){\r |
385 | fPreviousEventGoodV0s.clear();\r |
386 | fPreviousEventGoodV0s = fCurrentEventGoodV0s;\r |
387 | }\r |
388 | fCurrentEventGoodV0s.clear();\r |
389 | \r |
390 | fCurrentV0IndexNumber=0;\r |
391 | }\r |
392 | \r |
393 | Double_t AliV0Reader::GetNegativeTrackPhi() const{\r |
394 | //see header file for documentation\r |
395 | \r |
396 | Double_t offset=0;\r |
397 | if(fNegativeTrackLorentzVector->Phi()> TMath::Pi()){\r |
398 | offset = -2*TMath::Pi();\r |
399 | }\r |
400 | return fNegativeTrackLorentzVector->Phi()+offset;\r |
401 | }\r |
402 | \r |
403 | Double_t AliV0Reader::GetPositiveTrackPhi() const{\r |
404 | //see header file for documentation\r |
405 | \r |
406 | Double_t offset=0;\r |
407 | if(fPositiveTrackLorentzVector->Phi()> TMath::Pi()){\r |
408 | offset = -2*TMath::Pi();\r |
409 | }\r |
410 | return fPositiveTrackLorentzVector->Phi()+offset;\r |
411 | }\r |
412 | \r |
413 | Double_t AliV0Reader::GetMotherCandidatePhi() const{\r |
414 | //see header file for documentation\r |
415 | \r |
416 | Double_t offset=0;\r |
417 | if(fMotherCandidateLorentzVector->Phi()> TMath::Pi()){\r |
418 | offset = -2*TMath::Pi();\r |
419 | }\r |
420 | return fMotherCandidateLorentzVector->Phi()+offset;\r |
421 | }\r |
422 | \r |
423 | Int_t AliV0Reader::GetSpeciesIndex(Int_t chargeOfTrack){\r |
424 | //see header file for documentation\r |
425 | \r |
426 | Int_t iResult = 10; // Unknown particle\r |
427 | \r |
428 | if(chargeOfTrack==-1){ //negative track\r |
429 | switch(abs(fNegativeTrackPID)){\r |
430 | case 11: //electron\r |
431 | iResult = 0;\r |
432 | break;\r |
433 | case 13: //muon\r |
434 | iResult = 1;\r |
435 | break;\r |
436 | case 211: //pion\r |
437 | iResult = 2;\r |
438 | break;\r |
439 | case 321: //kaon\r |
440 | iResult = 3;\r |
441 | break;\r |
442 | case 2212: //proton\r |
443 | iResult = 4;\r |
444 | break;\r |
445 | case 22: //photon\r |
446 | iResult = 5;\r |
447 | break;\r |
448 | case 111: //pi0\r |
449 | iResult = 6;\r |
450 | break;\r |
451 | case 2112: //neutron\r |
452 | iResult = 7;\r |
453 | break;\r |
454 | case 311: //K0\r |
455 | iResult = 8;\r |
456 | break;\r |
457 | \r |
458 | //Put in here for kSPECIES::kEleCon ????\r |
459 | }\r |
460 | }\r |
461 | else if(chargeOfTrack==1){ //positive track\r |
462 | switch(abs(fPositiveTrackPID)){\r |
463 | case 11: //electron\r |
464 | iResult = 0;\r |
465 | break;\r |
466 | case 13: //muon\r |
467 | iResult = 1;\r |
468 | break;\r |
469 | case 211: //pion\r |
470 | iResult = 2;\r |
471 | break;\r |
472 | case 321: //kaon\r |
473 | iResult = 3;\r |
474 | break;\r |
475 | case 2212: //proton\r |
476 | iResult = 4;\r |
477 | break;\r |
478 | case 22: //photon\r |
479 | iResult = 5;\r |
480 | break;\r |
481 | case 111: //pi0\r |
482 | iResult = 6;\r |
483 | break;\r |
484 | case 2112: //neutron\r |
485 | iResult = 7;\r |
486 | break;\r |
487 | case 311: //K0\r |
488 | iResult = 8;\r |
489 | break;\r |
490 | \r |
491 | //Put in here for kSPECIES::kEleCon ????\r |
492 | }\r |
493 | }\r |
494 | else{\r |
495 | //Wrong parameter.. Print warning\r |
496 | }\r |
497 | return iResult;\r |
498 | }\r |