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 |
32a6d407 |
29 | #include "AliESDtrack.h"\r |
3c538586 |
30 | #include "AliMCEvent.h"\r |
31 | #include "AliKFVertex.h"\r |
32 | \r |
33 | #include "AliStack.h"\r |
34 | #include "AliMCEventHandler.h"\r |
35 | \r |
36 | \r |
37 | class iostream;\r |
38 | class AliESDv0;\r |
39 | class TFormula;\r |
40 | \r |
41 | using namespace std;\r |
42 | \r |
43 | ClassImp(AliV0Reader)\r |
44 | \r |
45 | \r |
46 | \r |
32a6d407 |
47 | AliV0Reader::AliV0Reader() :\r |
48 | TObject(),\r |
49 | fMCStack(NULL),\r |
50 | fMCTruth(NULL),\r |
51 | fChain(NULL),\r |
52 | fESDHandler(NULL),\r |
53 | fESDEvent(NULL),\r |
54 | fHistograms(NULL),\r |
55 | fCurrentV0IndexNumber(0),\r |
56 | fCurrentV0(NULL),\r |
57 | fCurrentNegativeKFParticle(NULL),\r |
58 | fCurrentPositiveKFParticle(NULL),\r |
59 | fCurrentMotherKFCandidate(NULL),\r |
60 | fCurrentNegativeESDTrack(NULL),\r |
61 | fCurrentPositiveESDTrack(NULL),\r |
62 | fNegativeTrackLorentzVector(NULL),\r |
63 | fPositiveTrackLorentzVector(NULL),\r |
64 | fMotherCandidateLorentzVector(NULL),\r |
65 | fCurrentXValue(0),\r |
66 | fCurrentYValue(0),\r |
67 | fCurrentZValue(0),\r |
68 | fPositiveTrackPID(0),\r |
69 | fNegativeTrackPID(0),\r |
70 | fNegativeMCParticle(NULL),\r |
71 | fPositiveMCParticle(NULL),\r |
72 | fMotherMCParticle(NULL),\r |
73 | fMotherCandidateKFMass(0),\r |
74 | fMotherCandidateKFWidth(0),\r |
75 | fUseKFParticle(kTRUE),\r |
76 | fUseESDTrack(kFALSE),\r |
77 | fDoMC(kFALSE),\r |
78 | fMaxR(10000),// 100 meter(outside of ALICE)\r |
79 | fEtaCut(0.),\r |
80 | fPtCut(0.),\r |
81 | fLineCutZRSlope(0.),\r |
82 | fLineCutZValue(0.),\r |
83 | fChi2CutConversion(0.),\r |
84 | fChi2CutMeson(0.),\r |
85 | fPIDProbabilityCutNegativeParticle(0),\r |
86 | fPIDProbabilityCutPositiveParticle(0),\r |
87 | fXVertexCut(0.),\r |
88 | fYVertexCut(0.),\r |
89 | fZVertexCut(0.),\r |
90 | fNSigmaMass(0.),\r |
91 | fUseImprovedVertex(kFALSE),\r |
92 | fCurrentEventGoodV0s(),\r |
93 | fPreviousEventGoodV0s()\r |
3c538586 |
94 | {\r |
32a6d407 |
95 | \r |
3c538586 |
96 | }\r |
97 | \r |
98 | \r |
99 | AliV0Reader::AliV0Reader(const AliV0Reader & original) :\r |
100 | TObject(original),\r |
101 | fMCStack(original.fMCStack),\r |
102 | fMCTruth(original.fMCTruth),\r |
103 | fChain(original.fChain),\r |
104 | fESDHandler(original.fESDHandler),\r |
105 | fESDEvent(original.fESDEvent),\r |
106 | fHistograms(original.fHistograms),\r |
107 | fCurrentV0IndexNumber(original.fCurrentV0IndexNumber),\r |
108 | fCurrentV0(original.fCurrentV0),\r |
109 | fCurrentNegativeKFParticle(original.fCurrentNegativeKFParticle),\r |
110 | fCurrentPositiveKFParticle(original.fCurrentPositiveKFParticle),\r |
111 | fCurrentMotherKFCandidate(original.fCurrentMotherKFCandidate),\r |
112 | fCurrentNegativeESDTrack(original.fCurrentNegativeESDTrack),\r |
113 | fCurrentPositiveESDTrack(original.fCurrentPositiveESDTrack),\r |
114 | fNegativeTrackLorentzVector(original.fNegativeTrackLorentzVector),\r |
115 | fPositiveTrackLorentzVector(original.fPositiveTrackLorentzVector),\r |
116 | fMotherCandidateLorentzVector(original.fMotherCandidateLorentzVector),\r |
117 | fCurrentXValue(original.fCurrentXValue),\r |
118 | fCurrentYValue(original.fCurrentYValue),\r |
119 | fCurrentZValue(original.fCurrentZValue),\r |
120 | fPositiveTrackPID(original.fPositiveTrackPID),\r |
121 | fNegativeTrackPID(original.fNegativeTrackPID),\r |
122 | fNegativeMCParticle(original.fNegativeMCParticle),\r |
123 | fPositiveMCParticle(original.fPositiveMCParticle),\r |
124 | fMotherMCParticle(original.fMotherMCParticle),\r |
125 | fMotherCandidateKFMass(original.fMotherCandidateKFMass),\r |
126 | fMotherCandidateKFWidth(original.fMotherCandidateKFWidth),\r |
127 | fUseKFParticle(kTRUE),\r |
128 | fUseESDTrack(kFALSE),\r |
129 | fDoMC(kFALSE),\r |
130 | fMaxR(original.fMaxR),\r |
131 | fEtaCut(original.fEtaCut),\r |
132 | fPtCut(original.fPtCut),\r |
32a6d407 |
133 | fLineCutZRSlope(original.fLineCutZRSlope),\r |
134 | fLineCutZValue(original.fLineCutZValue),\r |
3c538586 |
135 | fChi2CutConversion(original.fChi2CutConversion),\r |
136 | fChi2CutMeson(original.fChi2CutMeson),\r |
137 | fPIDProbabilityCutNegativeParticle(original.fPIDProbabilityCutNegativeParticle),\r |
138 | fPIDProbabilityCutPositiveParticle(original.fPIDProbabilityCutPositiveParticle),\r |
139 | fXVertexCut(original.fXVertexCut),\r |
140 | fYVertexCut(original.fYVertexCut),\r |
141 | fZVertexCut(original.fZVertexCut),\r |
142 | fNSigmaMass(original.fNSigmaMass),\r |
143 | fUseImprovedVertex(original.fUseImprovedVertex),\r |
144 | fCurrentEventGoodV0s(original.fCurrentEventGoodV0s),\r |
145 | fPreviousEventGoodV0s(original.fPreviousEventGoodV0s)\r |
146 | {\r |
32a6d407 |
147 | \r |
3c538586 |
148 | }\r |
149 | \r |
150 | \r |
151 | AliV0Reader & AliV0Reader::operator = (const AliV0Reader & /*source*/)\r |
152 | {\r |
153 | // assignment operator\r |
154 | return *this;\r |
155 | }\r |
156 | \r |
157 | void AliV0Reader::Initialize(){\r |
158 | //see header file for documentation\r |
32a6d407 |
159 | \r |
3c538586 |
160 | // Get the input handler from the manager\r |
161 | fESDHandler = (AliESDInputHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());\r |
162 | if(fESDHandler == NULL){\r |
163 | //print warning here\r |
164 | }\r |
32a6d407 |
165 | \r |
3c538586 |
166 | // Get pointer to esd event from input handler\r |
167 | fESDEvent = fESDHandler->GetEvent();\r |
168 | if(fESDEvent == NULL){\r |
169 | //print warning here\r |
170 | }\r |
32a6d407 |
171 | \r |
3c538586 |
172 | //Get pointer to MCTruth\r |
173 | fMCTruth = (AliMCEventHandler*)((AliAnalysisManager::GetAnalysisManager())->GetMCtruthEventHandler());\r |
174 | if(fMCTruth == NULL){\r |
175 | //print warning here\r |
176 | }\r |
32a6d407 |
177 | \r |
3c538586 |
178 | //Get pointer to the mc stack\r |
179 | fMCStack = fMCTruth->MCEvent()->Stack();\r |
180 | if(fMCStack == NULL){\r |
181 | //print warning here\r |
182 | }\r |
32a6d407 |
183 | \r |
3c538586 |
184 | AliKFParticle::SetField(fESDEvent->GetMagneticField());\r |
32a6d407 |
185 | \r |
3c538586 |
186 | }\r |
187 | \r |
188 | AliESDv0* AliV0Reader::GetV0(Int_t index){\r |
189 | //see header file for documentation\r |
32a6d407 |
190 | \r |
3c538586 |
191 | fCurrentV0 = fESDEvent->GetV0(index);\r |
192 | UpdateV0Information();\r |
193 | return fCurrentV0;\r |
194 | }\r |
32a6d407 |
195 | \r |
a19c3402 |
196 | Bool_t AliV0Reader::CheckForPrimaryVertex(){\r |
197 | return fESDEvent->GetPrimaryVertex()->GetNContributors()>0;\r |
198 | }\r |
3c538586 |
199 | \r |
32a6d407 |
200 | \r |
201 | \r |
3c538586 |
202 | Bool_t AliV0Reader::NextV0(){\r |
203 | //see header file for documentation\r |
32a6d407 |
204 | \r |
3c538586 |
205 | Bool_t iResult=kFALSE;\r |
206 | while(fCurrentV0IndexNumber<fESDEvent->GetNumberOfV0s()){\r |
207 | fCurrentV0 = fESDEvent->GetV0(fCurrentV0IndexNumber);\r |
32a6d407 |
208 | \r |
3c538586 |
209 | //checks if on the fly mode is set\r |
210 | if ( !fCurrentV0->GetOnFlyStatus() ){\r |
a19c3402 |
211 | if(fHistograms != NULL){\r |
32a6d407 |
212 | fHistograms->FillHistogram("ESD_CutGetOnFly_InvMass",GetMotherCandidateMass());\r |
a19c3402 |
213 | }\r |
32a6d407 |
214 | fCurrentV0IndexNumber++;\r |
3c538586 |
215 | continue;\r |
216 | }\r |
32a6d407 |
217 | \r |
218 | //checks if we have a prim vertex\r |
219 | if(fESDEvent->GetPrimaryVertex()->GetNContributors()<=0) { \r |
a19c3402 |
220 | if(fHistograms != NULL){\r |
32a6d407 |
221 | fHistograms->FillHistogram("ESD_CutNContributors_InvMass",GetMotherCandidateMass());\r |
a19c3402 |
222 | }\r |
32a6d407 |
223 | fCurrentV0IndexNumber++;\r |
3c538586 |
224 | continue;\r |
225 | }\r |
32a6d407 |
226 | \r |
227 | //Check the pid probability\r |
3c538586 |
228 | if(CheckPIDProbability(fPIDProbabilityCutNegativeParticle,fPIDProbabilityCutPositiveParticle)==kFALSE){\r |
a19c3402 |
229 | if(fHistograms != NULL){\r |
32a6d407 |
230 | fHistograms->FillHistogram("ESD_CutPIDProb_InvMass",GetMotherCandidateMass());\r |
a19c3402 |
231 | }\r |
32a6d407 |
232 | fCurrentV0IndexNumber++;\r |
3c538586 |
233 | continue;\r |
234 | }\r |
32a6d407 |
235 | \r |
236 | \r |
3c538586 |
237 | fCurrentV0->GetXYZ(fCurrentXValue,fCurrentYValue,fCurrentZValue);\r |
32a6d407 |
238 | \r |
239 | \r |
3c538586 |
240 | if(GetXYRadius()>fMaxR){ // cuts on distance from collision point\r |
32a6d407 |
241 | if(fHistograms != NULL){\r |
242 | fHistograms->FillHistogram("ESD_CutR_InvMass",GetMotherCandidateMass());\r |
243 | }\r |
3c538586 |
244 | fCurrentV0IndexNumber++;\r |
32a6d407 |
245 | continue;\r |
246 | } \r |
247 | \r |
248 | \r |
249 | if((TMath::Abs(fCurrentZValue)*fLineCutZRSlope)-fLineCutZValue > GetXYRadius() ){ // cuts out regions where we do not reconstruct\r |
a19c3402 |
250 | if(fHistograms != NULL){\r |
32a6d407 |
251 | fHistograms->FillHistogram("ESD_CutLine_InvMass",GetMotherCandidateMass());\r |
a19c3402 |
252 | }\r |
32a6d407 |
253 | fCurrentV0IndexNumber++;\r |
254 | continue;\r |
255 | } \r |
256 | \r |
257 | \r |
258 | if(UpdateV0Information() == kFALSE){\r |
259 | fCurrentV0IndexNumber++;\r |
3c538586 |
260 | continue;\r |
261 | }\r |
32a6d407 |
262 | \r |
3c538586 |
263 | if(fUseKFParticle){\r |
264 | if(fCurrentMotherKFCandidate->GetNDF()<=0){\r |
a19c3402 |
265 | if(fHistograms != NULL){\r |
32a6d407 |
266 | fHistograms->FillHistogram("ESD_CutNDF_InvMass",GetMotherCandidateMass());\r |
a19c3402 |
267 | }\r |
32a6d407 |
268 | fCurrentV0IndexNumber++;\r |
3c538586 |
269 | continue;\r |
270 | }\r |
32a6d407 |
271 | \r |
272 | \r |
3c538586 |
273 | Double_t chi2V0 = fCurrentMotherKFCandidate->GetChi2()/fCurrentMotherKFCandidate->GetNDF();\r |
274 | if(chi2V0 > fChi2CutConversion || chi2V0 <=0){\r |
a19c3402 |
275 | if(fHistograms != NULL){\r |
32a6d407 |
276 | fHistograms->FillHistogram("ESD_CutChi2_InvMass",GetMotherCandidateMass());\r |
a19c3402 |
277 | }\r |
32a6d407 |
278 | fCurrentV0IndexNumber++;\r |
279 | continue;\r |
3c538586 |
280 | }\r |
32a6d407 |
281 | \r |
282 | \r |
3c538586 |
283 | if(TMath::Abs(fMotherCandidateLorentzVector->Eta())> fEtaCut){\r |
a19c3402 |
284 | if(fHistograms != NULL){\r |
32a6d407 |
285 | fHistograms->FillHistogram("ESD_CutEta_InvMass",GetMotherCandidateMass());\r |
a19c3402 |
286 | }\r |
32a6d407 |
287 | fCurrentV0IndexNumber++;\r |
3c538586 |
288 | continue;\r |
289 | }\r |
32a6d407 |
290 | \r |
291 | \r |
3c538586 |
292 | if(fMotherCandidateLorentzVector->Pt()<fPtCut){\r |
a19c3402 |
293 | if(fHistograms != NULL){\r |
32a6d407 |
294 | fHistograms->FillHistogram("ESD_CutPt_InvMass",GetMotherCandidateMass());\r |
a19c3402 |
295 | }\r |
32a6d407 |
296 | fCurrentV0IndexNumber++;\r |
3c538586 |
297 | continue;\r |
298 | }\r |
32a6d407 |
299 | \r |
300 | \r |
3c538586 |
301 | }\r |
302 | else if(fUseESDTrack){\r |
303 | //TODO\r |
304 | }\r |
305 | \r |
32a6d407 |
306 | fCurrentEventGoodV0s.push_back(*fCurrentMotherKFCandidate);\r |
3c538586 |
307 | \r |
32a6d407 |
308 | iResult=kTRUE;//means we have a v0 who survived all the cuts applied\r |
309 | \r |
3c538586 |
310 | fCurrentV0IndexNumber++;\r |
32a6d407 |
311 | \r |
3c538586 |
312 | break;\r |
313 | }\r |
314 | return iResult; \r |
315 | }\r |
316 | \r |
32a6d407 |
317 | Bool_t AliV0Reader::UpdateV0Information(){\r |
3c538586 |
318 | //see header file for documentation\r |
32a6d407 |
319 | \r |
320 | Bool_t iResult=kTRUE; // for taking out not refitted, kinks and like sign tracks \r |
321 | \r |
322 | Bool_t switchTracks = kFALSE;\r |
323 | \r |
324 | fCurrentNegativeESDTrack = fESDEvent->GetTrack(fCurrentV0->GetNindex());\r |
325 | fCurrentPositiveESDTrack = fESDEvent->GetTrack(fCurrentV0->GetPindex());\r |
326 | \r |
327 | if(fCurrentNegativeESDTrack->GetSign() == fCurrentPositiveESDTrack->GetSign()){ // avoid like sign\r |
328 | iResult=kFALSE;\r |
329 | if(fHistograms != NULL){\r |
330 | fHistograms->FillHistogram("ESD_CutLikeSign_InvMass",GetMotherCandidateMass());\r |
331 | }\r |
332 | }\r |
333 | \r |
334 | if(fCurrentPositiveESDTrack->GetSign() == -1 && fCurrentNegativeESDTrack->GetSign() == 1){ // switch wrong signed tracks\r |
335 | fCurrentNegativeESDTrack = fESDEvent->GetTrack(fCurrentV0->GetPindex());\r |
336 | fCurrentPositiveESDTrack = fESDEvent->GetTrack(fCurrentV0->GetNindex());\r |
337 | switchTracks = kTRUE;\r |
338 | }\r |
339 | \r |
340 | if( !(fCurrentNegativeESDTrack->GetStatus() & AliESDtrack::kTPCrefit) || \r |
341 | !(fCurrentPositiveESDTrack->GetStatus() & AliESDtrack::kTPCrefit) ){\r |
342 | // if( !(fCurrentNegativeESDTrack->GetStatus() & AliESDtrack::kITSrefit) || \r |
343 | // !(fCurrentPositiveESDTrack->GetStatus() & AliESDtrack::kITSrefit) ){\r |
344 | \r |
345 | iResult=kFALSE;\r |
346 | if(fHistograms != NULL){\r |
347 | fHistograms->FillHistogram("ESD_CutRefit_InvMass",GetMotherCandidateMass());\r |
348 | }\r |
349 | }\r |
350 | \r |
351 | \r |
352 | if( fCurrentNegativeESDTrack->GetKinkIndex(0) > 0 || \r |
353 | fCurrentPositiveESDTrack->GetKinkIndex(0) > 0) { \r |
354 | \r |
355 | iResult=kFALSE;\r |
356 | if(fHistograms != NULL){\r |
357 | fHistograms->FillHistogram("ESD_CutKink_InvMass",GetMotherCandidateMass());\r |
358 | }\r |
359 | }\r |
360 | \r |
361 | \r |
362 | \r |
3c538586 |
363 | if(fCurrentNegativeKFParticle != NULL){\r |
364 | delete fCurrentNegativeKFParticle;\r |
365 | }\r |
32a6d407 |
366 | if(switchTracks == kFALSE){\r |
367 | fCurrentNegativeKFParticle = new AliKFParticle(*(fCurrentV0->GetParamN()),fNegativeTrackPID);\r |
368 | }\r |
369 | else{\r |
370 | fCurrentNegativeKFParticle = new AliKFParticle(*(fCurrentV0->GetParamP()),fNegativeTrackPID);\r |
371 | }\r |
372 | \r |
3c538586 |
373 | if(fCurrentPositiveKFParticle != NULL){\r |
374 | delete fCurrentPositiveKFParticle;\r |
375 | }\r |
32a6d407 |
376 | if(switchTracks == kFALSE){\r |
377 | fCurrentPositiveKFParticle = new AliKFParticle(*(fCurrentV0->GetParamP()),fPositiveTrackPID);\r |
378 | }\r |
379 | else{\r |
380 | fCurrentPositiveKFParticle = new AliKFParticle(*(fCurrentV0->GetParamN()),fPositiveTrackPID);\r |
381 | }\r |
3c538586 |
382 | \r |
383 | if(fCurrentMotherKFCandidate != NULL){\r |
384 | delete fCurrentMotherKFCandidate;\r |
385 | }\r |
386 | fCurrentMotherKFCandidate = new AliKFParticle(*fCurrentNegativeKFParticle,*fCurrentPositiveKFParticle);\r |
387 | \r |
3c538586 |
388 | \r |
389 | if(fPositiveTrackPID==-11 && fNegativeTrackPID==11){\r |
390 | fCurrentMotherKFCandidate->SetMassConstraint(0,fNSigmaMass);\r |
391 | }\r |
32a6d407 |
392 | \r |
393 | \r |
394 | \r |
395 | \r |
3c538586 |
396 | if(fUseImprovedVertex == kTRUE){\r |
397 | AliKFVertex primaryVertexImproved(*GetPrimaryVertex());\r |
398 | primaryVertexImproved+=*fCurrentMotherKFCandidate;\r |
399 | fCurrentMotherKFCandidate->SetProductionVertex(primaryVertexImproved);\r |
400 | }\r |
32a6d407 |
401 | \r |
3c538586 |
402 | fCurrentMotherKFCandidate->GetMass(fMotherCandidateKFMass,fMotherCandidateKFWidth);\r |
32a6d407 |
403 | \r |
404 | \r |
3c538586 |
405 | if(fNegativeTrackLorentzVector != NULL){\r |
406 | delete fNegativeTrackLorentzVector;\r |
407 | }\r |
408 | if(fUseKFParticle){\r |
409 | fNegativeTrackLorentzVector = new TLorentzVector(fCurrentNegativeKFParticle->Px(),fCurrentNegativeKFParticle->Py(),fCurrentNegativeKFParticle->Pz());\r |
410 | }\r |
411 | else if(fUseESDTrack){\r |
412 | fNegativeTrackLorentzVector = new TLorentzVector(fCurrentNegativeESDTrack->Px(),fCurrentNegativeESDTrack->Py(),fCurrentNegativeESDTrack->Pz());\r |
413 | }\r |
32a6d407 |
414 | \r |
3c538586 |
415 | if(fPositiveTrackLorentzVector != NULL){\r |
416 | delete fPositiveTrackLorentzVector;\r |
417 | }\r |
418 | if(fUseKFParticle){\r |
419 | fPositiveTrackLorentzVector = new TLorentzVector(fCurrentPositiveKFParticle->Px(),fCurrentPositiveKFParticle->Py(),fCurrentPositiveKFParticle->Pz());\r |
420 | }\r |
421 | else if(fUseESDTrack){\r |
422 | fPositiveTrackLorentzVector = new TLorentzVector(fCurrentPositiveESDTrack->Px(),fCurrentPositiveESDTrack->Py(),fCurrentPositiveESDTrack->Pz());\r |
423 | }\r |
32a6d407 |
424 | \r |
3c538586 |
425 | if(fMotherCandidateLorentzVector != NULL){\r |
426 | delete fMotherCandidateLorentzVector;\r |
427 | }\r |
428 | if(fUseKFParticle){\r |
429 | fMotherCandidateLorentzVector = new TLorentzVector(*fNegativeTrackLorentzVector + *fPositiveTrackLorentzVector);\r |
430 | }\r |
431 | else if(fUseESDTrack){\r |
432 | fMotherCandidateLorentzVector = new TLorentzVector(*fNegativeTrackLorentzVector + *fPositiveTrackLorentzVector);\r |
433 | }\r |
32a6d407 |
434 | \r |
3c538586 |
435 | if(fPositiveTrackPID==-11 && fNegativeTrackPID==11){\r |
436 | fMotherCandidateLorentzVector->SetXYZM(fMotherCandidateLorentzVector->Px() ,fMotherCandidateLorentzVector->Py(),fMotherCandidateLorentzVector->Pz(),0.); \r |
437 | }\r |
438 | \r |
32a6d407 |
439 | \r |
3c538586 |
440 | if(fDoMC == kTRUE){\r |
a19c3402 |
441 | fMotherMCParticle= NULL;\r |
3c538586 |
442 | fNegativeMCParticle = fMCStack->Particle(TMath::Abs(fESDEvent->GetTrack(fCurrentV0->GetNindex())->GetLabel()));\r |
443 | fPositiveMCParticle = fMCStack->Particle(TMath::Abs(fESDEvent->GetTrack(fCurrentV0->GetPindex())->GetLabel()));\r |
a19c3402 |
444 | if(fPositiveMCParticle->GetMother(0)>-1){\r |
445 | fMotherMCParticle = fMCStack->Particle(fPositiveMCParticle->GetMother(0));\r |
446 | }\r |
3c538586 |
447 | }\r |
32a6d407 |
448 | \r |
449 | // if(iResult==kTRUE){\r |
450 | // fCurrentEventGoodV0s.push_back(*fCurrentMotherKFCandidate); // moved it to NextV0() after all the cuts are applied\r |
451 | // }\r |
452 | \r |
453 | return iResult;\r |
3c538586 |
454 | }\r |
455 | \r |
32a6d407 |
456 | \r |
457 | \r |
3c538586 |
458 | Bool_t AliV0Reader::HasSameMCMother(){\r |
459 | //see header file for documentation\r |
32a6d407 |
460 | \r |
3c538586 |
461 | Bool_t iResult = kFALSE;\r |
462 | if(fDoMC == kTRUE){\r |
463 | if(fNegativeMCParticle != NULL && fPositiveMCParticle != NULL){\r |
464 | if(fNegativeMCParticle->GetMother(0) == fPositiveMCParticle->GetMother(0))\r |
a19c3402 |
465 | if(fMotherMCParticle){\r |
466 | iResult = kTRUE;\r |
467 | }\r |
3c538586 |
468 | }\r |
469 | }\r |
470 | return iResult;\r |
471 | }\r |
472 | \r |
473 | Bool_t AliV0Reader::CheckPIDProbability(Double_t negProbCut, Double_t posProbCut){\r |
474 | //see header file for documentation\r |
32a6d407 |
475 | \r |
3c538586 |
476 | Bool_t iResult=kFALSE;\r |
32a6d407 |
477 | \r |
3c538586 |
478 | Double_t *posProbArray = new Double_t[10];\r |
479 | Double_t *negProbArray = new Double_t[10];\r |
480 | AliESDtrack* negTrack = fESDEvent->GetTrack(fCurrentV0->GetNindex());\r |
481 | AliESDtrack* posTrack = fESDEvent->GetTrack(fCurrentV0->GetPindex());\r |
32a6d407 |
482 | \r |
3c538586 |
483 | negTrack->GetTPCpid(negProbArray);\r |
484 | posTrack->GetTPCpid(posProbArray);\r |
32a6d407 |
485 | \r |
3c538586 |
486 | if(negProbArray!=NULL && posProbArray!=NULL){\r |
487 | if(negProbArray[GetSpeciesIndex(-1)]>=negProbCut && posProbArray[GetSpeciesIndex(1)]>=posProbCut){\r |
488 | iResult=kTRUE;\r |
489 | }\r |
490 | }\r |
491 | delete [] posProbArray;\r |
492 | delete [] negProbArray;\r |
493 | return iResult;\r |
494 | }\r |
495 | \r |
a19c3402 |
496 | void AliV0Reader::GetPIDProbability(Double_t &negPIDProb,Double_t & posPIDProb){\r |
32a6d407 |
497 | \r |
a19c3402 |
498 | Double_t *posProbArray = new Double_t[10];\r |
499 | Double_t *negProbArray = new Double_t[10];\r |
500 | AliESDtrack* negTrack = fESDEvent->GetTrack(fCurrentV0->GetNindex());\r |
501 | AliESDtrack* posTrack = fESDEvent->GetTrack(fCurrentV0->GetPindex());\r |
32a6d407 |
502 | \r |
a19c3402 |
503 | negTrack->GetTPCpid(negProbArray);\r |
504 | posTrack->GetTPCpid(posProbArray);\r |
32a6d407 |
505 | \r |
a19c3402 |
506 | if(negProbArray!=NULL && posProbArray!=NULL){\r |
507 | negPIDProb = negProbArray[GetSpeciesIndex(-1)];\r |
508 | posPIDProb = posProbArray[GetSpeciesIndex(1)];\r |
509 | }\r |
510 | delete [] posProbArray;\r |
511 | delete [] negProbArray;\r |
512 | }\r |
513 | \r |
3c538586 |
514 | void AliV0Reader::UpdateEventByEventData(){\r |
515 | //see header file for documentation\r |
32a6d407 |
516 | \r |
3c538586 |
517 | if(fCurrentEventGoodV0s.size() >0 ){\r |
32a6d407 |
518 | // fPreviousEventGoodV0s.clear();\r |
519 | // fPreviousEventGoodV0s = fCurrentEventGoodV0s;\r |
520 | if(fPreviousEventGoodV0s.size()>19){\r |
521 | for(UInt_t nCurrent=0;nCurrent<fCurrentEventGoodV0s.size();nCurrent++){\r |
522 | fPreviousEventGoodV0s.erase(fPreviousEventGoodV0s.begin());\r |
523 | fPreviousEventGoodV0s.push_back(fCurrentEventGoodV0s.at(nCurrent));\r |
524 | }\r |
525 | }\r |
526 | else{\r |
527 | for(UInt_t nCurrent=0;nCurrent<fCurrentEventGoodV0s.size();nCurrent++){\r |
528 | if(fPreviousEventGoodV0s.size()<20){\r |
529 | fPreviousEventGoodV0s.push_back(fCurrentEventGoodV0s.at(nCurrent));\r |
530 | }\r |
531 | else{\r |
532 | fPreviousEventGoodV0s.erase(fPreviousEventGoodV0s.begin());\r |
533 | fPreviousEventGoodV0s.push_back(fCurrentEventGoodV0s.at(nCurrent));\r |
534 | }\r |
535 | }\r |
536 | }\r |
3c538586 |
537 | }\r |
538 | fCurrentEventGoodV0s.clear();\r |
32a6d407 |
539 | \r |
3c538586 |
540 | fCurrentV0IndexNumber=0;\r |
541 | }\r |
542 | \r |
32a6d407 |
543 | \r |
3c538586 |
544 | Double_t AliV0Reader::GetNegativeTrackPhi() const{\r |
545 | //see header file for documentation\r |
32a6d407 |
546 | \r |
3c538586 |
547 | Double_t offset=0;\r |
548 | if(fNegativeTrackLorentzVector->Phi()> TMath::Pi()){\r |
549 | offset = -2*TMath::Pi();\r |
550 | }\r |
551 | return fNegativeTrackLorentzVector->Phi()+offset;\r |
552 | }\r |
553 | \r |
554 | Double_t AliV0Reader::GetPositiveTrackPhi() const{\r |
555 | //see header file for documentation\r |
32a6d407 |
556 | \r |
3c538586 |
557 | Double_t offset=0;\r |
558 | if(fPositiveTrackLorentzVector->Phi()> TMath::Pi()){\r |
559 | offset = -2*TMath::Pi();\r |
560 | }\r |
561 | return fPositiveTrackLorentzVector->Phi()+offset;\r |
562 | }\r |
563 | \r |
564 | Double_t AliV0Reader::GetMotherCandidatePhi() const{\r |
565 | //see header file for documentation\r |
32a6d407 |
566 | \r |
3c538586 |
567 | Double_t offset=0;\r |
568 | if(fMotherCandidateLorentzVector->Phi()> TMath::Pi()){\r |
569 | offset = -2*TMath::Pi();\r |
570 | }\r |
571 | return fMotherCandidateLorentzVector->Phi()+offset;\r |
572 | }\r |
573 | \r |
32a6d407 |
574 | \r |
575 | Double_t AliV0Reader::GetMotherCandidateRapidity() const{\r |
3c538586 |
576 | //see header file for documentation\r |
32a6d407 |
577 | \r |
578 | Double_t rapidity=0;\r |
579 | if(fMotherCandidateLorentzVector->Energy() - fMotherCandidateLorentzVector->Pz() == 0 || fMotherCandidateLorentzVector->Energy() + fMotherCandidateLorentzVector->Pz() == 0) rapidity=0;\r |
580 | else rapidity = 0.5*(TMath::Log((fMotherCandidateLorentzVector->Energy() + fMotherCandidateLorentzVector->Pz()) / (fMotherCandidateLorentzVector->Energy()-fMotherCandidateLorentzVector->Pz())));\r |
581 | return rapidity;\r |
582 | \r |
583 | }\r |
584 | \r |
3c538586 |
585 | \r |
3c538586 |
586 | \r |
32a6d407 |
587 | \r |
588 | \r |
589 | Int_t AliV0Reader::GetSpeciesIndex(Int_t chargeOfTrack){\r |
590 | //see header file for documentation\r |
591 | \r |
592 | Int_t iResult = 10; // Unknown particle\r |
593 | \r |
3c538586 |
594 | if(chargeOfTrack==-1){ //negative track\r |
595 | switch(abs(fNegativeTrackPID)){\r |
596 | case 11: //electron\r |
597 | iResult = 0;\r |
598 | break;\r |
599 | case 13: //muon\r |
600 | iResult = 1;\r |
601 | break;\r |
602 | case 211: //pion\r |
603 | iResult = 2;\r |
604 | break;\r |
605 | case 321: //kaon\r |
606 | iResult = 3;\r |
607 | break;\r |
608 | case 2212: //proton\r |
609 | iResult = 4;\r |
610 | break;\r |
611 | case 22: //photon\r |
612 | iResult = 5;\r |
613 | break;\r |
614 | case 111: //pi0\r |
615 | iResult = 6;\r |
616 | break;\r |
617 | case 2112: //neutron\r |
618 | iResult = 7;\r |
619 | break;\r |
620 | case 311: //K0\r |
621 | iResult = 8;\r |
622 | break;\r |
32a6d407 |
623 | \r |
3c538586 |
624 | //Put in here for kSPECIES::kEleCon ????\r |
625 | }\r |
626 | }\r |
627 | else if(chargeOfTrack==1){ //positive track\r |
628 | switch(abs(fPositiveTrackPID)){\r |
629 | case 11: //electron\r |
630 | iResult = 0;\r |
631 | break;\r |
632 | case 13: //muon\r |
633 | iResult = 1;\r |
634 | break;\r |
635 | case 211: //pion\r |
636 | iResult = 2;\r |
637 | break;\r |
638 | case 321: //kaon\r |
639 | iResult = 3;\r |
640 | break;\r |
641 | case 2212: //proton\r |
642 | iResult = 4;\r |
643 | break;\r |
644 | case 22: //photon\r |
645 | iResult = 5;\r |
646 | break;\r |
647 | case 111: //pi0\r |
648 | iResult = 6;\r |
649 | break;\r |
650 | case 2112: //neutron\r |
651 | iResult = 7;\r |
652 | break;\r |
653 | case 311: //K0\r |
654 | iResult = 8;\r |
655 | break;\r |
32a6d407 |
656 | \r |
3c538586 |
657 | //Put in here for kSPECIES::kEleCon ????\r |
658 | }\r |
659 | }\r |
660 | else{\r |
661 | //Wrong parameter.. Print warning\r |
662 | }\r |
663 | return iResult;\r |
664 | }\r |