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 **********************************************************i****************/
19 // Data selection for flow framework
21 // origin: Mikolaj Krzewicki (mikolaj.krzewicki@cern.ch)
22 // mods: Redmer A. Bertens (rbertens@cern.ch)
24 // This class gurantees consistency of cut methods, trackparameter
25 // selection (global tracks, TPC only, etc..) and parameter mixing
26 // in the flow framework. Transparently handles different input types:
28 // This class works in 2 steps: first the requested track parameters are
29 // constructed (to be set by SetParamType() ), then cuts are applied.
30 // the constructed track can be requested AFTER checking the cuts by
31 // calling GetTrack(), in this case the cut object stays in control,
32 // caller does not have to delete the track.
33 // Additionally caller can request an AliFlowTrack object to be constructed
34 // according the parameter mixing scenario requested by SetParamMix().
35 // AliFlowTrack is made using MakeFlowTrack() method, its an 'object factory'
36 // so caller needs to take care of the freshly created object.
41 #include "TMCProcess.h"
42 #include "TParticle.h"
46 #include "AliMCEvent.h"
47 #include "AliESDEvent.h"
48 #include "AliAODEvent.h"
49 #include "AliVParticle.h"
50 #include "AliVVZERO.h"
51 #include "AliMCParticle.h"
52 #include "AliESDkink.h"
54 #include "AliESDtrack.h"
55 #include "AliESDMuonTrack.h" // XZhang 20120604
56 #include "AliMultiplicity.h"
57 #include "AliAODTrack.h"
58 #include "AliAODTracklets.h" // XZhang 20120615
59 #include "AliFlowTrackSimple.h"
60 #include "AliFlowTrack.h"
61 #include "AliFlowTrackCuts.h"
63 #include "AliESDpid.h"
64 #include "AliESDPmdTrack.h"
65 #include "AliESDUtils.h" //TODO
66 #include "AliFlowBayesianPID.h"
67 #include "AliFlowCandidateTrack.h"
68 #include "AliKFParticle.h"
69 #include "AliESDVZERO.h"
70 #include "AliFlowCommonConstants.h"
72 ClassImp(AliFlowTrackCuts)
74 //-----------------------------------------------------------------------
75 AliFlowTrackCuts::AliFlowTrackCuts():
76 AliFlowTrackSimpleCuts(),
77 fAliESDtrackCuts(NULL),
78 fMuonTrackCuts(NULL), // XZhang 20120604
81 fCutMChasTrackReferences(kFALSE),
82 fCutMCprocessType(kFALSE),
83 fMCprocessType(kPNoProcess),
86 fCutMCfirstMotherPID(kFALSE),
88 fIgnoreSignInMCPID(kFALSE),
89 fCutMCisPrimary(kFALSE),
90 fRequireTransportBitForPrimaries(kTRUE),
92 fRequireCharge(kFALSE),
94 fCutSPDtrackletDeltaPhi(kFALSE),
95 fSPDtrackletDeltaPhiMax(FLT_MAX),
96 fSPDtrackletDeltaPhiMin(-FLT_MAX),
97 fIgnoreTPCzRange(kFALSE),
98 fIgnoreTPCzRangeMax(FLT_MAX),
99 fIgnoreTPCzRangeMin(-FLT_MAX),
100 fCutChi2PerClusterTPC(kFALSE),
101 fMaxChi2PerClusterTPC(FLT_MAX),
102 fMinChi2PerClusterTPC(-FLT_MAX),
103 fCutNClustersTPC(kFALSE),
104 fNClustersTPCMax(INT_MAX),
105 fNClustersTPCMin(INT_MIN),
106 fCutNClustersITS(kFALSE),
107 fNClustersITSMax(INT_MAX),
108 fNClustersITSMin(INT_MIN),
109 fUseAODFilterBit(kTRUE),
111 fCutDCAToVertexXY(kFALSE),
112 fCutDCAToVertexZ(kFALSE),
113 fCutMinimalTPCdedx(kFALSE),
115 fLinearizeVZEROresponse(kFALSE),
120 fCutPmdNcell(kFALSE),
122 fMinKinkAngle(TMath::DegToRad()*2.),
123 fMinKinkRadius(130.),
124 fMaxKinkRadius(200.),
127 fMinKinkInvMassKmu(0.),
128 fMaxKinkInvMassKmu(0.6),
129 fForceTPCstandalone(kFALSE),
130 fRequireKinkDaughters(kFALSE),
141 fTrackLabel(INT_MIN),
147 fBayesianResponse(NULL),
151 fParticleID(AliPID::kUnknown),
152 fParticleProbability(.9),
153 fAllowTOFmismatchFlag(kFALSE),
154 fRequireStrictTOFTPCagreement(kFALSE),
155 fCutRejectElectronsWithTPCpid(kFALSE),
158 fVZEROgainEqualization(NULL),
159 fApplyRecentering(kFALSE),
160 fVZEROgainEqualizationPerRing(kFALSE)
163 SetPriors(); //init arrays
165 // New PID procedure (Bayesian Combined PID)
166 // allocating here is necessary because we don't
167 // stream this member
168 // TODO: fix streaming problems AliFlowBayesianPID
169 fBayesianResponse = new AliFlowBayesianPID();
170 fBayesianResponse->SetNewTrackParam();
171 for(Int_t i(0); i < 4; i++) {
175 for(Int_t i(0); i < 8; i++) fUseVZERORing[i] = kTRUE;
179 //-----------------------------------------------------------------------
180 AliFlowTrackCuts::AliFlowTrackCuts(const char* name):
181 AliFlowTrackSimpleCuts(name),
182 fAliESDtrackCuts(NULL),
183 fMuonTrackCuts(NULL), // XZhang 20120604
186 fCutMChasTrackReferences(kFALSE),
187 fCutMCprocessType(kFALSE),
188 fMCprocessType(kPNoProcess),
191 fCutMCfirstMotherPID(kFALSE),
192 fMCfirstMotherPID(0),
193 fIgnoreSignInMCPID(kFALSE),
194 fCutMCisPrimary(kFALSE),
195 fRequireTransportBitForPrimaries(kTRUE),
196 fMCisPrimary(kFALSE),
197 fRequireCharge(kFALSE),
199 fCutSPDtrackletDeltaPhi(kFALSE),
200 fSPDtrackletDeltaPhiMax(FLT_MAX),
201 fSPDtrackletDeltaPhiMin(-FLT_MAX),
202 fIgnoreTPCzRange(kFALSE),
203 fIgnoreTPCzRangeMax(FLT_MAX),
204 fIgnoreTPCzRangeMin(-FLT_MAX),
205 fCutChi2PerClusterTPC(kFALSE),
206 fMaxChi2PerClusterTPC(FLT_MAX),
207 fMinChi2PerClusterTPC(-FLT_MAX),
208 fCutNClustersTPC(kFALSE),
209 fNClustersTPCMax(INT_MAX),
210 fNClustersTPCMin(INT_MIN),
211 fCutNClustersITS(kFALSE),
212 fNClustersITSMax(INT_MAX),
213 fNClustersITSMin(INT_MIN),
214 fUseAODFilterBit(kTRUE),
216 fCutDCAToVertexXY(kFALSE),
217 fCutDCAToVertexZ(kFALSE),
218 fCutMinimalTPCdedx(kFALSE),
220 fLinearizeVZEROresponse(kFALSE),
225 fCutPmdNcell(kFALSE),
227 fMinKinkAngle(TMath::DegToRad()*2.),
228 fMinKinkRadius(130.),
229 fMaxKinkRadius(200.),
232 fMinKinkInvMassKmu(0.0),
233 fMaxKinkInvMassKmu(0.6),
234 fForceTPCstandalone(kFALSE),
235 fRequireKinkDaughters(kFALSE),
246 fTrackLabel(INT_MIN),
252 fBayesianResponse(NULL),
256 fParticleID(AliPID::kUnknown),
257 fParticleProbability(.9),
258 fAllowTOFmismatchFlag(kFALSE),
259 fRequireStrictTOFTPCagreement(kFALSE),
260 fCutRejectElectronsWithTPCpid(kFALSE),
263 fVZEROgainEqualization(NULL),
264 fApplyRecentering(kFALSE),
265 fVZEROgainEqualizationPerRing(kFALSE)
268 SetTitle("AliFlowTrackCuts");
269 fESDpid.GetTPCResponse().SetBetheBlochParameters( 0.0283086,
274 SetPriors(); //init arrays
276 // New PID procedure (Bayesian Combined PID)
277 fBayesianResponse = new AliFlowBayesianPID();
278 fBayesianResponse->SetNewTrackParam();
279 for(Int_t i(0); i < 4; i++) {
283 for(Int_t i(0); i < 8; i++) fUseVZERORing[i] = kTRUE;
286 //-----------------------------------------------------------------------
287 AliFlowTrackCuts::AliFlowTrackCuts(const AliFlowTrackCuts& that):
288 AliFlowTrackSimpleCuts(that),
289 fAliESDtrackCuts(NULL),
290 fMuonTrackCuts(NULL), // XZhang 20120604
293 fCutMChasTrackReferences(that.fCutMChasTrackReferences),
294 fCutMCprocessType(that.fCutMCprocessType),
295 fMCprocessType(that.fMCprocessType),
296 fCutMCPID(that.fCutMCPID),
298 fCutMCfirstMotherPID(that.fCutMCfirstMotherPID),
299 fMCfirstMotherPID(that.fMCfirstMotherPID),
300 fIgnoreSignInMCPID(that.fIgnoreSignInMCPID),
301 fCutMCisPrimary(that.fCutMCisPrimary),
302 fRequireTransportBitForPrimaries(that.fRequireTransportBitForPrimaries),
303 fMCisPrimary(that.fMCisPrimary),
304 fRequireCharge(that.fRequireCharge),
305 fFakesAreOK(that.fFakesAreOK),
306 fCutSPDtrackletDeltaPhi(that.fCutSPDtrackletDeltaPhi),
307 fSPDtrackletDeltaPhiMax(that.fSPDtrackletDeltaPhiMax),
308 fSPDtrackletDeltaPhiMin(that.fSPDtrackletDeltaPhiMin),
309 fIgnoreTPCzRange(that.fIgnoreTPCzRange),
310 fIgnoreTPCzRangeMax(that.fIgnoreTPCzRangeMax),
311 fIgnoreTPCzRangeMin(that.fIgnoreTPCzRangeMin),
312 fCutChi2PerClusterTPC(that.fCutChi2PerClusterTPC),
313 fMaxChi2PerClusterTPC(that.fMaxChi2PerClusterTPC),
314 fMinChi2PerClusterTPC(that.fMinChi2PerClusterTPC),
315 fCutNClustersTPC(that.fCutNClustersTPC),
316 fNClustersTPCMax(that.fNClustersTPCMax),
317 fNClustersTPCMin(that.fNClustersTPCMin),
318 fCutNClustersITS(that.fCutNClustersITS),
319 fNClustersITSMax(that.fNClustersITSMax),
320 fNClustersITSMin(that.fNClustersITSMin),
321 fUseAODFilterBit(that.fUseAODFilterBit),
322 fAODFilterBit(that.fAODFilterBit),
323 fCutDCAToVertexXY(that.fCutDCAToVertexXY),
324 fCutDCAToVertexZ(that.fCutDCAToVertexZ),
325 fCutMinimalTPCdedx(that.fCutMinimalTPCdedx),
326 fMinimalTPCdedx(that.fMinimalTPCdedx),
327 fLinearizeVZEROresponse(that.fLinearizeVZEROresponse),
328 fCutPmdDet(that.fCutPmdDet),
329 fPmdDet(that.fPmdDet),
330 fCutPmdAdc(that.fCutPmdAdc),
331 fPmdAdc(that.fPmdAdc),
332 fCutPmdNcell(that.fCutPmdNcell),
333 fPmdNcell(that.fPmdNcell),
334 fMinKinkAngle(that.fMinKinkAngle),
335 fMinKinkRadius(that.fMinKinkRadius),
336 fMaxKinkRadius(that.fMaxKinkRadius),
337 fMinKinkQt(that.fMinKinkQt),
338 fMaxKinkQt(that.fMaxKinkQt),
339 fMinKinkInvMassKmu(that.fMinKinkInvMassKmu),
340 fMaxKinkInvMassKmu(that.fMaxKinkInvMassKmu),
341 fForceTPCstandalone(that.fForceTPCstandalone),
342 fRequireKinkDaughters(that.fRequireKinkDaughters),
343 fParamType(that.fParamType),
344 fParamMix(that.fParamMix),
353 fTrackLabel(INT_MIN),
358 fESDpid(that.fESDpid),
359 fBayesianResponse(NULL),
360 fPIDsource(that.fPIDsource),
363 fParticleID(that.fParticleID),
364 fParticleProbability(that.fParticleProbability),
365 fAllowTOFmismatchFlag(that.fAllowTOFmismatchFlag),
366 fRequireStrictTOFTPCagreement(that.fRequireStrictTOFTPCagreement),
367 fCutRejectElectronsWithTPCpid(that.fCutRejectElectronsWithTPCpid),
370 fVZEROgainEqualization(NULL),
371 fApplyRecentering(that.fApplyRecentering),
372 fVZEROgainEqualizationPerRing(that.fVZEROgainEqualizationPerRing)
375 printf(" \n\n claling copy ctor \n\n" );
376 if (that.fTPCpidCuts) fTPCpidCuts = new TMatrixF(*(that.fTPCpidCuts));
377 if (that.fTOFpidCuts) fTOFpidCuts = new TMatrixF(*(that.fTOFpidCuts));
378 if (that.fAliESDtrackCuts) fAliESDtrackCuts = new AliESDtrackCuts(*(that.fAliESDtrackCuts));
379 if (that.fMuonTrackCuts) fMuonTrackCuts = new AliMuonTrackCuts(*(that.fMuonTrackCuts)); // XZhang 20120604
380 SetPriors(); //init arrays
381 if (that.fQA) DefineHistograms();
383 // New PID procedure (Bayesian Combined PID)
384 fBayesianResponse = new AliFlowBayesianPID();
385 fBayesianResponse->SetNewTrackParam();
387 // VZERO gain calibration
388 // no reason to init fVZEROgainEqualizationPerRing, will be initialized on node if necessary
389 // pointer is set to NULL in initialization list of this constructor
390 // if (that.fVZEROgainEqualization) fVZEROgainEqualization = new TH1(*(that.fVZEROgainEqualization));
391 for(Int_t i(0); i < 4; i++) { // no use to copy these guys since they're only initialized on worked node
395 for(Int_t i(0); i < 8; i++) fUseVZERORing[i] = that.fUseVZERORing[i];
399 //-----------------------------------------------------------------------
400 AliFlowTrackCuts& AliFlowTrackCuts::operator=(const AliFlowTrackCuts& that)
403 if (this==&that) return *this;
405 AliFlowTrackSimpleCuts::operator=(that);
406 //the following may seem excessive but if AliESDtrackCuts properly does copy and clone
407 //this approach is better memory-fragmentation-wise in some cases
408 if (that.fAliESDtrackCuts && fAliESDtrackCuts) *fAliESDtrackCuts=*(that.fAliESDtrackCuts);
409 if (that.fAliESDtrackCuts && !fAliESDtrackCuts) fAliESDtrackCuts=new AliESDtrackCuts(*(that.fAliESDtrackCuts));
410 if (!that.fAliESDtrackCuts) delete fAliESDtrackCuts; fAliESDtrackCuts=NULL;
412 if ( that.fMuonTrackCuts && fMuonTrackCuts) *fMuonTrackCuts = *(that.fMuonTrackCuts); // XZhang 20120604
413 if ( that.fMuonTrackCuts && !fMuonTrackCuts) fMuonTrackCuts = new AliMuonTrackCuts(*(that.fMuonTrackCuts)); // XZhang 20120604
414 if (!that.fMuonTrackCuts) delete fMuonTrackCuts; fMuonTrackCuts = NULL; // XZhang 20120604
415 if (!that.fVZEROgainEqualization) delete fVZEROgainEqualization; fVZEROgainEqualization = NULL;
416 //these guys we don't need to copy, just reinit
417 if (that.fQA) {fQA->Delete(); delete fQA; fQA=NULL; DefineHistograms();}
419 fCutMChasTrackReferences=that.fCutMChasTrackReferences;
420 fCutMCprocessType=that.fCutMCprocessType;
421 fMCprocessType=that.fMCprocessType;
422 fCutMCPID=that.fCutMCPID;
424 fCutMCfirstMotherPID=that.fCutMCfirstMotherPID;
425 fMCfirstMotherPID=that.fMCfirstMotherPID;
426 fIgnoreSignInMCPID=that.fIgnoreSignInMCPID,
427 fCutMCisPrimary=that.fCutMCisPrimary;
428 fRequireTransportBitForPrimaries=that.fRequireTransportBitForPrimaries;
429 fMCisPrimary=that.fMCisPrimary;
430 fRequireCharge=that.fRequireCharge;
431 fFakesAreOK=that.fFakesAreOK;
432 fCutSPDtrackletDeltaPhi=that.fCutSPDtrackletDeltaPhi;
433 fSPDtrackletDeltaPhiMax=that.fSPDtrackletDeltaPhiMax;
434 fSPDtrackletDeltaPhiMin=that.fSPDtrackletDeltaPhiMin;
435 fIgnoreTPCzRange=that.fIgnoreTPCzRange;
436 fIgnoreTPCzRangeMax=that.fIgnoreTPCzRangeMax;
437 fIgnoreTPCzRangeMin=that.fIgnoreTPCzRangeMin;
438 fCutChi2PerClusterTPC=that.fCutChi2PerClusterTPC;
439 fMaxChi2PerClusterTPC=that.fMaxChi2PerClusterTPC;
440 fMinChi2PerClusterTPC=that.fMinChi2PerClusterTPC;
441 fCutNClustersTPC=that.fCutNClustersTPC;
442 fNClustersTPCMax=that.fNClustersTPCMax;
443 fNClustersTPCMin=that.fNClustersTPCMin;
444 fCutNClustersITS=that.fCutNClustersITS;
445 fNClustersITSMax=that.fNClustersITSMax;
446 fNClustersITSMin=that.fNClustersITSMin;
447 fUseAODFilterBit=that.fUseAODFilterBit;
448 fAODFilterBit=that.fAODFilterBit;
449 fCutDCAToVertexXY=that.fCutDCAToVertexXY;
450 fCutDCAToVertexZ=that.fCutDCAToVertexZ;
451 fCutMinimalTPCdedx=that.fCutMinimalTPCdedx;
452 fMinimalTPCdedx=that.fMinimalTPCdedx;
453 fLinearizeVZEROresponse=that.fLinearizeVZEROresponse;
454 fCutPmdDet=that.fCutPmdDet;
455 fPmdDet=that.fPmdDet;
456 fCutPmdAdc=that.fCutPmdAdc;
457 fPmdAdc=that.fPmdAdc;
458 fCutPmdNcell=that.fCutPmdNcell;
459 fPmdNcell=that.fPmdNcell;
460 fMinKinkAngle=that.fMinKinkAngle;
461 fMinKinkRadius=that.fMinKinkRadius;
462 fMaxKinkRadius=that.fMaxKinkRadius;
463 fMinKinkQt=that.fMinKinkQt;
464 fMaxKinkQt=that.fMaxKinkQt;
465 fMinKinkInvMassKmu=that.fMinKinkInvMassKmu;
466 fMaxKinkInvMassKmu=that.fMaxKinkInvMassKmu;
467 fForceTPCstandalone=that.fForceTPCstandalone;
468 fRequireKinkDaughters=that.fRequireKinkDaughters;
470 fParamType=that.fParamType;
471 fParamMix=that.fParamMix;
486 fESDpid = that.fESDpid;
487 fPIDsource = that.fPIDsource;
491 if (that.fTPCpidCuts) fTPCpidCuts = new TMatrixF(*(that.fTPCpidCuts));
492 if (that.fTOFpidCuts) fTOFpidCuts = new TMatrixF(*(that.fTOFpidCuts));
494 fParticleID=that.fParticleID;
495 fParticleProbability=that.fParticleProbability;
496 fAllowTOFmismatchFlag=that.fAllowTOFmismatchFlag;
497 fRequireStrictTOFTPCagreement=that.fRequireStrictTOFTPCagreement;
498 fCutRejectElectronsWithTPCpid=that.fCutRejectElectronsWithTPCpid;
499 fProbBayes = that.fProbBayes;
500 fCurrCentr = that.fCurrCentr;
502 fApplyRecentering = that.fApplyRecentering;
503 fVZEROgainEqualizationPerRing = that.fVZEROgainEqualizationPerRing;
504 #if ROOT_VERSION_CODE < ROOT_VERSION(5,99,0)
505 if (that.fVZEROgainEqualization) fVZEROgainEqualization = new TH1(*(that.fVZEROgainEqualization));
507 //PH Lets try Clone, however the result might be wrong
508 if (that.fVZEROgainEqualization) fVZEROgainEqualization = (TH1*)that.fVZEROgainEqualization->Clone();
510 for(Int_t i(0); i < 4; i++) { // no use to copy these guys since they're only initialized on worked node
511 fVZEROApol[i] = that.fVZEROApol[i];
512 fVZEROCpol[i] = that.fVZEROCpol[i];
514 for(Int_t i(0); i < 8; i++) fUseVZERORing[i] = that.fUseVZERORing[i];
519 //-----------------------------------------------------------------------
520 AliFlowTrackCuts::~AliFlowTrackCuts()
523 delete fAliESDtrackCuts;
526 if (fMuonTrackCuts) delete fMuonTrackCuts; // XZhang 20120604
527 if (fQA) { fQA->SetOwner(); fQA->Delete(); delete fQA; }
528 if (fVZEROgainEqualization) delete fVZEROgainEqualization;
531 //-----------------------------------------------------------------------
532 void AliFlowTrackCuts::SetEvent(AliVEvent* event, AliMCEvent* mcEvent)
539 //do the magic for ESD
540 AliESDEvent* myESD = dynamic_cast<AliESDEvent*>(event);
541 AliAODEvent* myAOD = dynamic_cast<AliAODEvent*>(event);
542 if (fCutPID && myESD)
544 //TODO: maybe call it only for the TOF options?
545 // Added by F. Noferini for TOF PID
546 // old procedure now implemented inside fBayesianResponse
547 // fESDpid.MakePID(myESD,kFALSE);
549 fBayesianResponse->SetDetResponse(myESD, fCurrCentr,AliESDpid::kTOF_T0,kTRUE); // centrality = PbPb centrality class (0-100%) or -1 for pp collisions
550 fESDpid.SetTOFResponse(myESD,AliESDpid::kTOF_T0);
551 // End F. Noferini added part
553 if (fCutPID && myAOD){
554 fBayesianResponse->SetDetResponse(myAOD, fCurrCentr,AliESDpid::kTOF_T0); // centrality = PbPb centrality class (0-100%) or -1 for pp collisions
555 if(myAOD->GetTOFHeader()){
556 fESDpid.SetTOFResponse(myAOD,AliESDpid::kTOF_T0);
558 else{ // corrected on the fly track by track if tof header is not present (old AODs)
560 // End F. Noferini added part
563 if(fPIDsource==kTOFbayesian) fBayesianResponse->SetDetAND(1);
564 else if(fPIDsource==kTPCbayesian) fBayesianResponse->ResetDetOR(1);
567 //-----------------------------------------------------------------------
568 void AliFlowTrackCuts::SetCutMC( Bool_t b )
570 //will we be cutting on MC information?
573 //if we cut on MC info then also the Bethe Bloch should be the one tuned for MC
576 fESDpid.GetTPCResponse().SetBetheBlochParameters( 2.15898e+00/50.,
584 //-----------------------------------------------------------------------
585 Bool_t AliFlowTrackCuts::IsSelected(TObject* obj, Int_t id)
588 AliVParticle* vparticle = dynamic_cast<AliVParticle*>(obj);
589 //if (vparticle) return PassesCuts(vparticle); // XZhang 20120604
590 if (vparticle) { // XZhang 20120604
591 if (fParamType==kMUON) return PassesMuonCuts(vparticle); // XZhang 20120604
592 return PassesCuts(vparticle); // XZhang 20120604
595 AliFlowTrackSimple* flowtrack = dynamic_cast<AliFlowTrackSimple*>(obj);
596 if (flowtrack) return PassesCuts(flowtrack);
597 AliMultiplicity* tracklets = dynamic_cast<AliMultiplicity*>(obj);
598 if (tracklets) return PassesCuts(tracklets,id);
599 AliAODTracklets* trkletAOD = dynamic_cast<AliAODTracklets*>(obj); // XZhang 20120615
600 if (trkletAOD) return PassesCuts(trkletAOD,id); // XZhang 20120615
601 AliESDPmdTrack* pmdtrack = dynamic_cast<AliESDPmdTrack*>(obj);
602 if (pmdtrack) return PassesPMDcuts(pmdtrack);
603 AliVEvent* vvzero = dynamic_cast<AliVEvent*>(obj); // should be removed; left for protection only
604 if (vvzero) return PassesVZEROcuts(id);
605 AliESDkink* kink = dynamic_cast<AliESDkink*>(obj);
606 if (kink) return PassesCuts(kink);
607 //AliESDv0* v0 = dynamic_cast<AliESDv0*>(obj);
608 //if (v0) return PassesCuts(v0);
610 return kFALSE; //default when passed wrong type of object
613 //-----------------------------------------------------------------------
614 Bool_t AliFlowTrackCuts::IsSelectedMCtruth(TObject* obj, Int_t id)
617 AliVParticle* vparticle = dynamic_cast<AliVParticle*>(obj);
620 return PassesMCcuts(fMCevent,(fFakesAreOK)?TMath::Abs(vparticle->GetLabel()):vparticle->GetLabel());
622 AliMultiplicity* tracklets = dynamic_cast<AliMultiplicity*>(obj);
625 Int_t label0 = tracklets->GetLabel(id,0);
626 Int_t label1 = tracklets->GetLabel(id,1);
627 Int_t label = (fFakesAreOK)?TMath::Abs(label0):label0;
628 if (label0!=label1) label = -666;
629 return PassesMCcuts(fMCevent,label);
631 return kFALSE; //default when passed wrong type of object
634 //-----------------------------------------------------------------------
635 Bool_t AliFlowTrackCuts::PassesCuts(const AliFlowTrackSimple* track)
637 //check cuts on a flowtracksimple
639 //clean up from last iteration
641 return AliFlowTrackSimpleCuts::PassesCuts(track);
644 //-----------------------------------------------------------------------
645 Bool_t AliFlowTrackCuts::PassesCuts(const AliMultiplicity* tracklet, Int_t id)
647 //check cuts on a tracklets
649 if (id<0) return kFALSE;
651 //clean up from last iteration, and init label
654 fTrackPhi = tracklet->GetPhi(id);
655 fTrackEta = tracklet->GetEta(id);
657 if (fCutEta) {if ( fTrackEta < fEtaMin || fTrackEta >= fEtaMax ) return kFALSE;}
658 if (fCutPhi) {if ( fTrackPhi < fPhiMin || fTrackPhi >= fPhiMax ) return kFALSE;}
660 //check MC info if available
661 //if the 2 clusters have different label track cannot be good
662 //and should therefore not pass the mc cuts
663 Int_t label0 = tracklet->GetLabel(id,0);
664 Int_t label1 = tracklet->GetLabel(id,1);
665 //if possible get label and mcparticle
666 fTrackLabel = (label0==label1)?tracklet->GetLabel(id,1):-1;
667 if (!fFakesAreOK && fTrackLabel<0) return kFALSE;
668 if (fTrackLabel>=0 && fMCevent) fMCparticle = static_cast<AliMCParticle*>(fMCevent->GetTrack(fTrackLabel));
670 if (fCutMC && !PassesMCcuts()) return kFALSE;
674 //-----------------------------------------------------------------------
675 Bool_t AliFlowTrackCuts::PassesCuts(const AliAODTracklets* tracklet, Int_t id)
678 //check cuts on a tracklets
680 if (id<0) return kFALSE;
682 //clean up from last iteration, and init label
685 fTrackPhi = tracklet->GetPhi(id);
686 //fTrackEta = tracklet->GetEta(id);
687 fTrackEta = -1.*TMath::Log(TMath::Tan(tracklet->GetTheta(id)/2.));
689 if (fCutEta) {if ( fTrackEta < fEtaMin || fTrackEta >= fEtaMax ) return kFALSE;}
690 if (fCutPhi) {if ( fTrackPhi < fPhiMin || fTrackPhi >= fPhiMax ) return kFALSE;}
692 //check MC info if available
693 //if the 2 clusters have different label track cannot be good
694 //and should therefore not pass the mc cuts
695 Int_t label0 = tracklet->GetLabel(id,0);
696 Int_t label1 = tracklet->GetLabel(id,1);
697 //if possible get label and mcparticle
698 fTrackLabel = (label0==label1)?tracklet->GetLabel(id,1):-1;
699 if (!fFakesAreOK && fTrackLabel<0) return kFALSE;
700 if (fTrackLabel>=0 && fMCevent) fMCparticle = static_cast<AliMCParticle*>(fMCevent->GetTrack(fTrackLabel));
702 if (fCutMC && !PassesMCcuts()) return kFALSE;
706 //-----------------------------------------------------------------------
707 Bool_t AliFlowTrackCuts::PassesMCcuts(AliMCEvent* mcEvent, Int_t label)
710 if (!mcEvent) return kFALSE;
711 if (label<0) return kFALSE;//otherwise AliCMevent prints a warning before returning NULL
712 AliMCParticle* mcparticle = static_cast<AliMCParticle*>(mcEvent->GetTrack(label));
713 if (!mcparticle) {AliError("no MC track"); return kFALSE;}
717 if (IsPhysicalPrimary(mcEvent,label,fRequireTransportBitForPrimaries) != fMCisPrimary) return kFALSE;
721 Int_t pdgCode = mcparticle->PdgCode();
722 if (fIgnoreSignInMCPID)
724 if (TMath::Abs(fMCPID) != TMath::Abs(pdgCode)) return kFALSE;
728 if (fMCPID != pdgCode) return kFALSE;
731 if (fCutMCfirstMotherPID)
734 TParticle* tparticle=mcparticle->Particle();
735 Int_t firstMotherLabel = 0;
736 if (tparticle) { firstMotherLabel = tparticle->GetFirstMother(); }
737 AliVParticle* firstMotherParticle = mcEvent->GetTrack(firstMotherLabel);
738 Int_t pdgcodeFirstMother = 0;
739 if (firstMotherParticle) { pdgcodeFirstMother = firstMotherParticle->PdgCode(); }
740 if (pdgcodeFirstMother != fMCfirstMotherPID) return kFALSE;
742 if ( fCutMCprocessType )
744 TParticle* particle = mcparticle->Particle();
745 Int_t processID = particle->GetUniqueID();
746 if (processID != fMCprocessType ) return kFALSE;
748 if (fCutMChasTrackReferences)
750 if (mcparticle->GetNumberOfTrackReferences()<1) return kFALSE;
755 //-----------------------------------------------------------------------
756 Bool_t AliFlowTrackCuts::PassesMCcuts()
759 if (!fMCevent) return kFALSE;
760 if (fTrackLabel<0) return kFALSE;//otherwise AliCMevent prints a warning before returning NULL
761 fMCparticle = static_cast<AliMCParticle*>(fMCevent->GetTrack(fTrackLabel));
762 return PassesMCcuts(fMCevent,fTrackLabel);
765 //-----------------------------------------------------------------------
766 Bool_t AliFlowTrackCuts::PassesCuts(const AliESDv0* v0)
768 //check if the v0 passes cuts
770 //clean up from last iteration
773 fV0 = const_cast<AliESDv0*>(v0);
777 //first, extract/prepare the v0
778 if (!v0->GetOnFlyStatus()) return kFALSE; //skip offline V0 finder
779 const AliExternalTrackParam *negHelix=v0->GetParamN();
780 const AliExternalTrackParam *posHelix=v0->GetParamP();
781 AliVParticle *v0tracks[2];
782 v0tracks[0] = fEvent->GetTrack(v0->GetNindex());
783 v0tracks[1] = fEvent->GetTrack(v0->GetPindex());
784 if( v0tracks[1]->Charge() < 0)
786 v0tracks[1] = fEvent->GetTrack(v0->GetNindex());
787 v0tracks[0] = fEvent->GetTrack(v0->GetPindex());
788 negHelix=v0->GetParamP();
789 posHelix=v0->GetParamN();
792 int KalmanPidPairs[4][2] =
794 {-11,11}, // e-,e+ (gamma)
795 {-211,2212}, // pi- p (lambda)
796 {-2212,211}, // anti-p pi+ (anti-lambda)
797 {-211,211} // pi- pi+ (Kshort)
798 // {-321,321} // K- K+ (phi)
802 //refit using a mass hypothesis
803 AliKFParticle v0trackKFneg(*(negHelix),KalmanPidPairs[id][0]);
804 AliKFParticle v0trackKFpos(*(posHelix),KalmanPidPairs[id][1]);
805 AliKFParticle v0particleRefit;
806 v0particleRefit += v0trackKFneg;
807 v0particleRefit += v0trackKFpos;
808 Double_t invMassErr= -999;
809 v0particleRefit.GetMass(fTrackMass,invMassErr);
810 //Double_t openAngle = v0trackKFneg.GetAngle(v0trackKFpos);
811 fTrackEta = v0particleRefit.GetEta();
812 fTrackPt = v0particleRefit.GetPt();
813 fTrackPhi = TMath::Pi()+v0particleRefit.GetPhi();
814 ////find out which mass bin and put the number in fPOItype
815 //Int_t massBins = AliFlowCommonConstants::GetMaster()->GetNbinsMass();
816 //Double_t massMin = AliFlowCommonConstants::GetMaster()->GetMassMin();
817 //Double_t massMax = AliFlowCommonConstants::GetMaster()->GetMassMax();
818 //fPOItype = 1 + int(massBins*(fTrackMass-massMin)/(massMax-massMin));
820 /////////////////////////////////////////////////////////////////////////////
822 if ( v0tracks[0]->Charge() == v0tracks[1]->Charge() ) pass=kFALSE;
823 if ( v0tracks[0]->Pt()<0.15 || v0tracks[1]->Pt()<0.15 ) pass=kFALSE;
828 //-----------------------------------------------------------------------
829 Bool_t AliFlowTrackCuts::PassesCuts(const AliESDkink* kink)
831 //check if the kink passes cuts
833 //clean up from last iteration
835 fKink=const_cast<AliESDkink*>(kink);
839 Float_t kinkAngle = kink->GetAngle(2);
840 if (kinkAngle<fMinKinkAngle) pass = kFALSE;
841 Double_t kinkRadius = kink->GetR();
842 if (kinkRadius<fMinKinkRadius || kinkRadius>fMaxKinkRadius) pass = kFALSE;
845 const TVector3 motherMfromKink(kink->GetMotherP());
846 const TVector3 daughterMfromKink(kink->GetDaughterP());
847 Float_t qt=kink->GetQt();
848 if ( qt < fMinKinkQt || qt > fMaxKinkQt) pass = kFALSE;
851 Float_t energyDaughterMu = TMath::Sqrt( daughterMfromKink.Mag()*daughterMfromKink.Mag()+
853 Float_t p1XM = motherMfromKink.Px();
854 Float_t p1YM = motherMfromKink.Py();
855 Float_t p1ZM = motherMfromKink.Pz();
856 Float_t p2XM = daughterMfromKink.Px();
857 Float_t p2YM = daughterMfromKink.Py();
858 Float_t p2ZM = daughterMfromKink.Pz();
859 Float_t p3Daughter = TMath::Sqrt( ((p1XM-p2XM)*(p1XM-p2XM))+((p1YM-p2YM)*(p1YM-p2YM))+
860 ((p1ZM-p2ZM)*(p1ZM-p2ZM)) );
861 Double_t invariantMassKmu = TMath::Sqrt( (energyDaughterMu+p3Daughter)*(energyDaughterMu+p3Daughter)-
862 motherMfromKink.Mag()*motherMfromKink.Mag() );
863 if (invariantMassKmu > fMaxKinkInvMassKmu) pass=kFALSE;
864 if (invariantMassKmu < fMinKinkInvMassKmu) pass=kFALSE;
865 fTrackMass=invariantMassKmu;
869 QAbefore(13)->Fill(qt);
870 if (pass) QAafter(13)->Fill(qt);
871 QAbefore(14)->Fill(invariantMassKmu);
872 if (pass) QAafter(14)->Fill(invariantMassKmu);
873 const Double_t* kinkPosition = kink->GetPosition();
874 QAbefore(15)->Fill(kinkPosition[0],kinkPosition[1]);
875 if (pass) QAafter(15)->Fill(kinkPosition[0],kinkPosition[1]);
876 QAbefore(16)->Fill(motherMfromKink.Mag(),kinkAngle*TMath::RadToDeg());
877 if (pass) QAafter(16)->Fill(motherMfromKink.Mag(),kinkAngle*TMath::RadToDeg());
881 Int_t indexKinkMother = kink->GetIndex(0);
882 AliESDtrack* motherTrack = dynamic_cast<AliESDtrack*>(fEvent->GetTrack(indexKinkMother));
883 if (!motherTrack) return kFALSE;
884 if (!PassesCuts(motherTrack)) pass = kFALSE;
889 //-----------------------------------------------------------------------
890 Bool_t AliFlowTrackCuts::PassesCuts(AliVParticle* vparticle)
892 //check cuts for an ESD vparticle
894 ////////////////////////////////////////////////////////////////
895 // start by preparing the track parameters to cut on //////////
896 ////////////////////////////////////////////////////////////////
897 //clean up from last iteration
901 //get the label and the mc particle
902 fTrackLabel = (fFakesAreOK)?TMath::Abs(vparticle->GetLabel()):vparticle->GetLabel();
903 if (fMCevent) fMCparticle = static_cast<AliMCParticle*>(fMCevent->GetTrack(fTrackLabel));
904 else fMCparticle=NULL;
906 Bool_t isMCparticle = kFALSE; //some things are different for MC particles, check!
907 AliESDtrack* esdTrack = dynamic_cast<AliESDtrack*>(vparticle);
908 AliAODTrack* aodTrack = NULL;
911 //for an ESD track we do some magic sometimes like constructing TPC only parameters
912 //or doing some hybrid, handle that here
913 HandleESDtrack(esdTrack);
917 HandleVParticle(vparticle);
918 //now check if produced particle is MC
919 isMCparticle = (dynamic_cast<AliMCParticle*>(fTrack))!=NULL;
920 aodTrack = dynamic_cast<AliAODTrack*>(vparticle); //keep the additional dynamic cast out of the way for ESDs
922 ////////////////////////////////////////////////////////////////
923 ////////////////////////////////////////////////////////////////
925 if (!fTrack) return kFALSE;
926 //because it may be different from global, not needed for aodTrack because we dont do anything funky there
927 if (esdTrack) esdTrack = static_cast<AliESDtrack*>(fTrack);
929 //check the common cuts for the current particle fTrack (MC,AOD,ESD)
930 Double_t pt = fTrack->Pt();
931 Double_t p = fTrack->P();
932 if (!fFakesAreOK) {if (fTrackLabel<0) pass=kFALSE;}
933 if (fCutPt) {if (pt < fPtMin || pt >= fPtMax ) pass=kFALSE;}
934 if (fCutEta) {if (fTrack->Eta() < fEtaMin || fTrack->Eta() >= fEtaMax ) pass=kFALSE;}
935 if (fCutPhi) {if (fTrack->Phi() < fPhiMin || fTrack->Phi() >= fPhiMax ) pass=kFALSE;}
936 if (fRequireCharge) {if (fTrack->Charge() == 0) pass=kFALSE;}
937 if (fCutCharge && !isMCparticle) {if (fTrack->Charge() != fCharge) pass=kFALSE;}
938 if (fCutCharge && isMCparticle)
940 //in case of an MC particle the charge is stored in units of 1/3|e|
941 Int_t charge = TMath::Nint(fTrack->Charge()/3.0); //mc particles have charge in units of 1/3e
942 if (charge!=fCharge) pass=kFALSE;
944 //if(fCutPID) {if (fTrack->PID() != fPID) pass=kFALSE;}
946 //when additionally MC info is required
947 if (fCutMC && !PassesMCcuts()) pass=kFALSE;
949 //the case of ESD or AOD
950 if (esdTrack) { if (!PassesESDcuts(esdTrack)) { pass=kFALSE; } }
951 if (aodTrack) { if (!PassesAODcuts(aodTrack,pass)) { pass=kFALSE; } }
957 TParticle* tparticle=fMCparticle->Particle();
958 Int_t processID = tparticle->GetUniqueID();
959 Int_t firstMotherLabel = tparticle->GetFirstMother();
960 Bool_t primary = IsPhysicalPrimary();
962 //mcparticle->Particle()->ProductionVertex(v);
963 //Double_t prodvtxX = v.X();
964 //Double_t prodvtxY = v.Y();
966 Int_t pdgcode = fMCparticle->PdgCode();
967 AliVParticle* firstMotherParticle = fMCevent->GetTrack(firstMotherLabel);
968 Int_t pdgcodeFirstMother = 0;
969 if (firstMotherParticle) {pdgcodeFirstMother = firstMotherParticle->PdgCode();}
972 switch (TMath::Abs(pdgcode))
975 pdg = AliPID::kElectron + 0.5; break;
977 pdg = AliPID::kMuon + 0.5; break;
979 pdg = AliPID::kPion + 0.5; break;
981 pdg = AliPID::kKaon + 0.5; break;
983 pdg = AliPID::kProton + 0.5; break;
985 pdg = AliPID::kUnknown + 0.5; break;
987 pdg = TMath::Sign(pdg,static_cast<Float_t>(pdgcode));
989 Float_t geantCode = 0;
990 switch (pdgcodeFirstMother)
1001 case 12: case 14: case 16: //#nu
1005 geantCode=5; //#mu^{+}
1008 geantCode=6; //#mu^{-}
1016 case -211: //#pi^{-}
1019 case 130: //K^{0}_{L}
1035 geantCode=15; //#bar{p}
1038 geantCode=16; //K^{0}_{S}
1041 geantCode=17; //#eta
1044 geantCode=18; //#Lambda
1047 geantCode=19; //#Sigma^{+}
1050 geantCode=20; //#Sigma^{0}
1053 geantCode=21; //#Sigma^{-}
1056 geantCode=22; //#Theta^{0}
1059 geantCode=23; //#Theta^{-}
1062 geantCode=24; //#Omega^{-}
1065 geantCode=25; //#bar{n}
1068 geantCode=26; //#bar{#Lambda}
1071 geantCode=27; //#bar{#Sigma}^{-}
1074 geantCode=28; //#bar{#Sigma}^{0}
1077 geantCode=29; //#bar{#Sigma}^{+}
1080 geantCode=30; //#bar{#Theta}^{0}
1083 geantCode=31; //#bar{#Theta}^{+}
1086 geantCode=32; //#bar{#Omega}^{+}
1089 geantCode=33; //#tau^{+}
1092 geantCode=34; //#tau^{-}
1095 geantCode=35; //D^{+}
1098 geantCode=36; //D^{-}
1101 geantCode=37; //D^{0}
1104 geantCode=38; //#bar{D}^{0}
1107 geantCode=39; //D_{s}^{+}
1110 geantCode=40; //#bar{D_{s}}^{-}
1113 geantCode=41; //#Lambda_{c}^{+}
1116 geantCode=42; //W^{+}
1119 geantCode=43; //W^{-}
1122 geantCode=44; //Z^{0}
1129 QAbefore(2)->Fill(p,pdg);
1130 QAbefore(3)->Fill(p,primary?0.5:-0.5);
1131 QAbefore(4)->Fill(p,static_cast<Float_t>(processID));
1132 QAbefore(7)->Fill(p,geantCode+0.5);
1133 if (pass) QAafter(2)->Fill(p,pdg);
1134 if (pass) QAafter(3)->Fill(p,primary?0.5:-0.5);
1135 if (pass) QAafter(4)->Fill(p,static_cast<Float_t>(processID));
1136 if (pass) QAafter(7)->Fill(p,geantCode);
1140 //true by default, if we didn't set any cuts
1144 //_______________________________________________________________________
1145 Bool_t AliFlowTrackCuts::PassesAODcuts(const AliAODTrack* track, Bool_t passedFid)
1147 //check cuts for AOD
1148 Bool_t pass = passedFid;
1150 if (fCutNClustersTPC)
1152 Int_t ntpccls = track->GetTPCNcls();
1153 if (ntpccls < fNClustersTPCMin || ntpccls > fNClustersTPCMax) pass=kFALSE;
1156 if (fCutNClustersITS)
1158 Int_t nitscls = track->GetITSNcls();
1159 if (nitscls < fNClustersITSMin || nitscls > fNClustersITSMax) pass=kFALSE;
1162 if (fCutChi2PerClusterTPC)
1164 Double_t chi2tpc = track->Chi2perNDF();
1165 if (chi2tpc < fMinChi2PerClusterTPC || chi2tpc > fMaxChi2PerClusterTPC) pass=kFALSE;
1168 if (GetRequireTPCRefit() && !(track->GetStatus() & AliESDtrack::kTPCrefit) ) pass=kFALSE;
1169 if (GetRequireITSRefit() && !(track->GetStatus() & AliESDtrack::kITSrefit) ) pass=kFALSE;
1171 if (fUseAODFilterBit && !track->TestFilterBit(fAODFilterBit)) pass=kFALSE;
1173 if (fCutDCAToVertexXY && track->DCA()>GetMaxDCAToVertexXY()) pass=kFALSE;
1175 if (fCutDCAToVertexZ && track->ZAtDCA()>GetMaxDCAToVertexZ()) pass=kFALSE;
1177 Double_t dedx = track->GetTPCsignal();
1178 if (dedx < fMinimalTPCdedx) pass=kFALSE;
1180 track->GetIntegratedTimes(time);
1182 Double_t momTPC = track->GetTPCmomentum();
1183 QAbefore( 1)->Fill(momTPC,dedx);
1184 QAbefore( 5)->Fill(track->Pt(),track->DCA());
1185 QAbefore( 6)->Fill(track->Pt(),track->ZAtDCA());
1186 if (pass) QAafter( 1)->Fill(momTPC,dedx);
1187 if (pass) QAafter( 5)->Fill(track->Pt(),track->DCA());
1188 if (pass) QAafter( 6)->Fill(track->Pt(),track->ZAtDCA());
1189 QAbefore( 8)->Fill(track->P(),(track->GetTOFsignal()-time[AliPID::kElectron]));
1190 if (pass) QAafter( 8)->Fill(track->P(),(track->GetTOFsignal()-time[AliPID::kElectron]));
1191 QAbefore( 9)->Fill(track->P(),(track->GetTOFsignal()-time[AliPID::kMuon]));
1192 if (pass) QAafter( 9)->Fill(track->P(),(track->GetTOFsignal()-time[AliPID::kMuon]));
1193 QAbefore(10)->Fill(track->P(),(track->GetTOFsignal()-time[AliPID::kPion]));
1194 if (pass) QAafter( 10)->Fill(track->P(),(track->GetTOFsignal()-time[AliPID::kPion]));
1195 QAbefore(11)->Fill(track->P(),(track->GetTOFsignal()-time[AliPID::kKaon]));
1196 if (pass) QAafter( 11)->Fill(track->P(),(track->GetTOFsignal()-time[AliPID::kKaon]));
1197 QAbefore(12)->Fill(track->P(),(track->GetTOFsignal()-time[AliPID::kProton]));
1198 if (pass) QAafter( 12)->Fill(track->P(),(track->GetTOFsignal()-time[AliPID::kProton]));
1201 if (fCutPID && (fParticleID!=AliPID::kUnknown)) //if kUnknown don't cut on PID
1203 if (!PassesAODpidCut(track)) pass=kFALSE;
1209 //_______________________________________________________________________
1210 Bool_t AliFlowTrackCuts::PassesESDcuts(AliESDtrack* track)
1212 //check cuts on ESD tracks
1216 track->GetImpactParameters(dcaxy,dcaz);
1217 const AliExternalTrackParam* pout = track->GetOuterParam();
1218 const AliExternalTrackParam* pin = track->GetInnerParam();
1219 if (fIgnoreTPCzRange)
1223 Double_t zin = pin->GetZ();
1224 Double_t zout = pout->GetZ();
1225 if (zin*zout<0) pass=kFALSE; //reject if cross the membrane
1226 if (zin < fIgnoreTPCzRangeMin || zin > fIgnoreTPCzRangeMax) pass=kFALSE;
1227 if (zout < fIgnoreTPCzRangeMin || zout > fIgnoreTPCzRangeMax) pass=kFALSE;
1231 Int_t ntpccls = ( fParamType==kTPCstandalone )?
1232 track->GetTPCNclsIter1():track->GetTPCNcls();
1233 if (fCutChi2PerClusterTPC)
1235 Float_t tpcchi2 = (fParamType==kTPCstandalone)?
1236 track->GetTPCchi2Iter1():track->GetTPCchi2();
1237 tpcchi2 = (ntpccls>0)?tpcchi2/ntpccls:-FLT_MAX;
1238 if (tpcchi2<fMinChi2PerClusterTPC || tpcchi2 >=fMaxChi2PerClusterTPC)
1242 if (fCutMinimalTPCdedx)
1244 if (track->GetTPCsignal() < fMinimalTPCdedx) pass=kFALSE;
1247 if (fCutNClustersTPC)
1249 if (ntpccls < fNClustersTPCMin || ntpccls > fNClustersTPCMax) pass=kFALSE;
1252 Int_t nitscls = track->GetNcls(0);
1253 if (fCutNClustersITS)
1255 if (nitscls < fNClustersITSMin || nitscls > fNClustersITSMax) pass=kFALSE;
1258 //some stuff is still handled by AliESDtrackCuts class - delegate
1259 if (fAliESDtrackCuts)
1261 if (!fAliESDtrackCuts->IsSelected(track)) pass=kFALSE;
1264 //PID part with pid QA
1265 Double_t beta = GetBeta(track);
1266 Double_t dedx = Getdedx(track);
1269 if (pass) QAbefore(0)->Fill(track->GetP(),beta);
1270 if (pass) QAbefore(1)->Fill(pin->GetP(),dedx);
1272 if (fCutPID && (fParticleID!=AliPID::kUnknown)) //if kUnknown don't cut on PID
1274 if (!PassesESDpidCut(track)) pass=kFALSE;
1276 if (fCutRejectElectronsWithTPCpid)
1278 //reject electrons using standard TPC pid
1279 //TODO this should be rethought....
1280 Double_t pidTPC[AliPID::kSPECIES];
1281 track->GetTPCpid(pidTPC);
1282 if (pidTPC[AliPID::kElectron]<fParticleProbability) pass=kFALSE;
1286 if (pass) QAafter(0)->Fill(track->GetP(),beta);
1287 if (pass) QAafter(1)->Fill(pin->GetP(),dedx);
1289 //end pid part with qa
1293 Double_t pt = track->Pt();
1294 QAbefore(5)->Fill(pt,dcaxy);
1295 QAbefore(6)->Fill(pt,dcaz);
1296 if (pass) QAafter(5)->Fill(pt,dcaxy);
1297 if (pass) QAafter(6)->Fill(pt,dcaz);
1298 QAbefore(17)->Fill(Float_t(track->GetKinkIndex(0)));
1299 if (pass) QAafter(17)->Fill(Float_t(track->GetKinkIndex(0)));
1305 //-----------------------------------------------------------------------
1306 void AliFlowTrackCuts::HandleVParticle(AliVParticle* track)
1308 //handle the general case
1317 //-----------------------------------------------------------------------
1318 void AliFlowTrackCuts::HandleESDtrack(AliESDtrack* track)
1326 case kTPCstandalone:
1327 if (!track->FillTPCOnlyTrack(fTPCtrack))
1334 fTrack = &fTPCtrack;
1335 //recalculate the label and mc particle, they may differ as TPClabel != global label
1336 fTrackLabel = (fFakesAreOK)?TMath::Abs(fTrack->GetLabel()):fTrack->GetLabel();
1337 if (fMCevent) fMCparticle = static_cast<AliMCParticle*>(fMCevent->GetTrack(fTrackLabel));
1338 else fMCparticle=NULL;
1341 if (fForceTPCstandalone)
1343 if (!track->FillTPCOnlyTrack(fTPCtrack))
1350 fTrack = &fTPCtrack;
1351 //recalculate the label and mc particle, they may differ as TPClabel != global label
1352 fTrackLabel = (fFakesAreOK)?TMath::Abs(fTrack->GetLabel()):fTrack->GetLabel();
1353 if (fMCevent) fMCparticle = static_cast<AliMCParticle*>(fMCevent->GetTrack(fTrackLabel));
1354 else fMCparticle=NULL;
1362 //-----------------------------------------------------------------------
1363 Int_t AliFlowTrackCuts::Count(AliVEvent* event)
1365 //calculate the number of track in given event.
1366 //if argument is NULL(default) take the event attached
1368 Int_t multiplicity = 0;
1371 for (Int_t i=0; i<GetNumberOfInputObjects(); i++)
1373 if (IsSelected(GetInputObject(i))) multiplicity++;
1378 for (Int_t i=0; i<event->GetNumberOfTracks(); i++)
1380 if (IsSelected(event->GetTrack(i))) multiplicity++;
1383 return multiplicity;
1386 //-----------------------------------------------------------------------
1387 AliFlowTrackCuts* AliFlowTrackCuts::GetStandardVZEROOnlyTrackCuts()
1389 //returns the lhc10h vzero track cuts, this function
1390 //is left here for backward compatibility
1391 //if a run is recognized as 11h, the calibration method will
1392 //switch to 11h calbiration, which means that the cut
1393 //object is updated but not replaced.
1394 //calibratin is only available for PbPb runs
1395 return GetStandardVZEROOnlyTrackCuts2010();
1397 //-----------------------------------------------------------------------
1398 AliFlowTrackCuts* AliFlowTrackCuts::GetStandardVZEROOnlyTrackCuts2010()
1400 //get standard VZERO cuts
1401 AliFlowTrackCuts* cuts = new AliFlowTrackCuts("standard vzero flow cuts 2010");
1402 cuts->SetParamType(kVZERO);
1403 cuts->SetEtaRange( -10, +10 );
1404 cuts->SetPhiMin( 0 );
1405 cuts->SetPhiMax( TMath::TwoPi() );
1406 // options for the reweighting
1407 cuts->SetVZEROgainEqualizationPerRing(kFALSE);
1408 cuts->SetApplyRecentering(kTRUE);
1409 // to exclude a ring , do e.g.
1410 // cuts->SetUseVZERORing(7, kFALSE);
1413 //-----------------------------------------------------------------------
1414 AliFlowTrackCuts* AliFlowTrackCuts::GetStandardVZEROOnlyTrackCuts2011()
1416 //get standard VZERO cuts for 2011 data
1417 //in this case, the vzero segments will be weighted by
1418 //VZEROEqMultiplicity,
1419 //if recentering is enableded, the sub-q vectors
1420 //will be taken from the event header, so make sure to run
1421 //the VZERO event plane selection task before this task !
1422 //recentering replaces the already evaluated q-vectors, so
1423 //when chosen, additional settings (e.g. excluding rings)
1424 //have no effect. recentering is true by default
1426 //NOTE user is responsible for running the vzero event plane
1427 //selection task in advance, e.g. add to your launcher macro
1429 // gROOT->LoadMacro("$ALICE_ROOT/ANALYSIS/macros/AddTaskVZEROEPSelection.C");
1430 // AddTaskVZEROEPSelection();
1432 AliFlowTrackCuts* cuts = new AliFlowTrackCuts("standard vzero flow cuts 2011");
1433 cuts->SetParamType(kVZERO);
1434 cuts->SetEtaRange( -10, +10 );
1435 cuts->SetPhiMin( 0 );
1436 cuts->SetPhiMax( TMath::TwoPi() );
1437 cuts->SetApplyRecentering(kTRUE);
1440 //-----------------------------------------------------------------------
1441 AliFlowTrackCuts* AliFlowTrackCuts::GetStandardGlobalTrackCuts2010()
1444 AliFlowTrackCuts* cuts = new AliFlowTrackCuts("standard Global tracks");
1445 cuts->SetParamType(kGlobal);
1446 cuts->SetPtRange(0.2,5.);
1447 cuts->SetEtaRange(-0.8,0.8);
1448 cuts->SetMinNClustersTPC(70);
1449 cuts->SetMinChi2PerClusterTPC(0.1);
1450 cuts->SetMaxChi2PerClusterTPC(4.0);
1451 cuts->SetMinNClustersITS(2);
1452 cuts->SetRequireITSRefit(kTRUE);
1453 cuts->SetRequireTPCRefit(kTRUE);
1454 cuts->SetMaxDCAToVertexXY(0.3);
1455 cuts->SetMaxDCAToVertexZ(0.3);
1456 cuts->SetAcceptKinkDaughters(kFALSE);
1457 cuts->SetMinimalTPCdedx(10.);
1462 //-----------------------------------------------------------------------
1463 AliFlowTrackCuts* AliFlowTrackCuts::GetStandardTPCStandaloneTrackCuts2010()
1466 AliFlowTrackCuts* cuts = new AliFlowTrackCuts("standard TPC standalone 2010");
1467 cuts->SetParamType(kTPCstandalone);
1468 cuts->SetPtRange(0.2,5.);
1469 cuts->SetEtaRange(-0.8,0.8);
1470 cuts->SetMinNClustersTPC(70);
1471 cuts->SetMinChi2PerClusterTPC(0.2);
1472 cuts->SetMaxChi2PerClusterTPC(4.0);
1473 cuts->SetMaxDCAToVertexXY(3.0);
1474 cuts->SetMaxDCAToVertexZ(3.0);
1475 cuts->SetDCAToVertex2D(kTRUE);
1476 cuts->SetAcceptKinkDaughters(kFALSE);
1477 cuts->SetMinimalTPCdedx(10.);
1482 //-----------------------------------------------------------------------
1483 AliFlowTrackCuts* AliFlowTrackCuts::GetStandardTPCStandaloneTrackCuts()
1486 AliFlowTrackCuts* cuts = new AliFlowTrackCuts("standard TPC standalone");
1487 cuts->SetParamType(kTPCstandalone);
1488 cuts->SetPtRange(0.2,5.);
1489 cuts->SetEtaRange(-0.8,0.8);
1490 cuts->SetMinNClustersTPC(70);
1491 cuts->SetMinChi2PerClusterTPC(0.2);
1492 cuts->SetMaxChi2PerClusterTPC(4.0);
1493 cuts->SetMaxDCAToVertexXY(3.0);
1494 cuts->SetMaxDCAToVertexZ(3.0);
1495 cuts->SetDCAToVertex2D(kTRUE);
1496 cuts->SetAcceptKinkDaughters(kFALSE);
1497 cuts->SetMinimalTPCdedx(10.);
1502 //-----------------------------------------------------------------------
1503 AliFlowTrackCuts* AliFlowTrackCuts::GetStandardITSTPCTrackCuts2009(Bool_t selPrimaries)
1506 AliFlowTrackCuts* cuts = new AliFlowTrackCuts("standard global track cuts 2009");
1507 delete cuts->fAliESDtrackCuts;
1508 cuts->fAliESDtrackCuts = AliESDtrackCuts::GetStandardITSTPCTrackCuts2009(selPrimaries);
1509 cuts->SetParamType(kGlobal);
1513 //-----------------------------------------------------------------------------
1514 AliFlowTrackCuts* AliFlowTrackCuts::GetStandardMuonTrackCuts(Bool_t isMC, Int_t passN)
1517 AliFlowTrackCuts* cuts = new AliFlowTrackCuts("standard muon track cuts");
1518 cuts->SetParamType(kMUON);
1519 cuts->SetStandardMuonTrackCuts();
1520 cuts->SetIsMuonMC(isMC);
1521 cuts->SetMuonPassNumber(passN);
1525 //-----------------------------------------------------------------------
1526 //AliFlowTrack* AliFlowTrackCuts::FillFlowTrackV0(TObjArray* trackCollection, Int_t trackIndex) const
1528 // //fill flow track from a reconstructed V0 (topological)
1529 // AliFlowTrack* flowtrack = static_cast<AliFlowTrack*>(trackCollection->At(trackIndex));
1532 // flowtrack->Clear();
1536 // flowtrack = new AliFlowCandidateTrack();
1537 // trackCollection->AddAtAndExpand(flowtrack,trackIndex);
1540 // TParticle *tmpTParticle=NULL;
1541 // AliMCParticle* tmpAliMCParticle=NULL;
1542 // AliExternalTrackParam* externalParams=NULL;
1543 // AliESDtrack* esdtrack=NULL;
1544 // switch(fParamMix)
1547 // flowtrack->Set(fTrack);
1549 // case kTrackWithMCkine:
1550 // flowtrack->Set(fMCparticle);
1552 // case kTrackWithMCPID:
1553 // flowtrack->Set(fTrack);
1554 // //flowtrack->setPID(...) from mc, when implemented
1556 // case kTrackWithMCpt:
1557 // if (!fMCparticle) return NULL;
1558 // flowtrack->Set(fTrack);
1559 // flowtrack->SetPt(fMCparticle->Pt());
1561 // case kTrackWithPtFromFirstMother:
1562 // if (!fMCparticle) return NULL;
1563 // flowtrack->Set(fTrack);
1564 // tmpTParticle = fMCparticle->Particle();
1565 // tmpAliMCParticle = static_cast<AliMCParticle*>(fMCevent->GetTrack(tmpTParticle->GetFirstMother()));
1566 // flowtrack->SetPt(tmpAliMCParticle->Pt());
1568 // case kTrackWithTPCInnerParams:
1569 // esdtrack = dynamic_cast<AliESDtrack*>(fTrack);
1570 // if (!esdtrack) return NULL;
1571 // externalParams = const_cast<AliExternalTrackParam*>(esdtrack->GetTPCInnerParam());
1572 // if (!externalParams) return NULL;
1573 // flowtrack->Set(externalParams);
1576 // flowtrack->Set(fTrack);
1579 // if (fParamType==kMC)
1581 // flowtrack->SetSource(AliFlowTrack::kFromMC);
1582 // flowtrack->SetID(fTrackLabel);
1584 // else if (dynamic_cast<AliAODTrack*>(fTrack))
1586 // if (fParamType==kMUON) // XZhang 20120604
1587 // flowtrack->SetSource(AliFlowTrack::kFromMUON); // XZhang 20120604
1588 // else // XZhang 20120604
1589 // flowtrack->SetSource(AliFlowTrack::kFromAOD); // XZhang 20120604
1590 // flowtrack->SetID(static_cast<AliVTrack*>(fTrack)->GetID());
1592 // else if (dynamic_cast<AliMCParticle*>(fTrack))
1594 // flowtrack->SetSource(AliFlowTrack::kFromMC);
1595 // flowtrack->SetID(static_cast<AliVTrack*>(fTrack)->GetID());
1600 // //add daughter indices
1603 // return flowtrack;
1606 //-----------------------------------------------------------------------
1607 AliFlowTrack* AliFlowTrackCuts::FillFlowTrackKink(TObjArray* trackCollection, Int_t trackIndex) const
1609 //fill flow track from AliVParticle (ESD,AOD,MC)
1610 AliFlowTrack* flowtrack = static_cast<AliFlowTrack*>(trackCollection->At(trackIndex));
1617 flowtrack = new AliFlowCandidateTrack();
1618 trackCollection->AddAtAndExpand(flowtrack,trackIndex);
1621 TParticle *tmpTParticle=NULL;
1622 AliMCParticle* tmpAliMCParticle=NULL;
1623 AliExternalTrackParam* externalParams=NULL;
1624 AliESDtrack* esdtrack=NULL;
1628 flowtrack->Set(fTrack);
1630 case kTrackWithMCkine:
1631 flowtrack->Set(fMCparticle);
1633 case kTrackWithMCPID:
1634 flowtrack->Set(fTrack);
1635 //flowtrack->setPID(...) from mc, when implemented
1637 case kTrackWithMCpt:
1638 if (!fMCparticle) return NULL;
1639 flowtrack->Set(fTrack);
1640 flowtrack->SetPt(fMCparticle->Pt());
1642 case kTrackWithPtFromFirstMother:
1643 if (!fMCparticle) return NULL;
1644 flowtrack->Set(fTrack);
1645 tmpTParticle = fMCparticle->Particle();
1646 tmpAliMCParticle = static_cast<AliMCParticle*>(fMCevent->GetTrack(tmpTParticle->GetFirstMother()));
1647 flowtrack->SetPt(tmpAliMCParticle->Pt());
1649 case kTrackWithTPCInnerParams:
1650 esdtrack = dynamic_cast<AliESDtrack*>(fTrack);
1651 if (!esdtrack) return NULL;
1652 externalParams = const_cast<AliExternalTrackParam*>(esdtrack->GetTPCInnerParam());
1653 if (!externalParams) return NULL;
1654 flowtrack->Set(externalParams);
1657 flowtrack->Set(fTrack);
1660 if (fParamType==kMC)
1662 flowtrack->SetSource(AliFlowTrack::kFromMC);
1663 flowtrack->SetID(fTrackLabel);
1665 else if (dynamic_cast<AliESDtrack*>(fTrack))
1667 flowtrack->SetSource(AliFlowTrack::kFromESD);
1668 flowtrack->SetID(static_cast<AliVTrack*>(fTrack)->GetID());
1670 else if (dynamic_cast<AliESDMuonTrack*>(fTrack)) // XZhang 20120604
1671 { // XZhang 20120604
1672 flowtrack->SetSource(AliFlowTrack::kFromMUON); // XZhang 20120604
1673 flowtrack->SetID((Int_t)static_cast<AliESDMuonTrack*>(fTrack)->GetUniqueID()); // XZhang 20120604
1674 } // XZhang 20120604
1675 else if (dynamic_cast<AliAODTrack*>(fTrack))
1677 if (fParamType==kMUON) // XZhang 20120604
1678 flowtrack->SetSource(AliFlowTrack::kFromMUON); // XZhang 20120604
1679 else // XZhang 20120604
1680 flowtrack->SetSource(AliFlowTrack::kFromAOD); // XZhang 20120604
1681 flowtrack->SetID(static_cast<AliVTrack*>(fTrack)->GetID());
1683 else if (dynamic_cast<AliMCParticle*>(fTrack))
1685 flowtrack->SetSource(AliFlowTrack::kFromMC);
1686 flowtrack->SetID(static_cast<AliVTrack*>(fTrack)->GetID());
1691 Int_t indexMother = fKink->GetIndex(0);
1692 Int_t indexDaughter = fKink->GetIndex(1);
1693 flowtrack->SetID(indexMother);
1694 flowtrack->AddDaughter(indexDaughter);
1695 flowtrack->SetMass(1.);
1696 flowtrack->SetSource(AliFlowTrack::kFromKink);
1699 flowtrack->SetMass(fTrackMass);
1704 //-----------------------------------------------------------------------
1705 AliFlowTrack* AliFlowTrackCuts::FillFlowTrackGeneric(TObjArray* trackCollection, Int_t trackIndex) const
1707 //fill a flow track from tracklet,vzero,pmd,...
1708 AliFlowTrack* flowtrack = static_cast<AliFlowTrack*>(trackCollection->At(trackIndex));
1715 flowtrack = new AliFlowTrack();
1716 trackCollection->AddAtAndExpand(flowtrack,trackIndex);
1719 if (FillFlowTrackGeneric(flowtrack)) return flowtrack;
1722 trackCollection->RemoveAt(trackIndex);
1728 //-----------------------------------------------------------------------
1729 Bool_t AliFlowTrackCuts::FillFlowTrackGeneric(AliFlowTrack* flowtrack) const
1731 //fill a flow track from tracklet,vzero,pmd,...
1732 TParticle *tmpTParticle=NULL;
1733 AliMCParticle* tmpAliMCParticle=NULL;
1737 flowtrack->SetPhi(fTrackPhi);
1738 flowtrack->SetEta(fTrackEta);
1739 flowtrack->SetWeight(fTrackWeight);
1740 flowtrack->SetPt(fTrackPt);
1741 flowtrack->SetMass(fTrackMass);
1743 case kTrackWithMCkine:
1744 if (!fMCparticle) return kFALSE;
1745 flowtrack->SetPhi( fMCparticle->Phi() );
1746 flowtrack->SetEta( fMCparticle->Eta() );
1747 flowtrack->SetPt( fMCparticle->Pt() );
1748 flowtrack->SetMass(fTrackMass);
1750 case kTrackWithMCpt:
1751 if (!fMCparticle) return kFALSE;
1752 flowtrack->SetPhi(fTrackPhi);
1753 flowtrack->SetEta(fTrackEta);
1754 flowtrack->SetWeight(fTrackWeight);
1755 flowtrack->SetPt(fMCparticle->Pt());
1756 flowtrack->SetMass(fTrackMass);
1758 case kTrackWithPtFromFirstMother:
1759 if (!fMCparticle) return kFALSE;
1760 flowtrack->SetPhi(fTrackPhi);
1761 flowtrack->SetEta(fTrackEta);
1762 flowtrack->SetWeight(fTrackWeight);
1763 tmpTParticle = fMCparticle->Particle();
1764 tmpAliMCParticle = static_cast<AliMCParticle*>(fMCevent->GetTrack(tmpTParticle->GetFirstMother()));
1765 flowtrack->SetPt(tmpAliMCParticle->Pt());
1766 flowtrack->SetMass(fTrackMass);
1769 flowtrack->SetPhi(fTrackPhi);
1770 flowtrack->SetEta(fTrackEta);
1771 flowtrack->SetWeight(fTrackWeight);
1772 flowtrack->SetPt(fTrackPt);
1773 flowtrack->SetMass(fTrackMass);
1776 flowtrack->SetSource(AliFlowTrack::kFromTracklet);
1780 //-----------------------------------------------------------------------
1781 AliFlowTrack* AliFlowTrackCuts::FillFlowTrackVParticle(TObjArray* trackCollection, Int_t trackIndex) const
1783 //fill flow track from AliVParticle (ESD,AOD,MC)
1785 AliFlowTrack* flowtrack = static_cast<AliFlowTrack*>(trackCollection->At(trackIndex));
1792 flowtrack = new AliFlowTrack();
1793 trackCollection->AddAtAndExpand(flowtrack,trackIndex);
1796 if (FillFlowTrackVParticle(flowtrack)) return flowtrack;
1799 trackCollection->RemoveAt(trackIndex);
1805 //-----------------------------------------------------------------------
1806 Bool_t AliFlowTrackCuts::FillFlowTrackVParticle(AliFlowTrack* flowtrack) const
1808 //fill flow track from AliVParticle (ESD,AOD,MC)
1809 if (!fTrack) return kFALSE;
1810 TParticle *tmpTParticle=NULL;
1811 AliMCParticle* tmpAliMCParticle=NULL;
1812 AliExternalTrackParam* externalParams=NULL;
1813 AliESDtrack* esdtrack=NULL;
1817 flowtrack->Set(fTrack);
1819 case kTrackWithMCkine:
1820 flowtrack->Set(fMCparticle);
1822 case kTrackWithMCPID:
1823 flowtrack->Set(fTrack);
1824 //flowtrack->setPID(...) from mc, when implemented
1826 case kTrackWithMCpt:
1827 if (!fMCparticle) return kFALSE;
1828 flowtrack->Set(fTrack);
1829 flowtrack->SetPt(fMCparticle->Pt());
1831 case kTrackWithPtFromFirstMother:
1832 if (!fMCparticle) return kFALSE;
1833 flowtrack->Set(fTrack);
1834 tmpTParticle = fMCparticle->Particle();
1835 tmpAliMCParticle = static_cast<AliMCParticle*>(fMCevent->GetTrack(tmpTParticle->GetFirstMother()));
1836 flowtrack->SetPt(tmpAliMCParticle->Pt());
1838 case kTrackWithTPCInnerParams:
1839 esdtrack = dynamic_cast<AliESDtrack*>(fTrack);
1840 if (!esdtrack) return kFALSE;
1841 externalParams = const_cast<AliExternalTrackParam*>(esdtrack->GetTPCInnerParam());
1842 if (!externalParams) return kFALSE;
1843 flowtrack->Set(externalParams);
1846 flowtrack->Set(fTrack);
1849 if (fParamType==kMC)
1851 flowtrack->SetSource(AliFlowTrack::kFromMC);
1852 flowtrack->SetID(fTrackLabel);
1854 else if (dynamic_cast<AliESDtrack*>(fTrack))
1856 flowtrack->SetSource(AliFlowTrack::kFromESD);
1857 flowtrack->SetID(static_cast<AliVTrack*>(fTrack)->GetID());
1859 else if (dynamic_cast<AliESDMuonTrack*>(fTrack)) // XZhang 20120604
1860 { // XZhang 20120604
1861 flowtrack->SetSource(AliFlowTrack::kFromMUON); // XZhang 20120604
1862 flowtrack->SetID((Int_t)static_cast<AliESDMuonTrack*>(fTrack)->GetUniqueID()); // XZhang 20120604
1863 } // XZhang 20120604
1864 else if (dynamic_cast<AliAODTrack*>(fTrack))
1866 if (fParamType==kMUON) // XZhang 20120604
1867 flowtrack->SetSource(AliFlowTrack::kFromMUON); // XZhang 20120604
1868 else // XZhang 20120604
1869 flowtrack->SetSource(AliFlowTrack::kFromAOD); // XZhang 20120604
1870 flowtrack->SetID(static_cast<AliVTrack*>(fTrack)->GetID());
1872 else if (dynamic_cast<AliMCParticle*>(fTrack))
1874 flowtrack->SetSource(AliFlowTrack::kFromMC);
1875 flowtrack->SetID(static_cast<AliVTrack*>(fTrack)->GetID());
1877 flowtrack->SetMass(fTrackMass);
1881 //-----------------------------------------------------------------------
1882 AliFlowTrack* AliFlowTrackCuts::FillFlowTrack(TObjArray* trackCollection, Int_t trackIndex) const
1884 //fill a flow track constructed from whatever we applied cuts on
1885 //return true on success
1889 return FillFlowTrackGeneric(trackCollection, trackIndex);
1891 return FillFlowTrackGeneric(trackCollection, trackIndex);
1893 return FillFlowTrackGeneric(trackCollection, trackIndex);
1895 return FillFlowTrackKink(trackCollection, trackIndex);
1897 // return FillFlowTrackV0(trackCollection, trackIndex);
1899 return FillFlowTrackVParticle(trackCollection, trackIndex);
1903 //-----------------------------------------------------------------------
1904 Bool_t AliFlowTrackCuts::FillFlowTrack(AliFlowTrack* track) const
1906 //fill a flow track constructed from whatever we applied cuts on
1907 //return true on success
1911 return FillFlowTrackGeneric(track);
1913 return FillFlowTrackGeneric(track);
1915 return FillFlowTrackGeneric(track);
1917 return FillFlowTrackVParticle(track);
1921 ////-----------------------------------------------------------------------
1922 //AliFlowTrack* AliFlowTrackCuts::MakeFlowTrackSPDtracklet() const
1924 // //make a flow track from tracklet
1925 // AliFlowTrack* flowtrack=NULL;
1926 // TParticle *tmpTParticle=NULL;
1927 // AliMCParticle* tmpAliMCParticle=NULL;
1928 // switch (fParamMix)
1931 // flowtrack = new AliFlowTrack();
1932 // flowtrack->SetPhi(fTrackPhi);
1933 // flowtrack->SetEta(fTrackEta);
1934 // flowtrack->SetWeight(fTrackWeight);
1936 // case kTrackWithMCkine:
1937 // if (!fMCparticle) return NULL;
1938 // flowtrack = new AliFlowTrack();
1939 // flowtrack->SetPhi( fMCparticle->Phi() );
1940 // flowtrack->SetEta( fMCparticle->Eta() );
1941 // flowtrack->SetPt( fMCparticle->Pt() );
1943 // case kTrackWithMCpt:
1944 // if (!fMCparticle) return NULL;
1945 // flowtrack = new AliFlowTrack();
1946 // flowtrack->SetPhi(fTrackPhi);
1947 // flowtrack->SetEta(fTrackEta);
1948 // flowtrack->SetWeight(fTrackWeight);
1949 // flowtrack->SetPt(fMCparticle->Pt());
1951 // case kTrackWithPtFromFirstMother:
1952 // if (!fMCparticle) return NULL;
1953 // flowtrack = new AliFlowTrack();
1954 // flowtrack->SetPhi(fTrackPhi);
1955 // flowtrack->SetEta(fTrackEta);
1956 // flowtrack->SetWeight(fTrackWeight);
1957 // tmpTParticle = fMCparticle->Particle();
1958 // tmpAliMCParticle = static_cast<AliMCParticle*>(fMCevent->GetTrack(tmpTParticle->GetFirstMother()));
1959 // flowtrack->SetPt(tmpAliMCParticle->Pt());
1962 // flowtrack = new AliFlowTrack();
1963 // flowtrack->SetPhi(fTrackPhi);
1964 // flowtrack->SetEta(fTrackEta);
1965 // flowtrack->SetWeight(fTrackWeight);
1968 // flowtrack->SetSource(AliFlowTrack::kFromTracklet);
1969 // return flowtrack;
1972 ////-----------------------------------------------------------------------
1973 //AliFlowTrack* AliFlowTrackCuts::MakeFlowTrackVParticle() const
1975 // //make flow track from AliVParticle (ESD,AOD,MC)
1976 // if (!fTrack) return NULL;
1977 // AliFlowTrack* flowtrack=NULL;
1978 // TParticle *tmpTParticle=NULL;
1979 // AliMCParticle* tmpAliMCParticle=NULL;
1980 // AliExternalTrackParam* externalParams=NULL;
1981 // AliESDtrack* esdtrack=NULL;
1982 // switch(fParamMix)
1985 // flowtrack = new AliFlowTrack(fTrack);
1987 // case kTrackWithMCkine:
1988 // flowtrack = new AliFlowTrack(fMCparticle);
1990 // case kTrackWithMCPID:
1991 // flowtrack = new AliFlowTrack(fTrack);
1992 // //flowtrack->setPID(...) from mc, when implemented
1994 // case kTrackWithMCpt:
1995 // if (!fMCparticle) return NULL;
1996 // flowtrack = new AliFlowTrack(fTrack);
1997 // flowtrack->SetPt(fMCparticle->Pt());
1999 // case kTrackWithPtFromFirstMother:
2000 // if (!fMCparticle) return NULL;
2001 // flowtrack = new AliFlowTrack(fTrack);
2002 // tmpTParticle = fMCparticle->Particle();
2003 // tmpAliMCParticle = static_cast<AliMCParticle*>(fMCevent->GetTrack(tmpTParticle->GetFirstMother()));
2004 // flowtrack->SetPt(tmpAliMCParticle->Pt());
2006 // case kTrackWithTPCInnerParams:
2007 // esdtrack = dynamic_cast<AliESDtrack*>(fTrack);
2008 // if (!esdtrack) return NULL;
2009 // externalParams = const_cast<AliExternalTrackParam*>(esdtrack->GetTPCInnerParam());
2010 // if (!externalParams) return NULL;
2011 // flowtrack = new AliFlowTrack(externalParams);
2014 // flowtrack = new AliFlowTrack(fTrack);
2017 // if (fParamType==kMC)
2019 // flowtrack->SetSource(AliFlowTrack::kFromMC);
2020 // flowtrack->SetID(fTrackLabel);
2022 // else if (dynamic_cast<AliESDtrack*>(fTrack))
2024 // flowtrack->SetSource(AliFlowTrack::kFromESD);
2025 // flowtrack->SetID(static_cast<AliVTrack*>(fTrack)->GetID());
2027 // else if (dynamic_cast<AliAODTrack*>(fTrack))
2029 // flowtrack->SetSource(AliFlowTrack::kFromAOD);
2030 // flowtrack->SetID(static_cast<AliVTrack*>(fTrack)->GetID());
2032 // else if (dynamic_cast<AliMCParticle*>(fTrack))
2034 // flowtrack->SetSource(AliFlowTrack::kFromMC);
2035 // flowtrack->SetID(static_cast<AliVTrack*>(fTrack)->GetID());
2037 // return flowtrack;
2040 ////-----------------------------------------------------------------------
2041 //AliFlowTrack* AliFlowTrackCuts::MakeFlowTrackPMDtrack() const
2043 // //make a flow track from PMD track
2044 // AliFlowTrack* flowtrack=NULL;
2045 // TParticle *tmpTParticle=NULL;
2046 // AliMCParticle* tmpAliMCParticle=NULL;
2047 // switch (fParamMix)
2050 // flowtrack = new AliFlowTrack();
2051 // flowtrack->SetPhi(fTrackPhi);
2052 // flowtrack->SetEta(fTrackEta);
2053 // flowtrack->SetWeight(fTrackWeight);
2055 // case kTrackWithMCkine:
2056 // if (!fMCparticle) return NULL;
2057 // flowtrack = new AliFlowTrack();
2058 // flowtrack->SetPhi( fMCparticle->Phi() );
2059 // flowtrack->SetEta( fMCparticle->Eta() );
2060 // flowtrack->SetWeight(fTrackWeight);
2061 // flowtrack->SetPt( fMCparticle->Pt() );
2063 // case kTrackWithMCpt:
2064 // if (!fMCparticle) return NULL;
2065 // flowtrack = new AliFlowTrack();
2066 // flowtrack->SetPhi(fTrackPhi);
2067 // flowtrack->SetEta(fTrackEta);
2068 // flowtrack->SetWeight(fTrackWeight);
2069 // flowtrack->SetPt(fMCparticle->Pt());
2071 // case kTrackWithPtFromFirstMother:
2072 // if (!fMCparticle) return NULL;
2073 // flowtrack = new AliFlowTrack();
2074 // flowtrack->SetPhi(fTrackPhi);
2075 // flowtrack->SetEta(fTrackEta);
2076 // flowtrack->SetWeight(fTrackWeight);
2077 // tmpTParticle = fMCparticle->Particle();
2078 // tmpAliMCParticle = static_cast<AliMCParticle*>(fMCevent->GetTrack(tmpTParticle->GetFirstMother()));
2079 // flowtrack->SetPt(tmpAliMCParticle->Pt());
2082 // flowtrack = new AliFlowTrack();
2083 // flowtrack->SetPhi(fTrackPhi);
2084 // flowtrack->SetEta(fTrackEta);
2085 // flowtrack->SetWeight(fTrackWeight);
2089 // flowtrack->SetSource(AliFlowTrack::kFromPMD);
2090 // return flowtrack;
2093 ////-----------------------------------------------------------------------
2094 //AliFlowTrack* AliFlowTrackCuts::MakeFlowTrackVZERO() const
2096 // //make a flow track from VZERO
2097 // AliFlowTrack* flowtrack=NULL;
2098 // TParticle *tmpTParticle=NULL;
2099 // AliMCParticle* tmpAliMCParticle=NULL;
2100 // switch (fParamMix)
2103 // flowtrack = new AliFlowTrack();
2104 // flowtrack->SetPhi(fTrackPhi);
2105 // flowtrack->SetEta(fTrackEta);
2106 // flowtrack->SetWeight(fTrackWeight);
2108 // case kTrackWithMCkine:
2109 // if (!fMCparticle) return NULL;
2110 // flowtrack = new AliFlowTrack();
2111 // flowtrack->SetPhi( fMCparticle->Phi() );
2112 // flowtrack->SetEta( fMCparticle->Eta() );
2113 // flowtrack->SetWeight(fTrackWeight);
2114 // flowtrack->SetPt( fMCparticle->Pt() );
2116 // case kTrackWithMCpt:
2117 // if (!fMCparticle) return NULL;
2118 // flowtrack = new AliFlowTrack();
2119 // flowtrack->SetPhi(fTrackPhi);
2120 // flowtrack->SetEta(fTrackEta);
2121 // flowtrack->SetWeight(fTrackWeight);
2122 // flowtrack->SetPt(fMCparticle->Pt());
2124 // case kTrackWithPtFromFirstMother:
2125 // if (!fMCparticle) return NULL;
2126 // flowtrack = new AliFlowTrack();
2127 // flowtrack->SetPhi(fTrackPhi);
2128 // flowtrack->SetEta(fTrackEta);
2129 // flowtrack->SetWeight(fTrackWeight);
2130 // tmpTParticle = fMCparticle->Particle();
2131 // tmpAliMCParticle = static_cast<AliMCParticle*>(fMCevent->GetTrack(tmpTParticle->GetFirstMother()));
2132 // flowtrack->SetPt(tmpAliMCParticle->Pt());
2135 // flowtrack = new AliFlowTrack();
2136 // flowtrack->SetPhi(fTrackPhi);
2137 // flowtrack->SetEta(fTrackEta);
2138 // flowtrack->SetWeight(fTrackWeight);
2142 // flowtrack->SetSource(AliFlowTrack::kFromVZERO);
2143 // return flowtrack;
2146 ////-----------------------------------------------------------------------
2147 //AliFlowTrack* AliFlowTrackCuts::MakeFlowTrack() const
2149 // //get a flow track constructed from whatever we applied cuts on
2150 // //caller is resposible for deletion
2151 // //if construction fails return NULL
2152 // //TODO: for tracklets, PMD and VZERO we probably need just one method,
2153 // //something like MakeFlowTrackGeneric(), wait with this until
2154 // //requirements quirks are known.
2155 // switch (fParamType)
2157 // case kSPDtracklet:
2158 // return MakeFlowTrackSPDtracklet();
2160 // return MakeFlowTrackPMDtrack();
2162 // return MakeFlowTrackVZERO();
2164 // return MakeFlowTrackVParticle();
2168 //-----------------------------------------------------------------------
2169 Bool_t AliFlowTrackCuts::IsPhysicalPrimary() const
2171 //check if current particle is a physical primary
2172 if (!fMCevent) return kFALSE;
2173 if (fTrackLabel<0) return kFALSE;
2174 return IsPhysicalPrimary(fMCevent, fTrackLabel, fRequireTransportBitForPrimaries);
2177 //-----------------------------------------------------------------------
2178 Bool_t AliFlowTrackCuts::IsPhysicalPrimary(AliMCEvent* mcEvent, Int_t label, Bool_t requiretransported)
2180 //check if current particle is a physical primary
2181 Bool_t physprim=mcEvent->IsPhysicalPrimary(label);
2182 AliMCParticle* track = static_cast<AliMCParticle*>(mcEvent->GetTrack(label));
2183 if (!track) return kFALSE;
2184 TParticle* particle = track->Particle();
2185 Bool_t transported = particle->TestBit(kTransportBit);
2186 //printf("label: %i prim: %s, transp: %s, pass: %s\n",label, (physprim)?"YES":"NO ",(transported)?"YES":"NO ",
2187 //(physprim && (transported || !requiretransported))?"YES":"NO" );
2188 return (physprim && (transported || !requiretransported));
2191 //-----------------------------------------------------------------------
2192 void AliFlowTrackCuts::DefineHistograms()
2194 //define qa histograms
2197 const Int_t kNbinsP=200;
2198 Double_t binsP[kNbinsP+1];
2200 for(int i=1; i<kNbinsP+1; i++)
2202 //if(binsP[i-1]+0.05<1.01)
2203 // binsP[i]=binsP[i-1]+0.05;
2205 binsP[i]=binsP[i-1]+0.05;
2208 const Int_t nBinsDCA=1000;
2209 Double_t binsDCA[nBinsDCA+1];
2210 for(int i=0; i<nBinsDCA+1; i++) {binsDCA[i]=0.01*i-5.;}
2211 //for(int i=1; i<41; i++) {binsDCA[i+100]=0.1*i+1.0;}
2213 Bool_t adddirstatus = TH1::AddDirectoryStatus();
2214 TH1::AddDirectory(kFALSE);
2215 fQA=new TList(); fQA->SetOwner();
2216 fQA->SetName(Form("%s QA",GetName()));
2217 TList* before = new TList(); before->SetOwner();
2218 before->SetName("before");
2219 TList* after = new TList(); after->SetOwner();
2220 after->SetName("after");
2223 before->Add(new TH2F("TOFbeta",";p [GeV/c];#beta",kNbinsP,binsP,1000,0.4,1.1)); //0
2224 after->Add(new TH2F("TOFbeta",";p [GeV/c];#beta",kNbinsP,binsP,1000,0.4,1.1)); //0
2225 before->Add(new TH2F("TPCdedx",";p [GeV/c];dEdx",kNbinsP,binsP,500,0,500)); //1
2226 after->Add(new TH2F("TPCdedx",";p [GeV/c];dEdx",kNbinsP,binsP,500,0,500)); //1
2227 before->Add(new TH2F("MC pid",";p[GeV/c];species",kNbinsP,binsP,10,-5, 5)); //2
2228 after->Add(new TH2F("MC pid",";p[GeV/c];species",kNbinsP,binsP,10,-5, 5)); //2
2230 TH2F* hb = new TH2F("MC primary",";p[GeV/c];primary",kNbinsP,binsP,2,-1,1);
2231 TH2F* ha = new TH2F("MC primary",";p[GeV/c];primary",kNbinsP,binsP,2,-1,1);
2233 axis = hb->GetYaxis();
2234 axis->SetBinLabel(1,"secondary");
2235 axis->SetBinLabel(2,"primary");
2236 axis = ha->GetYaxis();
2237 axis->SetBinLabel(1,"secondary");
2238 axis->SetBinLabel(2,"primary");
2239 before->Add(hb); //3
2241 //production process
2242 hb = new TH2F("MC production process",";p[GeV/c];",kNbinsP,binsP,kMaxMCProcess,
2243 -0.5, kMaxMCProcess-0.5);
2244 ha = new TH2F("MC production process",";p[GeV/c];",kNbinsP,binsP,kMaxMCProcess,
2245 -0.5, kMaxMCProcess-0.5);
2246 axis = hb->GetYaxis();
2247 for (Int_t i=0; i<kMaxMCProcess; i++)
2249 axis->SetBinLabel(i+1,TMCProcessName[i]);
2251 axis = ha->GetYaxis();
2252 for (Int_t i=0; i<kMaxMCProcess; i++)
2254 axis->SetBinLabel(i+1,TMCProcessName[i]);
2256 before->Add(hb); //4
2259 before->Add(new TH2F("DCAxy",";p_{t}[GeV/c];DCAxy[cm]", 100, 0., 10., nBinsDCA, binsDCA));//5
2260 after->Add(new TH2F("DCAxy",";p_{t}[GeV/c];DCAxy[cm]", 100, 0., 10., nBinsDCA, binsDCA));//5
2261 before->Add(new TH2F("DCAz",";p_{t}[GeV/c];DCAz[cm]", 100, 0., 10., nBinsDCA, binsDCA));//6
2262 after->Add(new TH2F("DCAz",";p_{t}[GeV/c];DCAz[cm]", 100, 0., 10., nBinsDCA, binsDCA));//6
2264 hb = new TH2F("MC first mother",";p[GeV/c];",kNbinsP,binsP,44,1.,45.);
2265 ha = new TH2F("MC first mother",";p[GeV/c];",kNbinsP,binsP,44,1.,45.);
2266 hb->GetYaxis()->SetBinLabel(1, "#gamma");
2267 ha->GetYaxis()->SetBinLabel(1, "#gamma");
2268 hb->GetYaxis()->SetBinLabel(2, "e^{+}");
2269 ha->GetYaxis()->SetBinLabel(2, "e^{+}");
2270 hb->GetYaxis()->SetBinLabel(3, "e^{-}");
2271 ha->GetYaxis()->SetBinLabel(3, "e^{-}");
2272 hb->GetYaxis()->SetBinLabel(4, "#nu");
2273 ha->GetYaxis()->SetBinLabel(4, "#nu");
2274 hb->GetYaxis()->SetBinLabel(5, "#mu^{+}");
2275 ha->GetYaxis()->SetBinLabel(5, "#mu^{+}");
2276 hb->GetYaxis()->SetBinLabel(6, "#mu^{-}");
2277 ha->GetYaxis()->SetBinLabel(6, "#mu^{-}");
2278 hb->GetYaxis()->SetBinLabel(7, "#pi^{0}");
2279 ha->GetYaxis()->SetBinLabel(7, "#pi^{0}");
2280 hb->GetYaxis()->SetBinLabel(8, "#pi^{+}");
2281 ha->GetYaxis()->SetBinLabel(8, "#pi^{+}");
2282 hb->GetYaxis()->SetBinLabel(9, "#pi^{-}");
2283 ha->GetYaxis()->SetBinLabel(9, "#pi^{-}");
2284 hb->GetYaxis()->SetBinLabel(10, "K^{0}_{L}");
2285 ha->GetYaxis()->SetBinLabel(10, "K^{0}_{L}");
2286 hb->GetYaxis()->SetBinLabel(11, "K^{+}");
2287 ha->GetYaxis()->SetBinLabel(11, "K^{+}");
2288 hb->GetYaxis()->SetBinLabel(12, "K^{-}");
2289 ha->GetYaxis()->SetBinLabel(12, "K^{-}");
2290 hb->GetYaxis()->SetBinLabel( 13, "n");
2291 ha->GetYaxis()->SetBinLabel( 13, "n");
2292 hb->GetYaxis()->SetBinLabel( 14, "p");
2293 ha->GetYaxis()->SetBinLabel( 14, "p");
2294 hb->GetYaxis()->SetBinLabel(15, "#bar{p}");
2295 ha->GetYaxis()->SetBinLabel(15, "#bar{p}");
2296 hb->GetYaxis()->SetBinLabel(16, "K^{0}_{S}");
2297 ha->GetYaxis()->SetBinLabel(16, "K^{0}_{S}");
2298 hb->GetYaxis()->SetBinLabel(17, "#eta");
2299 ha->GetYaxis()->SetBinLabel(17, "#eta");
2300 hb->GetYaxis()->SetBinLabel(18, "#Lambda");
2301 ha->GetYaxis()->SetBinLabel(18, "#Lambda");
2302 hb->GetYaxis()->SetBinLabel(19, "#Sigma^{+}");
2303 ha->GetYaxis()->SetBinLabel(19, "#Sigma^{+}");
2304 hb->GetYaxis()->SetBinLabel(20, "#Sigma^{0}");
2305 ha->GetYaxis()->SetBinLabel(20, "#Sigma^{0}");
2306 hb->GetYaxis()->SetBinLabel(21, "#Sigma^{-}");
2307 ha->GetYaxis()->SetBinLabel(21, "#Sigma^{-}");
2308 hb->GetYaxis()->SetBinLabel(22, "#Theta^{0}");
2309 ha->GetYaxis()->SetBinLabel(22, "#Theta^{0}");
2310 hb->GetYaxis()->SetBinLabel(23, "#Theta^{-}");
2311 ha->GetYaxis()->SetBinLabel(23, "#Theta^{-}");
2312 hb->GetYaxis()->SetBinLabel(24, "#Omega^{-}");
2313 ha->GetYaxis()->SetBinLabel(24, "#Omega^{-}");
2314 hb->GetYaxis()->SetBinLabel(25, "#bar{n}");
2315 ha->GetYaxis()->SetBinLabel(25, "#bar{n}");
2316 hb->GetYaxis()->SetBinLabel(26, "#bar{#Lambda}");
2317 ha->GetYaxis()->SetBinLabel(26, "#bar{#Lambda}");
2318 hb->GetYaxis()->SetBinLabel(27, "#bar{#Sigma}^{-}");
2319 ha->GetYaxis()->SetBinLabel(27, "#bar{#Sigma}^{-}");
2320 hb->GetYaxis()->SetBinLabel(28, "#bar{#Sigma}^{0}");
2321 ha->GetYaxis()->SetBinLabel(28, "#bar{#Sigma}^{0}");
2322 hb->GetYaxis()->SetBinLabel(29, "#bar{#Sigma}^{+}");
2323 ha->GetYaxis()->SetBinLabel(29, "#bar{#Sigma}^{+}");
2324 hb->GetYaxis()->SetBinLabel(30, "#bar{#Theta}^{0}");
2325 ha->GetYaxis()->SetBinLabel(30, "#bar{#Theta}^{0}");
2326 hb->GetYaxis()->SetBinLabel(31, "#bar{#Theta}^{+}");
2327 ha->GetYaxis()->SetBinLabel(31, "#bar{#Theta}^{+}");
2328 hb->GetYaxis()->SetBinLabel(32, "#bar{#Omega}^{+}");
2329 ha->GetYaxis()->SetBinLabel(32, "#bar{#Omega}^{+}");
2330 hb->GetYaxis()->SetBinLabel(33, "#tau^{+}");
2331 ha->GetYaxis()->SetBinLabel(33, "#tau^{+}");
2332 hb->GetYaxis()->SetBinLabel(34, "#tau^{-}");
2333 ha->GetYaxis()->SetBinLabel(34, "#tau^{-}");
2334 hb->GetYaxis()->SetBinLabel(35, "D^{+}");
2335 ha->GetYaxis()->SetBinLabel(35, "D^{+}");
2336 hb->GetYaxis()->SetBinLabel(36, "D^{-}");
2337 ha->GetYaxis()->SetBinLabel(36, "D^{-}");
2338 hb->GetYaxis()->SetBinLabel(37, "D^{0}");
2339 ha->GetYaxis()->SetBinLabel(37, "D^{0}");
2340 hb->GetYaxis()->SetBinLabel(38, "#bar{D}^{0}");
2341 ha->GetYaxis()->SetBinLabel(38, "#bar{D}^{0}");
2342 hb->GetYaxis()->SetBinLabel(39, "D_{s}^{+}");
2343 ha->GetYaxis()->SetBinLabel(39, "D_{s}^{+}");
2344 hb->GetYaxis()->SetBinLabel(40, "#bar{D_{s}}^{-}");
2345 ha->GetYaxis()->SetBinLabel(40, "#bar{D_{s}}^{-}");
2346 hb->GetYaxis()->SetBinLabel(41, "#Lambda_{c}^{+}");
2347 ha->GetYaxis()->SetBinLabel(41, "#Lambda_{c}^{+}");
2348 hb->GetYaxis()->SetBinLabel(42, "W^{+}");
2349 ha->GetYaxis()->SetBinLabel(42, "W^{+}");
2350 hb->GetYaxis()->SetBinLabel(43, "W^{-}");
2351 ha->GetYaxis()->SetBinLabel(43, "W^{-}");
2352 hb->GetYaxis()->SetBinLabel(44, "Z^{0}");
2353 ha->GetYaxis()->SetBinLabel(44, "Z^{0}");
2357 before->Add(new TH2F("TOFkElectron",";p_{t}[GeV/c];TOF signal - IT", kNbinsP,binsP,1000,-2e4, 2e4));//8
2358 after->Add( new TH2F("TOFkElectron",";p_{t}[GeV/c];TOF signal - IT", kNbinsP,binsP,1000,-2e4, 2e4));//8
2360 before->Add(new TH2F("TOFkMuon",";p_{t}[GeV/c];TOF signal - IT", kNbinsP,binsP,1000,-2e4, 2e4));//9
2361 after->Add( new TH2F("TOFkMuon",";p_{t}[GeV/c];TOF signal - IT", kNbinsP,binsP,1000,-2e4, 2e4));//9
2363 before->Add(new TH2F("TOFkPion",";p_{t}[GeV/c];TOF signal - IT", kNbinsP,binsP,1000,-2e4, 2e4));//10
2364 after->Add( new TH2F("TOFkPion",";p_{t}[GeV/c];TOF signal - IT", kNbinsP,binsP,1000,-2e4, 2e4));//10
2366 before->Add(new TH2F("TOFkKaon",";p_{t}[GeV/c];TOF signal - IT", kNbinsP,binsP,1000,-2e4, 2e4));//11
2367 after->Add( new TH2F("TOFkKaon",";p_{t}[GeV/c];TOF signal - IT", kNbinsP,binsP,1000,-2e4, 2e4));//11
2369 before->Add(new TH2F("TOFkProton",";p_{t}[GeV/c];TOF signal - IT", kNbinsP,binsP,1000,-2e4, 2e4));//12
2370 after->Add( new TH2F("TOFkProton",";p_{t}[GeV/c];TOF signal - IT", kNbinsP,binsP,1000,-2e4, 2e4));//12
2373 before->Add(new TH1F("KinkQt",";q_{t}[GeV/c];counts", 200, 0., 0.3));//13
2374 after->Add(new TH1F("KinkQt",";q_{t}[GeV/c];counts", 200, 0., 0.3));//13
2376 before->Add(new TH1F("KinkMinv",";m_{inv}(#mu#nu)[GeV/c^{2}];counts;Kink M_{inv}", 200, 0., 0.7));//14
2377 after->Add(new TH1F("KinkMinv",";m_{inv}(#mu#nu)[GeV/c^{2}];counts;Kink M_{inv}", 200, 0., 0.7));//14
2379 before->Add(new TH2F("KinkVertex",";x[cm];y[cm];Kink vertex position",250,-250.,250., 250,-250.,250.));//15
2380 after->Add(new TH2F("KinkVertex",";x[cm];y[cm];Kink vertex position",250,-250.,250., 250,-250.,250.));//15
2382 before->Add(new TH2F("KinkAngleMp",";p_{mother}[GeV/c];Kink decay angle [deg];", 100,0.,6., 100,0.,80.));//16
2383 after->Add(new TH2F("KinkAngleMp",";p_{mother}[GeV/c];Kink decay angle [deg];", 100,0.,6., 100,0.,80.));//16
2385 before->Add(new TH1F("KinkIndex",";Kink index;counts", 2, 0., 2.));//17
2386 after->Add(new TH1F("KinkIndex",";Kink index;counts", 2, 0., 2.));//17
2387 TH1::AddDirectory(adddirstatus);
2390 //-----------------------------------------------------------------------
2391 Int_t AliFlowTrackCuts::GetNumberOfInputObjects() const
2393 //get the number of tracks in the input event according source
2394 //selection (ESD tracks, tracklets, MC particles etc.)
2395 AliESDEvent* esd=NULL;
2396 AliAODEvent* aod=NULL; // XZhang 20120615
2400 if (!fEvent) return 0; // XZhang 20120615
2401 esd = dynamic_cast<AliESDEvent*>(fEvent);
2402 aod = dynamic_cast<AliAODEvent*>(fEvent); // XZhang 20120615
2403 // if (!esd) return 0; // XZhang 20120615
2404 // return esd->GetMultiplicity()->GetNumberOfTracklets(); // XZhang 20120615
2405 if (esd) return esd->GetMultiplicity()->GetNumberOfTracklets(); // XZhang 20120615
2406 if (aod) return aod->GetTracklets()->GetNumberOfTracklets(); // XZhang 20120615
2408 if (!fMCevent) return 0;
2409 return fMCevent->GetNumberOfTracks();
2411 esd = dynamic_cast<AliESDEvent*>(fEvent);
2413 return esd->GetNumberOfPmdTracks();
2415 return fgkNumberOfVZEROtracks;
2416 case kMUON: // XZhang 20120604
2417 if (!fEvent) return 0; // XZhang 20120604
2418 esd = dynamic_cast<AliESDEvent*>(fEvent); // XZhang 20120604
2419 if (esd) return esd->GetNumberOfMuonTracks(); // XZhang 20120604
2420 return fEvent->GetNumberOfTracks(); // if AOD // XZhang 20120604
2422 esd = dynamic_cast<AliESDEvent*>(fEvent);
2424 return esd->GetNumberOfKinks();
2426 esd = dynamic_cast<AliESDEvent*>(fEvent);
2428 return esd->GetNumberOfV0s();
2430 if (!fEvent) return 0;
2431 return fEvent->GetNumberOfTracks();
2436 //-----------------------------------------------------------------------
2437 TObject* AliFlowTrackCuts::GetInputObject(Int_t i)
2439 //get the input object according the data source selection:
2440 //(esd tracks, traclets, mc particles,etc...)
2441 AliESDEvent* esd=NULL;
2442 AliAODEvent* aod=NULL; // XZhang 20120615
2446 if (!fEvent) return NULL; // XZhang 20120615
2447 esd = dynamic_cast<AliESDEvent*>(fEvent);
2448 aod = dynamic_cast<AliAODEvent*>(fEvent); // XZhang 20120615
2449 // if (!esd) return NULL; // XZhang 20120615
2450 // return const_cast<AliMultiplicity*>(esd->GetMultiplicity()); // XZhang 20120615
2451 if (esd) return const_cast<AliMultiplicity*>(esd->GetMultiplicity()); // XZhang 20120615
2452 if (aod) return const_cast<AliAODTracklets*>(aod->GetTracklets()); // XZhang 20120615
2454 if (!fMCevent) return NULL;
2455 return fMCevent->GetTrack(i);
2457 esd = dynamic_cast<AliESDEvent*>(fEvent);
2458 if (!esd) return NULL;
2459 return esd->GetPmdTrack(i);
2461 esd = dynamic_cast<AliESDEvent*>(fEvent);
2462 if (!esd) //contributed by G.Ortona
2464 aod = dynamic_cast<AliAODEvent*>(fEvent);
2465 if(!aod)return NULL;
2466 return aod->GetVZEROData();
2468 return esd->GetVZEROData();
2469 case kMUON: // XZhang 20120604
2470 if (!fEvent) return NULL; // XZhang 20120604
2471 esd = dynamic_cast<AliESDEvent*>(fEvent); // XZhang 20120604
2472 if (esd) return esd->GetMuonTrack(i); // XZhang 20120604
2473 return fEvent->GetTrack(i); // if AOD // XZhang 20120604
2475 esd = dynamic_cast<AliESDEvent*>(fEvent);
2476 if (!esd) return NULL;
2477 return esd->GetKink(i);
2479 esd = dynamic_cast<AliESDEvent*>(fEvent);
2480 if (!esd) return NULL;
2481 return esd->GetV0(i);
2483 if (!fEvent) return NULL;
2484 return fEvent->GetTrack(i);
2488 //-----------------------------------------------------------------------
2489 void AliFlowTrackCuts::Clear(Option_t*)
2497 //-----------------------------------------------------------------------
2498 void AliFlowTrackCuts::ClearTrack(Option_t*)
2500 //clean up last track
2513 //-----------------------------------------------------------------------
2514 Bool_t AliFlowTrackCuts::PassesAODpidCut(const AliAODTrack* track )
2516 if(!track->GetAODEvent()->GetTOFHeader()){
2517 AliAODPid *pidObj = track->GetDetPid();
2518 if (!pidObj) fESDpid.GetTOFResponse().SetTimeResolution(84.);
2520 Double_t sigmaTOFPidInAOD[10];
2521 pidObj->GetTOFpidResolution(sigmaTOFPidInAOD);
2522 if(sigmaTOFPidInAOD[0] > 84.){
2523 fESDpid.GetTOFResponse().SetTimeResolution(sigmaTOFPidInAOD[0]); // use the electron TOF PID sigma as time resolution (including the T0 used)
2528 //check if passes the selected pid cut for ESDs
2529 Bool_t pass = kTRUE;
2533 if (!PassesTOFbetaCut(track)) pass=kFALSE;
2536 if (!PassesTOFbayesianCut(track)) pass=kFALSE;
2539 if (!PassesTPCbayesianCut(track)) pass=kFALSE;
2548 //-----------------------------------------------------------------------
2549 Bool_t AliFlowTrackCuts::PassesESDpidCut(const AliESDtrack* track )
2551 //check if passes the selected pid cut for ESDs
2552 Bool_t pass = kTRUE;
2556 if (!PassesTPCpidCut(track)) pass=kFALSE;
2559 if (!PassesTPCdedxCut(track)) pass=kFALSE;
2562 if (!PassesTOFpidCut(track)) pass=kFALSE;
2565 if (!PassesTOFbetaCut(track)) pass=kFALSE;
2567 case kTOFbetaSimple:
2568 if (!PassesTOFbetaSimpleCut(track)) pass=kFALSE;
2571 if (!PassesTPCbayesianCut(track)) pass=kFALSE;
2573 // part added by F. Noferini
2575 if (!PassesTOFbayesianCut(track)) pass=kFALSE;
2577 // end part added by F. Noferini
2579 //part added by Natasha
2581 if (!PassesNucleiSelection(track)) pass=kFALSE;
2583 //end part added by Natasha
2586 printf("AliFlowTrackCuts::PassesCuts() this should never be called!\n");
2593 //-----------------------------------------------------------------------
2594 Bool_t AliFlowTrackCuts::PassesTOFbetaSimpleCut(const AliESDtrack* track )
2596 //check if passes PID cut using timing in TOF
2597 Bool_t goodtrack = (track->GetStatus() & AliESDtrack::kTOFpid) &&
2598 (track->GetTOFsignal() > 12000) &&
2599 (track->GetTOFsignal() < 100000) &&
2600 (track->GetIntegratedLength() > 365);
2602 if (!fAllowTOFmismatchFlag) {if ((track->GetStatus() & AliESDtrack::kTOFmismatch)) return kFALSE;}
2604 Bool_t statusMatchingHard = TPCTOFagree(track);
2605 if (fRequireStrictTOFTPCagreement && (!statusMatchingHard))
2608 if (!goodtrack) return kFALSE;
2610 const Float_t c = 2.99792457999999984e-02;
2611 Float_t p = track->GetP();
2612 Float_t l = track->GetIntegratedLength();
2613 Float_t trackT0 = fESDpid.GetTOFResponse().GetStartTime(p);
2614 Float_t timeTOF = track->GetTOFsignal()- trackT0;
2615 Float_t beta = l/timeTOF/c;
2616 Double_t integratedTimes[9] = {-1.0,-1.0,-1.0,-1.0,-1.0, -1.0, -1.0, -1.0, -1.0};
2617 track->GetIntegratedTimes(integratedTimes);
2618 Float_t betaHypothesis[5] = {0.0,0.0,0.0,0.0,0.0};
2619 Float_t s[5] = {0.0,0.0,0.0,0.0,0.0};
2620 for (Int_t i=0;i<5;i++)
2622 betaHypothesis[i] = l/integratedTimes[i]/c;
2623 s[i] = beta-betaHypothesis[i];
2626 switch (fParticleID)
2629 return ( (s[2]<0.015) && (s[2]>-0.015) &&
2633 return ( (s[3]<0.015) && (s[3]>-0.015) &&
2636 case AliPID::kProton:
2637 return ( (s[4]<0.015) && (s[4]>-0.015) &&
2646 //-----------------------------------------------------------------------
2647 Float_t AliFlowTrackCuts::GetBeta(const AliVTrack* track)
2650 Double_t integratedTimes[9] = {-1.0,-1.0,-1.0,-1.0,-1.0, -1.0, -1.0, -1.0, -1.0};
2651 track->GetIntegratedTimes(integratedTimes);
2653 const Float_t c = 2.99792457999999984e-02;
2654 Float_t p = track->P();
2655 Float_t l = integratedTimes[0]*c;
2656 Float_t trackT0 = fESDpid.GetTOFResponse().GetStartTime(p);
2657 Float_t timeTOF = track->GetTOFsignal()- trackT0;
2660 //-----------------------------------------------------------------------
2661 Bool_t AliFlowTrackCuts::PassesTOFbetaCut(const AliAODTrack* track )
2663 //check if track passes pid selection with an asymmetric TOF beta cut
2666 //printf("no TOFpidCuts\n");
2670 //check if passes PID cut using timing in TOF
2671 Bool_t goodtrack = (track->GetStatus() & AliESDtrack::kTOFpid) &&
2672 (track->GetTOFsignal() > 12000) &&
2673 (track->GetTOFsignal() < 100000);
2675 if (!goodtrack) return kFALSE;
2677 const Float_t c = 2.99792457999999984e-02;
2678 Double_t integratedTimes[9] = {-1.0,-1.0,-1.0,-1.0,-1.0, -1.0, -1.0, -1.0, -1.0};
2679 track->GetIntegratedTimes(integratedTimes);
2680 Float_t l = integratedTimes[0]*c;
2682 goodtrack = goodtrack && (l > 365);
2684 if (!goodtrack) return kFALSE;
2686 if (!fAllowTOFmismatchFlag) {if ((track->GetStatus() & AliESDtrack::kTOFmismatch)) return kFALSE;}
2688 Bool_t statusMatchingHard = TPCTOFagree(track);
2689 if (fRequireStrictTOFTPCagreement && (!statusMatchingHard))
2693 Float_t beta = GetBeta(track);
2695 //construct the pid index because it's not AliPID::EParticleType
2697 switch (fParticleID)
2705 case AliPID::kProton:
2713 Float_t p = track->P();
2714 Float_t betahypothesis = l/integratedTimes[pid]/c;
2715 Float_t betadiff = beta-betahypothesis;
2717 Float_t* arr = fTOFpidCuts->GetMatrixArray();
2718 Int_t col = TMath::BinarySearch(fTOFpidCuts->GetNcols(),arr,static_cast<Float_t>(p));
2719 if (col<0) return kFALSE;
2720 Float_t min = (*fTOFpidCuts)(1,col);
2721 Float_t max = (*fTOFpidCuts)(2,col);
2723 Bool_t pass = (betadiff>min && betadiff<max);
2727 //-----------------------------------------------------------------------
2728 Bool_t AliFlowTrackCuts::PassesTOFbetaCut(const AliESDtrack* track )
2730 //check if track passes pid selection with an asymmetric TOF beta cut
2733 //printf("no TOFpidCuts\n");
2737 //check if passes PID cut using timing in TOF
2738 Bool_t goodtrack = (track->GetStatus() & AliESDtrack::kTOFpid) &&
2739 (track->GetTOFsignal() > 12000) &&
2740 (track->GetTOFsignal() < 100000) &&
2741 (track->GetIntegratedLength() > 365);
2743 if (!fAllowTOFmismatchFlag) {if ((track->GetStatus() & AliESDtrack::kTOFmismatch)) return kFALSE;}
2745 if (!goodtrack) return kFALSE;
2747 Bool_t statusMatchingHard = TPCTOFagree(track);
2748 if (fRequireStrictTOFTPCagreement && (!statusMatchingHard))
2751 Float_t beta = GetBeta(track);
2752 Double_t integratedTimes[9] = {-1.0,-1.0,-1.0,-1.0,-1.0, -1.0, -1.0, -1.0, -1.0};
2753 track->GetIntegratedTimes(integratedTimes);
2755 //construct the pid index because it's not AliPID::EParticleType
2757 switch (fParticleID)
2765 case AliPID::kProton:
2773 const Float_t c = 2.99792457999999984e-02;
2774 Float_t l = track->GetIntegratedLength();
2775 Float_t p = track->GetP();
2776 Float_t betahypothesis = l/integratedTimes[pid]/c;
2777 Float_t betadiff = beta-betahypothesis;
2779 Float_t* arr = fTOFpidCuts->GetMatrixArray();
2780 Int_t col = TMath::BinarySearch(fTOFpidCuts->GetNcols(),arr,static_cast<Float_t>(p));
2781 if (col<0) return kFALSE;
2782 Float_t min = (*fTOFpidCuts)(1,col);
2783 Float_t max = (*fTOFpidCuts)(2,col);
2785 Bool_t pass = (betadiff>min && betadiff<max);
2790 //-----------------------------------------------------------------------
2791 Bool_t AliFlowTrackCuts::PassesTOFpidCut(const AliESDtrack* track) const
2793 //check if passes PID cut using default TOF pid
2794 Double_t pidTOF[AliPID::kSPECIES];
2795 track->GetTOFpid(pidTOF);
2796 if (pidTOF[fParticleID]>=fParticleProbability) return kTRUE;
2800 //-----------------------------------------------------------------------
2801 Bool_t AliFlowTrackCuts::PassesTPCpidCut(const AliESDtrack* track) const
2803 //check if passes PID cut using default TPC pid
2804 Double_t pidTPC[AliPID::kSPECIES];
2805 track->GetTPCpid(pidTPC);
2806 Double_t probablity = 0.;
2807 switch (fParticleID)
2810 probablity = pidTPC[AliPID::kPion] + pidTPC[AliPID::kMuon];
2813 probablity = pidTPC[fParticleID];
2815 if (probablity >= fParticleProbability) return kTRUE;
2819 //-----------------------------------------------------------------------
2820 Float_t AliFlowTrackCuts::Getdedx(const AliESDtrack* track) const
2823 return track->GetTPCsignal();
2826 //-----------------------------------------------------------------------
2827 Bool_t AliFlowTrackCuts::PassesTPCdedxCut(const AliESDtrack* track)
2829 //check if passes PID cut using dedx signal in the TPC
2832 //printf("no TPCpidCuts\n");
2836 const AliExternalTrackParam* tpcparam = track->GetInnerParam(); //tpc only params at the inner wall
2837 if (!tpcparam) return kFALSE;
2838 Double_t p = tpcparam->GetP();
2839 Float_t sigExp = fESDpid.GetTPCResponse().GetExpectedSignal(p, fParticleID);
2840 Float_t sigTPC = track->GetTPCsignal();
2841 Float_t s = (sigTPC-sigExp)/sigExp;
2843 Float_t* arr = fTPCpidCuts->GetMatrixArray();
2844 Int_t arrSize = fTPCpidCuts->GetNcols();
2845 Int_t col = TMath::BinarySearch( arrSize, arr, static_cast<Float_t>(p));
2846 if (col<0) return kFALSE;
2847 Float_t min = (*fTPCpidCuts)(1,col);
2848 Float_t max = (*fTPCpidCuts)(2,col);
2850 //printf("------------TPC pid cut %s\n",(s>min && s<max)?"PASS":"FAIL");
2851 return (s>min && s<max);
2854 //-----------------------------------------------------------------------
2855 void AliFlowTrackCuts::InitPIDcuts()
2857 //init matrices with PID cuts
2861 if (fParticleID==AliPID::kPion)
2863 t = new TMatrixF(3,15);
2864 (*t)(0,0) = 0.20; (*t)(1,0) = -0.4; (*t)(2,0) = 0.0;
2865 (*t)(0,1) = 0.25; (*t)(1,1) = -0.4; (*t)(2,1) = 0.1;
2866 (*t)(0,2) = 0.30; (*t)(1,2) = -0.4; (*t)(2,2) = 0.2;
2867 (*t)(0,3) = 0.35; (*t)(1,3) = -0.4; (*t)(2,3) = 0.2;
2868 (*t)(0,4) = 0.40; (*t)(1,4) = -0.4; (*t)(2,4) = 0.3;
2869 (*t)(0,5) = 0.45; (*t)(1,5) = -0.4; (*t)(2,5) = 0.3;
2870 (*t)(0,6) = 0.50; (*t)(1,6) = -0.4; (*t)(2,6) = 0.25;
2871 (*t)(0,7) = 0.55; (*t)(1,7) = -0.4; (*t)(2,7) = 0.15;
2872 (*t)(0,8) = 0.60; (*t)(1,8) = -0.4; (*t)(2,8) = 0.1;
2873 (*t)(0,9) = 0.65; (*t)(1,9) = -0.4; (*t)(2,9) = 0.05;
2874 (*t)(0,10) = 0.70; (*t)(1,10) = -0.4; (*t)(2,10) = 0;
2875 (*t)(0,11) = 0.75; (*t)(1,11) = -0.4; (*t)(2,11) = 0;
2876 (*t)(0,12) = 0.80; (*t)(1,12) = -0.4; (*t)(2,12) = -0.05;
2877 (*t)(0,13) = 0.85; (*t)(1,13) = -0.4; (*t)(2,13) = -0.1;
2878 (*t)(0,14) = 0.90; (*t)(1,14) = 0; (*t)(2,14) = 0;
2881 if (fParticleID==AliPID::kKaon)
2883 t = new TMatrixF(3,12);
2884 (*t)(0,0) = 0.20; (*t)(1,0) = -0.2; (*t)(2,0) = 0.2;
2885 (*t)(0,1) = 0.25; (*t)(1,1) = -0.2; (*t)(2,1) = 0.2;
2886 (*t)(0,2) = 0.30; (*t)(1,2) = -0.2; (*t)(2,2) = 0.2;
2887 (*t)(0,3) = 0.35; (*t)(1,3) = -0.2; (*t)(2,3) = 0.2;
2888 (*t)(0,4) = 0.40; (*t)(1,4) = -0.1; (*t)(2,4) = 0.2;
2889 (*t)(0,5) = 0.45; (*t)(1,5) = -0.1; (*t)(2,5) = 0.2;
2890 (*t)(0,6) = 0.50; (*t)(1,6) =-0.05; (*t)(2,6) = 0.2;
2891 (*t)(0,7) = 0.55; (*t)(1,7) = -0.1; (*t)(2,7) = 0.1;
2892 (*t)(0,8) = 0.60; (*t)(1,8) =-0.05; (*t)(2,8) = 0.1;
2893 (*t)(0,9) = 0.65; (*t)(1,9) = 0; (*t)(2,9) = 0.15;
2894 (*t)(0,10) = 0.70; (*t)(1,10) = 0.05; (*t)(2,10) = 0.2;
2895 (*t)(0,11) = 0.75; (*t)(1,11) = 0; (*t)(2,11) = 0;
2898 if (fParticleID==AliPID::kProton)
2900 t = new TMatrixF(3,9);
2901 (*t)(0,0) = 0.20; (*t)(1,0) = -0.1; (*t)(2,0) = 0.1;
2902 (*t)(0,1) = 0.25; (*t)(1,1) = -0.2; (*t)(2,1) = 0.2;
2903 (*t)(0,2) = 0.80; (*t)(1,2) = -0.1; (*t)(2,2) = 0.2;
2904 (*t)(0,3) = 0.85; (*t)(1,3) =-0.05; (*t)(2,3) = 0.2;
2905 (*t)(0,4) = 0.90; (*t)(1,4) =-0.05; (*t)(2,4) = 0.25;
2906 (*t)(0,5) = 0.95; (*t)(1,5) =-0.05; (*t)(2,5) = 0.25;
2907 (*t)(0,6) = 1.00; (*t)(1,6) = -0.1; (*t)(2,6) = 0.25;
2908 (*t)(0,7) = 1.10; (*t)(1,7) =-0.05; (*t)(2,7) = 0.3;
2909 (*t)(0,8) = 1.20; (*t)(1,8) = 0; (*t)(2,8) = 0;
2917 if (fParticleID==AliPID::kPion)
2919 //TOF pions, 0.9 purity
2920 t = new TMatrixF(3,61);
2921 (*t)(0,0) = 0.000; (*t)(1,0) = 0.000; (*t)(2,0) = 0.000;
2922 (*t)(0,1) = 0.050; (*t)(1,1) = 0.000; (*t)(2,1) = 0.000;
2923 (*t)(0,2) = 0.100; (*t)(1,2) = 0.000; (*t)(2,2) = 0.000;
2924 (*t)(0,3) = 0.150; (*t)(1,3) = 0.000; (*t)(2,3) = 0.000;
2925 (*t)(0,4) = 0.200; (*t)(1,4) = -0.030; (*t)(2,4) = 0.030;
2926 (*t)(0,5) = 0.250; (*t)(1,5) = -0.036; (*t)(2,5) = 0.032;
2927 (*t)(0,6) = 0.300; (*t)(1,6) = -0.038; (*t)(2,6) = 0.032;
2928 (*t)(0,7) = 0.350; (*t)(1,7) = -0.034; (*t)(2,7) = 0.032;
2929 (*t)(0,8) = 0.400; (*t)(1,8) = -0.032; (*t)(2,8) = 0.020;
2930 (*t)(0,9) = 0.450; (*t)(1,9) = -0.030; (*t)(2,9) = 0.020;
2931 (*t)(0,10) = 0.500; (*t)(1,10) = -0.030; (*t)(2,10) = 0.020;
2932 (*t)(0,11) = 0.550; (*t)(1,11) = -0.030; (*t)(2,11) = 0.020;
2933 (*t)(0,12) = 0.600; (*t)(1,12) = -0.030; (*t)(2,12) = 0.020;
2934 (*t)(0,13) = 0.650; (*t)(1,13) = -0.030; (*t)(2,13) = 0.020;
2935 (*t)(0,14) = 0.700; (*t)(1,14) = -0.030; (*t)(2,14) = 0.020;
2936 (*t)(0,15) = 0.750; (*t)(1,15) = -0.030; (*t)(2,15) = 0.020;
2937 (*t)(0,16) = 0.800; (*t)(1,16) = -0.030; (*t)(2,16) = 0.020;
2938 (*t)(0,17) = 0.850; (*t)(1,17) = -0.030; (*t)(2,17) = 0.020;
2939 (*t)(0,18) = 0.900; (*t)(1,18) = -0.030; (*t)(2,18) = 0.020;
2940 (*t)(0,19) = 0.950; (*t)(1,19) = -0.028; (*t)(2,19) = 0.028;
2941 (*t)(0,20) = 1.000; (*t)(1,20) = -0.028; (*t)(2,20) = 0.028;
2942 (*t)(0,21) = 1.100; (*t)(1,21) = -0.028; (*t)(2,21) = 0.028;
2943 (*t)(0,22) = 1.200; (*t)(1,22) = -0.026; (*t)(2,22) = 0.028;
2944 (*t)(0,23) = 1.300; (*t)(1,23) = -0.024; (*t)(2,23) = 0.028;
2945 (*t)(0,24) = 1.400; (*t)(1,24) = -0.020; (*t)(2,24) = 0.028;
2946 (*t)(0,25) = 1.500; (*t)(1,25) = -0.018; (*t)(2,25) = 0.028;
2947 (*t)(0,26) = 1.600; (*t)(1,26) = -0.016; (*t)(2,26) = 0.028;
2948 (*t)(0,27) = 1.700; (*t)(1,27) = -0.014; (*t)(2,27) = 0.028;
2949 (*t)(0,28) = 1.800; (*t)(1,28) = -0.012; (*t)(2,28) = 0.026;
2950 (*t)(0,29) = 1.900; (*t)(1,29) = -0.010; (*t)(2,29) = 0.026;
2951 (*t)(0,30) = 2.000; (*t)(1,30) = -0.008; (*t)(2,30) = 0.026;
2952 (*t)(0,31) = 2.100; (*t)(1,31) = -0.008; (*t)(2,31) = 0.024;
2953 (*t)(0,32) = 2.200; (*t)(1,32) = -0.006; (*t)(2,32) = 0.024;
2954 (*t)(0,33) = 2.300; (*t)(1,33) = -0.004; (*t)(2,33) = 0.024;
2955 (*t)(0,34) = 2.400; (*t)(1,34) = -0.004; (*t)(2,34) = 0.024;
2956 (*t)(0,35) = 2.500; (*t)(1,35) = -0.002; (*t)(2,35) = 0.024;
2957 (*t)(0,36) = 2.600; (*t)(1,36) = -0.002; (*t)(2,36) = 0.024;
2958 (*t)(0,37) = 2.700; (*t)(1,37) = 0.000; (*t)(2,37) = 0.024;
2959 (*t)(0,38) = 2.800; (*t)(1,38) = 0.000; (*t)(2,38) = 0.026;
2960 (*t)(0,39) = 2.900; (*t)(1,39) = 0.000; (*t)(2,39) = 0.024;
2961 (*t)(0,40) = 3.000; (*t)(1,40) = 0.002; (*t)(2,40) = 0.026;
2962 (*t)(0,41) = 3.100; (*t)(1,41) = 0.002; (*t)(2,41) = 0.026;
2963 (*t)(0,42) = 3.200; (*t)(1,42) = 0.002; (*t)(2,42) = 0.026;
2964 (*t)(0,43) = 3.300; (*t)(1,43) = 0.002; (*t)(2,43) = 0.026;
2965 (*t)(0,44) = 3.400; (*t)(1,44) = 0.002; (*t)(2,44) = 0.026;
2966 (*t)(0,45) = 3.500; (*t)(1,45) = 0.002; (*t)(2,45) = 0.026;
2967 (*t)(0,46) = 3.600; (*t)(1,46) = 0.002; (*t)(2,46) = 0.026;
2968 (*t)(0,47) = 3.700; (*t)(1,47) = 0.002; (*t)(2,47) = 0.026;
2969 (*t)(0,48) = 3.800; (*t)(1,48) = 0.002; (*t)(2,48) = 0.026;
2970 (*t)(0,49) = 3.900; (*t)(1,49) = 0.004; (*t)(2,49) = 0.024;
2971 (*t)(0,50) = 4.000; (*t)(1,50) = 0.004; (*t)(2,50) = 0.026;
2972 (*t)(0,51) = 4.100; (*t)(1,51) = 0.004; (*t)(2,51) = 0.026;
2973 (*t)(0,52) = 4.200; (*t)(1,52) = 0.004; (*t)(2,52) = 0.024;
2974 (*t)(0,53) = 4.300; (*t)(1,53) = 0.006; (*t)(2,53) = 0.024;
2975 (*t)(0,54) = 4.400; (*t)(1,54) = 0.000; (*t)(2,54) = 0.000;
2976 (*t)(0,55) = 4.500; (*t)(1,55) = 0.000; (*t)(2,55) = 0.000;
2977 (*t)(0,56) = 4.600; (*t)(1,56) = 0.000; (*t)(2,56) = 0.000;
2978 (*t)(0,57) = 4.700; (*t)(1,57) = 0.000; (*t)(2,57) = 0.000;
2979 (*t)(0,58) = 4.800; (*t)(1,58) = 0.000; (*t)(2,58) = 0.000;
2980 (*t)(0,59) = 4.900; (*t)(1,59) = 0.000; (*t)(2,59) = 0.000;
2981 (*t)(0,60) = 5.900; (*t)(1,60) = 0.000; (*t)(2,60) = 0.000;
2984 if (fParticleID==AliPID::kProton)
2986 //TOF protons, 0.9 purity
2987 t = new TMatrixF(3,61);
2988 (*t)(0,0) = 0.000; (*t)(1,0) = 0.000; (*t)(2,0) = 0.000;
2989 (*t)(0,1) = 0.050; (*t)(1,1) = 0.000; (*t)(2,1) = 0.000;
2990 (*t)(0,2) = 0.100; (*t)(1,2) = 0.000; (*t)(2,2) = 0.000;
2991 (*t)(0,3) = 0.150; (*t)(1,3) = 0.000; (*t)(2,3) = 0.000;
2992 (*t)(0,4) = 0.200; (*t)(1,4) = -0.07; (*t)(2,4) = 0.07;
2993 (*t)(0,5) = 0.200; (*t)(1,5) = -0.07; (*t)(2,5) = 0.07;
2994 (*t)(0,6) = 0.200; (*t)(1,6) = -0.07; (*t)(2,6) = 0.07;
2995 (*t)(0,7) = 0.200; (*t)(1,7) = -0.07; (*t)(2,7) = 0.07;
2996 (*t)(0,8) = 0.200; (*t)(1,8) = -0.07; (*t)(2,8) = 0.07;
2997 (*t)(0,9) = 0.200; (*t)(1,9) = -0.07; (*t)(2,9) = 0.07;
2998 (*t)(0,10) = 0.200; (*t)(1,10) = -0.07; (*t)(2,10) = 0.07;
2999 (*t)(0,11) = 0.200; (*t)(1,11) = -0.07; (*t)(2,11) = 0.07;
3000 (*t)(0,12) = 0.200; (*t)(1,12) = -0.07; (*t)(2,12) = 0.07;
3001 (*t)(0,13) = 0.200; (*t)(1,13) = -0.07; (*t)(2,13) = 0.07;
3002 (*t)(0,14) = 0.200; (*t)(1,14) = -0.07; (*t)(2,14) = 0.07;
3003 (*t)(0,15) = 0.200; (*t)(1,15) = -0.07; (*t)(2,15) = 0.07;
3004 (*t)(0,16) = 0.200; (*t)(1,16) = -0.07; (*t)(2,16) = 0.07;
3005 (*t)(0,17) = 0.850; (*t)(1,17) = -0.070; (*t)(2,17) = 0.070;
3006 (*t)(0,18) = 0.900; (*t)(1,18) = -0.072; (*t)(2,18) = 0.072;
3007 (*t)(0,19) = 0.950; (*t)(1,19) = -0.072; (*t)(2,19) = 0.072;
3008 (*t)(0,20) = 1.000; (*t)(1,20) = -0.074; (*t)(2,20) = 0.074;
3009 (*t)(0,21) = 1.100; (*t)(1,21) = -0.032; (*t)(2,21) = 0.032;
3010 (*t)(0,22) = 1.200; (*t)(1,22) = -0.026; (*t)(2,22) = 0.026;
3011 (*t)(0,23) = 1.300; (*t)(1,23) = -0.026; (*t)(2,23) = 0.026;
3012 (*t)(0,24) = 1.400; (*t)(1,24) = -0.024; (*t)(2,24) = 0.024;
3013 (*t)(0,25) = 1.500; (*t)(1,25) = -0.024; (*t)(2,25) = 0.024;
3014 (*t)(0,26) = 1.600; (*t)(1,26) = -0.026; (*t)(2,26) = 0.026;
3015 (*t)(0,27) = 1.700; (*t)(1,27) = -0.026; (*t)(2,27) = 0.026;
3016 (*t)(0,28) = 1.800; (*t)(1,28) = -0.026; (*t)(2,28) = 0.026;
3017 (*t)(0,29) = 1.900; (*t)(1,29) = -0.026; (*t)(2,29) = 0.026;
3018 (*t)(0,30) = 2.000; (*t)(1,30) = -0.026; (*t)(2,30) = 0.026;
3019 (*t)(0,31) = 2.100; (*t)(1,31) = -0.026; (*t)(2,31) = 0.026;
3020 (*t)(0,32) = 2.200; (*t)(1,32) = -0.026; (*t)(2,32) = 0.024;
3021 (*t)(0,33) = 2.300; (*t)(1,33) = -0.028; (*t)(2,33) = 0.022;
3022 (*t)(0,34) = 2.400; (*t)(1,34) = -0.028; (*t)(2,34) = 0.020;
3023 (*t)(0,35) = 2.500; (*t)(1,35) = -0.028; (*t)(2,35) = 0.018;
3024 (*t)(0,36) = 2.600; (*t)(1,36) = -0.028; (*t)(2,36) = 0.016;
3025 (*t)(0,37) = 2.700; (*t)(1,37) = -0.028; (*t)(2,37) = 0.016;
3026 (*t)(0,38) = 2.800; (*t)(1,38) = -0.030; (*t)(2,38) = 0.014;
3027 (*t)(0,39) = 2.900; (*t)(1,39) = -0.030; (*t)(2,39) = 0.012;
3028 (*t)(0,40) = 3.000; (*t)(1,40) = -0.030; (*t)(2,40) = 0.012;
3029 (*t)(0,41) = 3.100; (*t)(1,41) = -0.030; (*t)(2,41) = 0.010;
3030 (*t)(0,42) = 3.200; (*t)(1,42) = -0.030; (*t)(2,42) = 0.010;
3031 (*t)(0,43) = 3.300; (*t)(1,43) = -0.030; (*t)(2,43) = 0.010;
3032 (*t)(0,44) = 3.400; (*t)(1,44) = -0.030; (*t)(2,44) = 0.008;
3033 (*t)(0,45) = 3.500; (*t)(1,45) = -0.030; (*t)(2,45) = 0.008;
3034 (*t)(0,46) = 3.600; (*t)(1,46) = -0.030; (*t)(2,46) = 0.008;
3035 (*t)(0,47) = 3.700; (*t)(1,47) = -0.030; (*t)(2,47) = 0.006;
3036 (*t)(0,48) = 3.800; (*t)(1,48) = -0.030; (*t)(2,48) = 0.006;
3037 (*t)(0,49) = 3.900; (*t)(1,49) = -0.030; (*t)(2,49) = 0.006;
3038 (*t)(0,50) = 4.000; (*t)(1,50) = -0.028; (*t)(2,50) = 0.004;
3039 (*t)(0,51) = 4.100; (*t)(1,51) = -0.030; (*t)(2,51) = 0.004;
3040 (*t)(0,52) = 4.200; (*t)(1,52) = -0.030; (*t)(2,52) = 0.004;
3041 (*t)(0,53) = 4.300; (*t)(1,53) = -0.028; (*t)(2,53) = 0.002;
3042 (*t)(0,54) = 4.400; (*t)(1,54) = -0.030; (*t)(2,54) = 0.002;
3043 (*t)(0,55) = 4.500; (*t)(1,55) = -0.028; (*t)(2,55) = 0.002;
3044 (*t)(0,56) = 4.600; (*t)(1,56) = -0.028; (*t)(2,56) = 0.002;
3045 (*t)(0,57) = 4.700; (*t)(1,57) = -0.028; (*t)(2,57) = 0.000;
3046 (*t)(0,58) = 4.800; (*t)(1,58) = -0.028; (*t)(2,58) = 0.002;
3047 (*t)(0,59) = 4.900; (*t)(1,59) = 0.000; (*t)(2,59) = 0.000;
3048 (*t)(0,60) = 5.900; (*t)(1,60) = 0.000; (*t)(2,60) = 0.000;
3051 if (fParticleID==AliPID::kKaon)
3053 //TOF kaons, 0.9 purity
3054 t = new TMatrixF(3,61);
3055 (*t)(0,0) = 0.000; (*t)(1,0) = 0.000; (*t)(2,0) = 0.000;
3056 (*t)(0,1) = 0.050; (*t)(1,1) = 0.000; (*t)(2,1) = 0.000;
3057 (*t)(0,2) = 0.100; (*t)(1,2) = 0.000; (*t)(2,2) = 0.000;
3058 (*t)(0,3) = 0.150; (*t)(1,3) = 0.000; (*t)(2,3) = 0.000;
3059 (*t)(0,4) = 0.200; (*t)(1,4) = -0.05; (*t)(2,4) = 0.05;
3060 (*t)(0,5) = 0.200; (*t)(1,5) = -0.05; (*t)(2,5) = 0.05;
3061 (*t)(0,6) = 0.200; (*t)(1,6) = -0.05; (*t)(2,6) = 0.05;
3062 (*t)(0,7) = 0.200; (*t)(1,7) = -0.05; (*t)(2,7) = 0.05;
3063 (*t)(0,8) = 0.200; (*t)(1,8) = -0.05; (*t)(2,8) = 0.05;
3064 (*t)(0,9) = 0.200; (*t)(1,9) = -0.05; (*t)(2,9) = 0.05;
3065 (*t)(0,10) = 0.200; (*t)(1,10) = -0.05; (*t)(2,10) = 0.05;
3066 (*t)(0,11) = 0.550; (*t)(1,11) = -0.026; (*t)(2,11) = 0.026;
3067 (*t)(0,12) = 0.600; (*t)(1,12) = -0.026; (*t)(2,12) = 0.026;
3068 (*t)(0,13) = 0.650; (*t)(1,13) = -0.026; (*t)(2,13) = 0.026;
3069 (*t)(0,14) = 0.700; (*t)(1,14) = -0.026; (*t)(2,14) = 0.026;
3070 (*t)(0,15) = 0.750; (*t)(1,15) = -0.026; (*t)(2,15) = 0.026;
3071 (*t)(0,16) = 0.800; (*t)(1,16) = -0.026; (*t)(2,16) = 0.026;
3072 (*t)(0,17) = 0.850; (*t)(1,17) = -0.024; (*t)(2,17) = 0.024;
3073 (*t)(0,18) = 0.900; (*t)(1,18) = -0.024; (*t)(2,18) = 0.024;
3074 (*t)(0,19) = 0.950; (*t)(1,19) = -0.024; (*t)(2,19) = 0.024;
3075 (*t)(0,20) = 1.000; (*t)(1,20) = -0.024; (*t)(2,20) = 0.024;
3076 (*t)(0,21) = 1.100; (*t)(1,21) = -0.024; (*t)(2,21) = 0.024;
3077 (*t)(0,22) = 1.200; (*t)(1,22) = -0.024; (*t)(2,22) = 0.022;
3078 (*t)(0,23) = 1.300; (*t)(1,23) = -0.024; (*t)(2,23) = 0.020;
3079 (*t)(0,24) = 1.400; (*t)(1,24) = -0.026; (*t)(2,24) = 0.016;
3080 (*t)(0,25) = 1.500; (*t)(1,25) = -0.028; (*t)(2,25) = 0.014;
3081 (*t)(0,26) = 1.600; (*t)(1,26) = -0.028; (*t)(2,26) = 0.012;
3082 (*t)(0,27) = 1.700; (*t)(1,27) = -0.028; (*t)(2,27) = 0.010;
3083 (*t)(0,28) = 1.800; (*t)(1,28) = -0.028; (*t)(2,28) = 0.010;
3084 (*t)(0,29) = 1.900; (*t)(1,29) = -0.028; (*t)(2,29) = 0.008;
3085 (*t)(0,30) = 2.000; (*t)(1,30) = -0.028; (*t)(2,30) = 0.006;
3086 (*t)(0,31) = 2.100; (*t)(1,31) = -0.026; (*t)(2,31) = 0.006;
3087 (*t)(0,32) = 2.200; (*t)(1,32) = -0.024; (*t)(2,32) = 0.004;
3088 (*t)(0,33) = 2.300; (*t)(1,33) = -0.020; (*t)(2,33) = 0.002;
3089 (*t)(0,34) = 2.400; (*t)(1,34) = -0.020; (*t)(2,34) = 0.002;
3090 (*t)(0,35) = 2.500; (*t)(1,35) = -0.018; (*t)(2,35) = 0.000;
3091 (*t)(0,36) = 2.600; (*t)(1,36) = -0.016; (*t)(2,36) = 0.000;
3092 (*t)(0,37) = 2.700; (*t)(1,37) = -0.014; (*t)(2,37) = -0.002;
3093 (*t)(0,38) = 2.800; (*t)(1,38) = -0.014; (*t)(2,38) = -0.004;
3094 (*t)(0,39) = 2.900; (*t)(1,39) = -0.012; (*t)(2,39) = -0.004;
3095 (*t)(0,40) = 3.000; (*t)(1,40) = -0.010; (*t)(2,40) = -0.006;
3096 (*t)(0,41) = 3.100; (*t)(1,41) = 0.000; (*t)(2,41) = 0.000;
3097 (*t)(0,42) = 3.200; (*t)(1,42) = 0.000; (*t)(2,42) = 0.000;
3098 (*t)(0,43) = 3.300; (*t)(1,43) = 0.000; (*t)(2,43) = 0.000;
3099 (*t)(0,44) = 3.400; (*t)(1,44) = 0.000; (*t)(2,44) = 0.000;
3100 (*t)(0,45) = 3.500; (*t)(1,45) = 0.000; (*t)(2,45) = 0.000;
3101 (*t)(0,46) = 3.600; (*t)(1,46) = 0.000; (*t)(2,46) = 0.000;
3102 (*t)(0,47) = 3.700; (*t)(1,47) = 0.000; (*t)(2,47) = 0.000;
3103 (*t)(0,48) = 3.800; (*t)(1,48) = 0.000; (*t)(2,48) = 0.000;
3104 (*t)(0,49) = 3.900; (*t)(1,49) = 0.000; (*t)(2,49) = 0.000;
3105 (*t)(0,50) = 4.000; (*t)(1,50) = 0.000; (*t)(2,50) = 0.000;
3106 (*t)(0,51) = 4.100; (*t)(1,51) = 0.000; (*t)(2,51) = 0.000;
3107 (*t)(0,52) = 4.200; (*t)(1,52) = 0.000; (*t)(2,52) = 0.000;
3108 (*t)(0,53) = 4.300; (*t)(1,53) = 0.000; (*t)(2,53) = 0.000;
3109 (*t)(0,54) = 4.400; (*t)(1,54) = 0.000; (*t)(2,54) = 0.000;
3110 (*t)(0,55) = 4.500; (*t)(1,55) = 0.000; (*t)(2,55) = 0.000;
3111 (*t)(0,56) = 4.600; (*t)(1,56) = 0.000; (*t)(2,56) = 0.000;
3112 (*t)(0,57) = 4.700; (*t)(1,57) = 0.000; (*t)(2,57) = 0.000;
3113 (*t)(0,58) = 4.800; (*t)(1,58) = 0.000; (*t)(2,58) = 0.000;
3114 (*t)(0,59) = 4.900; (*t)(1,59) = 0.000; (*t)(2,59) = 0.000;
3115 (*t)(0,60) = 5.900; (*t)(1,60) = 0.000; (*t)(2,60) = 0.000;
3122 //-----------------------------------------------------------------------
3123 //-----------------------------------------------------------------------
3124 Bool_t AliFlowTrackCuts::PassesTPCbayesianCut(const AliAODTrack* track)
3126 fBayesianResponse->ComputeProb(track,track->GetAODEvent()); // fCurrCentr is needed for mismatch fraction
3127 Float_t *probabilities = fBayesianResponse->GetProb(); // Bayesian Probability (from 0 to 4) (Combined TPC || TOF) including a tuning of priors and TOF mism$
3129 Int_t kTPC = fBayesianResponse->GetCurrentMask(0); // is TPC on
3131 if(! kTPC) return kFALSE;
3135 switch (fParticleID)
3138 fProbBayes = probabilities[2];
3141 fProbBayes = probabilities[3];
3143 case AliPID::kProton:
3144 fProbBayes = probabilities[4];
3146 case AliPID::kElectron:
3147 fProbBayes = probabilities[0];
3150 fProbBayes = probabilities[1];
3152 case AliPID::kDeuteron:
3153 fProbBayes = probabilities[5];
3155 case AliPID::kTriton:
3156 fProbBayes = probabilities[6];
3159 fProbBayes = probabilities[7];
3165 if(fProbBayes > fParticleProbability){
3168 else if (fCutCharge && fCharge * track->Charge() > 0)
3173 //-----------------------------------------------------------------------
3174 Bool_t AliFlowTrackCuts::PassesTPCbayesianCut(const AliESDtrack* track)
3176 //cut on TPC bayesian pid
3177 //if (! fAllowTOFmismatchFlag) {if (track->GetStatus() & AliESDtrack::kTOFmismatch) return kFALSE;}
3179 //Bool_t statusMatchingHard = TPCTOFagree(track);
3180 //if (fRequireStrictTOFTPCagreement && (!statusMatchingHard))
3182 fBayesianResponse->ComputeProb(track,fCurrCentr); // fCurrCentr is needed for mismatch fraction
3183 Int_t kTPC = fBayesianResponse->GetCurrentMask(0); // is TPC on
3184 //Int_t kTOF = fBayesianResponse->GetCurrentMask(1); // is TOF on
3186 if(! kTPC) return kFALSE;
3188 // Bool_t statusMatchingHard = 1;
3189 // Float_t mismProb = 0;
3191 // statusMatchingHard = TPCTOFagree(track);
3192 // mismProb = fBayesianResponse->GetTOFMismProb();
3194 // if (fRequireStrictTOFTPCagreement && (!statusMatchingHard))
3197 Float_t *probabilities = fBayesianResponse->GetProb(); // Bayesian Probability (from 0 to 4) (Combined TPC || TOF) including a tuning of priors and TOF mismatch parameterization
3201 switch (fParticleID)
3204 fProbBayes = probabilities[2];
3207 fProbBayes = probabilities[3];
3209 case AliPID::kProton:
3210 fProbBayes = probabilities[4];
3212 case AliPID::kElectron:
3213 fProbBayes = probabilities[0];
3216 fProbBayes = probabilities[1];
3218 case AliPID::kDeuteron:
3219 fProbBayes = probabilities[5];
3221 case AliPID::kTriton:
3222 fProbBayes = probabilities[6];
3225 fProbBayes = probabilities[7];
3231 if(fProbBayes > fParticleProbability)
3235 else if (fCutCharge && fCharge * track->GetSign() > 0)
3240 //-----------------------------------------------------------------------
3241 Bool_t AliFlowTrackCuts::PassesTOFbayesianCut(const AliAODTrack* track)
3243 //check is track passes bayesian combined TOF+TPC pid cut
3244 Bool_t goodtrack = (track->GetStatus() & AliESDtrack::kTOFout) &&
3245 (track->GetStatus() & AliESDtrack::kTIME) &&
3246 (track->GetTOFsignal() > 12000) &&
3247 (track->GetTOFsignal() < 100000);
3252 Bool_t statusMatchingHard = TPCTOFagree(track);
3254 if (fRequireStrictTOFTPCagreement && (!statusMatchingHard))
3257 fBayesianResponse->ComputeProb(track,track->GetAODEvent()); // fCurrCentr is needed for mismatch fraction
3258 Float_t *probabilities = fBayesianResponse->GetProb(); // Bayesian Probability (from 0 to 4) (Combined TPC || TOF) including a tuning of priors and TOF mism$
3260 Float_t mismProb = fBayesianResponse->GetTOFMismProb(); // mismatch Bayesian probabilities
3264 switch (fParticleID)
3267 fProbBayes = probabilities[2];
3270 fProbBayes = probabilities[3];
3272 case AliPID::kProton:
3273 fProbBayes = probabilities[4];
3275 case AliPID::kElectron:
3276 fProbBayes = probabilities[0];
3279 fProbBayes = probabilities[1];
3281 case AliPID::kDeuteron:
3282 fProbBayes = probabilities[5];
3284 case AliPID::kTriton:
3285 fProbBayes = probabilities[6];
3288 fProbBayes = probabilities[7];
3294 if(fProbBayes > fParticleProbability && mismProb < 0.5){
3297 else if (fCutCharge && fCharge * track->Charge() > 0)
3303 //-----------------------------------------------------------------------
3304 // part added by F. Noferini (some methods)
3305 Bool_t AliFlowTrackCuts::PassesTOFbayesianCut(const AliESDtrack* track)
3307 //check is track passes bayesian combined TOF+TPC pid cut
3308 Bool_t goodtrack = (track->GetStatus() & AliESDtrack::kTOFout) &&
3309 (track->GetStatus() & AliESDtrack::kTIME) &&
3310 (track->GetTOFsignal() > 12000) &&
3311 (track->GetTOFsignal() < 100000) &&
3312 (track->GetIntegratedLength() > 365);
3317 if (! fAllowTOFmismatchFlag) {if (track->GetStatus() & AliESDtrack::kTOFmismatch) return kFALSE;}
3319 Bool_t statusMatchingHard = TPCTOFagree(track);
3320 if (fRequireStrictTOFTPCagreement && (!statusMatchingHard))
3323 fBayesianResponse->ComputeProb(track,fCurrCentr); // fCurrCentr is needed for mismatch fraction
3324 Float_t *probabilities = fBayesianResponse->GetProb(); // Bayesian Probability (from 0 to 4) (Combined TPC || TOF) including a tuning of priors and TOF mismatch parameterization
3326 Float_t mismProb = fBayesianResponse->GetTOFMismProb(); // mismatch Bayesian probabilities
3330 switch (fParticleID)
3333 fProbBayes = probabilities[2];
3336 fProbBayes = probabilities[3];
3338 case AliPID::kProton:
3339 fProbBayes = probabilities[4];
3341 case AliPID::kElectron:
3342 fProbBayes = probabilities[0];
3345 fProbBayes = probabilities[1];
3347 case AliPID::kDeuteron:
3348 fProbBayes = probabilities[5];
3350 case AliPID::kTriton:
3351 fProbBayes = probabilities[6];
3354 fProbBayes = probabilities[7];
3360 // 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);
3361 if(fProbBayes > fParticleProbability && mismProb < 0.5){
3364 else if (fCutCharge && fCharge * track->GetSign() > 0)
3371 //-----------------------------------------------------------------------
3372 // part added by Natasha
3373 Bool_t AliFlowTrackCuts::PassesNucleiSelection(const AliESDtrack* track)
3375 //pid selection for heavy nuclei
3376 Bool_t select=kFALSE;
3378 //if (!track) continue;
3380 if (!track->GetInnerParam())
3381 return kFALSE; //break;
3383 const AliExternalTrackParam* tpcTrack = track->GetInnerParam();
3385 Double_t ptotTPC = tpcTrack->GetP();
3386 Double_t sigTPC = track->GetTPCsignal();
3387 Double_t dEdxBBA = 0.;
3388 Double_t dSigma = 0.;
3390 switch (fParticleID)
3392 case AliPID::kDeuteron:
3394 dEdxBBA = AliExternalTrackParam::BetheBlochAleph(ptotTPC/1.8756,
3400 dSigma = (sigTPC - dEdxBBA)/dEdxBBA;
3402 if( ptotTPC<=1.1 && (dSigma < (0.5 - (0.1818*ptotTPC)) ) && (dSigma > ( (0.218*ptotTPC - 0.4) ) ) )
3406 case AliPID::kTriton:
3413 // ----- Pass 2 -------
3414 dEdxBBA = 4.0 * AliExternalTrackParam::BetheBlochAleph( (2.*ptotTPC)/2.8084,
3420 dSigma = (sigTPC - dEdxBBA)/dEdxBBA;
3421 if(ptotTPC<=5.0 && (dSigma >= (-0.03968*ptotTPC - 0.1)) && (dSigma <= (0.31 - 0.0217*ptotTPC)))
3425 case AliPID::kAlpha:
3436 // end part added by Natasha
3437 //-----------------------------------------------------------------------
3438 void AliFlowTrackCuts::SetPriors(Float_t centrCur){
3439 //set priors for the bayesian pid selection
3440 fCurrCentr = centrCur;
3442 fBinLimitPID[0] = 0.300000;
3443 fBinLimitPID[1] = 0.400000;
3444 fBinLimitPID[2] = 0.500000;
3445 fBinLimitPID[3] = 0.600000;
3446 fBinLimitPID[4] = 0.700000;
3447 fBinLimitPID[5] = 0.800000;
3448 fBinLimitPID[6] = 0.900000;
3449 fBinLimitPID[7] = 1.000000;
3450 fBinLimitPID[8] = 1.200000;
3451 fBinLimitPID[9] = 1.400000;
3452 fBinLimitPID[10] = 1.600000;
3453 fBinLimitPID[11] = 1.800000;
3454 fBinLimitPID[12] = 2.000000;
3455 fBinLimitPID[13] = 2.200000;
3456 fBinLimitPID[14] = 2.400000;
3457 fBinLimitPID[15] = 2.600000;
3458 fBinLimitPID[16] = 2.800000;
3459 fBinLimitPID[17] = 3.000000;
3572 else if(centrCur < 20){
3682 else if(centrCur < 30){
3792 else if(centrCur < 40){
3902 else if(centrCur < 50){
4012 else if(centrCur < 60){
4122 else if(centrCur < 70){
4232 else if(centrCur < 80){
4452 for(Int_t i=18;i<fgkPIDptBin;i++){
4453 fBinLimitPID[i] = 3.0 + 0.2 * (i-18);
4454 fC[i][0] = fC[17][0];
4455 fC[i][1] = fC[17][1];
4456 fC[i][2] = fC[17][2];
4457 fC[i][3] = fC[17][3];
4458 fC[i][4] = fC[17][4];
4462 //---------------------------------------------------------------//
4463 Bool_t AliFlowTrackCuts::TPCTOFagree(const AliVTrack *track)
4465 //check pid agreement between TPC and TOF
4466 Bool_t status = kFALSE;
4468 const Float_t c = 2.99792457999999984e-02;
4470 Float_t mass[5] = {5.10998909999999971e-04,1.05658000000000002e-01,1.39570000000000000e-01,4.93676999999999977e-01,9.38271999999999995e-01};
4473 Double_t exptimes[9];
4474 track->GetIntegratedTimes(exptimes);
4476 Float_t dedx = track->GetTPCsignal();
4478 Float_t p = track->P();
4479 Float_t time = track->GetTOFsignal()- fESDpid.GetTOFResponse().GetStartTime(p);
4480 Float_t tl = exptimes[0]*c; // to work both for ESD and AOD
4482 Float_t betagammares = fESDpid.GetTOFResponse().GetExpectedSigma(p, exptimes[4], mass[4]);
4484 Float_t betagamma1 = tl/(time-5 *betagammares) * 33.3564095198152043;
4486 // printf("betagamma1 = %f\n",betagamma1);
4488 if(betagamma1 < 0.1) betagamma1 = 0.1;
4490 if(betagamma1 < 0.99999) betagamma1 /= TMath::Sqrt(1-betagamma1*betagamma1);
4491 else betagamma1 = 100;
4493 Float_t betagamma2 = tl/(time+5 *betagammares) * 33.3564095198152043;
4494 // printf("betagamma2 = %f\n",betagamma2);
4496 if(betagamma2 < 0.1) betagamma2 = 0.1;
4498 if(betagamma2 < 0.99999) betagamma2 /= TMath::Sqrt(1-betagamma2*betagamma2);
4499 else betagamma2 = 100;
4502 Float_t momtpc=track->GetTPCmomentum();
4504 for(Int_t i=0;i < 5;i++){
4505 Float_t resolutionTOF = fESDpid.GetTOFResponse().GetExpectedSigma(p, exptimes[i], mass[i]);
4506 if(TMath::Abs(exptimes[i] - time) < 5 * resolutionTOF){
4507 Float_t dedxExp = 0;
4508 if(i==0) dedxExp = fESDpid.GetTPCResponse().GetExpectedSignal(momtpc,AliPID::kElectron);
4509 else if(i==1) dedxExp = fESDpid.GetTPCResponse().GetExpectedSignal(momtpc,AliPID::kMuon);
4510 else if(i==2) dedxExp = fESDpid.GetTPCResponse().GetExpectedSignal(momtpc,AliPID::kPion);
4511 else if(i==3) dedxExp = fESDpid.GetTPCResponse().GetExpectedSignal(momtpc,AliPID::kKaon);
4512 else if(i==4) dedxExp = fESDpid.GetTPCResponse().GetExpectedSignal(momtpc,AliPID::kProton);
4514 Float_t resolutionTPC = 2;
4515 if(i==0) resolutionTPC = fESDpid.GetTPCResponse().GetExpectedSigma(momtpc,track->GetTPCsignalN(),AliPID::kElectron);
4516 else if(i==1) resolutionTPC = fESDpid.GetTPCResponse().GetExpectedSigma(momtpc,track->GetTPCsignalN(),AliPID::kMuon);
4517 else if(i==2) resolutionTPC = fESDpid.GetTPCResponse().GetExpectedSigma(momtpc,track->GetTPCsignalN(),AliPID::kPion);
4518 else if(i==3) resolutionTPC = fESDpid.GetTPCResponse().GetExpectedSigma(momtpc,track->GetTPCsignalN(),AliPID::kKaon);
4519 else if(i==4) resolutionTPC = fESDpid.GetTPCResponse().GetExpectedSigma(momtpc,track->GetTPCsignalN(),AliPID::kProton);
4521 if(TMath::Abs(dedx - dedxExp) < 3 * resolutionTPC){
4527 Float_t bb1 = fESDpid.GetTPCResponse().Bethe(betagamma1);
4528 Float_t bb2 = fESDpid.GetTPCResponse().Bethe(betagamma2);
4529 Float_t bbM = fESDpid.GetTPCResponse().Bethe((betagamma1+betagamma2)*0.5);
4534 Float_t resolutionTOFpr = fESDpid.GetTOFResponse().GetExpectedSigma(p, exptimes[4], mass[4]);
4535 Float_t resolutionTPCpr = fESDpid.GetTPCResponse().GetExpectedSigma(momtpc,track->GetTPCsignalN(),AliPID::kProton);
4536 if(TMath::Abs(dedx-bb1) < resolutionTPCpr*3 && exptimes[4] < time-7*resolutionTOFpr){
4539 else if(TMath::Abs(dedx-bb2) < resolutionTPCpr*3 && exptimes[4] < time-7*resolutionTOFpr){
4542 else if(TMath::Abs(dedx-bbM) < resolutionTPCpr*3 && exptimes[4] < time-7*resolutionTOFpr){
4548 // end part added by F. Noferini
4549 //-----------------------------------------------------------------------
4551 //-----------------------------------------------------------------------
4552 const char* AliFlowTrackCuts::PIDsourceName(PIDsource s)
4554 //get the name of the particle id source
4560 return "TPCbayesian";
4568 return "TOFbayesianPID";
4569 case kTOFbetaSimple:
4570 return "TOFbetaSimple";
4578 //-----------------------------------------------------------------------
4579 const char* AliFlowTrackCuts::GetParamTypeName(trackParameterType type)
4581 //return the name of the selected parameter type
4588 case kTPCstandalone:
4589 return "TPCstandalone";
4591 return "SPDtracklets";
4596 case kMUON: // XZhang 20120604
4597 return "MUON"; // XZhang 20120604
4607 //-----------------------------------------------------------------------
4608 Bool_t AliFlowTrackCuts::PassesPMDcuts(const AliESDPmdTrack* track )
4610 //check PMD specific cuts
4611 //clean up from last iteration, and init label
4612 Int_t det = track->GetDetector();
4613 //Int_t smn = track->GetSmn();
4614 Float_t clsX = track->GetClusterX();
4615 Float_t clsY = track->GetClusterY();
4616 Float_t clsZ = track->GetClusterZ();
4617 Float_t ncell = track->GetClusterCells();
4618 Float_t adc = track->GetClusterADC();
4624 fTrackEta = GetPmdEta(clsX,clsY,clsZ);
4625 fTrackPhi = GetPmdPhi(clsX,clsY);
4629 if (fCutEta) {if ( fTrackEta < fEtaMin || fTrackEta >= fEtaMax ) pass = kFALSE;}
4630 if (fCutPhi) {if ( fTrackPhi < fPhiMin || fTrackPhi >= fPhiMax ) pass = kFALSE;}
4631 if (fCutPmdDet) {if(det != fPmdDet) pass = kFALSE;}
4632 if (fCutPmdAdc) {if(adc < fPmdAdc) pass = kFALSE;}
4633 if (fCutPmdNcell) {if(ncell < fPmdNcell) pass = kFALSE;}
4638 //-----------------------------------------------------------------------
4639 Bool_t AliFlowTrackCuts::PassesVZEROcuts(Int_t id)
4642 if (id<0) return kFALSE;
4644 //clean up from last iter
4647 fTrackPhi = TMath::PiOver4()*(0.5+id%8);
4649 // 10102013 weighting vzero tiles - rbertens@cern.ch
4650 if(!fVZEROgainEqualization) {
4651 // if for some reason the equalization is not initialized (e.g. 2011 data)
4652 // the fVZEROxpol[] weights are used to enable or disable vzero rings
4653 if(id<32) { // v0c side
4654 fTrackEta = -3.45+0.5*(id/8);
4655 if(id < 8) fTrackWeight = fEvent->GetVZEROEqMultiplicity(id)*fVZEROCpol[0];
4656 else if (id < 16 ) fTrackWeight = fEvent->GetVZEROEqMultiplicity(id)*fVZEROCpol[1];
4657 else if (id < 24 ) fTrackWeight = fEvent->GetVZEROEqMultiplicity(id)*fVZEROCpol[2];
4658 else if (id < 32 ) fTrackWeight = fEvent->GetVZEROEqMultiplicity(id)*fVZEROCpol[3];
4659 } else { // v0a side
4660 fTrackEta = +4.8-0.6*((id/8)-4);
4661 if( id < 40) fTrackWeight = fEvent->GetVZEROEqMultiplicity(id)*fVZEROApol[0];
4662 else if ( id < 48 ) fTrackWeight = fEvent->GetVZEROEqMultiplicity(id)*fVZEROApol[1];
4663 else if ( id < 56 ) fTrackWeight = fEvent->GetVZEROEqMultiplicity(id)*fVZEROApol[2];
4664 else if ( id < 64 ) fTrackWeight = fEvent->GetVZEROEqMultiplicity(id)*fVZEROApol[3];
4666 } else { // the equalization is initialized
4667 // note that disabled rings have already been excluded on calibration level in
4668 // AliFlowEvent (so for a disabled ring, fVZEROxpol is zero
4669 if(id<32) { // v0c side
4670 fTrackEta = -3.45+0.5*(id/8);
4671 if(id < 8) fTrackWeight = fEvent->GetVZEROData()->GetMultiplicity(id)*fVZEROCpol[0]/fVZEROgainEqualization->GetBinContent(1+id);
4672 else if (id < 16 ) fTrackWeight = fEvent->GetVZEROData()->GetMultiplicity(id)*fVZEROCpol[1]/fVZEROgainEqualization->GetBinContent(1+id);
4673 else if (id < 24 ) fTrackWeight = fEvent->GetVZEROData()->GetMultiplicity(id)*fVZEROCpol[2]/fVZEROgainEqualization->GetBinContent(1+id);
4674 else if (id < 32 ) fTrackWeight = fEvent->GetVZEROData()->GetMultiplicity(id)*fVZEROCpol[3]/fVZEROgainEqualization->GetBinContent(1+id);
4675 } else { // v0a side
4676 fTrackEta = +4.8-0.6*((id/8)-4);
4677 if( id < 40) fTrackWeight = fEvent->GetVZEROData()->GetMultiplicity(id)*fVZEROApol[0]/fVZEROgainEqualization->GetBinContent(1+id);
4678 else if ( id < 48 ) fTrackWeight = fEvent->GetVZEROData()->GetMultiplicity(id)*fVZEROApol[1]/fVZEROgainEqualization->GetBinContent(1+id);
4679 else if ( id < 56 ) fTrackWeight = fEvent->GetVZEROData()->GetMultiplicity(id)*fVZEROApol[2]/fVZEROgainEqualization->GetBinContent(1+id);
4680 else if ( id < 64 ) fTrackWeight = fEvent->GetVZEROData()->GetMultiplicity(id)*fVZEROApol[3]/fVZEROgainEqualization->GetBinContent(1+id);
4682 // printf ( " tile %i and weight %.2f \n", id, fTrackWeight);
4685 if (fLinearizeVZEROresponse && id < 64)
4687 //this is only needed in pass1 of LHC10h
4688 Float_t multVZERO[fgkNumberOfVZEROtracks];
4690 AliESDUtils::GetCorrV0((AliESDEvent*)fEvent,dummy,multVZERO);
4691 fTrackWeight = multVZERO[id];
4695 if (fCutEta) {if ( fTrackEta < fEtaMin || fTrackEta >= fEtaMax ) pass = kFALSE;}
4696 if (fCutPhi) {if ( fTrackPhi < fPhiMin || fTrackPhi >= fPhiMax ) pass = kFALSE;}
4701 //-----------------------------------------------------------------------------
4702 Bool_t AliFlowTrackCuts::PassesMuonCuts(AliVParticle* vparticle)
4706 fTrackLabel = (fFakesAreOK)?TMath::Abs(vparticle->GetLabel()):vparticle->GetLabel();
4707 if (fMCevent) fMCparticle = static_cast<AliMCParticle*>(fMCevent->GetTrack(fTrackLabel));
4708 else fMCparticle=NULL;
4710 AliESDMuonTrack *esdTrack = dynamic_cast<AliESDMuonTrack*>(vparticle);
4711 AliAODTrack *aodTrack = dynamic_cast<AliAODTrack*>(vparticle);
4712 if ((!esdTrack) && (!aodTrack)) return kFALSE;
4713 if (!fMuonTrackCuts->IsSelected(vparticle)) return kFALSE;
4714 HandleVParticle(vparticle); if (!fTrack) return kFALSE;
4718 //----------------------------------------------------------------------------//
4719 Double_t AliFlowTrackCuts::GetPmdEta(Float_t xPos, Float_t yPos, Float_t zPos)
4721 //get PMD "track" eta coordinate
4722 Float_t rpxpy, theta, eta;
4723 rpxpy = TMath::Sqrt(xPos*xPos + yPos*yPos);
4724 theta = TMath::ATan2(rpxpy,zPos);
4725 eta = -TMath::Log(TMath::Tan(0.5*theta));
4729 //--------------------------------------------------------------------------//
4730 Double_t AliFlowTrackCuts::GetPmdPhi(Float_t xPos, Float_t yPos)
4732 //Get PMD "track" phi coordinate
4733 Float_t pybypx, phi = 0., phi1;
4736 if(yPos>0) phi = 90.;
4737 if(yPos<0) phi = 270.;
4742 if(pybypx < 0) pybypx = - pybypx;
4743 phi1 = TMath::ATan(pybypx)*180./3.14159;
4745 if(xPos > 0 && yPos > 0) phi = phi1; // 1st Quadrant
4746 if(xPos < 0 && yPos > 0) phi = 180 - phi1; // 2nd Quadrant
4747 if(xPos < 0 && yPos < 0) phi = 180 + phi1; // 3rd Quadrant
4748 if(xPos > 0 && yPos < 0) phi = 360 - phi1; // 4th Quadrant
4751 phi = phi*3.14159/180.;
4755 //---------------------------------------------------------------//
4756 void AliFlowTrackCuts::Browse(TBrowser* b)
4758 //some browsing capabilities
4759 if (fQA) b->Add(fQA);
4762 //---------------------------------------------------------------//
4763 Long64_t AliFlowTrackCuts::Merge(TCollection* list)
4766 if (!fQA || !list) return 0;
4767 if (list->IsEmpty()) return 0;
4768 AliFlowTrackCuts* obj=NULL;
4771 while ( (obj = dynamic_cast<AliFlowTrackCuts*>(next())) )
4773 if (obj==this) continue;
4774 tmplist.Add(obj->GetQA());
4776 return fQA->Merge(&tmplist);