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 **************************************************************************/
19 // ESD track cuts for flow framework
21 // origin: Mikolaj Krzewicki (mikolaj.krzewicki@cern.ch)
23 // This class gurantees consistency of cut methods, trackparameter
24 // selection (global tracks, TPC only, etc..) and parameter mixing
25 // in the flow framework. Transparently handles different input types:
27 // This class works in 2 steps: first the requested track parameters are
28 // constructed (to be set by SetParamType() ), then cuts are applied.
29 // the constructed track can be requested AFTER checking the cuts by
30 // calling GetTrack(), in this case the cut object stays in control,
31 // caller does not have to delete the track.
32 // Additionally caller can request an AliFlowTrack object to be constructed
33 // according the parameter mixing scenario requested by SetParamMix().
34 // AliFlowTrack is made using MakeFlowTrack() method, its an 'object factory'
35 // so caller needs to take care of the freshly created object.
40 #include "TMCProcess.h"
41 #include "TParticle.h"
45 #include "AliMCEvent.h"
46 #include "AliESDEvent.h"
47 #include "AliVParticle.h"
48 #include "AliMCParticle.h"
49 #include "AliESDtrack.h"
50 #include "AliMultiplicity.h"
51 #include "AliAODTrack.h"
52 #include "AliFlowTrack.h"
53 #include "AliFlowTrackCuts.h"
55 #include "AliESDpid.h"
56 #include "AliESDPmdTrack.h"
57 #include "AliESDVZERO.h"
59 ClassImp(AliFlowTrackCuts)
61 //-----------------------------------------------------------------------
62 AliFlowTrackCuts::AliFlowTrackCuts():
63 AliFlowTrackSimpleCuts(),
64 fAliESDtrackCuts(NULL),
67 fCutMChasTrackReferences(kFALSE),
68 fCutMCprocessType(kFALSE),
69 fMCprocessType(kPNoProcess),
72 fIgnoreSignInMCPID(kFALSE),
73 fCutMCisPrimary(kFALSE),
74 fRequireTransportBitForPrimaries(kTRUE),
76 fRequireCharge(kFALSE),
78 fCutSPDtrackletDeltaPhi(kFALSE),
79 fSPDtrackletDeltaPhiMax(FLT_MAX),
80 fSPDtrackletDeltaPhiMin(-FLT_MAX),
81 fIgnoreTPCzRange(kFALSE),
82 fIgnoreTPCzRangeMax(FLT_MAX),
83 fIgnoreTPCzRangeMin(-FLT_MAX),
84 fCutChi2PerClusterTPC(kFALSE),
85 fMaxChi2PerClusterTPC(FLT_MAX),
86 fMinChi2PerClusterTPC(-FLT_MAX),
87 fCutNClustersTPC(kFALSE),
88 fNClustersTPCMax(INT_MAX),
89 fNClustersTPCMin(INT_MIN),
90 fCutNClustersITS(kFALSE),
91 fNClustersITSMax(INT_MAX),
92 fNClustersITSMin(INT_MIN),
93 fUseAODFilterBit(kFALSE),
95 fCutDCAToVertexXY(kFALSE),
96 fCutDCAToVertexZ(kFALSE),
97 fCutMinimalTPCdedx(kFALSE),
103 fCutPmdNcell(kFALSE),
111 fTrackLabel(INT_MIN),
120 fParticleID(AliPID::kUnknown),
121 fParticleProbability(.9),
122 fAllowTOFmismatchFlag(kFALSE),
123 fRequireStrictTOFTPCagreement(kFALSE),
124 fCutRejectElectronsWithTPCpid(kFALSE)
127 for ( Int_t i=0; i<5; i++ ) { fProbBayes[i]=0.0; }
128 SetPriors(); //init arrays
131 //-----------------------------------------------------------------------
132 AliFlowTrackCuts::AliFlowTrackCuts(const char* name):
133 AliFlowTrackSimpleCuts(),
134 fAliESDtrackCuts(NULL),
137 fCutMChasTrackReferences(kFALSE),
138 fCutMCprocessType(kFALSE),
139 fMCprocessType(kPNoProcess),
142 fIgnoreSignInMCPID(kFALSE),
143 fCutMCisPrimary(kFALSE),
144 fRequireTransportBitForPrimaries(kTRUE),
145 fMCisPrimary(kFALSE),
146 fRequireCharge(kFALSE),
148 fCutSPDtrackletDeltaPhi(kFALSE),
149 fSPDtrackletDeltaPhiMax(FLT_MAX),
150 fSPDtrackletDeltaPhiMin(-FLT_MAX),
151 fIgnoreTPCzRange(kFALSE),
152 fIgnoreTPCzRangeMax(FLT_MAX),
153 fIgnoreTPCzRangeMin(-FLT_MAX),
154 fCutChi2PerClusterTPC(kFALSE),
155 fMaxChi2PerClusterTPC(FLT_MAX),
156 fMinChi2PerClusterTPC(-FLT_MAX),
157 fCutNClustersTPC(kFALSE),
158 fNClustersTPCMax(INT_MAX),
159 fNClustersTPCMin(INT_MIN),
160 fCutNClustersITS(kFALSE),
161 fNClustersITSMax(INT_MAX),
162 fNClustersITSMin(INT_MIN),
163 fUseAODFilterBit(kFALSE),
165 fCutDCAToVertexXY(kFALSE),
166 fCutDCAToVertexZ(kFALSE),
167 fCutMinimalTPCdedx(kFALSE),
173 fCutPmdNcell(kFALSE),
181 fTrackLabel(INT_MIN),
190 fParticleID(AliPID::kUnknown),
191 fParticleProbability(.9),
192 fAllowTOFmismatchFlag(kFALSE),
193 fRequireStrictTOFTPCagreement(kFALSE),
194 fCutRejectElectronsWithTPCpid(kFALSE)
198 SetTitle("AliFlowTrackCuts");
199 fESDpid.GetTPCResponse().SetBetheBlochParameters( 0.0283086,
204 for ( Int_t i=0; i<5; i++ ) { fProbBayes[i]=0.0; }
205 SetPriors(); //init arrays
209 //-----------------------------------------------------------------------
210 AliFlowTrackCuts::AliFlowTrackCuts(const AliFlowTrackCuts& that):
211 AliFlowTrackSimpleCuts(that),
212 fAliESDtrackCuts(NULL),
215 fCutMChasTrackReferences(that.fCutMChasTrackReferences),
216 fCutMCprocessType(that.fCutMCprocessType),
217 fMCprocessType(that.fMCprocessType),
218 fCutMCPID(that.fCutMCPID),
220 fIgnoreSignInMCPID(that.fIgnoreSignInMCPID),
221 fCutMCisPrimary(that.fCutMCisPrimary),
222 fRequireTransportBitForPrimaries(that.fRequireTransportBitForPrimaries),
223 fMCisPrimary(that.fMCisPrimary),
224 fRequireCharge(that.fRequireCharge),
225 fFakesAreOK(that.fFakesAreOK),
226 fCutSPDtrackletDeltaPhi(that.fCutSPDtrackletDeltaPhi),
227 fSPDtrackletDeltaPhiMax(that.fSPDtrackletDeltaPhiMax),
228 fSPDtrackletDeltaPhiMin(that.fSPDtrackletDeltaPhiMin),
229 fIgnoreTPCzRange(that.fIgnoreTPCzRange),
230 fIgnoreTPCzRangeMax(that.fIgnoreTPCzRangeMax),
231 fIgnoreTPCzRangeMin(that.fIgnoreTPCzRangeMin),
232 fCutChi2PerClusterTPC(that.fCutChi2PerClusterTPC),
233 fMaxChi2PerClusterTPC(that.fMaxChi2PerClusterTPC),
234 fMinChi2PerClusterTPC(that.fMinChi2PerClusterTPC),
235 fCutNClustersTPC(that.fCutNClustersTPC),
236 fNClustersTPCMax(that.fNClustersTPCMax),
237 fNClustersTPCMin(that.fNClustersTPCMin),
238 fCutNClustersITS(that.fCutNClustersITS),
239 fNClustersITSMax(that.fNClustersITSMax),
240 fNClustersITSMin(that.fNClustersITSMin),
241 fUseAODFilterBit(that.fUseAODFilterBit),
242 fAODFilterBit(that.fAODFilterBit),
243 fCutDCAToVertexXY(that.fCutDCAToVertexXY),
244 fCutDCAToVertexZ(that.fCutDCAToVertexZ),
245 fCutMinimalTPCdedx(that.fCutMinimalTPCdedx),
246 fMinimalTPCdedx(that.fMinimalTPCdedx),
247 fCutPmdDet(that.fCutPmdDet),
248 fPmdDet(that.fPmdDet),
249 fCutPmdAdc(that.fCutPmdAdc),
250 fPmdAdc(that.fPmdAdc),
251 fCutPmdNcell(that.fCutPmdNcell),
252 fPmdNcell(that.fPmdNcell),
253 fParamType(that.fParamType),
254 fParamMix(that.fParamMix),
259 fTrackLabel(INT_MIN),
264 fESDpid(that.fESDpid),
265 fPIDsource(that.fPIDsource),
268 fParticleID(that.fParticleID),
269 fParticleProbability(that.fParticleProbability),
270 fAllowTOFmismatchFlag(that.fAllowTOFmismatchFlag),
271 fRequireStrictTOFTPCagreement(that.fRequireStrictTOFTPCagreement),
272 fCutRejectElectronsWithTPCpid(that.fCutRejectElectronsWithTPCpid)
275 if (that.fTPCpidCuts) fTPCpidCuts = new TMatrixF(*(that.fTPCpidCuts));
276 if (that.fTOFpidCuts) fTOFpidCuts = new TMatrixF(*(that.fTOFpidCuts));
277 if (that.fAliESDtrackCuts) fAliESDtrackCuts = new AliESDtrackCuts(*(that.fAliESDtrackCuts));
278 memcpy(fProbBayes,that.fProbBayes,sizeof(fProbBayes));
279 SetPriors(); //init arrays
280 if (that.fQA) DefineHistograms();
283 //-----------------------------------------------------------------------
284 AliFlowTrackCuts& AliFlowTrackCuts::operator=(const AliFlowTrackCuts& that)
287 if (this==&that) return *this;
289 AliFlowTrackSimpleCuts::operator=(that);
290 //the following may seem excessive but if AliESDtrackCuts properly does copy and clone
291 //this approach is better memory-fragmentation-wise in some cases
292 if (that.fAliESDtrackCuts && fAliESDtrackCuts) *fAliESDtrackCuts=*(that.fAliESDtrackCuts);
293 if (that.fAliESDtrackCuts && !fAliESDtrackCuts) fAliESDtrackCuts=new AliESDtrackCuts(*(that.fAliESDtrackCuts));
294 if (!that.fAliESDtrackCuts) delete fAliESDtrackCuts; fAliESDtrackCuts=NULL;
295 //these guys we don't need to copy, just reinit
296 if (that.fQA) {fQA->Delete(); delete fQA; fQA=NULL; DefineHistograms();}
298 fCutMChasTrackReferences=that.fCutMChasTrackReferences;
299 fCutMCprocessType=that.fCutMCprocessType;
300 fMCprocessType=that.fMCprocessType;
301 fCutMCPID=that.fCutMCPID;
303 fIgnoreSignInMCPID=that.fIgnoreSignInMCPID,
304 fCutMCisPrimary=that.fCutMCisPrimary;
305 fRequireTransportBitForPrimaries=that.fRequireTransportBitForPrimaries;
306 fMCisPrimary=that.fMCisPrimary;
307 fRequireCharge=that.fRequireCharge;
308 fFakesAreOK=that.fFakesAreOK;
309 fCutSPDtrackletDeltaPhi=that.fCutSPDtrackletDeltaPhi;
310 fSPDtrackletDeltaPhiMax=that.fSPDtrackletDeltaPhiMax;
311 fSPDtrackletDeltaPhiMin=that.fSPDtrackletDeltaPhiMin;
312 fIgnoreTPCzRange=that.fIgnoreTPCzRange;
313 fIgnoreTPCzRangeMax=that.fIgnoreTPCzRangeMax;
314 fIgnoreTPCzRangeMin=that.fIgnoreTPCzRangeMin;
315 fCutChi2PerClusterTPC=that.fCutChi2PerClusterTPC;
316 fMaxChi2PerClusterTPC=that.fMaxChi2PerClusterTPC;
317 fMinChi2PerClusterTPC=that.fMinChi2PerClusterTPC;
318 fCutNClustersTPC=that.fCutNClustersTPC;
319 fNClustersTPCMax=that.fNClustersTPCMax;
320 fNClustersTPCMin=that.fNClustersTPCMin;
321 fCutNClustersITS=that.fCutNClustersITS;
322 fNClustersITSMax=that.fNClustersITSMax;
323 fNClustersITSMin=that.fNClustersITSMin;
324 fUseAODFilterBit=that.fUseAODFilterBit;
325 fAODFilterBit=that.fAODFilterBit;
326 fCutDCAToVertexXY=that.fCutDCAToVertexXY;
327 fCutDCAToVertexZ=that.fCutDCAToVertexZ;
328 fCutMinimalTPCdedx=that.fCutMinimalTPCdedx;
329 fMinimalTPCdedx=that.fMinimalTPCdedx;
330 fCutPmdDet=that.fCutPmdDet;
331 fPmdDet=that.fPmdDet;
332 fCutPmdAdc=that.fCutPmdAdc;
333 fPmdAdc=that.fPmdAdc;
334 fCutPmdNcell=that.fCutPmdNcell;
335 fPmdNcell=that.fPmdNcell;
337 fParamType=that.fParamType;
338 fParamMix=that.fParamMix;
349 fESDpid = that.fESDpid;
350 fPIDsource = that.fPIDsource;
354 if (that.fTPCpidCuts) fTPCpidCuts = new TMatrixF(*(that.fTPCpidCuts));
355 if (that.fTOFpidCuts) fTOFpidCuts = new TMatrixF(*(that.fTOFpidCuts));
357 fParticleID=that.fParticleID;
358 fParticleProbability=that.fParticleProbability;
359 fAllowTOFmismatchFlag=that.fAllowTOFmismatchFlag;
360 fRequireStrictTOFTPCagreement=that.fRequireStrictTOFTPCagreement;
361 fCutRejectElectronsWithTPCpid=that.fCutRejectElectronsWithTPCpid;
362 memcpy(fProbBayes,that.fProbBayes,sizeof(fProbBayes));
367 //-----------------------------------------------------------------------
368 AliFlowTrackCuts::~AliFlowTrackCuts()
371 delete fAliESDtrackCuts;
374 if (fQA) { fQA->SetOwner(); fQA->Delete(); delete fQA; }
377 //-----------------------------------------------------------------------
378 void AliFlowTrackCuts::SetEvent(AliVEvent* event, AliMCEvent* mcEvent)
385 //do the magic for ESD
386 AliESDEvent* myESD = dynamic_cast<AliESDEvent*>(event);
387 if (fCutPID && myESD)
389 //TODO: maybe call it only for the TOF options?
390 // Added by F. Noferini for TOF PID
391 fESDpid.SetTOFResponse(myESD,AliESDpid::kTOF_T0);
392 fESDpid.MakePID(myESD,kFALSE);
393 // End F. Noferini added part
399 //-----------------------------------------------------------------------
400 void AliFlowTrackCuts::SetCutMC( Bool_t b )
402 //will we be cutting on MC information?
405 //if we cut on MC info then also the Bethe Bloch should be the one tuned for MC
408 fESDpid.GetTPCResponse().SetBetheBlochParameters( 2.15898e+00/50.,
416 //-----------------------------------------------------------------------
417 Bool_t AliFlowTrackCuts::IsSelected(TObject* obj, Int_t id)
420 AliVParticle* vparticle = dynamic_cast<AliVParticle*>(obj);
421 if (vparticle) return PassesCuts(vparticle);
422 AliFlowTrackSimple* flowtrack = dynamic_cast<AliFlowTrackSimple*>(obj);
423 if (flowtrack) return PassesCuts(flowtrack);
424 AliMultiplicity* tracklets = dynamic_cast<AliMultiplicity*>(obj);
425 if (tracklets) return PassesCuts(tracklets,id);
426 AliESDPmdTrack* pmdtrack = dynamic_cast<AliESDPmdTrack*>(obj);
427 if (pmdtrack) return PassesPMDcuts(pmdtrack);
428 AliESDVZERO* esdvzero = dynamic_cast<AliESDVZERO*>(obj);
429 if (esdvzero) return PassesV0cuts(esdvzero,id);
430 return kFALSE; //default when passed wrong type of object
433 //-----------------------------------------------------------------------
434 Bool_t AliFlowTrackCuts::IsSelectedMCtruth(TObject* obj, Int_t id)
437 AliVParticle* vparticle = dynamic_cast<AliVParticle*>(obj);
440 return PassesMCcuts(fMCevent,vparticle->GetLabel());
442 AliMultiplicity* tracklets = dynamic_cast<AliMultiplicity*>(obj);
445 Int_t label0 = tracklets->GetLabel(id,0);
446 Int_t label1 = tracklets->GetLabel(id,1);
447 Int_t label = (label0==label1)?tracklets->GetLabel(id,1):-666;
448 return PassesMCcuts(fMCevent,label);
450 return kFALSE; //default when passed wrong type of object
453 //-----------------------------------------------------------------------
454 Bool_t AliFlowTrackCuts::PassesCuts(const AliFlowTrackSimple* track)
456 //check cuts on a flowtracksimple
458 //clean up from last iteration
460 return AliFlowTrackSimpleCuts::PassesCuts(track);
463 //-----------------------------------------------------------------------
464 Bool_t AliFlowTrackCuts::PassesCuts(const AliMultiplicity* tracklet, Int_t id)
466 //check cuts on a tracklets
468 //clean up from last iteration, and init label
473 fTrackPhi = tracklet->GetPhi(id);
474 fTrackEta = tracklet->GetEta(id);
476 if (fCutEta) {if ( fTrackEta < fEtaMin || fTrackEta >= fEtaMax ) return kFALSE;}
477 if (fCutPhi) {if ( fTrackPhi < fPhiMin || fTrackPhi >= fPhiMax ) return kFALSE;}
479 //check MC info if available
480 //if the 2 clusters have different label track cannot be good
481 //and should therefore not pass the mc cuts
482 Int_t label0 = tracklet->GetLabel(id,0);
483 Int_t label1 = tracklet->GetLabel(id,1);
484 //if possible get label and mcparticle
485 fTrackLabel = (label0==label1)?tracklet->GetLabel(id,1):-1;
486 if (!fFakesAreOK && fTrackLabel<0) return kFALSE;
487 if (fTrackLabel>=0 && fMCevent) fMCparticle = static_cast<AliMCParticle*>(fMCevent->GetTrack(fTrackLabel));
489 if (fCutMC && !PassesMCcuts()) return kFALSE;
493 //-----------------------------------------------------------------------
494 Bool_t AliFlowTrackCuts::PassesMCcuts(AliMCEvent* mcEvent, Int_t label)
497 if (!mcEvent) return kFALSE;
498 if (label<0) return kFALSE;//otherwise AliCMevent prints a warning before returning NULL
499 AliMCParticle* mcparticle = static_cast<AliMCParticle*>(mcEvent->GetTrack(label));
500 if (!mcparticle) {AliError("no MC track"); return kFALSE;}
504 if (IsPhysicalPrimary(mcEvent,label,fRequireTransportBitForPrimaries) != fMCisPrimary) return kFALSE;
508 Int_t pdgCode = mcparticle->PdgCode();
509 if (fIgnoreSignInMCPID)
511 if (TMath::Abs(fMCPID) != TMath::Abs(pdgCode)) return kFALSE;
515 if (fMCPID != pdgCode) return kFALSE;
518 if ( fCutMCprocessType )
520 TParticle* particle = mcparticle->Particle();
521 Int_t processID = particle->GetUniqueID();
522 if (processID != fMCprocessType ) return kFALSE;
524 if (fCutMChasTrackReferences)
526 if (mcparticle->GetNumberOfTrackReferences()<1) return kFALSE;
531 //-----------------------------------------------------------------------
532 Bool_t AliFlowTrackCuts::PassesMCcuts()
535 if (!fMCevent) return kFALSE;
536 if (fTrackLabel<0) return kFALSE;//otherwise AliCMevent prints a warning before returning NULL
537 fMCparticle = static_cast<AliMCParticle*>(fMCevent->GetTrack(fTrackLabel));
538 return PassesMCcuts(fMCevent,fTrackLabel);
541 //-----------------------------------------------------------------------
542 Bool_t AliFlowTrackCuts::PassesCuts(AliVParticle* vparticle)
544 //check cuts for an ESD vparticle
546 ////////////////////////////////////////////////////////////////
547 // start by preparing the track parameters to cut on //////////
548 ////////////////////////////////////////////////////////////////
549 //clean up from last iteration
552 //get the label and the mc particle
553 fTrackLabel = (fFakesAreOK)?TMath::Abs(vparticle->GetLabel()):vparticle->GetLabel();
554 if (fMCevent) fMCparticle = static_cast<AliMCParticle*>(fMCevent->GetTrack(fTrackLabel));
555 else fMCparticle=NULL;
557 Bool_t isMCparticle = kFALSE; //some things are different for MC particles, check!
558 AliESDtrack* esdTrack = dynamic_cast<AliESDtrack*>(vparticle);
559 AliAODTrack* aodTrack = NULL;
562 //for an ESD track we do some magic sometimes like constructing TPC only parameters
563 //or doing some hybrid, handle that here
564 HandleESDtrack(esdTrack);
568 HandleVParticle(vparticle);
569 //now check if produced particle is MC
570 isMCparticle = (dynamic_cast<AliMCParticle*>(fTrack))!=NULL;
571 aodTrack = dynamic_cast<AliAODTrack*>(vparticle); //keep the additional dynamic cast out of the way for ESDs
573 ////////////////////////////////////////////////////////////////
574 ////////////////////////////////////////////////////////////////
576 if (!fTrack) return kFALSE;
577 //because it may be different from global, not needed for aodTrack because we dont do anything funky there
578 if (esdTrack) esdTrack = static_cast<AliESDtrack*>(fTrack);
581 //check the common cuts for the current particle fTrack (MC,AOD,ESD)
582 Double_t pt = fTrack->Pt();
583 Double_t p = fTrack->P();
584 if (!fFakesAreOK) {if (fTrackLabel<0) pass=kFALSE;}
585 if (fCutPt) {if (pt < fPtMin || pt >= fPtMax ) pass=kFALSE;}
586 if (fCutEta) {if (fTrack->Eta() < fEtaMin || fTrack->Eta() >= fEtaMax ) pass=kFALSE;}
587 if (fCutPhi) {if (fTrack->Phi() < fPhiMin || fTrack->Phi() >= fPhiMax ) pass=kFALSE;}
588 if (fRequireCharge) {if (fTrack->Charge() == 0) pass=kFALSE;}
589 if (fCutCharge && !isMCparticle) {if (fTrack->Charge() != fCharge) pass=kFALSE;}
590 if (fCutCharge && isMCparticle)
592 //in case of an MC particle the charge is stored in units of 1/3|e|
593 Int_t charge = TMath::Nint(fTrack->Charge()/3.0); //mc particles have charge in units of 1/3e
594 if (charge!=fCharge) pass=kFALSE;
596 //if(fCutPID) {if (fTrack->PID() != fPID) pass=kFALSE;}
598 //when additionally MC info is required
599 if (fCutMC && !PassesMCcuts()) pass=kFALSE;
601 //the case of ESD or AOD
602 if (esdTrack) { if (!PassesESDcuts(esdTrack)) { pass=kFALSE; } }
603 if (aodTrack) { if (!PassesAODcuts(aodTrack)) { pass=kFALSE; } }
609 TParticle* tparticle=fMCparticle->Particle();
610 Int_t processID = tparticle->GetUniqueID();
612 //mcparticle->Particle()->ProductionVertex(v);
613 //Double_t prodvtxX = v.X();
614 //Double_t prodvtxY = v.Y();
617 Int_t pdgcode = fMCparticle->PdgCode();
618 switch (TMath::Abs(pdgcode))
621 pdg = AliPID::kElectron + 0.5; break;
623 pdg = AliPID::kMuon + 0.5; break;
625 pdg = AliPID::kPion + 0.5; break;
627 pdg = AliPID::kKaon + 0.5; break;
629 pdg = AliPID::kProton + 0.5; break;
631 pdg = AliPID::kUnknown + 0.5; break;
633 pdg = TMath::Sign(pdg,static_cast<Float_t>(pdgcode));
634 QAbefore(2)->Fill(p,pdg);
635 QAbefore(3)->Fill(p,IsPhysicalPrimary()?0.5:-0.5);
636 QAbefore(4)->Fill(p,static_cast<Float_t>(processID));
637 if (pass) QAafter(2)->Fill(p,pdg);
638 if (pass) QAafter(3)->Fill(p,IsPhysicalPrimary()?0.5:-0.5);
639 if (pass) QAafter(4)->Fill(p,static_cast<Float_t>(processID));
643 //true by default, if we didn't set any cuts
647 //_______________________________________________________________________
648 Bool_t AliFlowTrackCuts::PassesAODcuts(const AliAODTrack* track)
653 if (fCutNClustersTPC)
655 Int_t ntpccls = track->GetTPCNcls();
656 if (ntpccls < fNClustersTPCMin || ntpccls > fNClustersTPCMax) pass=kFALSE;
659 if (fCutNClustersITS)
661 Int_t nitscls = track->GetITSNcls();
662 if (nitscls < fNClustersITSMin || nitscls > fNClustersITSMax) pass=kFALSE;
665 if (fCutChi2PerClusterTPC)
667 Double_t chi2tpc = track->Chi2perNDF();
668 if (chi2tpc < fMinChi2PerClusterTPC || chi2tpc > fMaxChi2PerClusterTPC) pass=kFALSE;
671 if (GetRequireTPCRefit() && !(track->GetStatus() & AliESDtrack::kTPCrefit) ) pass=kFALSE;
672 if (GetRequireITSRefit() && !(track->GetStatus() & AliESDtrack::kITSrefit) ) pass=kFALSE;
674 if (fUseAODFilterBit && !track->TestFilterBit(fAODFilterBit)) pass=kFALSE;
676 if (fCutDCAToVertexXY && track->DCA()>GetMaxDCAToVertexXY()) pass=kFALSE;
681 //_______________________________________________________________________
682 Bool_t AliFlowTrackCuts::PassesESDcuts(AliESDtrack* track)
684 //check cuts on ESD tracks
688 track->GetImpactParameters(dcaxy,dcaz);
689 const AliExternalTrackParam* pout = track->GetOuterParam();
690 const AliExternalTrackParam* pin = track->GetInnerParam();
691 if (fIgnoreTPCzRange)
695 Double_t zin = pin->GetZ();
696 Double_t zout = pout->GetZ();
697 if (zin*zout<0) pass=kFALSE; //reject if cross the membrane
698 if (zin < fIgnoreTPCzRangeMin || zin > fIgnoreTPCzRangeMax) pass=kFALSE;
699 if (zout < fIgnoreTPCzRangeMin || zout > fIgnoreTPCzRangeMax) pass=kFALSE;
703 Int_t ntpccls = ( fParamType==kTPCstandalone )?
704 track->GetTPCNclsIter1():track->GetTPCNcls();
705 if (fCutChi2PerClusterTPC)
707 Float_t tpcchi2 = (fParamType==kTPCstandalone)?
708 track->GetTPCchi2Iter1():track->GetTPCchi2();
709 tpcchi2 = (ntpccls>0)?tpcchi2/ntpccls:-FLT_MAX;
710 if (tpcchi2<fMinChi2PerClusterTPC || tpcchi2 >=fMaxChi2PerClusterTPC)
714 if (fCutMinimalTPCdedx)
716 if (track->GetTPCsignal() < fMinimalTPCdedx) pass=kFALSE;
719 if (fCutNClustersTPC)
721 if (ntpccls < fNClustersTPCMin || ntpccls > fNClustersTPCMax) pass=kFALSE;
724 Int_t nitscls = track->GetNcls(0);
725 if (fCutNClustersITS)
727 if (nitscls < fNClustersITSMin || nitscls > fNClustersITSMax) pass=kFALSE;
730 //some stuff is still handled by AliESDtrackCuts class - delegate
731 if (fAliESDtrackCuts)
733 if (!fAliESDtrackCuts->IsSelected(track)) pass=kFALSE;
736 //PID part with pid QA
737 Double_t beta = GetBeta(track);
738 Double_t dedx = Getdedx(track);
741 if (pass) QAbefore(0)->Fill(track->GetP(),beta);
742 if (pass) QAbefore(1)->Fill(pin->GetP(),dedx);
744 if (fCutPID && (fParticleID!=AliPID::kUnknown)) //if kUnknown don't cut on PID
749 if (!PassesTPCpidCut(track)) pass=kFALSE;
752 if (!PassesTPCdedxCut(track)) pass=kFALSE;
755 if (!PassesTOFpidCut(track)) pass=kFALSE;
758 if (!PassesTOFbetaCut(track)) pass=kFALSE;
761 if (!PassesTOFbetaSimpleCut(track)) pass=kFALSE;
764 if (!PassesTPCbayesianCut(track)) pass=kFALSE;
766 // part added by F. Noferini
768 if (!PassesTOFbayesianCut(track)) pass=kFALSE;
770 // end part added by F. Noferini
772 printf("AliFlowTrackCuts::PassesCuts() this should never be called!\n");
777 if (fCutRejectElectronsWithTPCpid)
779 //reject electrons using standard TPC pid
780 Double_t pidTPC[AliPID::kSPECIES];
781 track->GetTPCpid(pidTPC);
782 if (pidTPC[AliPID::kElectron]<fParticleProbability) pass=kFALSE;
786 if (pass) QAafter(0)->Fill(track->GetP(),beta);
787 if (pass) QAafter(1)->Fill(pin->GetP(),dedx);
789 //end pid part with qa
792 Double_t pt = track->Pt();
793 QAbefore(5)->Fill(pt,dcaxy);
794 QAbefore(6)->Fill(pt,dcaz);
795 if (pass) QAafter(5)->Fill(pt,dcaxy);
796 if (pass) QAafter(6)->Fill(pt,dcaz);
802 //-----------------------------------------------------------------------
803 void AliFlowTrackCuts::HandleVParticle(AliVParticle* track)
805 //handle the general case
814 //-----------------------------------------------------------------------
815 void AliFlowTrackCuts::HandleESDtrack(AliESDtrack* track)
824 if (!track->FillTPCOnlyTrack(fTPCtrack))
832 //recalculate the label and mc particle, they may differ as TPClabel != global label
833 fTrackLabel = (fFakesAreOK)?TMath::Abs(fTrack->GetLabel()):fTrack->GetLabel();
834 if (fMCevent) fMCparticle = static_cast<AliMCParticle*>(fMCevent->GetTrack(fTrackLabel));
835 else fMCparticle=NULL;
843 //-----------------------------------------------------------------------
844 Int_t AliFlowTrackCuts::Count(AliVEvent* event)
846 //calculate the number of track in given event.
847 //if argument is NULL(default) take the event attached
849 Int_t multiplicity = 0;
852 for (Int_t i=0; i<GetNumberOfInputObjects(); i++)
854 if (IsSelected(GetInputObject(i))) multiplicity++;
859 for (Int_t i=0; i<event->GetNumberOfTracks(); i++)
861 if (IsSelected(event->GetTrack(i))) multiplicity++;
867 //-----------------------------------------------------------------------
868 AliFlowTrackCuts* AliFlowTrackCuts::GetStandardVZEROOnlyTrackCuts()
870 AliFlowTrackCuts* cuts = new AliFlowTrackCuts("standard vzero flow cuts");
871 cuts->SetParamType(kV0);
872 cuts->SetEtaRange( -10, +10 );
873 cuts->SetPhiMin( 0 );
874 cuts->SetPhiMax( TMath::TwoPi() );
878 //-----------------------------------------------------------------------
879 AliFlowTrackCuts* AliFlowTrackCuts::GetStandardGlobalTrackCuts2010()
882 AliFlowTrackCuts* cuts = new AliFlowTrackCuts("standard Global tracks");
883 cuts->SetParamType(kGlobal);
884 cuts->SetPtRange(0.2,5.);
885 cuts->SetEtaRange(-0.8,0.8);
886 cuts->SetMinNClustersTPC(70);
887 cuts->SetMinChi2PerClusterTPC(0.1);
888 cuts->SetMaxChi2PerClusterTPC(4.0);
889 cuts->SetMinNClustersITS(2);
890 cuts->SetRequireITSRefit(kTRUE);
891 cuts->SetRequireTPCRefit(kTRUE);
892 cuts->SetMaxDCAToVertexXY(0.3);
893 cuts->SetMaxDCAToVertexZ(0.3);
894 cuts->SetAcceptKinkDaughters(kFALSE);
895 cuts->SetMinimalTPCdedx(10.);
900 //-----------------------------------------------------------------------
901 AliFlowTrackCuts* AliFlowTrackCuts::GetStandardTPCStandaloneTrackCuts2010()
904 AliFlowTrackCuts* cuts = new AliFlowTrackCuts("standard TPC standalone 2010");
905 cuts->SetParamType(kTPCstandalone);
906 cuts->SetPtRange(0.2,5.);
907 cuts->SetEtaRange(-0.8,0.8);
908 cuts->SetMinNClustersTPC(70);
909 cuts->SetMinChi2PerClusterTPC(0.2);
910 cuts->SetMaxChi2PerClusterTPC(4.0);
911 cuts->SetMaxDCAToVertexXY(3.0);
912 cuts->SetMaxDCAToVertexZ(3.0);
913 cuts->SetDCAToVertex2D(kTRUE);
914 cuts->SetAcceptKinkDaughters(kFALSE);
915 cuts->SetMinimalTPCdedx(10.);
920 //-----------------------------------------------------------------------
921 AliFlowTrackCuts* AliFlowTrackCuts::GetStandardTPCStandaloneTrackCuts()
924 AliFlowTrackCuts* cuts = new AliFlowTrackCuts("standard TPC standalone");
925 cuts->SetParamType(kTPCstandalone);
926 cuts->SetPtRange(0.2,5.);
927 cuts->SetEtaRange(-0.8,0.8);
928 cuts->SetMinNClustersTPC(70);
929 cuts->SetMinChi2PerClusterTPC(0.2);
930 cuts->SetMaxChi2PerClusterTPC(4.0);
931 cuts->SetMaxDCAToVertexXY(3.0);
932 cuts->SetMaxDCAToVertexZ(3.0);
933 cuts->SetDCAToVertex2D(kTRUE);
934 cuts->SetAcceptKinkDaughters(kFALSE);
935 cuts->SetMinimalTPCdedx(10.);
940 //-----------------------------------------------------------------------
941 AliFlowTrackCuts* AliFlowTrackCuts::GetStandardITSTPCTrackCuts2009(Bool_t selPrimaries)
944 AliFlowTrackCuts* cuts = new AliFlowTrackCuts("standard global track cuts 2009");
945 delete cuts->fAliESDtrackCuts;
946 cuts->fAliESDtrackCuts = AliESDtrackCuts::GetStandardITSTPCTrackCuts2009(selPrimaries);
947 cuts->SetParamType(kGlobal);
951 //-----------------------------------------------------------------------
952 Bool_t AliFlowTrackCuts::FillFlowTrackGeneric(AliFlowTrack* flowtrack) const
954 //fill a flow track from tracklet,vzero,pmd,...
955 TParticle *tmpTParticle=NULL;
956 AliMCParticle* tmpAliMCParticle=NULL;
960 flowtrack->SetPhi(fTrackPhi);
961 flowtrack->SetEta(fTrackEta);
963 case kTrackWithMCkine:
964 if (!fMCparticle) return kFALSE;
965 flowtrack->SetPhi( fMCparticle->Phi() );
966 flowtrack->SetEta( fMCparticle->Eta() );
967 flowtrack->SetPt( fMCparticle->Pt() );
970 if (!fMCparticle) return kFALSE;
971 flowtrack->SetPhi(fTrackPhi);
972 flowtrack->SetEta(fTrackEta);
973 flowtrack->SetPt(fMCparticle->Pt());
975 case kTrackWithPtFromFirstMother:
976 if (!fMCparticle) return kFALSE;
977 flowtrack->SetPhi(fTrackPhi);
978 flowtrack->SetEta(fTrackEta);
979 tmpTParticle = fMCparticle->Particle();
980 tmpAliMCParticle = static_cast<AliMCParticle*>(fMCevent->GetTrack(tmpTParticle->GetFirstMother()));
981 flowtrack->SetPt(tmpAliMCParticle->Pt());
984 flowtrack->SetPhi(fTrackPhi);
985 flowtrack->SetEta(fTrackEta);
988 flowtrack->SetSource(AliFlowTrack::kFromTracklet);
992 //-----------------------------------------------------------------------
993 Bool_t AliFlowTrackCuts::FillFlowTrackVParticle(AliFlowTrack* flowtrack) const
995 //fill flow track from AliVParticle (ESD,AOD,MC)
996 if (!fTrack) return kFALSE;
997 TParticle *tmpTParticle=NULL;
998 AliMCParticle* tmpAliMCParticle=NULL;
999 AliExternalTrackParam* externalParams=NULL;
1000 AliESDtrack* esdtrack=NULL;
1004 flowtrack->Set(fTrack);
1006 case kTrackWithMCkine:
1007 flowtrack->Set(fMCparticle);
1009 case kTrackWithMCPID:
1010 flowtrack->Set(fTrack);
1011 //flowtrack->setPID(...) from mc, when implemented
1013 case kTrackWithMCpt:
1014 if (!fMCparticle) return kFALSE;
1015 flowtrack->Set(fTrack);
1016 flowtrack->SetPt(fMCparticle->Pt());
1018 case kTrackWithPtFromFirstMother:
1019 if (!fMCparticle) return kFALSE;
1020 flowtrack->Set(fTrack);
1021 tmpTParticle = fMCparticle->Particle();
1022 tmpAliMCParticle = static_cast<AliMCParticle*>(fMCevent->GetTrack(tmpTParticle->GetFirstMother()));
1023 flowtrack->SetPt(tmpAliMCParticle->Pt());
1025 case kTrackWithTPCInnerParams:
1026 esdtrack = dynamic_cast<AliESDtrack*>(fTrack);
1027 if (!esdtrack) return kFALSE;
1028 externalParams = const_cast<AliExternalTrackParam*>(esdtrack->GetTPCInnerParam());
1029 if (!externalParams) return kFALSE;
1030 flowtrack->Set(externalParams);
1033 flowtrack->Set(fTrack);
1036 if (fParamType==kMC)
1038 flowtrack->SetSource(AliFlowTrack::kFromMC);
1039 flowtrack->SetID(fTrack->GetLabel());
1041 else if (dynamic_cast<AliESDtrack*>(fTrack))
1043 flowtrack->SetSource(AliFlowTrack::kFromESD);
1044 flowtrack->SetID(static_cast<AliVTrack*>(fTrack)->GetID());
1046 else if (dynamic_cast<AliAODTrack*>(fTrack))
1048 flowtrack->SetSource(AliFlowTrack::kFromAOD);
1049 flowtrack->SetID(static_cast<AliVTrack*>(fTrack)->GetID());
1051 else if (dynamic_cast<AliMCParticle*>(fTrack))
1053 flowtrack->SetSource(AliFlowTrack::kFromMC);
1054 flowtrack->SetID(static_cast<AliVTrack*>(fTrack)->GetID());
1059 //-----------------------------------------------------------------------
1060 Bool_t AliFlowTrackCuts::FillFlowTrack(AliFlowTrack* track) const
1062 //fill a flow track constructed from whatever we applied cuts on
1063 //return true on success
1067 return FillFlowTrackGeneric(track);
1069 return FillFlowTrackGeneric(track);
1071 return FillFlowTrackGeneric(track);
1073 return FillFlowTrackVParticle(track);
1077 //-----------------------------------------------------------------------
1078 AliFlowTrack* AliFlowTrackCuts::MakeFlowTrackSPDtracklet() const
1080 //make a flow track from tracklet
1081 AliFlowTrack* flowtrack=NULL;
1082 TParticle *tmpTParticle=NULL;
1083 AliMCParticle* tmpAliMCParticle=NULL;
1087 flowtrack = new AliFlowTrack();
1088 flowtrack->SetPhi(fTrackPhi);
1089 flowtrack->SetEta(fTrackEta);
1091 case kTrackWithMCkine:
1092 if (!fMCparticle) return NULL;
1093 flowtrack = new AliFlowTrack();
1094 flowtrack->SetPhi( fMCparticle->Phi() );
1095 flowtrack->SetEta( fMCparticle->Eta() );
1096 flowtrack->SetPt( fMCparticle->Pt() );
1098 case kTrackWithMCpt:
1099 if (!fMCparticle) return NULL;
1100 flowtrack = new AliFlowTrack();
1101 flowtrack->SetPhi(fTrackPhi);
1102 flowtrack->SetEta(fTrackEta);
1103 flowtrack->SetPt(fMCparticle->Pt());
1105 case kTrackWithPtFromFirstMother:
1106 if (!fMCparticle) return NULL;
1107 flowtrack = new AliFlowTrack();
1108 flowtrack->SetPhi(fTrackPhi);
1109 flowtrack->SetEta(fTrackEta);
1110 tmpTParticle = fMCparticle->Particle();
1111 tmpAliMCParticle = static_cast<AliMCParticle*>(fMCevent->GetTrack(tmpTParticle->GetFirstMother()));
1112 flowtrack->SetPt(tmpAliMCParticle->Pt());
1115 flowtrack = new AliFlowTrack();
1116 flowtrack->SetPhi(fTrackPhi);
1117 flowtrack->SetEta(fTrackEta);
1120 flowtrack->SetSource(AliFlowTrack::kFromTracklet);
1124 //-----------------------------------------------------------------------
1125 AliFlowTrack* AliFlowTrackCuts::MakeFlowTrackVParticle() const
1127 //make flow track from AliVParticle (ESD,AOD,MC)
1128 if (!fTrack) return NULL;
1129 AliFlowTrack* flowtrack=NULL;
1130 TParticle *tmpTParticle=NULL;
1131 AliMCParticle* tmpAliMCParticle=NULL;
1132 AliExternalTrackParam* externalParams=NULL;
1133 AliESDtrack* esdtrack=NULL;
1137 flowtrack = new AliFlowTrack(fTrack);
1139 case kTrackWithMCkine:
1140 flowtrack = new AliFlowTrack(fMCparticle);
1142 case kTrackWithMCPID:
1143 flowtrack = new AliFlowTrack(fTrack);
1144 //flowtrack->setPID(...) from mc, when implemented
1146 case kTrackWithMCpt:
1147 if (!fMCparticle) return NULL;
1148 flowtrack = new AliFlowTrack(fTrack);
1149 flowtrack->SetPt(fMCparticle->Pt());
1151 case kTrackWithPtFromFirstMother:
1152 if (!fMCparticle) return NULL;
1153 flowtrack = new AliFlowTrack(fTrack);
1154 tmpTParticle = fMCparticle->Particle();
1155 tmpAliMCParticle = static_cast<AliMCParticle*>(fMCevent->GetTrack(tmpTParticle->GetFirstMother()));
1156 flowtrack->SetPt(tmpAliMCParticle->Pt());
1158 case kTrackWithTPCInnerParams:
1159 esdtrack = dynamic_cast<AliESDtrack*>(fTrack);
1160 if (!esdtrack) return NULL;
1161 externalParams = const_cast<AliExternalTrackParam*>(esdtrack->GetTPCInnerParam());
1162 if (!externalParams) return NULL;
1163 flowtrack = new AliFlowTrack(externalParams);
1166 flowtrack = new AliFlowTrack(fTrack);
1169 if (fParamType==kMC)
1171 flowtrack->SetSource(AliFlowTrack::kFromMC);
1172 flowtrack->SetID(fTrack->GetLabel());
1174 else if (dynamic_cast<AliESDtrack*>(fTrack))
1176 flowtrack->SetSource(AliFlowTrack::kFromESD);
1177 flowtrack->SetID(static_cast<AliVTrack*>(fTrack)->GetID());
1179 else if (dynamic_cast<AliAODTrack*>(fTrack))
1181 flowtrack->SetSource(AliFlowTrack::kFromAOD);
1182 flowtrack->SetID(static_cast<AliVTrack*>(fTrack)->GetID());
1184 else if (dynamic_cast<AliMCParticle*>(fTrack))
1186 flowtrack->SetSource(AliFlowTrack::kFromMC);
1187 flowtrack->SetID(static_cast<AliVTrack*>(fTrack)->GetID());
1192 //-----------------------------------------------------------------------
1193 AliFlowTrack* AliFlowTrackCuts::MakeFlowTrackPMDtrack() const
1195 //make a flow track from PMD track
1196 AliFlowTrack* flowtrack=NULL;
1197 TParticle *tmpTParticle=NULL;
1198 AliMCParticle* tmpAliMCParticle=NULL;
1202 flowtrack = new AliFlowTrack();
1203 flowtrack->SetPhi(fTrackPhi);
1204 flowtrack->SetEta(fTrackEta);
1205 flowtrack->SetWeight(fTrackWeight);
1207 case kTrackWithMCkine:
1208 if (!fMCparticle) return NULL;
1209 flowtrack = new AliFlowTrack();
1210 flowtrack->SetPhi( fMCparticle->Phi() );
1211 flowtrack->SetEta( fMCparticle->Eta() );
1212 flowtrack->SetWeight(fTrackWeight);
1213 flowtrack->SetPt( fMCparticle->Pt() );
1215 case kTrackWithMCpt:
1216 if (!fMCparticle) return NULL;
1217 flowtrack = new AliFlowTrack();
1218 flowtrack->SetPhi(fTrackPhi);
1219 flowtrack->SetEta(fTrackEta);
1220 flowtrack->SetWeight(fTrackWeight);
1221 flowtrack->SetPt(fMCparticle->Pt());
1223 case kTrackWithPtFromFirstMother:
1224 if (!fMCparticle) return NULL;
1225 flowtrack = new AliFlowTrack();
1226 flowtrack->SetPhi(fTrackPhi);
1227 flowtrack->SetEta(fTrackEta);
1228 flowtrack->SetWeight(fTrackWeight);
1229 tmpTParticle = fMCparticle->Particle();
1230 tmpAliMCParticle = static_cast<AliMCParticle*>(fMCevent->GetTrack(tmpTParticle->GetFirstMother()));
1231 flowtrack->SetPt(tmpAliMCParticle->Pt());
1234 flowtrack = new AliFlowTrack();
1235 flowtrack->SetPhi(fTrackPhi);
1236 flowtrack->SetEta(fTrackEta);
1237 flowtrack->SetWeight(fTrackWeight);
1241 flowtrack->SetSource(AliFlowTrack::kFromPMD);
1245 //-----------------------------------------------------------------------
1246 AliFlowTrack* AliFlowTrackCuts::MakeFlowTrackV0() const
1248 //make a flow track from V0
1249 AliFlowTrack* flowtrack=NULL;
1250 TParticle *tmpTParticle=NULL;
1251 AliMCParticle* tmpAliMCParticle=NULL;
1255 flowtrack = new AliFlowTrack();
1256 flowtrack->SetPhi(fTrackPhi);
1257 flowtrack->SetEta(fTrackEta);
1258 flowtrack->SetWeight(fTrackWeight);
1260 case kTrackWithMCkine:
1261 if (!fMCparticle) return NULL;
1262 flowtrack = new AliFlowTrack();
1263 flowtrack->SetPhi( fMCparticle->Phi() );
1264 flowtrack->SetEta( fMCparticle->Eta() );
1265 flowtrack->SetWeight(fTrackWeight);
1266 flowtrack->SetPt( fMCparticle->Pt() );
1268 case kTrackWithMCpt:
1269 if (!fMCparticle) return NULL;
1270 flowtrack = new AliFlowTrack();
1271 flowtrack->SetPhi(fTrackPhi);
1272 flowtrack->SetEta(fTrackEta);
1273 flowtrack->SetWeight(fTrackWeight);
1274 flowtrack->SetPt(fMCparticle->Pt());
1276 case kTrackWithPtFromFirstMother:
1277 if (!fMCparticle) return NULL;
1278 flowtrack = new AliFlowTrack();
1279 flowtrack->SetPhi(fTrackPhi);
1280 flowtrack->SetEta(fTrackEta);
1281 flowtrack->SetWeight(fTrackWeight);
1282 tmpTParticle = fMCparticle->Particle();
1283 tmpAliMCParticle = static_cast<AliMCParticle*>(fMCevent->GetTrack(tmpTParticle->GetFirstMother()));
1284 flowtrack->SetPt(tmpAliMCParticle->Pt());
1287 flowtrack = new AliFlowTrack();
1288 flowtrack->SetPhi(fTrackPhi);
1289 flowtrack->SetEta(fTrackEta);
1290 flowtrack->SetWeight(fTrackWeight);
1294 flowtrack->SetSource(AliFlowTrack::kFromV0);
1298 //-----------------------------------------------------------------------
1299 AliFlowTrack* AliFlowTrackCuts::MakeFlowTrack() const
1301 //get a flow track constructed from whatever we applied cuts on
1302 //caller is resposible for deletion
1303 //if construction fails return NULL
1304 //TODO: for tracklets, PMD and V0 we probably need just one method,
1305 //something like MakeFlowTrackGeneric(), wait with this until
1306 //requirements quirks are known.
1310 return MakeFlowTrackSPDtracklet();
1312 return MakeFlowTrackPMDtrack();
1314 return MakeFlowTrackV0();
1316 return MakeFlowTrackVParticle();
1320 //-----------------------------------------------------------------------
1321 Bool_t AliFlowTrackCuts::IsPhysicalPrimary() const
1323 //check if current particle is a physical primary
1324 if (!fMCevent) return kFALSE;
1325 if (fTrackLabel<0) return kFALSE;
1326 return IsPhysicalPrimary(fMCevent, fTrackLabel, fRequireTransportBitForPrimaries);
1329 //-----------------------------------------------------------------------
1330 Bool_t AliFlowTrackCuts::IsPhysicalPrimary(AliMCEvent* mcEvent, Int_t label, Bool_t requiretransported)
1332 //check if current particle is a physical primary
1333 Bool_t physprim=mcEvent->IsPhysicalPrimary(label);
1334 AliMCParticle* track = static_cast<AliMCParticle*>(mcEvent->GetTrack(label));
1335 if (!track) return kFALSE;
1336 TParticle* particle = track->Particle();
1337 Bool_t transported = particle->TestBit(kTransportBit);
1338 //printf("label: %i prim: %s, transp: %s, pass: %s\n",label, (physprim)?"YES":"NO ",(transported)?"YES":"NO ",
1339 //(physprim && (transported || !requiretransported))?"YES":"NO" );
1340 return (physprim && (transported || !requiretransported));
1343 //-----------------------------------------------------------------------
1344 void AliFlowTrackCuts::DefineHistograms()
1346 //define qa histograms
1349 const Int_t kNbinsP=60;
1350 Double_t binsP[kNbinsP+1];
1352 for(int i=1; i<=kNbinsP+1; i++)
1354 if(binsP[i-1]+0.05<1.01)
1355 binsP[i]=binsP[i-1]+0.05;
1357 binsP[i]=binsP[i-1]+0.1;
1360 const Int_t nBinsDCA=1000;
1361 Double_t binsDCA[nBinsDCA+1];
1362 for(int i=0; i<nBinsDCA+1; i++) {binsDCA[i]=0.01*i-5.;}
1363 //for(int i=1; i<41; i++) {binsDCA[i+100]=0.1*i+1.0;}
1365 Bool_t adddirstatus = TH1::AddDirectoryStatus();
1366 TH1::AddDirectory(kFALSE);
1367 fQA=new TList(); fQA->SetOwner();
1368 fQA->SetName(Form("%s QA",GetName()));
1369 TList* before = new TList(); before->SetOwner();
1370 before->SetName("before");
1371 TList* after = new TList(); after->SetOwner();
1372 after->SetName("after");
1375 before->Add(new TH2F("TOFbeta",";p [GeV/c];#beta",kNbinsP,binsP,1000,0.4,1.1)); //0
1376 after->Add(new TH2F("TOFbeta",";p [GeV/c];#beta",kNbinsP,binsP,1000,0.4,1.1)); //0
1377 before->Add(new TH2F("TPCdedx",";p [GeV/c];dEdx",kNbinsP,binsP,500,0,500)); //1
1378 after->Add(new TH2F("TPCdedx",";p [GeV/c];dEdx",kNbinsP,binsP,500,0,500)); //1
1379 before->Add(new TH2F("MC pid",";p[GeV/c];species",kNbinsP,binsP,10,-5, 5)); //2
1380 after->Add(new TH2F("MC pid",";p[GeV/c];species",kNbinsP,binsP,10,-5, 5)); //2
1381 before->Add(new TH2F("MC primary",";p[GeV/c];primary",kNbinsP,binsP,2,-1,1)); //3
1382 after->Add(new TH2F("MC primary",";p[GeV/c];primary",kNbinsP,binsP,2,-1,1)); //3
1383 //production process
1384 TH2F* hb = new TH2F("MC production process",";p[GeV/c];",kNbinsP,binsP,kMaxMCProcess,
1385 -0.5, kMaxMCProcess-0.5);
1386 TH2F* ha = new TH2F("MC production process",";p[GeV/c];",kNbinsP,binsP,kMaxMCProcess,
1387 -0.5, kMaxMCProcess-0.5);
1388 TAxis* axis = hb->GetYaxis();
1389 for (Int_t i=0; i<kMaxMCProcess; i++)
1391 axis->SetBinLabel(i+1,TMCProcessName[i]);
1393 axis = ha->GetYaxis();
1394 for (Int_t i=0; i<kMaxMCProcess; i++)
1396 axis->SetBinLabel(i+1,TMCProcessName[i]);
1398 before->Add(hb); //4
1401 before->Add(new TH2F("DCAxy",";p_{t}[GeV/c];DCAxy[cm]", 100, 0., 10., nBinsDCA, binsDCA));//5
1402 after->Add(new TH2F("DCAxy",";p_{t}[GeV/c];DCAxy[cm]", 100, 0., 10., nBinsDCA, binsDCA));//5
1403 before->Add(new TH2F("DCAz",";p_{t}[GeV/c];DCAz[cm]", 100, 0., 10., nBinsDCA, binsDCA));//6
1404 after->Add(new TH2F("DCAz",";p_{t}[GeV/c];DCAz[cm]", 100, 0., 10., nBinsDCA, binsDCA));//6
1406 TH1::AddDirectory(adddirstatus);
1409 //-----------------------------------------------------------------------
1410 Int_t AliFlowTrackCuts::GetNumberOfInputObjects() const
1412 //get the number of tracks in the input event according source
1413 //selection (ESD tracks, tracklets, MC particles etc.)
1414 AliESDEvent* esd=NULL;
1418 esd = dynamic_cast<AliESDEvent*>(fEvent);
1420 return esd->GetMultiplicity()->GetNumberOfTracklets();
1422 if (!fMCevent) return 0;
1423 return fMCevent->GetNumberOfTracks();
1425 esd = dynamic_cast<AliESDEvent*>(fEvent);
1427 return esd->GetNumberOfPmdTracks();
1429 return fgkNumberOfV0tracks;
1431 if (!fEvent) return 0;
1432 return fEvent->GetNumberOfTracks();
1437 //-----------------------------------------------------------------------
1438 TObject* AliFlowTrackCuts::GetInputObject(Int_t i)
1440 //get the input object according the data source selection:
1441 //(esd tracks, traclets, mc particles,etc...)
1442 AliESDEvent* esd=NULL;
1446 esd = dynamic_cast<AliESDEvent*>(fEvent);
1447 if (!esd) return NULL;
1448 return const_cast<AliMultiplicity*>(esd->GetMultiplicity());
1450 if (!fMCevent) return NULL;
1451 return fMCevent->GetTrack(i);
1453 esd = dynamic_cast<AliESDEvent*>(fEvent);
1454 if (!esd) return NULL;
1455 return esd->GetPmdTrack(i);
1457 esd = dynamic_cast<AliESDEvent*>(fEvent);
1458 if (!esd) return NULL;
1459 return esd->GetVZEROData();
1461 if (!fEvent) return NULL;
1462 return fEvent->GetTrack(i);
1466 //-----------------------------------------------------------------------
1467 void AliFlowTrackCuts::Clear(Option_t*)
1479 //-----------------------------------------------------------------------
1480 Bool_t AliFlowTrackCuts::PassesTOFbetaSimpleCut(const AliESDtrack* track )
1482 //check if passes PID cut using timing in TOF
1483 Bool_t goodtrack = (track->GetStatus() & AliESDtrack::kTOFpid) &&
1484 (track->GetTOFsignal() > 12000) &&
1485 (track->GetTOFsignal() < 100000) &&
1486 (track->GetIntegratedLength() > 365);
1488 if (!fAllowTOFmismatchFlag) {if ((track->GetStatus() & AliESDtrack::kTOFmismatch)) return kFALSE;}
1490 Bool_t statusMatchingHard = TPCTOFagree(track);
1491 if (fRequireStrictTOFTPCagreement && (!statusMatchingHard))
1494 if (!goodtrack) return kFALSE;
1496 const Float_t c = 2.99792457999999984e-02;
1497 Float_t p = track->GetP();
1498 Float_t l = track->GetIntegratedLength();
1499 Float_t trackT0 = fESDpid.GetTOFResponse().GetStartTime(p);
1500 Float_t timeTOF = track->GetTOFsignal()- trackT0;
1501 Float_t beta = l/timeTOF/c;
1502 Double_t integratedTimes[5] = {-1.0,-1.0,-1.0,-1.0,-1.0};
1503 track->GetIntegratedTimes(integratedTimes);
1504 Float_t betaHypothesis[5] = {0.0,0.0,0.0,0.0,0.0};
1505 Float_t s[5] = {0.0,0.0,0.0,0.0,0.0};
1506 for (Int_t i=0;i<5;i++)
1508 betaHypothesis[i] = l/integratedTimes[i]/c;
1509 s[i] = beta-betaHypothesis[i];
1512 switch (fParticleID)
1515 return ( (s[2]<0.015) && (s[2]>-0.015) &&
1519 return ( (s[3]<0.015) && (s[3]>-0.015) &&
1522 case AliPID::kProton:
1523 return ( (s[4]<0.015) && (s[4]>-0.015) &&
1532 //-----------------------------------------------------------------------
1533 Float_t AliFlowTrackCuts::GetBeta(const AliESDtrack* track)
1536 const Float_t c = 2.99792457999999984e-02;
1537 Float_t p = track->GetP();
1538 Float_t l = track->GetIntegratedLength();
1539 Float_t trackT0 = fESDpid.GetTOFResponse().GetStartTime(p);
1540 Float_t timeTOF = track->GetTOFsignal()- trackT0;
1544 //-----------------------------------------------------------------------
1545 Bool_t AliFlowTrackCuts::PassesTOFbetaCut(const AliESDtrack* track )
1549 //printf("no TOFpidCuts\n");
1553 //check if passes PID cut using timing in TOF
1554 Bool_t goodtrack = (track->GetStatus() & AliESDtrack::kTOFpid) &&
1555 (track->GetTOFsignal() > 12000) &&
1556 (track->GetTOFsignal() < 100000) &&
1557 (track->GetIntegratedLength() > 365);
1559 if (!fAllowTOFmismatchFlag) {if ((track->GetStatus() & AliESDtrack::kTOFmismatch)) return kFALSE;}
1561 Bool_t statusMatchingHard = TPCTOFagree(track);
1562 if (fRequireStrictTOFTPCagreement && (!statusMatchingHard))
1565 if (!goodtrack) return kFALSE;
1567 Float_t beta = GetBeta(track);
1569 Double_t integratedTimes[5] = {-1.0,-1.0,-1.0,-1.0,-1.0};
1570 track->GetIntegratedTimes(integratedTimes);
1572 //construct the pid index because it's not AliPID::EParticleType
1574 switch (fParticleID)
1582 case AliPID::kProton:
1590 const Float_t c = 2.99792457999999984e-02;
1591 Float_t l = track->GetIntegratedLength();
1592 Float_t p = track->GetP();
1593 Float_t betahypothesis = l/integratedTimes[pid]/c;
1594 Float_t betadiff = beta-betahypothesis;
1596 Float_t* arr = fTOFpidCuts->GetMatrixArray();
1597 Int_t col = TMath::BinarySearch(fTOFpidCuts->GetNcols(),arr,static_cast<Float_t>(p));
1598 if (col<0) return kFALSE;
1599 Float_t min = (*fTOFpidCuts)(1,col);
1600 Float_t max = (*fTOFpidCuts)(2,col);
1602 Bool_t pass = (betadiff>min && betadiff<max);
1607 //-----------------------------------------------------------------------
1608 Bool_t AliFlowTrackCuts::PassesTOFpidCut(const AliESDtrack* track) const
1610 //check if passes PID cut using default TOF pid
1611 Double_t pidTOF[AliPID::kSPECIES];
1612 track->GetTOFpid(pidTOF);
1613 if (pidTOF[fParticleID]>=fParticleProbability) return kTRUE;
1617 //-----------------------------------------------------------------------
1618 Bool_t AliFlowTrackCuts::PassesTPCpidCut(const AliESDtrack* track) const
1620 //check if passes PID cut using default TPC pid
1621 Double_t pidTPC[AliPID::kSPECIES];
1622 track->GetTPCpid(pidTPC);
1623 Double_t probablity = 0.;
1624 switch (fParticleID)
1627 probablity = pidTPC[AliPID::kPion] + pidTPC[AliPID::kMuon];
1630 probablity = pidTPC[fParticleID];
1632 if (probablity >= fParticleProbability) return kTRUE;
1636 //-----------------------------------------------------------------------
1637 Float_t AliFlowTrackCuts::Getdedx(const AliESDtrack* track)
1640 return track->GetTPCsignal();
1643 //-----------------------------------------------------------------------
1644 Bool_t AliFlowTrackCuts::PassesTPCdedxCut(const AliESDtrack* track)
1646 //check if passes PID cut using dedx signal in the TPC
1649 //printf("no TPCpidCuts\n");
1653 const AliExternalTrackParam* tpcparam = track->GetInnerParam(); //tpc only params at the inner wall
1654 if (!tpcparam) return kFALSE;
1655 Double_t p = tpcparam->GetP();
1656 Float_t sigExp = fESDpid.GetTPCResponse().GetExpectedSignal(p, fParticleID);
1657 Float_t sigTPC = track->GetTPCsignal();
1658 Float_t s = (sigTPC-sigExp)/sigExp;
1660 Float_t* arr = fTPCpidCuts->GetMatrixArray();
1661 Int_t arrSize = fTPCpidCuts->GetNcols();
1662 Int_t col = TMath::BinarySearch( arrSize, arr, static_cast<Float_t>(p));
1663 if (col<0) return kFALSE;
1664 Float_t min = (*fTPCpidCuts)(1,col);
1665 Float_t max = (*fTPCpidCuts)(2,col);
1667 //printf("------------TPC pid cut %s\n",(s>min && s<max)?"PASS":"FAIL");
1668 return (s>min && s<max);
1671 //-----------------------------------------------------------------------
1672 void AliFlowTrackCuts::InitPIDcuts()
1674 //init matrices with PID cuts
1678 if (fParticleID==AliPID::kPion)
1680 t = new TMatrixF(3,15);
1681 (*t)(0,0) = 0.20; (*t)(1,0) = -0.4; (*t)(2,0) = 0.0;
1682 (*t)(0,1) = 0.25; (*t)(1,1) = -0.4; (*t)(2,1) = 0.1;
1683 (*t)(0,2) = 0.30; (*t)(1,2) = -0.4; (*t)(2,2) = 0.2;
1684 (*t)(0,3) = 0.35; (*t)(1,3) = -0.4; (*t)(2,3) = 0.2;
1685 (*t)(0,4) = 0.40; (*t)(1,4) = -0.4; (*t)(2,4) = 0.3;
1686 (*t)(0,5) = 0.45; (*t)(1,5) = -0.4; (*t)(2,5) = 0.3;
1687 (*t)(0,6) = 0.50; (*t)(1,6) = -0.4; (*t)(2,6) = 0.25;
1688 (*t)(0,7) = 0.55; (*t)(1,7) = -0.4; (*t)(2,7) = 0.15;
1689 (*t)(0,8) = 0.60; (*t)(1,8) = -0.4; (*t)(2,8) = 0.1;
1690 (*t)(0,9) = 0.65; (*t)(1,9) = -0.4; (*t)(2,9) = 0.05;
1691 (*t)(0,10) = 0.70; (*t)(1,10) = -0.4; (*t)(2,10) = 0;
1692 (*t)(0,11) = 0.75; (*t)(1,11) = -0.4; (*t)(2,11) = 0;
1693 (*t)(0,12) = 0.80; (*t)(1,12) = -0.4; (*t)(2,12) = -0.05;
1694 (*t)(0,13) = 0.85; (*t)(1,13) = -0.4; (*t)(2,13) = -0.1;
1695 (*t)(0,14) = 0.90; (*t)(1,14) = 0; (*t)(2,14) = 0;
1698 if (fParticleID==AliPID::kKaon)
1700 t = new TMatrixF(3,12);
1701 (*t)(0,0) = 0.20; (*t)(1,0) = -0.2; (*t)(2,0) = 0.2;
1702 (*t)(0,1) = 0.25; (*t)(1,1) = -0.2; (*t)(2,1) = 0.2;
1703 (*t)(0,2) = 0.30; (*t)(1,2) = -0.2; (*t)(2,2) = 0.2;
1704 (*t)(0,3) = 0.35; (*t)(1,3) = -0.2; (*t)(2,3) = 0.2;
1705 (*t)(0,4) = 0.40; (*t)(1,4) = -0.1; (*t)(2,4) = 0.2;
1706 (*t)(0,5) = 0.45; (*t)(1,5) = -0.1; (*t)(2,5) = 0.2;
1707 (*t)(0,6) = 0.50; (*t)(1,6) =-0.05; (*t)(2,6) = 0.2;
1708 (*t)(0,7) = 0.55; (*t)(1,7) = -0.1; (*t)(2,7) = 0.1;
1709 (*t)(0,8) = 0.60; (*t)(1,8) =-0.05; (*t)(2,8) = 0.1;
1710 (*t)(0,9) = 0.65; (*t)(1,9) = 0; (*t)(2,9) = 0.15;
1711 (*t)(0,10) = 0.70; (*t)(1,10) = 0.05; (*t)(2,10) = 0.2;
1712 (*t)(0,11) = 0.75; (*t)(1,11) = 0; (*t)(2,11) = 0;
1715 if (fParticleID==AliPID::kProton)
1717 t = new TMatrixF(3,9);
1718 (*t)(0,0) = 0.20; (*t)(1,0) = -0.1; (*t)(2,0) = 0.1;
1719 (*t)(0,1) = 0.25; (*t)(1,1) = -0.2; (*t)(2,1) = 0.2;
1720 (*t)(0,2) = 0.80; (*t)(1,2) = -0.1; (*t)(2,2) = 0.2;
1721 (*t)(0,3) = 0.85; (*t)(1,3) =-0.05; (*t)(2,3) = 0.2;
1722 (*t)(0,4) = 0.90; (*t)(1,4) =-0.05; (*t)(2,4) = 0.25;
1723 (*t)(0,5) = 0.95; (*t)(1,5) =-0.05; (*t)(2,5) = 0.25;
1724 (*t)(0,6) = 1.00; (*t)(1,6) = -0.1; (*t)(2,6) = 0.25;
1725 (*t)(0,7) = 1.10; (*t)(1,7) =-0.05; (*t)(2,7) = 0.3;
1726 (*t)(0,8) = 1.20; (*t)(1,8) = 0; (*t)(2,8) = 0;
1734 if (fParticleID==AliPID::kPion)
1736 //TOF pions, 0.9 purity
1737 t = new TMatrixF(3,61);
1738 (*t)(0,0) = 0.000; (*t)(1,0) = 0.000; (*t)(2,0) = 0.000;
1739 (*t)(0,1) = 0.050; (*t)(1,1) = 0.000; (*t)(2,1) = 0.000;
1740 (*t)(0,2) = 0.100; (*t)(1,2) = 0.000; (*t)(2,2) = 0.000;
1741 (*t)(0,3) = 0.150; (*t)(1,3) = 0.000; (*t)(2,3) = 0.000;
1742 (*t)(0,4) = 0.200; (*t)(1,4) = -0.030; (*t)(2,4) = 0.030;
1743 (*t)(0,5) = 0.250; (*t)(1,5) = -0.036; (*t)(2,5) = 0.032;
1744 (*t)(0,6) = 0.300; (*t)(1,6) = -0.038; (*t)(2,6) = 0.032;
1745 (*t)(0,7) = 0.350; (*t)(1,7) = -0.034; (*t)(2,7) = 0.032;
1746 (*t)(0,8) = 0.400; (*t)(1,8) = -0.032; (*t)(2,8) = 0.020;
1747 (*t)(0,9) = 0.450; (*t)(1,9) = -0.030; (*t)(2,9) = 0.020;
1748 (*t)(0,10) = 0.500; (*t)(1,10) = -0.030; (*t)(2,10) = 0.020;
1749 (*t)(0,11) = 0.550; (*t)(1,11) = -0.030; (*t)(2,11) = 0.020;
1750 (*t)(0,12) = 0.600; (*t)(1,12) = -0.030; (*t)(2,12) = 0.020;
1751 (*t)(0,13) = 0.650; (*t)(1,13) = -0.030; (*t)(2,13) = 0.020;
1752 (*t)(0,14) = 0.700; (*t)(1,14) = -0.030; (*t)(2,14) = 0.020;
1753 (*t)(0,15) = 0.750; (*t)(1,15) = -0.030; (*t)(2,15) = 0.020;
1754 (*t)(0,16) = 0.800; (*t)(1,16) = -0.030; (*t)(2,16) = 0.020;
1755 (*t)(0,17) = 0.850; (*t)(1,17) = -0.030; (*t)(2,17) = 0.020;
1756 (*t)(0,18) = 0.900; (*t)(1,18) = -0.030; (*t)(2,18) = 0.020;
1757 (*t)(0,19) = 0.950; (*t)(1,19) = -0.028; (*t)(2,19) = 0.028;
1758 (*t)(0,20) = 1.000; (*t)(1,20) = -0.028; (*t)(2,20) = 0.028;
1759 (*t)(0,21) = 1.100; (*t)(1,21) = -0.028; (*t)(2,21) = 0.028;
1760 (*t)(0,22) = 1.200; (*t)(1,22) = -0.026; (*t)(2,22) = 0.028;
1761 (*t)(0,23) = 1.300; (*t)(1,23) = -0.024; (*t)(2,23) = 0.028;
1762 (*t)(0,24) = 1.400; (*t)(1,24) = -0.020; (*t)(2,24) = 0.028;
1763 (*t)(0,25) = 1.500; (*t)(1,25) = -0.018; (*t)(2,25) = 0.028;
1764 (*t)(0,26) = 1.600; (*t)(1,26) = -0.016; (*t)(2,26) = 0.028;
1765 (*t)(0,27) = 1.700; (*t)(1,27) = -0.014; (*t)(2,27) = 0.028;
1766 (*t)(0,28) = 1.800; (*t)(1,28) = -0.012; (*t)(2,28) = 0.026;
1767 (*t)(0,29) = 1.900; (*t)(1,29) = -0.010; (*t)(2,29) = 0.026;
1768 (*t)(0,30) = 2.000; (*t)(1,30) = -0.008; (*t)(2,30) = 0.026;
1769 (*t)(0,31) = 2.100; (*t)(1,31) = -0.008; (*t)(2,31) = 0.024;
1770 (*t)(0,32) = 2.200; (*t)(1,32) = -0.006; (*t)(2,32) = 0.024;
1771 (*t)(0,33) = 2.300; (*t)(1,33) = -0.004; (*t)(2,33) = 0.024;
1772 (*t)(0,34) = 2.400; (*t)(1,34) = -0.004; (*t)(2,34) = 0.024;
1773 (*t)(0,35) = 2.500; (*t)(1,35) = -0.002; (*t)(2,35) = 0.024;
1774 (*t)(0,36) = 2.600; (*t)(1,36) = -0.002; (*t)(2,36) = 0.024;
1775 (*t)(0,37) = 2.700; (*t)(1,37) = 0.000; (*t)(2,37) = 0.024;
1776 (*t)(0,38) = 2.800; (*t)(1,38) = 0.000; (*t)(2,38) = 0.026;
1777 (*t)(0,39) = 2.900; (*t)(1,39) = 0.000; (*t)(2,39) = 0.024;
1778 (*t)(0,40) = 3.000; (*t)(1,40) = 0.002; (*t)(2,40) = 0.026;
1779 (*t)(0,41) = 3.100; (*t)(1,41) = 0.002; (*t)(2,41) = 0.026;
1780 (*t)(0,42) = 3.200; (*t)(1,42) = 0.002; (*t)(2,42) = 0.026;
1781 (*t)(0,43) = 3.300; (*t)(1,43) = 0.002; (*t)(2,43) = 0.026;
1782 (*t)(0,44) = 3.400; (*t)(1,44) = 0.002; (*t)(2,44) = 0.026;
1783 (*t)(0,45) = 3.500; (*t)(1,45) = 0.002; (*t)(2,45) = 0.026;
1784 (*t)(0,46) = 3.600; (*t)(1,46) = 0.002; (*t)(2,46) = 0.026;
1785 (*t)(0,47) = 3.700; (*t)(1,47) = 0.002; (*t)(2,47) = 0.026;
1786 (*t)(0,48) = 3.800; (*t)(1,48) = 0.002; (*t)(2,48) = 0.026;
1787 (*t)(0,49) = 3.900; (*t)(1,49) = 0.004; (*t)(2,49) = 0.024;
1788 (*t)(0,50) = 4.000; (*t)(1,50) = 0.004; (*t)(2,50) = 0.026;
1789 (*t)(0,51) = 4.100; (*t)(1,51) = 0.004; (*t)(2,51) = 0.026;
1790 (*t)(0,52) = 4.200; (*t)(1,52) = 0.004; (*t)(2,52) = 0.024;
1791 (*t)(0,53) = 4.300; (*t)(1,53) = 0.006; (*t)(2,53) = 0.024;
1792 (*t)(0,54) = 4.400; (*t)(1,54) = 0.000; (*t)(2,54) = 0.000;
1793 (*t)(0,55) = 4.500; (*t)(1,55) = 0.000; (*t)(2,55) = 0.000;
1794 (*t)(0,56) = 4.600; (*t)(1,56) = 0.000; (*t)(2,56) = 0.000;
1795 (*t)(0,57) = 4.700; (*t)(1,57) = 0.000; (*t)(2,57) = 0.000;
1796 (*t)(0,58) = 4.800; (*t)(1,58) = 0.000; (*t)(2,58) = 0.000;
1797 (*t)(0,59) = 4.900; (*t)(1,59) = 0.000; (*t)(2,59) = 0.000;
1798 (*t)(0,60) = 5.900; (*t)(1,60) = 0.000; (*t)(2,60) = 0.000;
1801 if (fParticleID==AliPID::kProton)
1803 //TOF protons, 0.9 purity
1804 t = new TMatrixF(3,61);
1805 (*t)(0,0) = 0.000; (*t)(1,0) = 0.000; (*t)(2,0) = 0.000;
1806 (*t)(0,1) = 0.050; (*t)(1,1) = 0.000; (*t)(2,1) = 0.000;
1807 (*t)(0,2) = 0.100; (*t)(1,2) = 0.000; (*t)(2,2) = 0.000;
1808 (*t)(0,3) = 0.150; (*t)(1,3) = 0.000; (*t)(2,3) = 0.000;
1809 (*t)(0,4) = 0.200; (*t)(1,4) = -0.07; (*t)(2,4) = 0.07;
1810 (*t)(0,5) = 0.200; (*t)(1,5) = -0.07; (*t)(2,5) = 0.07;
1811 (*t)(0,6) = 0.200; (*t)(1,6) = -0.07; (*t)(2,6) = 0.07;
1812 (*t)(0,7) = 0.200; (*t)(1,7) = -0.07; (*t)(2,7) = 0.07;
1813 (*t)(0,8) = 0.200; (*t)(1,8) = -0.07; (*t)(2,8) = 0.07;
1814 (*t)(0,9) = 0.200; (*t)(1,9) = -0.07; (*t)(2,9) = 0.07;
1815 (*t)(0,10) = 0.200; (*t)(1,10) = -0.07; (*t)(2,10) = 0.07;
1816 (*t)(0,11) = 0.200; (*t)(1,11) = -0.07; (*t)(2,11) = 0.07;
1817 (*t)(0,12) = 0.200; (*t)(1,12) = -0.07; (*t)(2,12) = 0.07;
1818 (*t)(0,13) = 0.200; (*t)(1,13) = -0.07; (*t)(2,13) = 0.07;
1819 (*t)(0,14) = 0.200; (*t)(1,14) = -0.07; (*t)(2,14) = 0.07;
1820 (*t)(0,15) = 0.200; (*t)(1,15) = -0.07; (*t)(2,15) = 0.07;
1821 (*t)(0,16) = 0.200; (*t)(1,16) = -0.07; (*t)(2,16) = 0.07;
1822 (*t)(0,17) = 0.850; (*t)(1,17) = -0.070; (*t)(2,17) = 0.070;
1823 (*t)(0,18) = 0.900; (*t)(1,18) = -0.072; (*t)(2,18) = 0.072;
1824 (*t)(0,19) = 0.950; (*t)(1,19) = -0.072; (*t)(2,19) = 0.072;
1825 (*t)(0,20) = 1.000; (*t)(1,20) = -0.074; (*t)(2,20) = 0.074;
1826 (*t)(0,21) = 1.100; (*t)(1,21) = -0.032; (*t)(2,21) = 0.032;
1827 (*t)(0,22) = 1.200; (*t)(1,22) = -0.026; (*t)(2,22) = 0.026;
1828 (*t)(0,23) = 1.300; (*t)(1,23) = -0.026; (*t)(2,23) = 0.026;
1829 (*t)(0,24) = 1.400; (*t)(1,24) = -0.024; (*t)(2,24) = 0.024;
1830 (*t)(0,25) = 1.500; (*t)(1,25) = -0.024; (*t)(2,25) = 0.024;
1831 (*t)(0,26) = 1.600; (*t)(1,26) = -0.026; (*t)(2,26) = 0.026;
1832 (*t)(0,27) = 1.700; (*t)(1,27) = -0.026; (*t)(2,27) = 0.026;
1833 (*t)(0,28) = 1.800; (*t)(1,28) = -0.026; (*t)(2,28) = 0.026;
1834 (*t)(0,29) = 1.900; (*t)(1,29) = -0.026; (*t)(2,29) = 0.026;
1835 (*t)(0,30) = 2.000; (*t)(1,30) = -0.026; (*t)(2,30) = 0.026;
1836 (*t)(0,31) = 2.100; (*t)(1,31) = -0.026; (*t)(2,31) = 0.026;
1837 (*t)(0,32) = 2.200; (*t)(1,32) = -0.026; (*t)(2,32) = 0.024;
1838 (*t)(0,33) = 2.300; (*t)(1,33) = -0.028; (*t)(2,33) = 0.022;
1839 (*t)(0,34) = 2.400; (*t)(1,34) = -0.028; (*t)(2,34) = 0.020;
1840 (*t)(0,35) = 2.500; (*t)(1,35) = -0.028; (*t)(2,35) = 0.018;
1841 (*t)(0,36) = 2.600; (*t)(1,36) = -0.028; (*t)(2,36) = 0.016;
1842 (*t)(0,37) = 2.700; (*t)(1,37) = -0.028; (*t)(2,37) = 0.016;
1843 (*t)(0,38) = 2.800; (*t)(1,38) = -0.030; (*t)(2,38) = 0.014;
1844 (*t)(0,39) = 2.900; (*t)(1,39) = -0.030; (*t)(2,39) = 0.012;
1845 (*t)(0,40) = 3.000; (*t)(1,40) = -0.030; (*t)(2,40) = 0.012;
1846 (*t)(0,41) = 3.100; (*t)(1,41) = -0.030; (*t)(2,41) = 0.010;
1847 (*t)(0,42) = 3.200; (*t)(1,42) = -0.030; (*t)(2,42) = 0.010;
1848 (*t)(0,43) = 3.300; (*t)(1,43) = -0.030; (*t)(2,43) = 0.010;
1849 (*t)(0,44) = 3.400; (*t)(1,44) = -0.030; (*t)(2,44) = 0.008;
1850 (*t)(0,45) = 3.500; (*t)(1,45) = -0.030; (*t)(2,45) = 0.008;
1851 (*t)(0,46) = 3.600; (*t)(1,46) = -0.030; (*t)(2,46) = 0.008;
1852 (*t)(0,47) = 3.700; (*t)(1,47) = -0.030; (*t)(2,47) = 0.006;
1853 (*t)(0,48) = 3.800; (*t)(1,48) = -0.030; (*t)(2,48) = 0.006;
1854 (*t)(0,49) = 3.900; (*t)(1,49) = -0.030; (*t)(2,49) = 0.006;
1855 (*t)(0,50) = 4.000; (*t)(1,50) = -0.028; (*t)(2,50) = 0.004;
1856 (*t)(0,51) = 4.100; (*t)(1,51) = -0.030; (*t)(2,51) = 0.004;
1857 (*t)(0,52) = 4.200; (*t)(1,52) = -0.030; (*t)(2,52) = 0.004;
1858 (*t)(0,53) = 4.300; (*t)(1,53) = -0.028; (*t)(2,53) = 0.002;
1859 (*t)(0,54) = 4.400; (*t)(1,54) = -0.030; (*t)(2,54) = 0.002;
1860 (*t)(0,55) = 4.500; (*t)(1,55) = -0.028; (*t)(2,55) = 0.002;
1861 (*t)(0,56) = 4.600; (*t)(1,56) = -0.028; (*t)(2,56) = 0.002;
1862 (*t)(0,57) = 4.700; (*t)(1,57) = -0.028; (*t)(2,57) = 0.000;
1863 (*t)(0,58) = 4.800; (*t)(1,58) = -0.028; (*t)(2,58) = 0.002;
1864 (*t)(0,59) = 4.900; (*t)(1,59) = 0.000; (*t)(2,59) = 0.000;
1865 (*t)(0,60) = 5.900; (*t)(1,60) = 0.000; (*t)(2,60) = 0.000;
1868 if (fParticleID==AliPID::kKaon)
1870 //TOF kaons, 0.9 purity
1871 t = new TMatrixF(3,61);
1872 (*t)(0,0) = 0.000; (*t)(1,0) = 0.000; (*t)(2,0) = 0.000;
1873 (*t)(0,1) = 0.050; (*t)(1,1) = 0.000; (*t)(2,1) = 0.000;
1874 (*t)(0,2) = 0.100; (*t)(1,2) = 0.000; (*t)(2,2) = 0.000;
1875 (*t)(0,3) = 0.150; (*t)(1,3) = 0.000; (*t)(2,3) = 0.000;
1876 (*t)(0,4) = 0.200; (*t)(1,4) = -0.05; (*t)(2,4) = 0.05;
1877 (*t)(0,5) = 0.200; (*t)(1,5) = -0.05; (*t)(2,5) = 0.05;
1878 (*t)(0,6) = 0.200; (*t)(1,6) = -0.05; (*t)(2,6) = 0.05;
1879 (*t)(0,7) = 0.200; (*t)(1,7) = -0.05; (*t)(2,7) = 0.05;
1880 (*t)(0,8) = 0.200; (*t)(1,8) = -0.05; (*t)(2,8) = 0.05;
1881 (*t)(0,9) = 0.200; (*t)(1,9) = -0.05; (*t)(2,9) = 0.05;
1882 (*t)(0,10) = 0.200; (*t)(1,10) = -0.05; (*t)(2,10) = 0.05;
1883 (*t)(0,11) = 0.550; (*t)(1,11) = -0.026; (*t)(2,11) = 0.026;
1884 (*t)(0,12) = 0.600; (*t)(1,12) = -0.026; (*t)(2,12) = 0.026;
1885 (*t)(0,13) = 0.650; (*t)(1,13) = -0.026; (*t)(2,13) = 0.026;
1886 (*t)(0,14) = 0.700; (*t)(1,14) = -0.026; (*t)(2,14) = 0.026;
1887 (*t)(0,15) = 0.750; (*t)(1,15) = -0.026; (*t)(2,15) = 0.026;
1888 (*t)(0,16) = 0.800; (*t)(1,16) = -0.026; (*t)(2,16) = 0.026;
1889 (*t)(0,17) = 0.850; (*t)(1,17) = -0.024; (*t)(2,17) = 0.024;
1890 (*t)(0,18) = 0.900; (*t)(1,18) = -0.024; (*t)(2,18) = 0.024;
1891 (*t)(0,19) = 0.950; (*t)(1,19) = -0.024; (*t)(2,19) = 0.024;
1892 (*t)(0,20) = 1.000; (*t)(1,20) = -0.024; (*t)(2,20) = 0.024;
1893 (*t)(0,21) = 1.100; (*t)(1,21) = -0.024; (*t)(2,21) = 0.024;
1894 (*t)(0,22) = 1.200; (*t)(1,22) = -0.024; (*t)(2,22) = 0.022;
1895 (*t)(0,23) = 1.300; (*t)(1,23) = -0.024; (*t)(2,23) = 0.020;
1896 (*t)(0,24) = 1.400; (*t)(1,24) = -0.026; (*t)(2,24) = 0.016;
1897 (*t)(0,25) = 1.500; (*t)(1,25) = -0.028; (*t)(2,25) = 0.014;
1898 (*t)(0,26) = 1.600; (*t)(1,26) = -0.028; (*t)(2,26) = 0.012;
1899 (*t)(0,27) = 1.700; (*t)(1,27) = -0.028; (*t)(2,27) = 0.010;
1900 (*t)(0,28) = 1.800; (*t)(1,28) = -0.028; (*t)(2,28) = 0.010;
1901 (*t)(0,29) = 1.900; (*t)(1,29) = -0.028; (*t)(2,29) = 0.008;
1902 (*t)(0,30) = 2.000; (*t)(1,30) = -0.028; (*t)(2,30) = 0.006;
1903 (*t)(0,31) = 2.100; (*t)(1,31) = -0.026; (*t)(2,31) = 0.006;
1904 (*t)(0,32) = 2.200; (*t)(1,32) = -0.024; (*t)(2,32) = 0.004;
1905 (*t)(0,33) = 2.300; (*t)(1,33) = -0.020; (*t)(2,33) = 0.002;
1906 (*t)(0,34) = 2.400; (*t)(1,34) = -0.020; (*t)(2,34) = 0.002;
1907 (*t)(0,35) = 2.500; (*t)(1,35) = -0.018; (*t)(2,35) = 0.000;
1908 (*t)(0,36) = 2.600; (*t)(1,36) = -0.016; (*t)(2,36) = 0.000;
1909 (*t)(0,37) = 2.700; (*t)(1,37) = -0.014; (*t)(2,37) = -0.002;
1910 (*t)(0,38) = 2.800; (*t)(1,38) = -0.014; (*t)(2,38) = -0.004;
1911 (*t)(0,39) = 2.900; (*t)(1,39) = -0.012; (*t)(2,39) = -0.004;
1912 (*t)(0,40) = 3.000; (*t)(1,40) = -0.010; (*t)(2,40) = -0.006;
1913 (*t)(0,41) = 3.100; (*t)(1,41) = 0.000; (*t)(2,41) = 0.000;
1914 (*t)(0,42) = 3.200; (*t)(1,42) = 0.000; (*t)(2,42) = 0.000;
1915 (*t)(0,43) = 3.300; (*t)(1,43) = 0.000; (*t)(2,43) = 0.000;
1916 (*t)(0,44) = 3.400; (*t)(1,44) = 0.000; (*t)(2,44) = 0.000;
1917 (*t)(0,45) = 3.500; (*t)(1,45) = 0.000; (*t)(2,45) = 0.000;
1918 (*t)(0,46) = 3.600; (*t)(1,46) = 0.000; (*t)(2,46) = 0.000;
1919 (*t)(0,47) = 3.700; (*t)(1,47) = 0.000; (*t)(2,47) = 0.000;
1920 (*t)(0,48) = 3.800; (*t)(1,48) = 0.000; (*t)(2,48) = 0.000;
1921 (*t)(0,49) = 3.900; (*t)(1,49) = 0.000; (*t)(2,49) = 0.000;
1922 (*t)(0,50) = 4.000; (*t)(1,50) = 0.000; (*t)(2,50) = 0.000;
1923 (*t)(0,51) = 4.100; (*t)(1,51) = 0.000; (*t)(2,51) = 0.000;
1924 (*t)(0,52) = 4.200; (*t)(1,52) = 0.000; (*t)(2,52) = 0.000;
1925 (*t)(0,53) = 4.300; (*t)(1,53) = 0.000; (*t)(2,53) = 0.000;
1926 (*t)(0,54) = 4.400; (*t)(1,54) = 0.000; (*t)(2,54) = 0.000;
1927 (*t)(0,55) = 4.500; (*t)(1,55) = 0.000; (*t)(2,55) = 0.000;
1928 (*t)(0,56) = 4.600; (*t)(1,56) = 0.000; (*t)(2,56) = 0.000;
1929 (*t)(0,57) = 4.700; (*t)(1,57) = 0.000; (*t)(2,57) = 0.000;
1930 (*t)(0,58) = 4.800; (*t)(1,58) = 0.000; (*t)(2,58) = 0.000;
1931 (*t)(0,59) = 4.900; (*t)(1,59) = 0.000; (*t)(2,59) = 0.000;
1932 (*t)(0,60) = 5.900; (*t)(1,60) = 0.000; (*t)(2,60) = 0.000;
1939 //-----------------------------------------------------------------------
1940 Bool_t AliFlowTrackCuts::PassesTPCbayesianCut(const AliESDtrack* track)
1942 //cut on TPC bayesian pid
1943 //TODO: maybe join all bayesian methods, make GetESDPdg aware of pid mode selected
1944 //if (! fAllowTOFmismatchFlag) {if (track->GetStatus() & AliESDtrack::kTOFmismatch) return kFALSE;}
1946 //Bool_t statusMatchingHard = TPCTOFagree(track);
1947 //if (fRequireStrictTOFTPCagreement && (!statusMatchingHard))
1950 Int_t pdg = GetESDPdg(track,"bayesianTPC");
1951 // printf("pdg set to %i\n",pdg);
1955 switch (fParticleID)
1959 prob = fProbBayes[2];
1963 prob = fProbBayes[3];
1965 case AliPID::kProton:
1967 prob = fProbBayes[4];
1969 case AliPID::kElectron:
1971 prob = fProbBayes[0];
1977 if(TMath::Abs(pdg) == TMath::Abs(pid) && prob > fParticleProbability)
1981 else if (fCutCharge && fCharge * track->GetSign() > 0)
1987 //-----------------------------------------------------------------------
1988 // part added by F. Noferini (some methods)
1989 Bool_t AliFlowTrackCuts::PassesTOFbayesianCut(const AliESDtrack* track)
1992 Bool_t goodtrack = track &&
1993 (track->GetStatus() & AliESDtrack::kTOFpid) &&
1994 (track->GetTOFsignal() > 12000) &&
1995 (track->GetTOFsignal() < 100000) &&
1996 (track->GetIntegratedLength() > 365);
1998 if (! fAllowTOFmismatchFlag) {if (track->GetStatus() & AliESDtrack::kTOFmismatch) return kFALSE;}
2003 Bool_t statusMatchingHard = TPCTOFagree(track);
2004 if (fRequireStrictTOFTPCagreement && (!statusMatchingHard))
2007 Int_t pdg = GetESDPdg(track,"bayesianALL");
2008 // printf("pdg set to %i\n",pdg);
2012 switch (fParticleID)
2016 prob = fProbBayes[2];
2020 prob = fProbBayes[3];
2022 case AliPID::kProton:
2024 prob = fProbBayes[4];
2026 case AliPID::kElectron:
2028 prob = fProbBayes[0];
2034 // printf("pt = %f -- all prob = [%4.2f,%4.2f,%4.2f,%4.2f,%4.2f] -- prob = %f\n",track->Pt(),fProbBayes[0],fProbBayes[1],fProbBayes[2],fProbBayes[3],fProbBayes[4],prob);
2035 if(TMath::Abs(pdg) == TMath::Abs(pid) && prob > fParticleProbability){
2038 else if (fCutCharge && fCharge * track->GetSign() > 0)
2044 //-----------------------------------------------------------------------
2045 Int_t AliFlowTrackCuts::GetESDPdg(const AliESDtrack *track,Option_t *option,Int_t ipart,Float_t cPi,Float_t cKa,Float_t cPr)
2049 Int_t pdgvalues[5] = {-11,-13,211,321,2212};
2050 Float_t mass[5] = {5.10998909999999971e-04,1.05658000000000002e-01,1.39570000000000000e-01,4.93676999999999977e-01,9.38271999999999995e-01};
2052 if(strstr(option,"bayesianTOF")){ // Bayesian TOF PID
2053 Double_t c[5]={0.01, 0.01, 0.85, 0.1, 0.05};
2056 Float_t pt = track->Pt();
2059 while(pt > fBinLimitPID[iptesd] && iptesd < fgkPIDptBin-1) iptesd++;
2062 c[0] = fC[iptesd][0];
2063 c[1] = fC[iptesd][1];
2064 c[2] = fC[iptesd][2];
2065 c[3] = fC[iptesd][3];
2066 c[4] = fC[iptesd][4];
2076 Double_t r1[10]; track->GetTOFpid(r1);
2079 for (i=0; i<5; i++) rcc+=(c[i]*r1[i]);
2082 for (i=0; i<5; i++){
2083 w[i]=c[i]*r1[i]/rcc;
2084 fProbBayes[i] = w[i];
2086 if (w[2]>=w[3] && w[2]>=w[4] && w[2]>=w[1] && w[2]>=w[0]) {//pion
2087 pdg = 211*Int_t(track->GetSign());
2089 else if (w[4]>=w[3] && w[4]>=w[1] && w[4]>=w[0]) {//proton
2090 pdg = 2212*Int_t(track->GetSign());
2092 else if (w[3]>=w[1] && w[3]>=w[0]){//kaon
2093 pdg = 321*Int_t(track->GetSign());
2095 else if (w[0]>=w[1]) { //electrons
2096 pdg = -11*Int_t(track->GetSign());
2099 pdg = -13*Int_t(track->GetSign());
2103 else if(strstr(option,"bayesianTPC")){ // Bayesian TPC PID
2104 Double_t c[5]={0.01, 0.01, 0.85, 0.1, 0.05};
2107 Float_t pt = track->Pt();
2110 while(pt > fBinLimitPID[iptesd] && iptesd < fgkPIDptBin-1) iptesd++;
2113 c[0] = fC[iptesd][0];
2114 c[1] = fC[iptesd][1];
2115 c[2] = fC[iptesd][2];
2116 c[3] = fC[iptesd][3];
2117 c[4] = fC[iptesd][4];
2127 Double_t r1[10]; track->GetTPCpid(r1);
2130 for (i=0; i<5; i++) rcc+=(c[i]*r1[i]);
2133 for (i=0; i<5; i++){
2134 w[i]=c[i]*r1[i]/rcc;
2135 fProbBayes[i] = w[i];
2137 if (w[2]>=w[3] && w[2]>=w[4] && w[2]>=w[1] && w[2]>=w[0]) {//pion
2138 pdg = 211*Int_t(track->GetSign());
2140 else if (w[4]>=w[3] && w[4]>=w[1] && w[4]>=w[0]) {//proton
2141 pdg = 2212*Int_t(track->GetSign());
2143 else if (w[3]>=w[1] && w[3]>=w[0]){//kaon
2144 pdg = 321*Int_t(track->GetSign());
2146 else if (w[0]>=w[1]) { //electrons
2147 pdg = -11*Int_t(track->GetSign());
2150 pdg = -13*Int_t(track->GetSign());
2154 else if(strstr(option,"bayesianALL")){
2155 Double_t c[5]={0.01, 0.01, 0.85, 0.1, 0.05};
2158 Float_t pt = track->Pt();
2161 while(pt > fBinLimitPID[iptesd] && iptesd < fgkPIDptBin-1) iptesd++;
2164 c[0] = fC[iptesd][0];
2165 c[1] = fC[iptesd][1];
2166 c[2] = fC[iptesd][2];
2167 c[3] = fC[iptesd][3];
2168 c[4] = fC[iptesd][4];
2178 Double_t r1[10]; track->GetTOFpid(r1);
2179 Double_t r2[10]; track->GetTPCpid(r2);
2181 r1[0] = TMath::Min(r1[2],r1[0]);
2182 r1[1] = TMath::Min(r1[2],r1[1]);
2185 for (i=0; i<5; i++) rcc+=(c[i]*r1[i]*r2[i]);
2189 for (i=0; i<5; i++){
2190 w[i]=c[i]*r1[i]*r2[i]/rcc;
2191 fProbBayes[i] = w[i];
2194 if (w[2]>=w[3] && w[2]>=w[4] && w[2]>=w[1] && w[2]>=w[0]) {//pion
2195 pdg = 211*Int_t(track->GetSign());
2197 else if (w[4]>=w[3] && w[4]>=w[1] && w[4]>=w[0]) {//proton
2198 pdg = 2212*Int_t(track->GetSign());
2200 else if (w[3]>=w[1] && w[3]>=w[0]){//kaon
2201 pdg = 321*Int_t(track->GetSign());
2203 else if (w[0]>=w[1]) { //electrons
2204 pdg = -11*Int_t(track->GetSign());
2207 pdg = -13*Int_t(track->GetSign());
2211 else if(strstr(option,"sigmacutTOF")){
2212 printf("PID not implemented yet: %s\nNO PID!!!!\n",option);
2213 Float_t p = track->P();
2215 // Take expected times
2216 Double_t exptimes[5];
2217 track->GetIntegratedTimes(exptimes);
2219 // Take resolution for TOF response
2220 // like fESDpid.GetTOFResponse().GetExpectedSigma(p, exptimes[ipart], mass[ipart]);
2221 Float_t resolution = fESDpid.GetTOFResponse().GetExpectedSigma(p, exptimes[ipart], mass[ipart]);
2223 if(TMath::Abs(exptimes[ipart] - track->GetTOFsignal()) < 3 * resolution){
2224 pdg = pdgvalues[ipart] * Int_t(track->GetSign());
2229 printf("Invalid PID option: %s\nNO PID!!!!\n",option);
2235 //-----------------------------------------------------------------------
2236 void AliFlowTrackCuts::SetPriors(Float_t centrCur){
2237 fBinLimitPID[0] = 0.300000;
2238 fBinLimitPID[1] = 0.400000;
2239 fBinLimitPID[2] = 0.500000;
2240 fBinLimitPID[3] = 0.600000;
2241 fBinLimitPID[4] = 0.700000;
2242 fBinLimitPID[5] = 0.800000;
2243 fBinLimitPID[6] = 0.900000;
2244 fBinLimitPID[7] = 1.000000;
2245 fBinLimitPID[8] = 1.200000;
2246 fBinLimitPID[9] = 1.400000;
2247 fBinLimitPID[10] = 1.600000;
2248 fBinLimitPID[11] = 1.800000;
2249 fBinLimitPID[12] = 2.000000;
2250 fBinLimitPID[13] = 2.200000;
2251 fBinLimitPID[14] = 2.400000;
2252 fBinLimitPID[15] = 2.600000;
2253 fBinLimitPID[16] = 2.800000;
2254 fBinLimitPID[17] = 3.000000;
2367 else if(centrCur < 20){
2477 else if(centrCur < 30){
2587 else if(centrCur < 40){
2697 else if(centrCur < 50){
2807 else if(centrCur < 60){
2917 else if(centrCur < 70){
3027 else if(centrCur < 80){
3247 for(Int_t i=18;i<fgkPIDptBin;i++){
3248 fBinLimitPID[i] = 3.0 + 0.2 * (i-18);
3249 fC[i][0] = fC[17][0];
3250 fC[i][1] = fC[17][1];
3251 fC[i][2] = fC[17][2];
3252 fC[i][3] = fC[17][3];
3253 fC[i][4] = fC[17][4];
3257 //---------------------------------------------------------------//
3258 Bool_t AliFlowTrackCuts::TPCTOFagree(const AliESDtrack *track)
3260 Bool_t status = kFALSE;
3262 Float_t mass[5] = {5.10998909999999971e-04,1.05658000000000002e-01,1.39570000000000000e-01,4.93676999999999977e-01,9.38271999999999995e-01};
3265 Double_t exptimes[5];
3266 track->GetIntegratedTimes(exptimes);
3268 Float_t dedx = track->GetTPCsignal();
3270 Float_t p = track->P();
3271 Float_t time = track->GetTOFsignal()- fESDpid.GetTOFResponse().GetStartTime(p);
3272 Float_t tl = track->GetIntegratedLength();
3274 Float_t betagammares = fESDpid.GetTOFResponse().GetExpectedSigma(p, exptimes[4], mass[4]);
3276 Float_t betagamma1 = tl/(time-5 *betagammares) * 33.3564095198152043;
3278 // printf("betagamma1 = %f\n",betagamma1);
3280 if(betagamma1 < 0.1) betagamma1 = 0.1;
3282 if(betagamma1 < 0.99999) betagamma1 /= TMath::Sqrt(1-betagamma1*betagamma1);
3283 else betagamma1 = 100;
3285 Float_t betagamma2 = tl/(time+5 *betagammares) * 33.3564095198152043;
3286 // printf("betagamma2 = %f\n",betagamma2);
3288 if(betagamma2 < 0.1) betagamma2 = 0.1;
3290 if(betagamma2 < 0.99999) betagamma2 /= TMath::Sqrt(1-betagamma2*betagamma2);
3291 else betagamma2 = 100;
3295 track->GetInnerPxPyPz(ptpc);
3296 Float_t momtpc=TMath::Sqrt(ptpc[0]*ptpc[0] + ptpc[1]*ptpc[1] + ptpc[2]*ptpc[2]);
3298 for(Int_t i=0;i < 5;i++){
3299 Float_t resolutionTOF = fESDpid.GetTOFResponse().GetExpectedSigma(p, exptimes[i], mass[i]);
3300 if(TMath::Abs(exptimes[i] - time) < 5 * resolutionTOF){
3301 Float_t dedxExp = 0;
3302 if(i==0) dedxExp = fESDpid.GetTPCResponse().GetExpectedSignal(momtpc,AliPID::kElectron);
3303 else if(i==1) dedxExp = fESDpid.GetTPCResponse().GetExpectedSignal(momtpc,AliPID::kMuon);
3304 else if(i==2) dedxExp = fESDpid.GetTPCResponse().GetExpectedSignal(momtpc,AliPID::kPion);
3305 else if(i==3) dedxExp = fESDpid.GetTPCResponse().GetExpectedSignal(momtpc,AliPID::kKaon);
3306 else if(i==4) dedxExp = fESDpid.GetTPCResponse().GetExpectedSignal(momtpc,AliPID::kProton);
3308 Float_t resolutionTPC = 2;
3309 if(i==0) resolutionTPC = fESDpid.GetTPCResponse().GetExpectedSigma(momtpc,track->GetTPCsignalN(),AliPID::kElectron);
3310 else if(i==1) resolutionTPC = fESDpid.GetTPCResponse().GetExpectedSigma(momtpc,track->GetTPCsignalN(),AliPID::kMuon);
3311 else if(i==2) resolutionTPC = fESDpid.GetTPCResponse().GetExpectedSigma(momtpc,track->GetTPCsignalN(),AliPID::kPion);
3312 else if(i==3) resolutionTPC = fESDpid.GetTPCResponse().GetExpectedSigma(momtpc,track->GetTPCsignalN(),AliPID::kKaon);
3313 else if(i==4) resolutionTPC = fESDpid.GetTPCResponse().GetExpectedSigma(momtpc,track->GetTPCsignalN(),AliPID::kProton);
3315 if(TMath::Abs(dedx - dedxExp) < 3 * resolutionTPC){
3321 Float_t bb1 = fESDpid.GetTPCResponse().Bethe(betagamma1);
3322 Float_t bb2 = fESDpid.GetTPCResponse().Bethe(betagamma2);
3323 Float_t bbM = fESDpid.GetTPCResponse().Bethe((betagamma1+betagamma2)*0.5);
3328 Float_t resolutionTOFpr = fESDpid.GetTOFResponse().GetExpectedSigma(p, exptimes[4], mass[4]);
3329 Float_t resolutionTPCpr = fESDpid.GetTPCResponse().GetExpectedSigma(momtpc,track->GetTPCsignalN(),AliPID::kProton);
3330 if(TMath::Abs(dedx-bb1) < resolutionTPCpr*3 && exptimes[4] < time-7*resolutionTOFpr){
3333 else if(TMath::Abs(dedx-bb2) < resolutionTPCpr*3 && exptimes[4] < time-7*resolutionTOFpr){
3336 else if(TMath::Abs(dedx-bbM) < resolutionTPCpr*3 && exptimes[4] < time-7*resolutionTOFpr){
3342 // end part added by F. Noferini
3343 //-----------------------------------------------------------------------
3345 //-----------------------------------------------------------------------
3346 const char* AliFlowTrackCuts::PIDsourceName(PIDsource s)
3348 //get the name of the particle id source
3354 return "TPCbayesian";
3362 return "TOFbayesianPID";
3363 case kTOFbetaSimple:
3364 return "TOFbetaSimple";
3370 //-----------------------------------------------------------------------
3371 const char* AliFlowTrackCuts::GetParamTypeName(trackParameterType type)
3373 //return the name of the selected parameter type
3380 case kTPCstandalone:
3381 return "TPCstandalone";
3383 return "SPDtracklets";
3393 //-----------------------------------------------------------------------
3394 Bool_t AliFlowTrackCuts::PassesPMDcuts(AliESDPmdTrack* track )
3396 //check PMD specific cuts
3397 //clean up from last iteration, and init label
3398 Int_t det = track->GetDetector();
3399 //Int_t smn = track->GetSmn();
3400 Float_t clsX = track->GetClusterX();
3401 Float_t clsY = track->GetClusterY();
3402 Float_t clsZ = track->GetClusterZ();
3403 Float_t ncell = track->GetClusterCells();
3404 Float_t adc = track->GetClusterADC();
3410 fTrackEta = GetPmdEta(clsX,clsY,clsZ);
3411 fTrackPhi = GetPmdPhi(clsX,clsY);
3415 if (fCutEta) {if ( fTrackEta < fEtaMin || fTrackEta >= fEtaMax ) pass = kFALSE;}
3416 if (fCutPhi) {if ( fTrackPhi < fPhiMin || fTrackPhi >= fPhiMax ) pass = kFALSE;}
3417 if (fCutPmdDet) {if(det != fPmdDet) pass = kFALSE;}
3418 if (fCutPmdAdc) {if(adc < fPmdAdc) pass = kFALSE;}
3419 if (fCutPmdNcell) {if(ncell < fPmdNcell) pass = kFALSE;}
3424 //-----------------------------------------------------------------------
3425 Bool_t AliFlowTrackCuts::PassesV0cuts(AliESDVZERO* vzero, Int_t id)
3429 //clean up from last iter
3434 fTrackPhi = TMath::PiOver4()*(0.5+id%8);
3436 fTrackEta = -3.45+0.5*(id/8); // taken from PPR
3438 fTrackEta = +4.8-0.5*((id/8)-4); // taken from PPR
3439 fTrackWeight = vzero->GetMultiplicity(id); // not corrected yet: we should use AliESDUtils
3442 if (fCutEta) {if ( fTrackEta < fEtaMin || fTrackEta >= fEtaMax ) pass = kFALSE;}
3443 if (fCutPhi) {if ( fTrackPhi < fPhiMin || fTrackPhi >= fPhiMax ) pass = kFALSE;}
3448 //----------------------------------------------------------------------------//
3449 Double_t AliFlowTrackCuts::GetPmdEta(Float_t xPos, Float_t yPos, Float_t zPos)
3451 Float_t rpxpy, theta, eta;
3452 rpxpy = TMath::Sqrt(xPos*xPos + yPos*yPos);
3453 theta = TMath::ATan2(rpxpy,zPos);
3454 eta = -TMath::Log(TMath::Tan(0.5*theta));
3458 //--------------------------------------------------------------------------//
3459 Double_t AliFlowTrackCuts::GetPmdPhi(Float_t xPos, Float_t yPos)
3461 Float_t pybypx, phi = 0., phi1;
3464 if(yPos>0) phi = 90.;
3465 if(yPos<0) phi = 270.;
3470 if(pybypx < 0) pybypx = - pybypx;
3471 phi1 = TMath::ATan(pybypx)*180./3.14159;
3473 if(xPos > 0 && yPos > 0) phi = phi1; // 1st Quadrant
3474 if(xPos < 0 && yPos > 0) phi = 180 - phi1; // 2nd Quadrant
3475 if(xPos < 0 && yPos < 0) phi = 180 + phi1; // 3rd Quadrant
3476 if(xPos > 0 && yPos < 0) phi = 360 - phi1; // 4th Quadrant
3479 phi = phi*3.14159/180.;
3483 //---------------------------------------------------------------//
3484 void AliFlowTrackCuts::Browse(TBrowser* b)
3486 //some browsing capabilities
3487 if (fQA) b->Add(fQA);
3490 //---------------------------------------------------------------//
3491 Long64_t AliFlowTrackCuts::Merge(TCollection* list)
3495 AliFlowTrackCuts* obj;
3496 if (!list) return 0;
3497 if (list->GetEntries()<1) return 0;
3499 while ( (obj = dynamic_cast<AliFlowTrackCuts*>(next())) )
3501 if (obj==this) continue;
3503 listwrapper.Add(obj->GetQA());
3504 fQA->Merge(&listwrapper);