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 AliVVZERO* vvzero = dynamic_cast<AliVVZERO*>(obj); // downcast to base class
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);
1181 if (fCutPID && (fParticleID!=AliPID::kUnknown)) //if kUnknown don't cut on PID
1183 if (!PassesAODpidCut(track)) pass=kFALSE;
1187 // changed 04062014 used to be filled before possible PID cut
1188 Double_t momTPC = track->GetTPCmomentum();
1189 QAbefore( 1)->Fill(momTPC,dedx);
1190 QAbefore( 5)->Fill(track->Pt(),track->DCA());
1191 QAbefore( 6)->Fill(track->Pt(),track->ZAtDCA());
1192 if (pass) QAafter( 1)->Fill(momTPC,dedx);
1193 if (pass) QAafter( 5)->Fill(track->Pt(),track->DCA());
1194 if (pass) QAafter( 6)->Fill(track->Pt(),track->ZAtDCA());
1195 QAbefore( 8)->Fill(track->P(),(track->GetTOFsignal()-time[AliPID::kElectron]));
1196 if (pass) QAafter( 8)->Fill(track->P(),(track->GetTOFsignal()-time[AliPID::kElectron]));
1197 QAbefore( 9)->Fill(track->P(),(track->GetTOFsignal()-time[AliPID::kMuon]));
1198 if (pass) QAafter( 9)->Fill(track->P(),(track->GetTOFsignal()-time[AliPID::kMuon]));
1199 QAbefore(10)->Fill(track->P(),(track->GetTOFsignal()-time[AliPID::kPion]));
1200 if (pass) QAafter( 10)->Fill(track->P(),(track->GetTOFsignal()-time[AliPID::kPion]));
1201 QAbefore(11)->Fill(track->P(),(track->GetTOFsignal()-time[AliPID::kKaon]));
1202 if (pass) QAafter( 11)->Fill(track->P(),(track->GetTOFsignal()-time[AliPID::kKaon]));
1203 QAbefore(12)->Fill(track->P(),(track->GetTOFsignal()-time[AliPID::kProton]));
1204 if (pass) QAafter( 12)->Fill(track->P(),(track->GetTOFsignal()-time[AliPID::kProton]));
1211 //_______________________________________________________________________
1212 Bool_t AliFlowTrackCuts::PassesESDcuts(AliESDtrack* track)
1214 //check cuts on ESD tracks
1218 track->GetImpactParameters(dcaxy,dcaz);
1219 const AliExternalTrackParam* pout = track->GetOuterParam();
1220 const AliExternalTrackParam* pin = track->GetInnerParam();
1221 if (fIgnoreTPCzRange)
1225 Double_t zin = pin->GetZ();
1226 Double_t zout = pout->GetZ();
1227 if (zin*zout<0) pass=kFALSE; //reject if cross the membrane
1228 if (zin < fIgnoreTPCzRangeMin || zin > fIgnoreTPCzRangeMax) pass=kFALSE;
1229 if (zout < fIgnoreTPCzRangeMin || zout > fIgnoreTPCzRangeMax) pass=kFALSE;
1233 Int_t ntpccls = ( fParamType==kTPCstandalone )?
1234 track->GetTPCNclsIter1():track->GetTPCNcls();
1235 if (fCutChi2PerClusterTPC)
1237 Float_t tpcchi2 = (fParamType==kTPCstandalone)?
1238 track->GetTPCchi2Iter1():track->GetTPCchi2();
1239 tpcchi2 = (ntpccls>0)?tpcchi2/ntpccls:-FLT_MAX;
1240 if (tpcchi2<fMinChi2PerClusterTPC || tpcchi2 >=fMaxChi2PerClusterTPC)
1244 if (fCutMinimalTPCdedx)
1246 if (track->GetTPCsignal() < fMinimalTPCdedx) pass=kFALSE;
1249 if (fCutNClustersTPC)
1251 if (ntpccls < fNClustersTPCMin || ntpccls > fNClustersTPCMax) pass=kFALSE;
1254 Int_t nitscls = track->GetNcls(0);
1255 if (fCutNClustersITS)
1257 if (nitscls < fNClustersITSMin || nitscls > fNClustersITSMax) pass=kFALSE;
1260 //some stuff is still handled by AliESDtrackCuts class - delegate
1261 if (fAliESDtrackCuts)
1263 if (!fAliESDtrackCuts->IsSelected(track)) pass=kFALSE;
1266 //PID part with pid QA
1267 Double_t beta = GetBeta(track);
1268 Double_t dedx = Getdedx(track);
1271 if (pass) QAbefore(0)->Fill(track->GetP(),beta);
1272 if (pass) QAbefore(1)->Fill(pin->GetP(),dedx);
1274 if (fCutPID && (fParticleID!=AliPID::kUnknown)) //if kUnknown don't cut on PID
1276 if (!PassesESDpidCut(track)) pass=kFALSE;
1278 if (fCutRejectElectronsWithTPCpid)
1280 //reject electrons using standard TPC pid
1281 //TODO this should be rethought....
1282 Double_t pidTPC[AliPID::kSPECIES];
1283 track->GetTPCpid(pidTPC);
1284 if (pidTPC[AliPID::kElectron]<fParticleProbability) pass=kFALSE;
1288 if (pass) QAafter(0)->Fill(track->GetP(),beta);
1289 if (pass) QAafter(1)->Fill(pin->GetP(),dedx);
1291 //end pid part with qa
1295 Double_t pt = track->Pt();
1296 QAbefore(5)->Fill(pt,dcaxy);
1297 QAbefore(6)->Fill(pt,dcaz);
1298 if (pass) QAafter(5)->Fill(pt,dcaxy);
1299 if (pass) QAafter(6)->Fill(pt,dcaz);
1300 QAbefore(17)->Fill(Float_t(track->GetKinkIndex(0)));
1301 if (pass) QAafter(17)->Fill(Float_t(track->GetKinkIndex(0)));
1307 //-----------------------------------------------------------------------
1308 void AliFlowTrackCuts::HandleVParticle(AliVParticle* track)
1310 //handle the general case
1319 //-----------------------------------------------------------------------
1320 void AliFlowTrackCuts::HandleESDtrack(AliESDtrack* track)
1328 case kTPCstandalone:
1329 if (!track->FillTPCOnlyTrack(fTPCtrack))
1336 fTrack = &fTPCtrack;
1337 //recalculate the label and mc particle, they may differ as TPClabel != global label
1338 fTrackLabel = (fFakesAreOK)?TMath::Abs(fTrack->GetLabel()):fTrack->GetLabel();
1339 if (fMCevent) fMCparticle = static_cast<AliMCParticle*>(fMCevent->GetTrack(fTrackLabel));
1340 else fMCparticle=NULL;
1343 if (fForceTPCstandalone)
1345 if (!track->FillTPCOnlyTrack(fTPCtrack))
1352 fTrack = &fTPCtrack;
1353 //recalculate the label and mc particle, they may differ as TPClabel != global label
1354 fTrackLabel = (fFakesAreOK)?TMath::Abs(fTrack->GetLabel()):fTrack->GetLabel();
1355 if (fMCevent) fMCparticle = static_cast<AliMCParticle*>(fMCevent->GetTrack(fTrackLabel));
1356 else fMCparticle=NULL;
1364 //-----------------------------------------------------------------------
1365 Int_t AliFlowTrackCuts::Count(AliVEvent* event)
1367 //calculate the number of track in given event.
1368 //if argument is NULL(default) take the event attached
1370 Int_t multiplicity = 0;
1373 for (Int_t i=0; i<GetNumberOfInputObjects(); i++)
1375 if (IsSelected(GetInputObject(i))) multiplicity++;
1380 for (Int_t i=0; i<event->GetNumberOfTracks(); i++)
1382 if (IsSelected(event->GetTrack(i))) multiplicity++;
1385 return multiplicity;
1388 //-----------------------------------------------------------------------
1389 AliFlowTrackCuts* AliFlowTrackCuts::GetStandardVZEROOnlyTrackCuts()
1391 //returns the lhc10h vzero track cuts, this function
1392 //is left here for backward compatibility
1393 //if a run is recognized as 11h, the calibration method will
1394 //switch to 11h calbiration, which means that the cut
1395 //object is updated but not replaced.
1396 //calibratin is only available for PbPb runs
1397 return GetStandardVZEROOnlyTrackCuts2010();
1399 //-----------------------------------------------------------------------
1400 AliFlowTrackCuts* AliFlowTrackCuts::GetStandardVZEROOnlyTrackCuts2010()
1402 //get standard VZERO cuts
1403 AliFlowTrackCuts* cuts = new AliFlowTrackCuts("standard vzero flow cuts 2010");
1404 cuts->SetParamType(kVZERO);
1405 cuts->SetEtaRange( -10, +10 );
1406 cuts->SetPhiMin( 0 );
1407 cuts->SetPhiMax( TMath::TwoPi() );
1408 // options for the reweighting
1409 cuts->SetVZEROgainEqualizationPerRing(kFALSE);
1410 cuts->SetApplyRecentering(kTRUE);
1411 // to exclude a ring , do e.g.
1412 // cuts->SetUseVZERORing(7, kFALSE);
1415 //-----------------------------------------------------------------------
1416 AliFlowTrackCuts* AliFlowTrackCuts::GetStandardVZEROOnlyTrackCuts2011()
1418 //get standard VZERO cuts for 2011 data
1419 //in this case, the vzero segments will be weighted by
1420 //VZEROEqMultiplicity,
1421 //if recentering is enableded, the sub-q vectors
1422 //will be taken from the event header, so make sure to run
1423 //the VZERO event plane selection task before this task !
1424 //recentering replaces the already evaluated q-vectors, so
1425 //when chosen, additional settings (e.g. excluding rings)
1426 //have no effect. recentering is true by default
1428 //NOTE user is responsible for running the vzero event plane
1429 //selection task in advance, e.g. add to your launcher macro
1431 // gROOT->LoadMacro("$ALICE_ROOT/ANALYSIS/macros/AddTaskVZEROEPSelection.C");
1432 // AddTaskVZEROEPSelection();
1434 AliFlowTrackCuts* cuts = new AliFlowTrackCuts("standard vzero flow cuts 2011");
1435 cuts->SetParamType(kVZERO);
1436 cuts->SetEtaRange( -10, +10 );
1437 cuts->SetPhiMin( 0 );
1438 cuts->SetPhiMax( TMath::TwoPi() );
1439 cuts->SetApplyRecentering(kTRUE);
1440 cuts->SetVZEROgainEqualizationPerRing(kFALSE);
1443 //-----------------------------------------------------------------------
1444 AliFlowTrackCuts* AliFlowTrackCuts::GetStandardGlobalTrackCuts2010()
1447 AliFlowTrackCuts* cuts = new AliFlowTrackCuts("standard Global tracks");
1448 cuts->SetParamType(kGlobal);
1449 cuts->SetPtRange(0.2,5.);
1450 cuts->SetEtaRange(-0.8,0.8);
1451 cuts->SetMinNClustersTPC(70);
1452 cuts->SetMinChi2PerClusterTPC(0.1);
1453 cuts->SetMaxChi2PerClusterTPC(4.0);
1454 cuts->SetMinNClustersITS(2);
1455 cuts->SetRequireITSRefit(kTRUE);
1456 cuts->SetRequireTPCRefit(kTRUE);
1457 cuts->SetMaxDCAToVertexXY(0.3);
1458 cuts->SetMaxDCAToVertexZ(0.3);
1459 cuts->SetAcceptKinkDaughters(kFALSE);
1460 cuts->SetMinimalTPCdedx(10.);
1465 //-----------------------------------------------------------------------
1466 AliFlowTrackCuts* AliFlowTrackCuts::GetStandardTPCStandaloneTrackCuts2010()
1469 AliFlowTrackCuts* cuts = new AliFlowTrackCuts("standard TPC standalone 2010");
1470 cuts->SetParamType(kTPCstandalone);
1471 cuts->SetPtRange(0.2,5.);
1472 cuts->SetEtaRange(-0.8,0.8);
1473 cuts->SetMinNClustersTPC(70);
1474 cuts->SetMinChi2PerClusterTPC(0.2);
1475 cuts->SetMaxChi2PerClusterTPC(4.0);
1476 cuts->SetMaxDCAToVertexXY(3.0);
1477 cuts->SetMaxDCAToVertexZ(3.0);
1478 cuts->SetDCAToVertex2D(kTRUE);
1479 cuts->SetAcceptKinkDaughters(kFALSE);
1480 cuts->SetMinimalTPCdedx(10.);
1485 //-----------------------------------------------------------------------
1486 AliFlowTrackCuts* AliFlowTrackCuts::GetStandardTPCStandaloneTrackCuts()
1489 AliFlowTrackCuts* cuts = new AliFlowTrackCuts("standard TPC standalone");
1490 cuts->SetParamType(kTPCstandalone);
1491 cuts->SetPtRange(0.2,5.);
1492 cuts->SetEtaRange(-0.8,0.8);
1493 cuts->SetMinNClustersTPC(70);
1494 cuts->SetMinChi2PerClusterTPC(0.2);
1495 cuts->SetMaxChi2PerClusterTPC(4.0);
1496 cuts->SetMaxDCAToVertexXY(3.0);
1497 cuts->SetMaxDCAToVertexZ(3.0);
1498 cuts->SetDCAToVertex2D(kTRUE);
1499 cuts->SetAcceptKinkDaughters(kFALSE);
1500 cuts->SetMinimalTPCdedx(10.);
1505 //-----------------------------------------------------------------------
1506 AliFlowTrackCuts* AliFlowTrackCuts::GetStandardITSTPCTrackCuts2009(Bool_t selPrimaries)
1509 AliFlowTrackCuts* cuts = new AliFlowTrackCuts("standard global track cuts 2009");
1510 delete cuts->fAliESDtrackCuts;
1511 cuts->fAliESDtrackCuts = AliESDtrackCuts::GetStandardITSTPCTrackCuts2009(selPrimaries);
1512 cuts->SetParamType(kGlobal);
1516 //-----------------------------------------------------------------------------
1517 AliFlowTrackCuts* AliFlowTrackCuts::GetStandardMuonTrackCuts(Bool_t isMC, Int_t passN)
1520 AliFlowTrackCuts* cuts = new AliFlowTrackCuts("standard muon track cuts");
1521 cuts->SetParamType(kMUON);
1522 cuts->SetStandardMuonTrackCuts();
1523 cuts->SetIsMuonMC(isMC);
1524 cuts->SetMuonPassNumber(passN);
1528 //-----------------------------------------------------------------------
1529 //AliFlowTrack* AliFlowTrackCuts::FillFlowTrackV0(TObjArray* trackCollection, Int_t trackIndex) const
1531 // //fill flow track from a reconstructed V0 (topological)
1532 // AliFlowTrack* flowtrack = static_cast<AliFlowTrack*>(trackCollection->At(trackIndex));
1535 // flowtrack->Clear();
1539 // flowtrack = new AliFlowCandidateTrack();
1540 // trackCollection->AddAtAndExpand(flowtrack,trackIndex);
1543 // TParticle *tmpTParticle=NULL;
1544 // AliMCParticle* tmpAliMCParticle=NULL;
1545 // AliExternalTrackParam* externalParams=NULL;
1546 // AliESDtrack* esdtrack=NULL;
1547 // switch(fParamMix)
1550 // flowtrack->Set(fTrack);
1552 // case kTrackWithMCkine:
1553 // flowtrack->Set(fMCparticle);
1555 // case kTrackWithMCPID:
1556 // flowtrack->Set(fTrack);
1557 // //flowtrack->setPID(...) from mc, when implemented
1559 // case kTrackWithMCpt:
1560 // if (!fMCparticle) return NULL;
1561 // flowtrack->Set(fTrack);
1562 // flowtrack->SetPt(fMCparticle->Pt());
1564 // case kTrackWithPtFromFirstMother:
1565 // if (!fMCparticle) return NULL;
1566 // flowtrack->Set(fTrack);
1567 // tmpTParticle = fMCparticle->Particle();
1568 // tmpAliMCParticle = static_cast<AliMCParticle*>(fMCevent->GetTrack(tmpTParticle->GetFirstMother()));
1569 // flowtrack->SetPt(tmpAliMCParticle->Pt());
1571 // case kTrackWithTPCInnerParams:
1572 // esdtrack = dynamic_cast<AliESDtrack*>(fTrack);
1573 // if (!esdtrack) return NULL;
1574 // externalParams = const_cast<AliExternalTrackParam*>(esdtrack->GetTPCInnerParam());
1575 // if (!externalParams) return NULL;
1576 // flowtrack->Set(externalParams);
1579 // flowtrack->Set(fTrack);
1582 // if (fParamType==kMC)
1584 // flowtrack->SetSource(AliFlowTrack::kFromMC);
1585 // flowtrack->SetID(fTrackLabel);
1587 // else if (dynamic_cast<AliAODTrack*>(fTrack))
1589 // if (fParamType==kMUON) // XZhang 20120604
1590 // flowtrack->SetSource(AliFlowTrack::kFromMUON); // XZhang 20120604
1591 // else // XZhang 20120604
1592 // flowtrack->SetSource(AliFlowTrack::kFromAOD); // XZhang 20120604
1593 // flowtrack->SetID(static_cast<AliVTrack*>(fTrack)->GetID());
1595 // else if (dynamic_cast<AliMCParticle*>(fTrack))
1597 // flowtrack->SetSource(AliFlowTrack::kFromMC);
1598 // flowtrack->SetID(static_cast<AliVTrack*>(fTrack)->GetID());
1603 // //add daughter indices
1606 // return flowtrack;
1609 //-----------------------------------------------------------------------
1610 AliFlowTrack* AliFlowTrackCuts::FillFlowTrackKink(TObjArray* trackCollection, Int_t trackIndex) const
1612 //fill flow track from AliVParticle (ESD,AOD,MC)
1613 AliFlowTrack* flowtrack = static_cast<AliFlowTrack*>(trackCollection->At(trackIndex));
1620 flowtrack = new AliFlowCandidateTrack();
1621 trackCollection->AddAtAndExpand(flowtrack,trackIndex);
1624 TParticle *tmpTParticle=NULL;
1625 AliMCParticle* tmpAliMCParticle=NULL;
1626 AliExternalTrackParam* externalParams=NULL;
1627 AliESDtrack* esdtrack=NULL;
1631 flowtrack->Set(fTrack);
1633 case kTrackWithMCkine:
1634 flowtrack->Set(fMCparticle);
1636 case kTrackWithMCPID:
1637 flowtrack->Set(fTrack);
1638 //flowtrack->setPID(...) from mc, when implemented
1640 case kTrackWithMCpt:
1641 if (!fMCparticle) return NULL;
1642 flowtrack->Set(fTrack);
1643 flowtrack->SetPt(fMCparticle->Pt());
1645 case kTrackWithPtFromFirstMother:
1646 if (!fMCparticle) return NULL;
1647 flowtrack->Set(fTrack);
1648 tmpTParticle = fMCparticle->Particle();
1649 tmpAliMCParticle = static_cast<AliMCParticle*>(fMCevent->GetTrack(tmpTParticle->GetFirstMother()));
1650 flowtrack->SetPt(tmpAliMCParticle->Pt());
1652 case kTrackWithTPCInnerParams:
1653 esdtrack = dynamic_cast<AliESDtrack*>(fTrack);
1654 if (!esdtrack) return NULL;
1655 externalParams = const_cast<AliExternalTrackParam*>(esdtrack->GetTPCInnerParam());
1656 if (!externalParams) return NULL;
1657 flowtrack->Set(externalParams);
1660 flowtrack->Set(fTrack);
1663 if (fParamType==kMC)
1665 flowtrack->SetSource(AliFlowTrack::kFromMC);
1666 flowtrack->SetID(fTrackLabel);
1668 else if (dynamic_cast<AliESDtrack*>(fTrack))
1670 flowtrack->SetSource(AliFlowTrack::kFromESD);
1671 flowtrack->SetID(static_cast<AliVTrack*>(fTrack)->GetID());
1673 else if (dynamic_cast<AliESDMuonTrack*>(fTrack)) // XZhang 20120604
1674 { // XZhang 20120604
1675 flowtrack->SetSource(AliFlowTrack::kFromMUON); // XZhang 20120604
1676 flowtrack->SetID((Int_t)static_cast<AliESDMuonTrack*>(fTrack)->GetUniqueID()); // XZhang 20120604
1677 } // XZhang 20120604
1678 else if (dynamic_cast<AliAODTrack*>(fTrack))
1680 if (fParamType==kMUON) // XZhang 20120604
1681 flowtrack->SetSource(AliFlowTrack::kFromMUON); // XZhang 20120604
1682 else // XZhang 20120604
1683 flowtrack->SetSource(AliFlowTrack::kFromAOD); // XZhang 20120604
1684 flowtrack->SetID(static_cast<AliVTrack*>(fTrack)->GetID());
1686 else if (dynamic_cast<AliMCParticle*>(fTrack))
1688 flowtrack->SetSource(AliFlowTrack::kFromMC);
1689 flowtrack->SetID(static_cast<AliVTrack*>(fTrack)->GetID());
1694 Int_t indexMother = fKink->GetIndex(0);
1695 Int_t indexDaughter = fKink->GetIndex(1);
1696 flowtrack->SetID(indexMother);
1697 flowtrack->AddDaughter(indexDaughter);
1698 flowtrack->SetMass(1.);
1699 flowtrack->SetSource(AliFlowTrack::kFromKink);
1702 flowtrack->SetMass(fTrackMass);
1707 //-----------------------------------------------------------------------
1708 AliFlowTrack* AliFlowTrackCuts::FillFlowTrackGeneric(TObjArray* trackCollection, Int_t trackIndex) const
1710 //fill a flow track from tracklet,vzero,pmd,...
1711 AliFlowTrack* flowtrack = static_cast<AliFlowTrack*>(trackCollection->At(trackIndex));
1718 flowtrack = new AliFlowTrack();
1719 trackCollection->AddAtAndExpand(flowtrack,trackIndex);
1722 if (FillFlowTrackGeneric(flowtrack)) return flowtrack;
1725 trackCollection->RemoveAt(trackIndex);
1731 //-----------------------------------------------------------------------
1732 Bool_t AliFlowTrackCuts::FillFlowTrackGeneric(AliFlowTrack* flowtrack) const
1734 //fill a flow track from tracklet,vzero,pmd,...
1735 TParticle *tmpTParticle=NULL;
1736 AliMCParticle* tmpAliMCParticle=NULL;
1740 flowtrack->SetPhi(fTrackPhi);
1741 flowtrack->SetEta(fTrackEta);
1742 flowtrack->SetWeight(fTrackWeight);
1743 flowtrack->SetPt(fTrackPt);
1744 flowtrack->SetMass(fTrackMass);
1746 case kTrackWithMCkine:
1747 if (!fMCparticle) return kFALSE;
1748 flowtrack->SetPhi( fMCparticle->Phi() );
1749 flowtrack->SetEta( fMCparticle->Eta() );
1750 flowtrack->SetPt( fMCparticle->Pt() );
1751 flowtrack->SetMass(fTrackMass);
1753 case kTrackWithMCpt:
1754 if (!fMCparticle) return kFALSE;
1755 flowtrack->SetPhi(fTrackPhi);
1756 flowtrack->SetEta(fTrackEta);
1757 flowtrack->SetWeight(fTrackWeight);
1758 flowtrack->SetPt(fMCparticle->Pt());
1759 flowtrack->SetMass(fTrackMass);
1761 case kTrackWithPtFromFirstMother:
1762 if (!fMCparticle) return kFALSE;
1763 flowtrack->SetPhi(fTrackPhi);
1764 flowtrack->SetEta(fTrackEta);
1765 flowtrack->SetWeight(fTrackWeight);
1766 tmpTParticle = fMCparticle->Particle();
1767 tmpAliMCParticle = static_cast<AliMCParticle*>(fMCevent->GetTrack(tmpTParticle->GetFirstMother()));
1768 flowtrack->SetPt(tmpAliMCParticle->Pt());
1769 flowtrack->SetMass(fTrackMass);
1772 flowtrack->SetPhi(fTrackPhi);
1773 flowtrack->SetEta(fTrackEta);
1774 flowtrack->SetWeight(fTrackWeight);
1775 flowtrack->SetPt(fTrackPt);
1776 flowtrack->SetMass(fTrackMass);
1779 flowtrack->SetSource(AliFlowTrack::kFromTracklet);
1783 //-----------------------------------------------------------------------
1784 AliFlowTrack* AliFlowTrackCuts::FillFlowTrackVParticle(TObjArray* trackCollection, Int_t trackIndex) const
1786 //fill flow track from AliVParticle (ESD,AOD,MC)
1788 AliFlowTrack* flowtrack = static_cast<AliFlowTrack*>(trackCollection->At(trackIndex));
1795 flowtrack = new AliFlowTrack();
1796 trackCollection->AddAtAndExpand(flowtrack,trackIndex);
1799 if (FillFlowTrackVParticle(flowtrack)) return flowtrack;
1802 trackCollection->RemoveAt(trackIndex);
1808 //-----------------------------------------------------------------------
1809 Bool_t AliFlowTrackCuts::FillFlowTrackVParticle(AliFlowTrack* flowtrack) const
1811 //fill flow track from AliVParticle (ESD,AOD,MC)
1812 if (!fTrack) return kFALSE;
1813 TParticle *tmpTParticle=NULL;
1814 AliMCParticle* tmpAliMCParticle=NULL;
1815 AliExternalTrackParam* externalParams=NULL;
1816 AliESDtrack* esdtrack=NULL;
1820 flowtrack->Set(fTrack);
1822 case kTrackWithMCkine:
1823 flowtrack->Set(fMCparticle);
1825 case kTrackWithMCPID:
1826 flowtrack->Set(fTrack);
1827 //flowtrack->setPID(...) from mc, when implemented
1829 case kTrackWithMCpt:
1830 if (!fMCparticle) return kFALSE;
1831 flowtrack->Set(fTrack);
1832 flowtrack->SetPt(fMCparticle->Pt());
1834 case kTrackWithPtFromFirstMother:
1835 if (!fMCparticle) return kFALSE;
1836 flowtrack->Set(fTrack);
1837 tmpTParticle = fMCparticle->Particle();
1838 tmpAliMCParticle = static_cast<AliMCParticle*>(fMCevent->GetTrack(tmpTParticle->GetFirstMother()));
1839 flowtrack->SetPt(tmpAliMCParticle->Pt());
1841 case kTrackWithTPCInnerParams:
1842 esdtrack = dynamic_cast<AliESDtrack*>(fTrack);
1843 if (!esdtrack) return kFALSE;
1844 externalParams = const_cast<AliExternalTrackParam*>(esdtrack->GetTPCInnerParam());
1845 if (!externalParams) return kFALSE;
1846 flowtrack->Set(externalParams);
1849 flowtrack->Set(fTrack);
1852 if (fParamType==kMC)
1854 flowtrack->SetSource(AliFlowTrack::kFromMC);
1855 flowtrack->SetID(fTrackLabel);
1857 else if (dynamic_cast<AliESDtrack*>(fTrack))
1859 flowtrack->SetSource(AliFlowTrack::kFromESD);
1860 flowtrack->SetID(static_cast<AliVTrack*>(fTrack)->GetID());
1862 else if (dynamic_cast<AliESDMuonTrack*>(fTrack)) // XZhang 20120604
1863 { // XZhang 20120604
1864 flowtrack->SetSource(AliFlowTrack::kFromMUON); // XZhang 20120604
1865 flowtrack->SetID((Int_t)static_cast<AliESDMuonTrack*>(fTrack)->GetUniqueID()); // XZhang 20120604
1866 } // XZhang 20120604
1867 else if (dynamic_cast<AliAODTrack*>(fTrack))
1869 if (fParamType==kMUON) // XZhang 20120604
1870 flowtrack->SetSource(AliFlowTrack::kFromMUON); // XZhang 20120604
1871 else // XZhang 20120604
1872 flowtrack->SetSource(AliFlowTrack::kFromAOD); // XZhang 20120604
1873 flowtrack->SetID(static_cast<AliVTrack*>(fTrack)->GetID());
1875 else if (dynamic_cast<AliMCParticle*>(fTrack))
1877 flowtrack->SetSource(AliFlowTrack::kFromMC);
1878 flowtrack->SetID(static_cast<AliVTrack*>(fTrack)->GetID());
1880 flowtrack->SetMass(fTrackMass);
1884 //-----------------------------------------------------------------------
1885 AliFlowTrack* AliFlowTrackCuts::FillFlowTrack(TObjArray* trackCollection, Int_t trackIndex) const
1887 //fill a flow track constructed from whatever we applied cuts on
1888 //return true on success
1892 return FillFlowTrackGeneric(trackCollection, trackIndex);
1894 return FillFlowTrackGeneric(trackCollection, trackIndex);
1896 return FillFlowTrackGeneric(trackCollection, trackIndex);
1898 return FillFlowTrackKink(trackCollection, trackIndex);
1900 // return FillFlowTrackV0(trackCollection, trackIndex);
1902 return FillFlowTrackVParticle(trackCollection, trackIndex);
1906 //-----------------------------------------------------------------------
1907 Bool_t AliFlowTrackCuts::FillFlowTrack(AliFlowTrack* track) const
1909 //fill a flow track constructed from whatever we applied cuts on
1910 //return true on success
1914 return FillFlowTrackGeneric(track);
1916 return FillFlowTrackGeneric(track);
1918 return FillFlowTrackGeneric(track);
1920 return FillFlowTrackVParticle(track);
1924 ////-----------------------------------------------------------------------
1925 //AliFlowTrack* AliFlowTrackCuts::MakeFlowTrackSPDtracklet() const
1927 // //make a flow track from tracklet
1928 // AliFlowTrack* flowtrack=NULL;
1929 // TParticle *tmpTParticle=NULL;
1930 // AliMCParticle* tmpAliMCParticle=NULL;
1931 // switch (fParamMix)
1934 // flowtrack = new AliFlowTrack();
1935 // flowtrack->SetPhi(fTrackPhi);
1936 // flowtrack->SetEta(fTrackEta);
1937 // flowtrack->SetWeight(fTrackWeight);
1939 // case kTrackWithMCkine:
1940 // if (!fMCparticle) return NULL;
1941 // flowtrack = new AliFlowTrack();
1942 // flowtrack->SetPhi( fMCparticle->Phi() );
1943 // flowtrack->SetEta( fMCparticle->Eta() );
1944 // flowtrack->SetPt( fMCparticle->Pt() );
1946 // case kTrackWithMCpt:
1947 // if (!fMCparticle) return NULL;
1948 // flowtrack = new AliFlowTrack();
1949 // flowtrack->SetPhi(fTrackPhi);
1950 // flowtrack->SetEta(fTrackEta);
1951 // flowtrack->SetWeight(fTrackWeight);
1952 // flowtrack->SetPt(fMCparticle->Pt());
1954 // case kTrackWithPtFromFirstMother:
1955 // if (!fMCparticle) return NULL;
1956 // flowtrack = new AliFlowTrack();
1957 // flowtrack->SetPhi(fTrackPhi);
1958 // flowtrack->SetEta(fTrackEta);
1959 // flowtrack->SetWeight(fTrackWeight);
1960 // tmpTParticle = fMCparticle->Particle();
1961 // tmpAliMCParticle = static_cast<AliMCParticle*>(fMCevent->GetTrack(tmpTParticle->GetFirstMother()));
1962 // flowtrack->SetPt(tmpAliMCParticle->Pt());
1965 // flowtrack = new AliFlowTrack();
1966 // flowtrack->SetPhi(fTrackPhi);
1967 // flowtrack->SetEta(fTrackEta);
1968 // flowtrack->SetWeight(fTrackWeight);
1971 // flowtrack->SetSource(AliFlowTrack::kFromTracklet);
1972 // return flowtrack;
1975 ////-----------------------------------------------------------------------
1976 //AliFlowTrack* AliFlowTrackCuts::MakeFlowTrackVParticle() const
1978 // //make flow track from AliVParticle (ESD,AOD,MC)
1979 // if (!fTrack) return NULL;
1980 // AliFlowTrack* flowtrack=NULL;
1981 // TParticle *tmpTParticle=NULL;
1982 // AliMCParticle* tmpAliMCParticle=NULL;
1983 // AliExternalTrackParam* externalParams=NULL;
1984 // AliESDtrack* esdtrack=NULL;
1985 // switch(fParamMix)
1988 // flowtrack = new AliFlowTrack(fTrack);
1990 // case kTrackWithMCkine:
1991 // flowtrack = new AliFlowTrack(fMCparticle);
1993 // case kTrackWithMCPID:
1994 // flowtrack = new AliFlowTrack(fTrack);
1995 // //flowtrack->setPID(...) from mc, when implemented
1997 // case kTrackWithMCpt:
1998 // if (!fMCparticle) return NULL;
1999 // flowtrack = new AliFlowTrack(fTrack);
2000 // flowtrack->SetPt(fMCparticle->Pt());
2002 // case kTrackWithPtFromFirstMother:
2003 // if (!fMCparticle) return NULL;
2004 // flowtrack = new AliFlowTrack(fTrack);
2005 // tmpTParticle = fMCparticle->Particle();
2006 // tmpAliMCParticle = static_cast<AliMCParticle*>(fMCevent->GetTrack(tmpTParticle->GetFirstMother()));
2007 // flowtrack->SetPt(tmpAliMCParticle->Pt());
2009 // case kTrackWithTPCInnerParams:
2010 // esdtrack = dynamic_cast<AliESDtrack*>(fTrack);
2011 // if (!esdtrack) return NULL;
2012 // externalParams = const_cast<AliExternalTrackParam*>(esdtrack->GetTPCInnerParam());
2013 // if (!externalParams) return NULL;
2014 // flowtrack = new AliFlowTrack(externalParams);
2017 // flowtrack = new AliFlowTrack(fTrack);
2020 // if (fParamType==kMC)
2022 // flowtrack->SetSource(AliFlowTrack::kFromMC);
2023 // flowtrack->SetID(fTrackLabel);
2025 // else if (dynamic_cast<AliESDtrack*>(fTrack))
2027 // flowtrack->SetSource(AliFlowTrack::kFromESD);
2028 // flowtrack->SetID(static_cast<AliVTrack*>(fTrack)->GetID());
2030 // else if (dynamic_cast<AliAODTrack*>(fTrack))
2032 // flowtrack->SetSource(AliFlowTrack::kFromAOD);
2033 // flowtrack->SetID(static_cast<AliVTrack*>(fTrack)->GetID());
2035 // else if (dynamic_cast<AliMCParticle*>(fTrack))
2037 // flowtrack->SetSource(AliFlowTrack::kFromMC);
2038 // flowtrack->SetID(static_cast<AliVTrack*>(fTrack)->GetID());
2040 // return flowtrack;
2043 ////-----------------------------------------------------------------------
2044 //AliFlowTrack* AliFlowTrackCuts::MakeFlowTrackPMDtrack() const
2046 // //make a flow track from PMD track
2047 // AliFlowTrack* flowtrack=NULL;
2048 // TParticle *tmpTParticle=NULL;
2049 // AliMCParticle* tmpAliMCParticle=NULL;
2050 // switch (fParamMix)
2053 // flowtrack = new AliFlowTrack();
2054 // flowtrack->SetPhi(fTrackPhi);
2055 // flowtrack->SetEta(fTrackEta);
2056 // flowtrack->SetWeight(fTrackWeight);
2058 // case kTrackWithMCkine:
2059 // if (!fMCparticle) return NULL;
2060 // flowtrack = new AliFlowTrack();
2061 // flowtrack->SetPhi( fMCparticle->Phi() );
2062 // flowtrack->SetEta( fMCparticle->Eta() );
2063 // flowtrack->SetWeight(fTrackWeight);
2064 // flowtrack->SetPt( fMCparticle->Pt() );
2066 // case kTrackWithMCpt:
2067 // if (!fMCparticle) return NULL;
2068 // flowtrack = new AliFlowTrack();
2069 // flowtrack->SetPhi(fTrackPhi);
2070 // flowtrack->SetEta(fTrackEta);
2071 // flowtrack->SetWeight(fTrackWeight);
2072 // flowtrack->SetPt(fMCparticle->Pt());
2074 // case kTrackWithPtFromFirstMother:
2075 // if (!fMCparticle) return NULL;
2076 // flowtrack = new AliFlowTrack();
2077 // flowtrack->SetPhi(fTrackPhi);
2078 // flowtrack->SetEta(fTrackEta);
2079 // flowtrack->SetWeight(fTrackWeight);
2080 // tmpTParticle = fMCparticle->Particle();
2081 // tmpAliMCParticle = static_cast<AliMCParticle*>(fMCevent->GetTrack(tmpTParticle->GetFirstMother()));
2082 // flowtrack->SetPt(tmpAliMCParticle->Pt());
2085 // flowtrack = new AliFlowTrack();
2086 // flowtrack->SetPhi(fTrackPhi);
2087 // flowtrack->SetEta(fTrackEta);
2088 // flowtrack->SetWeight(fTrackWeight);
2092 // flowtrack->SetSource(AliFlowTrack::kFromPMD);
2093 // return flowtrack;
2096 ////-----------------------------------------------------------------------
2097 //AliFlowTrack* AliFlowTrackCuts::MakeFlowTrackVZERO() const
2099 // //make a flow track from VZERO
2100 // AliFlowTrack* flowtrack=NULL;
2101 // TParticle *tmpTParticle=NULL;
2102 // AliMCParticle* tmpAliMCParticle=NULL;
2103 // switch (fParamMix)
2106 // flowtrack = new AliFlowTrack();
2107 // flowtrack->SetPhi(fTrackPhi);
2108 // flowtrack->SetEta(fTrackEta);
2109 // flowtrack->SetWeight(fTrackWeight);
2111 // case kTrackWithMCkine:
2112 // if (!fMCparticle) return NULL;
2113 // flowtrack = new AliFlowTrack();
2114 // flowtrack->SetPhi( fMCparticle->Phi() );
2115 // flowtrack->SetEta( fMCparticle->Eta() );
2116 // flowtrack->SetWeight(fTrackWeight);
2117 // flowtrack->SetPt( fMCparticle->Pt() );
2119 // case kTrackWithMCpt:
2120 // if (!fMCparticle) return NULL;
2121 // flowtrack = new AliFlowTrack();
2122 // flowtrack->SetPhi(fTrackPhi);
2123 // flowtrack->SetEta(fTrackEta);
2124 // flowtrack->SetWeight(fTrackWeight);
2125 // flowtrack->SetPt(fMCparticle->Pt());
2127 // case kTrackWithPtFromFirstMother:
2128 // if (!fMCparticle) return NULL;
2129 // flowtrack = new AliFlowTrack();
2130 // flowtrack->SetPhi(fTrackPhi);
2131 // flowtrack->SetEta(fTrackEta);
2132 // flowtrack->SetWeight(fTrackWeight);
2133 // tmpTParticle = fMCparticle->Particle();
2134 // tmpAliMCParticle = static_cast<AliMCParticle*>(fMCevent->GetTrack(tmpTParticle->GetFirstMother()));
2135 // flowtrack->SetPt(tmpAliMCParticle->Pt());
2138 // flowtrack = new AliFlowTrack();
2139 // flowtrack->SetPhi(fTrackPhi);
2140 // flowtrack->SetEta(fTrackEta);
2141 // flowtrack->SetWeight(fTrackWeight);
2145 // flowtrack->SetSource(AliFlowTrack::kFromVZERO);
2146 // return flowtrack;
2149 ////-----------------------------------------------------------------------
2150 //AliFlowTrack* AliFlowTrackCuts::MakeFlowTrack() const
2152 // //get a flow track constructed from whatever we applied cuts on
2153 // //caller is resposible for deletion
2154 // //if construction fails return NULL
2155 // //TODO: for tracklets, PMD and VZERO we probably need just one method,
2156 // //something like MakeFlowTrackGeneric(), wait with this until
2157 // //requirements quirks are known.
2158 // switch (fParamType)
2160 // case kSPDtracklet:
2161 // return MakeFlowTrackSPDtracklet();
2163 // return MakeFlowTrackPMDtrack();
2165 // return MakeFlowTrackVZERO();
2167 // return MakeFlowTrackVParticle();
2171 //-----------------------------------------------------------------------
2172 Bool_t AliFlowTrackCuts::IsPhysicalPrimary() const
2174 //check if current particle is a physical primary
2175 if (!fMCevent) return kFALSE;
2176 if (fTrackLabel<0) return kFALSE;
2177 return IsPhysicalPrimary(fMCevent, fTrackLabel, fRequireTransportBitForPrimaries);
2180 //-----------------------------------------------------------------------
2181 Bool_t AliFlowTrackCuts::IsPhysicalPrimary(AliMCEvent* mcEvent, Int_t label, Bool_t requiretransported)
2183 //check if current particle is a physical primary
2184 Bool_t physprim=mcEvent->IsPhysicalPrimary(label);
2185 AliMCParticle* track = static_cast<AliMCParticle*>(mcEvent->GetTrack(label));
2186 if (!track) return kFALSE;
2187 TParticle* particle = track->Particle();
2188 Bool_t transported = particle->TestBit(kTransportBit);
2189 //printf("label: %i prim: %s, transp: %s, pass: %s\n",label, (physprim)?"YES":"NO ",(transported)?"YES":"NO ",
2190 //(physprim && (transported || !requiretransported))?"YES":"NO" );
2191 return (physprim && (transported || !requiretransported));
2194 //-----------------------------------------------------------------------
2195 void AliFlowTrackCuts::DefineHistograms()
2197 //define qa histograms
2200 const Int_t kNbinsP=200;
2201 Double_t binsP[kNbinsP+1];
2203 for(int i=1; i<kNbinsP+1; i++)
2205 //if(binsP[i-1]+0.05<1.01)
2206 // binsP[i]=binsP[i-1]+0.05;
2208 binsP[i]=binsP[i-1]+0.05;
2211 const Int_t nBinsDCA=1000;
2212 Double_t binsDCA[nBinsDCA+1];
2213 for(int i=0; i<nBinsDCA+1; i++) {binsDCA[i]=0.01*i-5.;}
2214 //for(int i=1; i<41; i++) {binsDCA[i+100]=0.1*i+1.0;}
2216 Bool_t adddirstatus = TH1::AddDirectoryStatus();
2217 TH1::AddDirectory(kFALSE);
2218 fQA=new TList(); fQA->SetOwner();
2219 fQA->SetName(Form("%s QA",GetName()));
2220 TList* before = new TList(); before->SetOwner();
2221 before->SetName("before");
2222 TList* after = new TList(); after->SetOwner();
2223 after->SetName("after");
2226 before->Add(new TH2F("TOFbeta",";p [GeV/c];#beta",kNbinsP,binsP,1000,0.4,1.1)); //0
2227 after->Add(new TH2F("TOFbeta",";p [GeV/c];#beta",kNbinsP,binsP,1000,0.4,1.1)); //0
2228 before->Add(new TH2F("TPCdedx",";p [GeV/c];dEdx",kNbinsP,binsP,500,0,500)); //1
2229 after->Add(new TH2F("TPCdedx",";p [GeV/c];dEdx",kNbinsP,binsP,500,0,500)); //1
2230 before->Add(new TH2F("MC pid",";p[GeV/c];species",kNbinsP,binsP,10,-5, 5)); //2
2231 after->Add(new TH2F("MC pid",";p[GeV/c];species",kNbinsP,binsP,10,-5, 5)); //2
2233 TH2F* hb = new TH2F("MC primary",";p[GeV/c];primary",kNbinsP,binsP,2,-1,1);
2234 TH2F* ha = new TH2F("MC primary",";p[GeV/c];primary",kNbinsP,binsP,2,-1,1);
2236 axis = hb->GetYaxis();
2237 axis->SetBinLabel(1,"secondary");
2238 axis->SetBinLabel(2,"primary");
2239 axis = ha->GetYaxis();
2240 axis->SetBinLabel(1,"secondary");
2241 axis->SetBinLabel(2,"primary");
2242 before->Add(hb); //3
2244 //production process
2245 hb = new TH2F("MC production process",";p[GeV/c];",kNbinsP,binsP,kMaxMCProcess,
2246 -0.5, kMaxMCProcess-0.5);
2247 ha = new TH2F("MC production process",";p[GeV/c];",kNbinsP,binsP,kMaxMCProcess,
2248 -0.5, kMaxMCProcess-0.5);
2249 axis = hb->GetYaxis();
2250 for (Int_t i=0; i<kMaxMCProcess; i++)
2252 axis->SetBinLabel(i+1,TMCProcessName[i]);
2254 axis = ha->GetYaxis();
2255 for (Int_t i=0; i<kMaxMCProcess; i++)
2257 axis->SetBinLabel(i+1,TMCProcessName[i]);
2259 before->Add(hb); //4
2262 before->Add(new TH2F("DCAxy",";p_{t}[GeV/c];DCAxy[cm]", 100, 0., 10., nBinsDCA, binsDCA));//5
2263 after->Add(new TH2F("DCAxy",";p_{t}[GeV/c];DCAxy[cm]", 100, 0., 10., nBinsDCA, binsDCA));//5
2264 before->Add(new TH2F("DCAz",";p_{t}[GeV/c];DCAz[cm]", 100, 0., 10., nBinsDCA, binsDCA));//6
2265 after->Add(new TH2F("DCAz",";p_{t}[GeV/c];DCAz[cm]", 100, 0., 10., nBinsDCA, binsDCA));//6
2267 hb = new TH2F("MC first mother",";p[GeV/c];",kNbinsP,binsP,44,1.,45.);
2268 ha = new TH2F("MC first mother",";p[GeV/c];",kNbinsP,binsP,44,1.,45.);
2269 hb->GetYaxis()->SetBinLabel(1, "#gamma");
2270 ha->GetYaxis()->SetBinLabel(1, "#gamma");
2271 hb->GetYaxis()->SetBinLabel(2, "e^{+}");
2272 ha->GetYaxis()->SetBinLabel(2, "e^{+}");
2273 hb->GetYaxis()->SetBinLabel(3, "e^{-}");
2274 ha->GetYaxis()->SetBinLabel(3, "e^{-}");
2275 hb->GetYaxis()->SetBinLabel(4, "#nu");
2276 ha->GetYaxis()->SetBinLabel(4, "#nu");
2277 hb->GetYaxis()->SetBinLabel(5, "#mu^{+}");
2278 ha->GetYaxis()->SetBinLabel(5, "#mu^{+}");
2279 hb->GetYaxis()->SetBinLabel(6, "#mu^{-}");
2280 ha->GetYaxis()->SetBinLabel(6, "#mu^{-}");
2281 hb->GetYaxis()->SetBinLabel(7, "#pi^{0}");
2282 ha->GetYaxis()->SetBinLabel(7, "#pi^{0}");
2283 hb->GetYaxis()->SetBinLabel(8, "#pi^{+}");
2284 ha->GetYaxis()->SetBinLabel(8, "#pi^{+}");
2285 hb->GetYaxis()->SetBinLabel(9, "#pi^{-}");
2286 ha->GetYaxis()->SetBinLabel(9, "#pi^{-}");
2287 hb->GetYaxis()->SetBinLabel(10, "K^{0}_{L}");
2288 ha->GetYaxis()->SetBinLabel(10, "K^{0}_{L}");
2289 hb->GetYaxis()->SetBinLabel(11, "K^{+}");
2290 ha->GetYaxis()->SetBinLabel(11, "K^{+}");
2291 hb->GetYaxis()->SetBinLabel(12, "K^{-}");
2292 ha->GetYaxis()->SetBinLabel(12, "K^{-}");
2293 hb->GetYaxis()->SetBinLabel( 13, "n");
2294 ha->GetYaxis()->SetBinLabel( 13, "n");
2295 hb->GetYaxis()->SetBinLabel( 14, "p");
2296 ha->GetYaxis()->SetBinLabel( 14, "p");
2297 hb->GetYaxis()->SetBinLabel(15, "#bar{p}");
2298 ha->GetYaxis()->SetBinLabel(15, "#bar{p}");
2299 hb->GetYaxis()->SetBinLabel(16, "K^{0}_{S}");
2300 ha->GetYaxis()->SetBinLabel(16, "K^{0}_{S}");
2301 hb->GetYaxis()->SetBinLabel(17, "#eta");
2302 ha->GetYaxis()->SetBinLabel(17, "#eta");
2303 hb->GetYaxis()->SetBinLabel(18, "#Lambda");
2304 ha->GetYaxis()->SetBinLabel(18, "#Lambda");
2305 hb->GetYaxis()->SetBinLabel(19, "#Sigma^{+}");
2306 ha->GetYaxis()->SetBinLabel(19, "#Sigma^{+}");
2307 hb->GetYaxis()->SetBinLabel(20, "#Sigma^{0}");
2308 ha->GetYaxis()->SetBinLabel(20, "#Sigma^{0}");
2309 hb->GetYaxis()->SetBinLabel(21, "#Sigma^{-}");
2310 ha->GetYaxis()->SetBinLabel(21, "#Sigma^{-}");
2311 hb->GetYaxis()->SetBinLabel(22, "#Theta^{0}");
2312 ha->GetYaxis()->SetBinLabel(22, "#Theta^{0}");
2313 hb->GetYaxis()->SetBinLabel(23, "#Theta^{-}");
2314 ha->GetYaxis()->SetBinLabel(23, "#Theta^{-}");
2315 hb->GetYaxis()->SetBinLabel(24, "#Omega^{-}");
2316 ha->GetYaxis()->SetBinLabel(24, "#Omega^{-}");
2317 hb->GetYaxis()->SetBinLabel(25, "#bar{n}");
2318 ha->GetYaxis()->SetBinLabel(25, "#bar{n}");
2319 hb->GetYaxis()->SetBinLabel(26, "#bar{#Lambda}");
2320 ha->GetYaxis()->SetBinLabel(26, "#bar{#Lambda}");
2321 hb->GetYaxis()->SetBinLabel(27, "#bar{#Sigma}^{-}");
2322 ha->GetYaxis()->SetBinLabel(27, "#bar{#Sigma}^{-}");
2323 hb->GetYaxis()->SetBinLabel(28, "#bar{#Sigma}^{0}");
2324 ha->GetYaxis()->SetBinLabel(28, "#bar{#Sigma}^{0}");
2325 hb->GetYaxis()->SetBinLabel(29, "#bar{#Sigma}^{+}");
2326 ha->GetYaxis()->SetBinLabel(29, "#bar{#Sigma}^{+}");
2327 hb->GetYaxis()->SetBinLabel(30, "#bar{#Theta}^{0}");
2328 ha->GetYaxis()->SetBinLabel(30, "#bar{#Theta}^{0}");
2329 hb->GetYaxis()->SetBinLabel(31, "#bar{#Theta}^{+}");
2330 ha->GetYaxis()->SetBinLabel(31, "#bar{#Theta}^{+}");
2331 hb->GetYaxis()->SetBinLabel(32, "#bar{#Omega}^{+}");
2332 ha->GetYaxis()->SetBinLabel(32, "#bar{#Omega}^{+}");
2333 hb->GetYaxis()->SetBinLabel(33, "#tau^{+}");
2334 ha->GetYaxis()->SetBinLabel(33, "#tau^{+}");
2335 hb->GetYaxis()->SetBinLabel(34, "#tau^{-}");
2336 ha->GetYaxis()->SetBinLabel(34, "#tau^{-}");
2337 hb->GetYaxis()->SetBinLabel(35, "D^{+}");
2338 ha->GetYaxis()->SetBinLabel(35, "D^{+}");
2339 hb->GetYaxis()->SetBinLabel(36, "D^{-}");
2340 ha->GetYaxis()->SetBinLabel(36, "D^{-}");
2341 hb->GetYaxis()->SetBinLabel(37, "D^{0}");
2342 ha->GetYaxis()->SetBinLabel(37, "D^{0}");
2343 hb->GetYaxis()->SetBinLabel(38, "#bar{D}^{0}");
2344 ha->GetYaxis()->SetBinLabel(38, "#bar{D}^{0}");
2345 hb->GetYaxis()->SetBinLabel(39, "D_{s}^{+}");
2346 ha->GetYaxis()->SetBinLabel(39, "D_{s}^{+}");
2347 hb->GetYaxis()->SetBinLabel(40, "#bar{D_{s}}^{-}");
2348 ha->GetYaxis()->SetBinLabel(40, "#bar{D_{s}}^{-}");
2349 hb->GetYaxis()->SetBinLabel(41, "#Lambda_{c}^{+}");
2350 ha->GetYaxis()->SetBinLabel(41, "#Lambda_{c}^{+}");
2351 hb->GetYaxis()->SetBinLabel(42, "W^{+}");
2352 ha->GetYaxis()->SetBinLabel(42, "W^{+}");
2353 hb->GetYaxis()->SetBinLabel(43, "W^{-}");
2354 ha->GetYaxis()->SetBinLabel(43, "W^{-}");
2355 hb->GetYaxis()->SetBinLabel(44, "Z^{0}");
2356 ha->GetYaxis()->SetBinLabel(44, "Z^{0}");
2360 before->Add(new TH2F("TOFkElectron",";p_{t}[GeV/c];TOF signal - IT", kNbinsP,binsP,1000,-2e4, 2e4));//8
2361 after->Add( new TH2F("TOFkElectron",";p_{t}[GeV/c];TOF signal - IT", kNbinsP,binsP,1000,-2e4, 2e4));//8
2363 before->Add(new TH2F("TOFkMuon",";p_{t}[GeV/c];TOF signal - IT", kNbinsP,binsP,1000,-2e4, 2e4));//9
2364 after->Add( new TH2F("TOFkMuon",";p_{t}[GeV/c];TOF signal - IT", kNbinsP,binsP,1000,-2e4, 2e4));//9
2366 before->Add(new TH2F("TOFkPion",";p_{t}[GeV/c];TOF signal - IT", kNbinsP,binsP,1000,-2e4, 2e4));//10
2367 after->Add( new TH2F("TOFkPion",";p_{t}[GeV/c];TOF signal - IT", kNbinsP,binsP,1000,-2e4, 2e4));//10
2369 before->Add(new TH2F("TOFkKaon",";p_{t}[GeV/c];TOF signal - IT", kNbinsP,binsP,1000,-2e4, 2e4));//11
2370 after->Add( new TH2F("TOFkKaon",";p_{t}[GeV/c];TOF signal - IT", kNbinsP,binsP,1000,-2e4, 2e4));//11
2372 before->Add(new TH2F("TOFkProton",";p_{t}[GeV/c];TOF signal - IT", kNbinsP,binsP,1000,-2e4, 2e4));//12
2373 after->Add( new TH2F("TOFkProton",";p_{t}[GeV/c];TOF signal - IT", kNbinsP,binsP,1000,-2e4, 2e4));//12
2376 before->Add(new TH1F("KinkQt",";q_{t}[GeV/c];counts", 200, 0., 0.3));//13
2377 after->Add(new TH1F("KinkQt",";q_{t}[GeV/c];counts", 200, 0., 0.3));//13
2379 before->Add(new TH1F("KinkMinv",";m_{inv}(#mu#nu)[GeV/c^{2}];counts;Kink M_{inv}", 200, 0., 0.7));//14
2380 after->Add(new TH1F("KinkMinv",";m_{inv}(#mu#nu)[GeV/c^{2}];counts;Kink M_{inv}", 200, 0., 0.7));//14
2382 before->Add(new TH2F("KinkVertex",";x[cm];y[cm];Kink vertex position",250,-250.,250., 250,-250.,250.));//15
2383 after->Add(new TH2F("KinkVertex",";x[cm];y[cm];Kink vertex position",250,-250.,250., 250,-250.,250.));//15
2385 before->Add(new TH2F("KinkAngleMp",";p_{mother}[GeV/c];Kink decay angle [deg];", 100,0.,6., 100,0.,80.));//16
2386 after->Add(new TH2F("KinkAngleMp",";p_{mother}[GeV/c];Kink decay angle [deg];", 100,0.,6., 100,0.,80.));//16
2388 before->Add(new TH1F("KinkIndex",";Kink index;counts", 2, 0., 2.));//17
2389 after->Add(new TH1F("KinkIndex",";Kink index;counts", 2, 0., 2.));//17
2390 TH1::AddDirectory(adddirstatus);
2393 //-----------------------------------------------------------------------
2394 Int_t AliFlowTrackCuts::GetNumberOfInputObjects() const
2396 //get the number of tracks in the input event according source
2397 //selection (ESD tracks, tracklets, MC particles etc.)
2398 AliESDEvent* esd=NULL;
2399 AliAODEvent* aod=NULL; // XZhang 20120615
2403 if (!fEvent) return 0; // XZhang 20120615
2404 esd = dynamic_cast<AliESDEvent*>(fEvent);
2405 aod = dynamic_cast<AliAODEvent*>(fEvent); // XZhang 20120615
2406 // if (!esd) return 0; // XZhang 20120615
2407 // return esd->GetMultiplicity()->GetNumberOfTracklets(); // XZhang 20120615
2408 if (esd) return esd->GetMultiplicity()->GetNumberOfTracklets(); // XZhang 20120615
2409 if (aod) return aod->GetTracklets()->GetNumberOfTracklets(); // XZhang 20120615
2411 if (!fMCevent) return 0;
2412 return fMCevent->GetNumberOfTracks();
2414 esd = dynamic_cast<AliESDEvent*>(fEvent);
2416 return esd->GetNumberOfPmdTracks();
2418 return fgkNumberOfVZEROtracks;
2419 case kMUON: // XZhang 20120604
2420 if (!fEvent) return 0; // XZhang 20120604
2421 esd = dynamic_cast<AliESDEvent*>(fEvent); // XZhang 20120604
2422 if (esd) return esd->GetNumberOfMuonTracks(); // XZhang 20120604
2423 return fEvent->GetNumberOfTracks(); // if AOD // XZhang 20120604
2425 esd = dynamic_cast<AliESDEvent*>(fEvent);
2427 return esd->GetNumberOfKinks();
2429 esd = dynamic_cast<AliESDEvent*>(fEvent);
2431 return esd->GetNumberOfV0s();
2433 if (!fEvent) return 0;
2434 return fEvent->GetNumberOfTracks();
2439 //-----------------------------------------------------------------------
2440 TObject* AliFlowTrackCuts::GetInputObject(Int_t i)
2442 //get the input object according the data source selection:
2443 //(esd tracks, traclets, mc particles,etc...)
2444 AliESDEvent* esd=NULL;
2445 AliAODEvent* aod=NULL; // XZhang 20120615
2449 if (!fEvent) return NULL; // XZhang 20120615
2450 esd = dynamic_cast<AliESDEvent*>(fEvent);
2451 aod = dynamic_cast<AliAODEvent*>(fEvent); // XZhang 20120615
2452 // if (!esd) return NULL; // XZhang 20120615
2453 // return const_cast<AliMultiplicity*>(esd->GetMultiplicity()); // XZhang 20120615
2454 if (esd) return const_cast<AliMultiplicity*>(esd->GetMultiplicity()); // XZhang 20120615
2455 if (aod) return const_cast<AliAODTracklets*>(aod->GetTracklets()); // XZhang 20120615
2457 if (!fMCevent) return NULL;
2458 return fMCevent->GetTrack(i);
2460 esd = dynamic_cast<AliESDEvent*>(fEvent);
2461 if (!esd) return NULL;
2462 return esd->GetPmdTrack(i);
2464 esd = dynamic_cast<AliESDEvent*>(fEvent);
2465 if (!esd) //contributed by G.Ortona
2467 aod = dynamic_cast<AliAODEvent*>(fEvent);
2468 if(!aod)return NULL;
2469 return aod->GetVZEROData();
2471 return esd->GetVZEROData();
2472 case kMUON: // XZhang 20120604
2473 if (!fEvent) return NULL; // XZhang 20120604
2474 esd = dynamic_cast<AliESDEvent*>(fEvent); // XZhang 20120604
2475 if (esd) return esd->GetMuonTrack(i); // XZhang 20120604
2476 return fEvent->GetTrack(i); // if AOD // XZhang 20120604
2478 esd = dynamic_cast<AliESDEvent*>(fEvent);
2479 if (!esd) return NULL;
2480 return esd->GetKink(i);
2482 esd = dynamic_cast<AliESDEvent*>(fEvent);
2483 if (!esd) return NULL;
2484 return esd->GetV0(i);
2486 if (!fEvent) return NULL;
2487 return fEvent->GetTrack(i);
2491 //-----------------------------------------------------------------------
2492 void AliFlowTrackCuts::Clear(Option_t*)
2500 //-----------------------------------------------------------------------
2501 void AliFlowTrackCuts::ClearTrack(Option_t*)
2503 //clean up last track
2516 //-----------------------------------------------------------------------
2517 Bool_t AliFlowTrackCuts::PassesAODpidCut(const AliAODTrack* track )
2519 if(!track->GetAODEvent()->GetTOFHeader()){
2520 AliAODPid *pidObj = track->GetDetPid();
2521 if (!pidObj) fESDpid.GetTOFResponse().SetTimeResolution(84.);
2523 Double_t sigmaTOFPidInAOD[10];
2524 pidObj->GetTOFpidResolution(sigmaTOFPidInAOD);
2525 if(sigmaTOFPidInAOD[0] > 84.){
2526 fESDpid.GetTOFResponse().SetTimeResolution(sigmaTOFPidInAOD[0]); // use the electron TOF PID sigma as time resolution (including the T0 used)
2531 //check if passes the selected pid cut for ESDs
2532 Bool_t pass = kTRUE;
2536 if (!PassesTOFbetaCut(track)) pass=kFALSE;
2539 if (!PassesTOFbayesianCut(track)) pass=kFALSE;
2542 if (!PassesTPCbayesianCut(track)) pass=kFALSE;
2551 //-----------------------------------------------------------------------
2552 Bool_t AliFlowTrackCuts::PassesESDpidCut(const AliESDtrack* track )
2554 //check if passes the selected pid cut for ESDs
2555 Bool_t pass = kTRUE;
2559 if (!PassesTPCpidCut(track)) pass=kFALSE;
2562 if (!PassesTPCdedxCut(track)) pass=kFALSE;
2565 if (!PassesTOFpidCut(track)) pass=kFALSE;
2568 if (!PassesTOFbetaCut(track)) pass=kFALSE;
2570 case kTOFbetaSimple:
2571 if (!PassesTOFbetaSimpleCut(track)) pass=kFALSE;
2574 if (!PassesTPCbayesianCut(track)) pass=kFALSE;
2576 // part added by F. Noferini
2578 if (!PassesTOFbayesianCut(track)) pass=kFALSE;
2580 // end part added by F. Noferini
2582 //part added by Natasha
2584 if (!PassesNucleiSelection(track)) pass=kFALSE;
2586 //end part added by Natasha
2589 if (!PassesTPCTOFNsigmaCut(track)) pass = kFALSE;
2592 printf("AliFlowTrackCuts::PassesCuts() this should never be called!\n");
2599 //-----------------------------------------------------------------------
2600 Bool_t AliFlowTrackCuts::PassesTOFbetaSimpleCut(const AliESDtrack* track )
2602 //check if passes PID cut using timing in TOF
2603 Bool_t goodtrack = (track->GetStatus() & AliESDtrack::kTOFpid) &&
2604 (track->GetTOFsignal() > 12000) &&
2605 (track->GetTOFsignal() < 100000) &&
2606 (track->GetIntegratedLength() > 365);
2608 if (!fAllowTOFmismatchFlag) {if ((track->GetStatus() & AliESDtrack::kTOFmismatch)) return kFALSE;}
2610 Bool_t statusMatchingHard = TPCTOFagree(track);
2611 if (fRequireStrictTOFTPCagreement && (!statusMatchingHard))
2614 if (!goodtrack) return kFALSE;
2616 const Float_t c = 2.99792457999999984e-02;
2617 Float_t p = track->GetP();
2618 Float_t l = track->GetIntegratedLength();
2619 Float_t trackT0 = fESDpid.GetTOFResponse().GetStartTime(p);
2620 Float_t timeTOF = track->GetTOFsignal()- trackT0;
2621 Float_t beta = l/timeTOF/c;
2622 Double_t integratedTimes[9] = {-1.0,-1.0,-1.0,-1.0,-1.0, -1.0, -1.0, -1.0, -1.0};
2623 track->GetIntegratedTimes(integratedTimes);
2624 Float_t betaHypothesis[5] = {0.0,0.0,0.0,0.0,0.0};
2625 Float_t s[5] = {0.0,0.0,0.0,0.0,0.0};
2626 for (Int_t i=0;i<5;i++)
2628 betaHypothesis[i] = l/integratedTimes[i]/c;
2629 s[i] = beta-betaHypothesis[i];
2632 switch (fParticleID)
2635 return ( (s[2]<0.015) && (s[2]>-0.015) &&
2639 return ( (s[3]<0.015) && (s[3]>-0.015) &&
2642 case AliPID::kProton:
2643 return ( (s[4]<0.015) && (s[4]>-0.015) &&
2652 //-----------------------------------------------------------------------
2653 Float_t AliFlowTrackCuts::GetBeta(const AliVTrack* track)
2656 Double_t integratedTimes[9] = {-1.0,-1.0,-1.0,-1.0,-1.0, -1.0, -1.0, -1.0, -1.0};
2657 track->GetIntegratedTimes(integratedTimes);
2659 const Float_t c = 2.99792457999999984e-02;
2660 Float_t p = track->P();
2661 Float_t l = integratedTimes[0]*c;
2662 Float_t trackT0 = fESDpid.GetTOFResponse().GetStartTime(p);
2663 Float_t timeTOF = track->GetTOFsignal()- trackT0;
2666 //-----------------------------------------------------------------------
2667 Bool_t AliFlowTrackCuts::PassesTOFbetaCut(const AliAODTrack* track )
2669 //check if track passes pid selection with an asymmetric TOF beta cut
2672 //printf("no TOFpidCuts\n");
2676 //check if passes PID cut using timing in TOF
2677 Bool_t goodtrack = (track->GetStatus() & AliESDtrack::kTOFpid) &&
2678 (track->GetTOFsignal() > 12000) &&
2679 (track->GetTOFsignal() < 100000);
2681 if (!goodtrack) return kFALSE;
2683 const Float_t c = 2.99792457999999984e-02;
2684 Double_t integratedTimes[9] = {-1.0,-1.0,-1.0,-1.0,-1.0, -1.0, -1.0, -1.0, -1.0};
2685 track->GetIntegratedTimes(integratedTimes);
2686 Float_t l = integratedTimes[0]*c;
2688 goodtrack = goodtrack && (l > 365);
2690 if (!goodtrack) return kFALSE;
2692 if (!fAllowTOFmismatchFlag) {if ((track->GetStatus() & AliESDtrack::kTOFmismatch)) return kFALSE;}
2694 Bool_t statusMatchingHard = TPCTOFagree(track);
2695 if (fRequireStrictTOFTPCagreement && (!statusMatchingHard))
2699 Float_t beta = GetBeta(track);
2701 //construct the pid index because it's not AliPID::EParticleType
2703 switch (fParticleID)
2711 case AliPID::kProton:
2719 Float_t p = track->P();
2720 Float_t betahypothesis = l/integratedTimes[pid]/c;
2721 Float_t betadiff = beta-betahypothesis;
2723 Float_t* arr = fTOFpidCuts->GetMatrixArray();
2724 Int_t col = TMath::BinarySearch(fTOFpidCuts->GetNcols(),arr,static_cast<Float_t>(p));
2725 if (col<0) return kFALSE;
2726 Float_t min = (*fTOFpidCuts)(1,col);
2727 Float_t max = (*fTOFpidCuts)(2,col);
2729 Bool_t pass = (betadiff>min && betadiff<max);
2733 //-----------------------------------------------------------------------
2734 Bool_t AliFlowTrackCuts::PassesTOFbetaCut(const AliESDtrack* track )
2736 //check if track passes pid selection with an asymmetric TOF beta cut
2739 //printf("no TOFpidCuts\n");
2743 //check if passes PID cut using timing in TOF
2744 Bool_t goodtrack = (track->GetStatus() & AliESDtrack::kTOFpid) &&
2745 (track->GetTOFsignal() > 12000) &&
2746 (track->GetTOFsignal() < 100000) &&
2747 (track->GetIntegratedLength() > 365);
2749 if (!fAllowTOFmismatchFlag) {if ((track->GetStatus() & AliESDtrack::kTOFmismatch)) return kFALSE;}
2751 if (!goodtrack) return kFALSE;
2753 Bool_t statusMatchingHard = TPCTOFagree(track);
2754 if (fRequireStrictTOFTPCagreement && (!statusMatchingHard))
2757 Float_t beta = GetBeta(track);
2758 Double_t integratedTimes[9] = {-1.0,-1.0,-1.0,-1.0,-1.0, -1.0, -1.0, -1.0, -1.0};
2759 track->GetIntegratedTimes(integratedTimes);
2761 //construct the pid index because it's not AliPID::EParticleType
2763 switch (fParticleID)
2771 case AliPID::kProton:
2779 const Float_t c = 2.99792457999999984e-02;
2780 Float_t l = track->GetIntegratedLength();
2781 Float_t p = track->GetP();
2782 Float_t betahypothesis = l/integratedTimes[pid]/c;
2783 Float_t betadiff = beta-betahypothesis;
2785 Float_t* arr = fTOFpidCuts->GetMatrixArray();
2786 Int_t col = TMath::BinarySearch(fTOFpidCuts->GetNcols(),arr,static_cast<Float_t>(p));
2787 if (col<0) return kFALSE;
2788 Float_t min = (*fTOFpidCuts)(1,col);
2789 Float_t max = (*fTOFpidCuts)(2,col);
2791 Bool_t pass = (betadiff>min && betadiff<max);
2796 //-----------------------------------------------------------------------
2797 Bool_t AliFlowTrackCuts::PassesTOFpidCut(const AliESDtrack* track) const
2799 //check if passes PID cut using default TOF pid
2800 Double_t pidTOF[AliPID::kSPECIES];
2801 track->GetTOFpid(pidTOF);
2802 if (pidTOF[fParticleID]>=fParticleProbability) return kTRUE;
2806 //-----------------------------------------------------------------------
2807 Bool_t AliFlowTrackCuts::PassesTPCpidCut(const AliESDtrack* track) const
2809 //check if passes PID cut using default TPC pid
2810 Double_t pidTPC[AliPID::kSPECIES];
2811 track->GetTPCpid(pidTPC);
2812 Double_t probablity = 0.;
2813 switch (fParticleID)
2816 probablity = pidTPC[AliPID::kPion] + pidTPC[AliPID::kMuon];
2819 probablity = pidTPC[fParticleID];
2821 if (probablity >= fParticleProbability) return kTRUE;
2825 //-----------------------------------------------------------------------
2826 Float_t AliFlowTrackCuts::Getdedx(const AliESDtrack* track) const
2829 return track->GetTPCsignal();
2832 //-----------------------------------------------------------------------
2833 Bool_t AliFlowTrackCuts::PassesTPCdedxCut(const AliESDtrack* track)
2835 //check if passes PID cut using dedx signal in the TPC
2838 //printf("no TPCpidCuts\n");
2842 const AliExternalTrackParam* tpcparam = track->GetInnerParam(); //tpc only params at the inner wall
2843 if (!tpcparam) return kFALSE;
2844 Double_t p = tpcparam->GetP();
2845 Float_t sigExp = fESDpid.GetTPCResponse().GetExpectedSignal(p, fParticleID);
2846 Float_t sigTPC = track->GetTPCsignal();
2847 Float_t s = (sigTPC-sigExp)/sigExp;
2849 Float_t* arr = fTPCpidCuts->GetMatrixArray();
2850 Int_t arrSize = fTPCpidCuts->GetNcols();
2851 Int_t col = TMath::BinarySearch( arrSize, arr, static_cast<Float_t>(p));
2852 if (col<0) return kFALSE;
2853 Float_t min = (*fTPCpidCuts)(1,col);
2854 Float_t max = (*fTPCpidCuts)(2,col);
2856 //printf("------------TPC pid cut %s\n",(s>min && s<max)?"PASS":"FAIL");
2857 return (s>min && s<max);
2860 //-----------------------------------------------------------------------
2861 void AliFlowTrackCuts::InitPIDcuts()
2863 //init matrices with PID cuts
2867 if (fParticleID==AliPID::kPion)
2869 t = new TMatrixF(3,15);
2870 (*t)(0,0) = 0.20; (*t)(1,0) = -0.4; (*t)(2,0) = 0.0;
2871 (*t)(0,1) = 0.25; (*t)(1,1) = -0.4; (*t)(2,1) = 0.1;
2872 (*t)(0,2) = 0.30; (*t)(1,2) = -0.4; (*t)(2,2) = 0.2;
2873 (*t)(0,3) = 0.35; (*t)(1,3) = -0.4; (*t)(2,3) = 0.2;
2874 (*t)(0,4) = 0.40; (*t)(1,4) = -0.4; (*t)(2,4) = 0.3;
2875 (*t)(0,5) = 0.45; (*t)(1,5) = -0.4; (*t)(2,5) = 0.3;
2876 (*t)(0,6) = 0.50; (*t)(1,6) = -0.4; (*t)(2,6) = 0.25;
2877 (*t)(0,7) = 0.55; (*t)(1,7) = -0.4; (*t)(2,7) = 0.15;
2878 (*t)(0,8) = 0.60; (*t)(1,8) = -0.4; (*t)(2,8) = 0.1;
2879 (*t)(0,9) = 0.65; (*t)(1,9) = -0.4; (*t)(2,9) = 0.05;
2880 (*t)(0,10) = 0.70; (*t)(1,10) = -0.4; (*t)(2,10) = 0;
2881 (*t)(0,11) = 0.75; (*t)(1,11) = -0.4; (*t)(2,11) = 0;
2882 (*t)(0,12) = 0.80; (*t)(1,12) = -0.4; (*t)(2,12) = -0.05;
2883 (*t)(0,13) = 0.85; (*t)(1,13) = -0.4; (*t)(2,13) = -0.1;
2884 (*t)(0,14) = 0.90; (*t)(1,14) = 0; (*t)(2,14) = 0;
2887 if (fParticleID==AliPID::kKaon)
2889 t = new TMatrixF(3,12);
2890 (*t)(0,0) = 0.20; (*t)(1,0) = -0.2; (*t)(2,0) = 0.2;
2891 (*t)(0,1) = 0.25; (*t)(1,1) = -0.2; (*t)(2,1) = 0.2;
2892 (*t)(0,2) = 0.30; (*t)(1,2) = -0.2; (*t)(2,2) = 0.2;
2893 (*t)(0,3) = 0.35; (*t)(1,3) = -0.2; (*t)(2,3) = 0.2;
2894 (*t)(0,4) = 0.40; (*t)(1,4) = -0.1; (*t)(2,4) = 0.2;
2895 (*t)(0,5) = 0.45; (*t)(1,5) = -0.1; (*t)(2,5) = 0.2;
2896 (*t)(0,6) = 0.50; (*t)(1,6) =-0.05; (*t)(2,6) = 0.2;
2897 (*t)(0,7) = 0.55; (*t)(1,7) = -0.1; (*t)(2,7) = 0.1;
2898 (*t)(0,8) = 0.60; (*t)(1,8) =-0.05; (*t)(2,8) = 0.1;
2899 (*t)(0,9) = 0.65; (*t)(1,9) = 0; (*t)(2,9) = 0.15;
2900 (*t)(0,10) = 0.70; (*t)(1,10) = 0.05; (*t)(2,10) = 0.2;
2901 (*t)(0,11) = 0.75; (*t)(1,11) = 0; (*t)(2,11) = 0;
2904 if (fParticleID==AliPID::kProton)
2906 t = new TMatrixF(3,9);
2907 (*t)(0,0) = 0.20; (*t)(1,0) = -0.1; (*t)(2,0) = 0.1;
2908 (*t)(0,1) = 0.25; (*t)(1,1) = -0.2; (*t)(2,1) = 0.2;
2909 (*t)(0,2) = 0.80; (*t)(1,2) = -0.1; (*t)(2,2) = 0.2;
2910 (*t)(0,3) = 0.85; (*t)(1,3) =-0.05; (*t)(2,3) = 0.2;
2911 (*t)(0,4) = 0.90; (*t)(1,4) =-0.05; (*t)(2,4) = 0.25;
2912 (*t)(0,5) = 0.95; (*t)(1,5) =-0.05; (*t)(2,5) = 0.25;
2913 (*t)(0,6) = 1.00; (*t)(1,6) = -0.1; (*t)(2,6) = 0.25;
2914 (*t)(0,7) = 1.10; (*t)(1,7) =-0.05; (*t)(2,7) = 0.3;
2915 (*t)(0,8) = 1.20; (*t)(1,8) = 0; (*t)(2,8) = 0;
2923 if (fParticleID==AliPID::kPion)
2925 //TOF pions, 0.9 purity
2926 t = new TMatrixF(3,61);
2927 (*t)(0,0) = 0.000; (*t)(1,0) = 0.000; (*t)(2,0) = 0.000;
2928 (*t)(0,1) = 0.050; (*t)(1,1) = 0.000; (*t)(2,1) = 0.000;
2929 (*t)(0,2) = 0.100; (*t)(1,2) = 0.000; (*t)(2,2) = 0.000;
2930 (*t)(0,3) = 0.150; (*t)(1,3) = 0.000; (*t)(2,3) = 0.000;
2931 (*t)(0,4) = 0.200; (*t)(1,4) = -0.030; (*t)(2,4) = 0.030;
2932 (*t)(0,5) = 0.250; (*t)(1,5) = -0.036; (*t)(2,5) = 0.032;
2933 (*t)(0,6) = 0.300; (*t)(1,6) = -0.038; (*t)(2,6) = 0.032;
2934 (*t)(0,7) = 0.350; (*t)(1,7) = -0.034; (*t)(2,7) = 0.032;
2935 (*t)(0,8) = 0.400; (*t)(1,8) = -0.032; (*t)(2,8) = 0.020;
2936 (*t)(0,9) = 0.450; (*t)(1,9) = -0.030; (*t)(2,9) = 0.020;
2937 (*t)(0,10) = 0.500; (*t)(1,10) = -0.030; (*t)(2,10) = 0.020;
2938 (*t)(0,11) = 0.550; (*t)(1,11) = -0.030; (*t)(2,11) = 0.020;
2939 (*t)(0,12) = 0.600; (*t)(1,12) = -0.030; (*t)(2,12) = 0.020;
2940 (*t)(0,13) = 0.650; (*t)(1,13) = -0.030; (*t)(2,13) = 0.020;
2941 (*t)(0,14) = 0.700; (*t)(1,14) = -0.030; (*t)(2,14) = 0.020;
2942 (*t)(0,15) = 0.750; (*t)(1,15) = -0.030; (*t)(2,15) = 0.020;
2943 (*t)(0,16) = 0.800; (*t)(1,16) = -0.030; (*t)(2,16) = 0.020;
2944 (*t)(0,17) = 0.850; (*t)(1,17) = -0.030; (*t)(2,17) = 0.020;
2945 (*t)(0,18) = 0.900; (*t)(1,18) = -0.030; (*t)(2,18) = 0.020;
2946 (*t)(0,19) = 0.950; (*t)(1,19) = -0.028; (*t)(2,19) = 0.028;
2947 (*t)(0,20) = 1.000; (*t)(1,20) = -0.028; (*t)(2,20) = 0.028;
2948 (*t)(0,21) = 1.100; (*t)(1,21) = -0.028; (*t)(2,21) = 0.028;
2949 (*t)(0,22) = 1.200; (*t)(1,22) = -0.026; (*t)(2,22) = 0.028;
2950 (*t)(0,23) = 1.300; (*t)(1,23) = -0.024; (*t)(2,23) = 0.028;
2951 (*t)(0,24) = 1.400; (*t)(1,24) = -0.020; (*t)(2,24) = 0.028;
2952 (*t)(0,25) = 1.500; (*t)(1,25) = -0.018; (*t)(2,25) = 0.028;
2953 (*t)(0,26) = 1.600; (*t)(1,26) = -0.016; (*t)(2,26) = 0.028;
2954 (*t)(0,27) = 1.700; (*t)(1,27) = -0.014; (*t)(2,27) = 0.028;
2955 (*t)(0,28) = 1.800; (*t)(1,28) = -0.012; (*t)(2,28) = 0.026;
2956 (*t)(0,29) = 1.900; (*t)(1,29) = -0.010; (*t)(2,29) = 0.026;
2957 (*t)(0,30) = 2.000; (*t)(1,30) = -0.008; (*t)(2,30) = 0.026;
2958 (*t)(0,31) = 2.100; (*t)(1,31) = -0.008; (*t)(2,31) = 0.024;
2959 (*t)(0,32) = 2.200; (*t)(1,32) = -0.006; (*t)(2,32) = 0.024;
2960 (*t)(0,33) = 2.300; (*t)(1,33) = -0.004; (*t)(2,33) = 0.024;
2961 (*t)(0,34) = 2.400; (*t)(1,34) = -0.004; (*t)(2,34) = 0.024;
2962 (*t)(0,35) = 2.500; (*t)(1,35) = -0.002; (*t)(2,35) = 0.024;
2963 (*t)(0,36) = 2.600; (*t)(1,36) = -0.002; (*t)(2,36) = 0.024;
2964 (*t)(0,37) = 2.700; (*t)(1,37) = 0.000; (*t)(2,37) = 0.024;
2965 (*t)(0,38) = 2.800; (*t)(1,38) = 0.000; (*t)(2,38) = 0.026;
2966 (*t)(0,39) = 2.900; (*t)(1,39) = 0.000; (*t)(2,39) = 0.024;
2967 (*t)(0,40) = 3.000; (*t)(1,40) = 0.002; (*t)(2,40) = 0.026;
2968 (*t)(0,41) = 3.100; (*t)(1,41) = 0.002; (*t)(2,41) = 0.026;
2969 (*t)(0,42) = 3.200; (*t)(1,42) = 0.002; (*t)(2,42) = 0.026;
2970 (*t)(0,43) = 3.300; (*t)(1,43) = 0.002; (*t)(2,43) = 0.026;
2971 (*t)(0,44) = 3.400; (*t)(1,44) = 0.002; (*t)(2,44) = 0.026;
2972 (*t)(0,45) = 3.500; (*t)(1,45) = 0.002; (*t)(2,45) = 0.026;
2973 (*t)(0,46) = 3.600; (*t)(1,46) = 0.002; (*t)(2,46) = 0.026;
2974 (*t)(0,47) = 3.700; (*t)(1,47) = 0.002; (*t)(2,47) = 0.026;
2975 (*t)(0,48) = 3.800; (*t)(1,48) = 0.002; (*t)(2,48) = 0.026;
2976 (*t)(0,49) = 3.900; (*t)(1,49) = 0.004; (*t)(2,49) = 0.024;
2977 (*t)(0,50) = 4.000; (*t)(1,50) = 0.004; (*t)(2,50) = 0.026;
2978 (*t)(0,51) = 4.100; (*t)(1,51) = 0.004; (*t)(2,51) = 0.026;
2979 (*t)(0,52) = 4.200; (*t)(1,52) = 0.004; (*t)(2,52) = 0.024;
2980 (*t)(0,53) = 4.300; (*t)(1,53) = 0.006; (*t)(2,53) = 0.024;
2981 (*t)(0,54) = 4.400; (*t)(1,54) = 0.000; (*t)(2,54) = 0.000;
2982 (*t)(0,55) = 4.500; (*t)(1,55) = 0.000; (*t)(2,55) = 0.000;
2983 (*t)(0,56) = 4.600; (*t)(1,56) = 0.000; (*t)(2,56) = 0.000;
2984 (*t)(0,57) = 4.700; (*t)(1,57) = 0.000; (*t)(2,57) = 0.000;
2985 (*t)(0,58) = 4.800; (*t)(1,58) = 0.000; (*t)(2,58) = 0.000;
2986 (*t)(0,59) = 4.900; (*t)(1,59) = 0.000; (*t)(2,59) = 0.000;
2987 (*t)(0,60) = 5.900; (*t)(1,60) = 0.000; (*t)(2,60) = 0.000;
2990 if (fParticleID==AliPID::kProton)
2992 //TOF protons, 0.9 purity
2993 t = new TMatrixF(3,61);
2994 (*t)(0,0) = 0.000; (*t)(1,0) = 0.000; (*t)(2,0) = 0.000;
2995 (*t)(0,1) = 0.050; (*t)(1,1) = 0.000; (*t)(2,1) = 0.000;
2996 (*t)(0,2) = 0.100; (*t)(1,2) = 0.000; (*t)(2,2) = 0.000;
2997 (*t)(0,3) = 0.150; (*t)(1,3) = 0.000; (*t)(2,3) = 0.000;
2998 (*t)(0,4) = 0.200; (*t)(1,4) = -0.07; (*t)(2,4) = 0.07;
2999 (*t)(0,5) = 0.200; (*t)(1,5) = -0.07; (*t)(2,5) = 0.07;
3000 (*t)(0,6) = 0.200; (*t)(1,6) = -0.07; (*t)(2,6) = 0.07;
3001 (*t)(0,7) = 0.200; (*t)(1,7) = -0.07; (*t)(2,7) = 0.07;
3002 (*t)(0,8) = 0.200; (*t)(1,8) = -0.07; (*t)(2,8) = 0.07;
3003 (*t)(0,9) = 0.200; (*t)(1,9) = -0.07; (*t)(2,9) = 0.07;
3004 (*t)(0,10) = 0.200; (*t)(1,10) = -0.07; (*t)(2,10) = 0.07;
3005 (*t)(0,11) = 0.200; (*t)(1,11) = -0.07; (*t)(2,11) = 0.07;
3006 (*t)(0,12) = 0.200; (*t)(1,12) = -0.07; (*t)(2,12) = 0.07;
3007 (*t)(0,13) = 0.200; (*t)(1,13) = -0.07; (*t)(2,13) = 0.07;
3008 (*t)(0,14) = 0.200; (*t)(1,14) = -0.07; (*t)(2,14) = 0.07;
3009 (*t)(0,15) = 0.200; (*t)(1,15) = -0.07; (*t)(2,15) = 0.07;
3010 (*t)(0,16) = 0.200; (*t)(1,16) = -0.07; (*t)(2,16) = 0.07;
3011 (*t)(0,17) = 0.850; (*t)(1,17) = -0.070; (*t)(2,17) = 0.070;
3012 (*t)(0,18) = 0.900; (*t)(1,18) = -0.072; (*t)(2,18) = 0.072;
3013 (*t)(0,19) = 0.950; (*t)(1,19) = -0.072; (*t)(2,19) = 0.072;
3014 (*t)(0,20) = 1.000; (*t)(1,20) = -0.074; (*t)(2,20) = 0.074;
3015 (*t)(0,21) = 1.100; (*t)(1,21) = -0.032; (*t)(2,21) = 0.032;
3016 (*t)(0,22) = 1.200; (*t)(1,22) = -0.026; (*t)(2,22) = 0.026;
3017 (*t)(0,23) = 1.300; (*t)(1,23) = -0.026; (*t)(2,23) = 0.026;
3018 (*t)(0,24) = 1.400; (*t)(1,24) = -0.024; (*t)(2,24) = 0.024;
3019 (*t)(0,25) = 1.500; (*t)(1,25) = -0.024; (*t)(2,25) = 0.024;
3020 (*t)(0,26) = 1.600; (*t)(1,26) = -0.026; (*t)(2,26) = 0.026;
3021 (*t)(0,27) = 1.700; (*t)(1,27) = -0.026; (*t)(2,27) = 0.026;
3022 (*t)(0,28) = 1.800; (*t)(1,28) = -0.026; (*t)(2,28) = 0.026;
3023 (*t)(0,29) = 1.900; (*t)(1,29) = -0.026; (*t)(2,29) = 0.026;
3024 (*t)(0,30) = 2.000; (*t)(1,30) = -0.026; (*t)(2,30) = 0.026;
3025 (*t)(0,31) = 2.100; (*t)(1,31) = -0.026; (*t)(2,31) = 0.026;
3026 (*t)(0,32) = 2.200; (*t)(1,32) = -0.026; (*t)(2,32) = 0.024;
3027 (*t)(0,33) = 2.300; (*t)(1,33) = -0.028; (*t)(2,33) = 0.022;
3028 (*t)(0,34) = 2.400; (*t)(1,34) = -0.028; (*t)(2,34) = 0.020;
3029 (*t)(0,35) = 2.500; (*t)(1,35) = -0.028; (*t)(2,35) = 0.018;
3030 (*t)(0,36) = 2.600; (*t)(1,36) = -0.028; (*t)(2,36) = 0.016;
3031 (*t)(0,37) = 2.700; (*t)(1,37) = -0.028; (*t)(2,37) = 0.016;
3032 (*t)(0,38) = 2.800; (*t)(1,38) = -0.030; (*t)(2,38) = 0.014;
3033 (*t)(0,39) = 2.900; (*t)(1,39) = -0.030; (*t)(2,39) = 0.012;
3034 (*t)(0,40) = 3.000; (*t)(1,40) = -0.030; (*t)(2,40) = 0.012;
3035 (*t)(0,41) = 3.100; (*t)(1,41) = -0.030; (*t)(2,41) = 0.010;
3036 (*t)(0,42) = 3.200; (*t)(1,42) = -0.030; (*t)(2,42) = 0.010;
3037 (*t)(0,43) = 3.300; (*t)(1,43) = -0.030; (*t)(2,43) = 0.010;
3038 (*t)(0,44) = 3.400; (*t)(1,44) = -0.030; (*t)(2,44) = 0.008;
3039 (*t)(0,45) = 3.500; (*t)(1,45) = -0.030; (*t)(2,45) = 0.008;
3040 (*t)(0,46) = 3.600; (*t)(1,46) = -0.030; (*t)(2,46) = 0.008;
3041 (*t)(0,47) = 3.700; (*t)(1,47) = -0.030; (*t)(2,47) = 0.006;
3042 (*t)(0,48) = 3.800; (*t)(1,48) = -0.030; (*t)(2,48) = 0.006;
3043 (*t)(0,49) = 3.900; (*t)(1,49) = -0.030; (*t)(2,49) = 0.006;
3044 (*t)(0,50) = 4.000; (*t)(1,50) = -0.028; (*t)(2,50) = 0.004;
3045 (*t)(0,51) = 4.100; (*t)(1,51) = -0.030; (*t)(2,51) = 0.004;
3046 (*t)(0,52) = 4.200; (*t)(1,52) = -0.030; (*t)(2,52) = 0.004;
3047 (*t)(0,53) = 4.300; (*t)(1,53) = -0.028; (*t)(2,53) = 0.002;
3048 (*t)(0,54) = 4.400; (*t)(1,54) = -0.030; (*t)(2,54) = 0.002;
3049 (*t)(0,55) = 4.500; (*t)(1,55) = -0.028; (*t)(2,55) = 0.002;
3050 (*t)(0,56) = 4.600; (*t)(1,56) = -0.028; (*t)(2,56) = 0.002;
3051 (*t)(0,57) = 4.700; (*t)(1,57) = -0.028; (*t)(2,57) = 0.000;
3052 (*t)(0,58) = 4.800; (*t)(1,58) = -0.028; (*t)(2,58) = 0.002;
3053 (*t)(0,59) = 4.900; (*t)(1,59) = 0.000; (*t)(2,59) = 0.000;
3054 (*t)(0,60) = 5.900; (*t)(1,60) = 0.000; (*t)(2,60) = 0.000;
3057 if (fParticleID==AliPID::kKaon)
3059 //TOF kaons, 0.9 purity
3060 t = new TMatrixF(3,61);
3061 (*t)(0,0) = 0.000; (*t)(1,0) = 0.000; (*t)(2,0) = 0.000;
3062 (*t)(0,1) = 0.050; (*t)(1,1) = 0.000; (*t)(2,1) = 0.000;
3063 (*t)(0,2) = 0.100; (*t)(1,2) = 0.000; (*t)(2,2) = 0.000;
3064 (*t)(0,3) = 0.150; (*t)(1,3) = 0.000; (*t)(2,3) = 0.000;
3065 (*t)(0,4) = 0.200; (*t)(1,4) = -0.05; (*t)(2,4) = 0.05;
3066 (*t)(0,5) = 0.200; (*t)(1,5) = -0.05; (*t)(2,5) = 0.05;
3067 (*t)(0,6) = 0.200; (*t)(1,6) = -0.05; (*t)(2,6) = 0.05;
3068 (*t)(0,7) = 0.200; (*t)(1,7) = -0.05; (*t)(2,7) = 0.05;
3069 (*t)(0,8) = 0.200; (*t)(1,8) = -0.05; (*t)(2,8) = 0.05;
3070 (*t)(0,9) = 0.200; (*t)(1,9) = -0.05; (*t)(2,9) = 0.05;
3071 (*t)(0,10) = 0.200; (*t)(1,10) = -0.05; (*t)(2,10) = 0.05;
3072 (*t)(0,11) = 0.550; (*t)(1,11) = -0.026; (*t)(2,11) = 0.026;
3073 (*t)(0,12) = 0.600; (*t)(1,12) = -0.026; (*t)(2,12) = 0.026;
3074 (*t)(0,13) = 0.650; (*t)(1,13) = -0.026; (*t)(2,13) = 0.026;
3075 (*t)(0,14) = 0.700; (*t)(1,14) = -0.026; (*t)(2,14) = 0.026;
3076 (*t)(0,15) = 0.750; (*t)(1,15) = -0.026; (*t)(2,15) = 0.026;
3077 (*t)(0,16) = 0.800; (*t)(1,16) = -0.026; (*t)(2,16) = 0.026;
3078 (*t)(0,17) = 0.850; (*t)(1,17) = -0.024; (*t)(2,17) = 0.024;
3079 (*t)(0,18) = 0.900; (*t)(1,18) = -0.024; (*t)(2,18) = 0.024;
3080 (*t)(0,19) = 0.950; (*t)(1,19) = -0.024; (*t)(2,19) = 0.024;
3081 (*t)(0,20) = 1.000; (*t)(1,20) = -0.024; (*t)(2,20) = 0.024;
3082 (*t)(0,21) = 1.100; (*t)(1,21) = -0.024; (*t)(2,21) = 0.024;
3083 (*t)(0,22) = 1.200; (*t)(1,22) = -0.024; (*t)(2,22) = 0.022;
3084 (*t)(0,23) = 1.300; (*t)(1,23) = -0.024; (*t)(2,23) = 0.020;
3085 (*t)(0,24) = 1.400; (*t)(1,24) = -0.026; (*t)(2,24) = 0.016;
3086 (*t)(0,25) = 1.500; (*t)(1,25) = -0.028; (*t)(2,25) = 0.014;
3087 (*t)(0,26) = 1.600; (*t)(1,26) = -0.028; (*t)(2,26) = 0.012;
3088 (*t)(0,27) = 1.700; (*t)(1,27) = -0.028; (*t)(2,27) = 0.010;
3089 (*t)(0,28) = 1.800; (*t)(1,28) = -0.028; (*t)(2,28) = 0.010;
3090 (*t)(0,29) = 1.900; (*t)(1,29) = -0.028; (*t)(2,29) = 0.008;
3091 (*t)(0,30) = 2.000; (*t)(1,30) = -0.028; (*t)(2,30) = 0.006;
3092 (*t)(0,31) = 2.100; (*t)(1,31) = -0.026; (*t)(2,31) = 0.006;
3093 (*t)(0,32) = 2.200; (*t)(1,32) = -0.024; (*t)(2,32) = 0.004;
3094 (*t)(0,33) = 2.300; (*t)(1,33) = -0.020; (*t)(2,33) = 0.002;
3095 (*t)(0,34) = 2.400; (*t)(1,34) = -0.020; (*t)(2,34) = 0.002;
3096 (*t)(0,35) = 2.500; (*t)(1,35) = -0.018; (*t)(2,35) = 0.000;
3097 (*t)(0,36) = 2.600; (*t)(1,36) = -0.016; (*t)(2,36) = 0.000;
3098 (*t)(0,37) = 2.700; (*t)(1,37) = -0.014; (*t)(2,37) = -0.002;
3099 (*t)(0,38) = 2.800; (*t)(1,38) = -0.014; (*t)(2,38) = -0.004;
3100 (*t)(0,39) = 2.900; (*t)(1,39) = -0.012; (*t)(2,39) = -0.004;
3101 (*t)(0,40) = 3.000; (*t)(1,40) = -0.010; (*t)(2,40) = -0.006;
3102 (*t)(0,41) = 3.100; (*t)(1,41) = 0.000; (*t)(2,41) = 0.000;
3103 (*t)(0,42) = 3.200; (*t)(1,42) = 0.000; (*t)(2,42) = 0.000;
3104 (*t)(0,43) = 3.300; (*t)(1,43) = 0.000; (*t)(2,43) = 0.000;
3105 (*t)(0,44) = 3.400; (*t)(1,44) = 0.000; (*t)(2,44) = 0.000;
3106 (*t)(0,45) = 3.500; (*t)(1,45) = 0.000; (*t)(2,45) = 0.000;
3107 (*t)(0,46) = 3.600; (*t)(1,46) = 0.000; (*t)(2,46) = 0.000;
3108 (*t)(0,47) = 3.700; (*t)(1,47) = 0.000; (*t)(2,47) = 0.000;
3109 (*t)(0,48) = 3.800; (*t)(1,48) = 0.000; (*t)(2,48) = 0.000;
3110 (*t)(0,49) = 3.900; (*t)(1,49) = 0.000; (*t)(2,49) = 0.000;
3111 (*t)(0,50) = 4.000; (*t)(1,50) = 0.000; (*t)(2,50) = 0.000;
3112 (*t)(0,51) = 4.100; (*t)(1,51) = 0.000; (*t)(2,51) = 0.000;
3113 (*t)(0,52) = 4.200; (*t)(1,52) = 0.000; (*t)(2,52) = 0.000;
3114 (*t)(0,53) = 4.300; (*t)(1,53) = 0.000; (*t)(2,53) = 0.000;
3115 (*t)(0,54) = 4.400; (*t)(1,54) = 0.000; (*t)(2,54) = 0.000;
3116 (*t)(0,55) = 4.500; (*t)(1,55) = 0.000; (*t)(2,55) = 0.000;
3117 (*t)(0,56) = 4.600; (*t)(1,56) = 0.000; (*t)(2,56) = 0.000;
3118 (*t)(0,57) = 4.700; (*t)(1,57) = 0.000; (*t)(2,57) = 0.000;
3119 (*t)(0,58) = 4.800; (*t)(1,58) = 0.000; (*t)(2,58) = 0.000;
3120 (*t)(0,59) = 4.900; (*t)(1,59) = 0.000; (*t)(2,59) = 0.000;
3121 (*t)(0,60) = 5.900; (*t)(1,60) = 0.000; (*t)(2,60) = 0.000;
3128 //-----------------------------------------------------------------------
3129 //-----------------------------------------------------------------------
3130 Bool_t AliFlowTrackCuts::PassesTPCbayesianCut(const AliAODTrack* track)
3132 fBayesianResponse->ComputeProb(track,track->GetAODEvent()); // fCurrCentr is needed for mismatch fraction
3133 Float_t *probabilities = fBayesianResponse->GetProb(); // Bayesian Probability (from 0 to 4) (Combined TPC || TOF) including a tuning of priors and TOF mism$
3135 Int_t kTPC = fBayesianResponse->GetCurrentMask(0); // is TPC on
3137 if(! kTPC) return kFALSE;
3141 switch (fParticleID)
3144 fProbBayes = probabilities[2];
3147 fProbBayes = probabilities[3];
3149 case AliPID::kProton:
3150 fProbBayes = probabilities[4];
3152 case AliPID::kElectron:
3153 fProbBayes = probabilities[0];
3156 fProbBayes = probabilities[1];
3158 case AliPID::kDeuteron:
3159 fProbBayes = probabilities[5];
3161 case AliPID::kTriton:
3162 fProbBayes = probabilities[6];
3165 fProbBayes = probabilities[7];
3171 if(fProbBayes > fParticleProbability){
3174 else if (fCutCharge && fCharge * track->Charge() > 0)
3179 //-----------------------------------------------------------------------
3180 Bool_t AliFlowTrackCuts::PassesTPCbayesianCut(const AliESDtrack* track)
3182 //cut on TPC bayesian pid
3183 //if (! fAllowTOFmismatchFlag) {if (track->GetStatus() & AliESDtrack::kTOFmismatch) return kFALSE;}
3185 //Bool_t statusMatchingHard = TPCTOFagree(track);
3186 //if (fRequireStrictTOFTPCagreement && (!statusMatchingHard))
3188 fBayesianResponse->ComputeProb(track,fCurrCentr); // fCurrCentr is needed for mismatch fraction
3189 Int_t kTPC = fBayesianResponse->GetCurrentMask(0); // is TPC on
3190 //Int_t kTOF = fBayesianResponse->GetCurrentMask(1); // is TOF on
3192 if(! kTPC) return kFALSE;
3194 // Bool_t statusMatchingHard = 1;
3195 // Float_t mismProb = 0;
3197 // statusMatchingHard = TPCTOFagree(track);
3198 // mismProb = fBayesianResponse->GetTOFMismProb();
3200 // if (fRequireStrictTOFTPCagreement && (!statusMatchingHard))
3203 Float_t *probabilities = fBayesianResponse->GetProb(); // Bayesian Probability (from 0 to 4) (Combined TPC || TOF) including a tuning of priors and TOF mismatch parameterization
3207 switch (fParticleID)
3210 fProbBayes = probabilities[2];
3213 fProbBayes = probabilities[3];
3215 case AliPID::kProton:
3216 fProbBayes = probabilities[4];
3218 case AliPID::kElectron:
3219 fProbBayes = probabilities[0];
3222 fProbBayes = probabilities[1];
3224 case AliPID::kDeuteron:
3225 fProbBayes = probabilities[5];
3227 case AliPID::kTriton:
3228 fProbBayes = probabilities[6];
3231 fProbBayes = probabilities[7];
3237 if(fProbBayes > fParticleProbability)
3241 else if (fCutCharge && fCharge * track->GetSign() > 0)
3246 //-----------------------------------------------------------------------
3247 Bool_t AliFlowTrackCuts::PassesTOFbayesianCut(const AliAODTrack* track)
3249 //check is track passes bayesian combined TOF+TPC pid cut
3250 Bool_t goodtrack = (track->GetStatus() & AliESDtrack::kTOFout) &&
3251 (track->GetStatus() & AliESDtrack::kTIME) &&
3252 (track->GetTOFsignal() > 12000) &&
3253 (track->GetTOFsignal() < 100000);
3258 Bool_t statusMatchingHard = TPCTOFagree(track);
3260 if (fRequireStrictTOFTPCagreement && (!statusMatchingHard))
3263 fBayesianResponse->ComputeProb(track,track->GetAODEvent()); // fCurrCentr is needed for mismatch fraction
3264 Float_t *probabilities = fBayesianResponse->GetProb(); // Bayesian Probability (from 0 to 4) (Combined TPC || TOF) including a tuning of priors and TOF mism$
3266 Float_t mismProb = fBayesianResponse->GetTOFMismProb(); // mismatch Bayesian probabilities
3270 switch (fParticleID)
3273 fProbBayes = probabilities[2];
3276 fProbBayes = probabilities[3];
3278 case AliPID::kProton:
3279 fProbBayes = probabilities[4];
3281 case AliPID::kElectron:
3282 fProbBayes = probabilities[0];
3285 fProbBayes = probabilities[1];
3287 case AliPID::kDeuteron:
3288 fProbBayes = probabilities[5];
3290 case AliPID::kTriton:
3291 fProbBayes = probabilities[6];
3294 fProbBayes = probabilities[7];
3300 if(fProbBayes > fParticleProbability && mismProb < 0.5){
3303 else if (fCutCharge && fCharge * track->Charge() > 0)
3309 //-----------------------------------------------------------------------
3310 // part added by F. Noferini (some methods)
3311 Bool_t AliFlowTrackCuts::PassesTOFbayesianCut(const AliESDtrack* track)
3313 //check is track passes bayesian combined TOF+TPC pid cut
3314 Bool_t goodtrack = (track->GetStatus() & AliESDtrack::kTOFout) &&
3315 (track->GetStatus() & AliESDtrack::kTIME) &&
3316 (track->GetTOFsignal() > 12000) &&
3317 (track->GetTOFsignal() < 100000) &&
3318 (track->GetIntegratedLength() > 365);
3323 if (! fAllowTOFmismatchFlag) {if (track->GetStatus() & AliESDtrack::kTOFmismatch) return kFALSE;}
3325 Bool_t statusMatchingHard = TPCTOFagree(track);
3326 if (fRequireStrictTOFTPCagreement && (!statusMatchingHard))
3329 fBayesianResponse->ComputeProb(track,fCurrCentr); // fCurrCentr is needed for mismatch fraction
3330 Float_t *probabilities = fBayesianResponse->GetProb(); // Bayesian Probability (from 0 to 4) (Combined TPC || TOF) including a tuning of priors and TOF mismatch parameterization
3332 Float_t mismProb = fBayesianResponse->GetTOFMismProb(); // mismatch Bayesian probabilities
3336 switch (fParticleID)
3339 fProbBayes = probabilities[2];
3342 fProbBayes = probabilities[3];
3344 case AliPID::kProton:
3345 fProbBayes = probabilities[4];
3347 case AliPID::kElectron:
3348 fProbBayes = probabilities[0];
3351 fProbBayes = probabilities[1];
3353 case AliPID::kDeuteron:
3354 fProbBayes = probabilities[5];
3356 case AliPID::kTriton:
3357 fProbBayes = probabilities[6];
3360 fProbBayes = probabilities[7];
3366 // 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);
3367 if(fProbBayes > fParticleProbability && mismProb < 0.5){
3370 else if (fCutCharge && fCharge * track->GetSign() > 0)
3377 //-----------------------------------------------------------------------
3378 // part added by Natasha
3379 Bool_t AliFlowTrackCuts::PassesNucleiSelection(const AliESDtrack* track)
3381 //pid selection for heavy nuclei
3382 Bool_t select=kFALSE;
3384 //if (!track) continue;
3386 if (!track->GetInnerParam())
3387 return kFALSE; //break;
3389 const AliExternalTrackParam* tpcTrack = track->GetInnerParam();
3391 Double_t ptotTPC = tpcTrack->GetP();
3392 Double_t sigTPC = track->GetTPCsignal();
3393 Double_t dEdxBBA = 0.;
3394 Double_t dSigma = 0.;
3396 switch (fParticleID)
3398 case AliPID::kDeuteron:
3400 dEdxBBA = AliExternalTrackParam::BetheBlochAleph(ptotTPC/1.8756,
3406 dSigma = (sigTPC - dEdxBBA)/dEdxBBA;
3408 if( ptotTPC<=1.1 && (dSigma < (0.5 - (0.1818*ptotTPC)) ) && (dSigma > ( (0.218*ptotTPC - 0.4) ) ) )
3412 case AliPID::kTriton:
3419 // ----- Pass 2 -------
3420 dEdxBBA = 4.0 * AliExternalTrackParam::BetheBlochAleph( (2.*ptotTPC)/2.8084,
3426 dSigma = (sigTPC - dEdxBBA)/dEdxBBA;
3427 if(ptotTPC<=5.0 && (dSigma >= (-0.03968*ptotTPC - 0.1)) && (dSigma <= (0.31 - 0.0217*ptotTPC)))
3431 case AliPID::kAlpha:
3442 // end part added by Natasha
3443 //-----------------------------------------------------------------------
3444 Bool_t AliFlowTrackCuts::PassesTPCTOFNsigmaCut(const AliAODTrack* track)
3446 // do a simple combined cut on the n sigma from tpc and tof
3447 // with information of the pid response object (needs pid response task)
3448 // stub, not implemented yet
3449 if(!track) return kFALSE;
3453 //-----------------------------------------------------------------------------
3454 Bool_t AliFlowTrackCuts::PassesTPCTOFNsigmaCut(const AliESDtrack* track)
3456 // do a simple combined cut on the n sigma from tpc and tof
3457 // with information of the pid response object (needs pid response task)
3458 // stub, not implemented yet
3459 if(!track) return kFALSE;
3464 //-----------------------------------------------------------------------
3465 void AliFlowTrackCuts::SetPriors(Float_t centrCur){
3466 //set priors for the bayesian pid selection
3467 fCurrCentr = centrCur;
3469 fBinLimitPID[0] = 0.300000;
3470 fBinLimitPID[1] = 0.400000;
3471 fBinLimitPID[2] = 0.500000;
3472 fBinLimitPID[3] = 0.600000;
3473 fBinLimitPID[4] = 0.700000;
3474 fBinLimitPID[5] = 0.800000;
3475 fBinLimitPID[6] = 0.900000;
3476 fBinLimitPID[7] = 1.000000;
3477 fBinLimitPID[8] = 1.200000;
3478 fBinLimitPID[9] = 1.400000;
3479 fBinLimitPID[10] = 1.600000;
3480 fBinLimitPID[11] = 1.800000;
3481 fBinLimitPID[12] = 2.000000;
3482 fBinLimitPID[13] = 2.200000;
3483 fBinLimitPID[14] = 2.400000;
3484 fBinLimitPID[15] = 2.600000;
3485 fBinLimitPID[16] = 2.800000;
3486 fBinLimitPID[17] = 3.000000;
3599 else if(centrCur < 20){
3709 else if(centrCur < 30){
3819 else if(centrCur < 40){
3929 else if(centrCur < 50){
4039 else if(centrCur < 60){
4149 else if(centrCur < 70){
4259 else if(centrCur < 80){
4479 for(Int_t i=18;i<fgkPIDptBin;i++){
4480 fBinLimitPID[i] = 3.0 + 0.2 * (i-18);
4481 fC[i][0] = fC[17][0];
4482 fC[i][1] = fC[17][1];
4483 fC[i][2] = fC[17][2];
4484 fC[i][3] = fC[17][3];
4485 fC[i][4] = fC[17][4];
4489 //---------------------------------------------------------------//
4490 Bool_t AliFlowTrackCuts::TPCTOFagree(const AliVTrack *track)
4492 //check pid agreement between TPC and TOF
4493 Bool_t status = kFALSE;
4495 const Float_t c = 2.99792457999999984e-02;
4497 Float_t mass[5] = {5.10998909999999971e-04,1.05658000000000002e-01,1.39570000000000000e-01,4.93676999999999977e-01,9.38271999999999995e-01};
4500 Double_t exptimes[9];
4501 track->GetIntegratedTimes(exptimes);
4503 Float_t dedx = track->GetTPCsignal();
4505 Float_t p = track->P();
4506 Float_t time = track->GetTOFsignal()- fESDpid.GetTOFResponse().GetStartTime(p);
4507 Float_t tl = exptimes[0]*c; // to work both for ESD and AOD
4509 Float_t betagammares = fESDpid.GetTOFResponse().GetExpectedSigma(p, exptimes[4], mass[4]);
4511 Float_t betagamma1 = tl/(time-5 *betagammares) * 33.3564095198152043;
4513 // printf("betagamma1 = %f\n",betagamma1);
4515 if(betagamma1 < 0.1) betagamma1 = 0.1;
4517 if(betagamma1 < 0.99999) betagamma1 /= TMath::Sqrt(1-betagamma1*betagamma1);
4518 else betagamma1 = 100;
4520 Float_t betagamma2 = tl/(time+5 *betagammares) * 33.3564095198152043;
4521 // printf("betagamma2 = %f\n",betagamma2);
4523 if(betagamma2 < 0.1) betagamma2 = 0.1;
4525 if(betagamma2 < 0.99999) betagamma2 /= TMath::Sqrt(1-betagamma2*betagamma2);
4526 else betagamma2 = 100;
4529 Float_t momtpc=track->GetTPCmomentum();
4531 for(Int_t i=0;i < 5;i++){
4532 Float_t resolutionTOF = fESDpid.GetTOFResponse().GetExpectedSigma(p, exptimes[i], mass[i]);
4533 if(TMath::Abs(exptimes[i] - time) < 5 * resolutionTOF){
4534 Float_t dedxExp = 0;
4535 if(i==0) dedxExp = fESDpid.GetTPCResponse().GetExpectedSignal(momtpc,AliPID::kElectron);
4536 else if(i==1) dedxExp = fESDpid.GetTPCResponse().GetExpectedSignal(momtpc,AliPID::kMuon);
4537 else if(i==2) dedxExp = fESDpid.GetTPCResponse().GetExpectedSignal(momtpc,AliPID::kPion);
4538 else if(i==3) dedxExp = fESDpid.GetTPCResponse().GetExpectedSignal(momtpc,AliPID::kKaon);
4539 else if(i==4) dedxExp = fESDpid.GetTPCResponse().GetExpectedSignal(momtpc,AliPID::kProton);
4541 Float_t resolutionTPC = 2;
4542 if(i==0) resolutionTPC = fESDpid.GetTPCResponse().GetExpectedSigma(momtpc,track->GetTPCsignalN(),AliPID::kElectron);
4543 else if(i==1) resolutionTPC = fESDpid.GetTPCResponse().GetExpectedSigma(momtpc,track->GetTPCsignalN(),AliPID::kMuon);
4544 else if(i==2) resolutionTPC = fESDpid.GetTPCResponse().GetExpectedSigma(momtpc,track->GetTPCsignalN(),AliPID::kPion);
4545 else if(i==3) resolutionTPC = fESDpid.GetTPCResponse().GetExpectedSigma(momtpc,track->GetTPCsignalN(),AliPID::kKaon);
4546 else if(i==4) resolutionTPC = fESDpid.GetTPCResponse().GetExpectedSigma(momtpc,track->GetTPCsignalN(),AliPID::kProton);
4548 if(TMath::Abs(dedx - dedxExp) < 3 * resolutionTPC){
4554 Float_t bb1 = fESDpid.GetTPCResponse().Bethe(betagamma1);
4555 Float_t bb2 = fESDpid.GetTPCResponse().Bethe(betagamma2);
4556 Float_t bbM = fESDpid.GetTPCResponse().Bethe((betagamma1+betagamma2)*0.5);
4561 Float_t resolutionTOFpr = fESDpid.GetTOFResponse().GetExpectedSigma(p, exptimes[4], mass[4]);
4562 Float_t resolutionTPCpr = fESDpid.GetTPCResponse().GetExpectedSigma(momtpc,track->GetTPCsignalN(),AliPID::kProton);
4563 if(TMath::Abs(dedx-bb1) < resolutionTPCpr*3 && exptimes[4] < time-7*resolutionTOFpr){
4566 else if(TMath::Abs(dedx-bb2) < resolutionTPCpr*3 && exptimes[4] < time-7*resolutionTOFpr){
4569 else if(TMath::Abs(dedx-bbM) < resolutionTPCpr*3 && exptimes[4] < time-7*resolutionTOFpr){
4575 // end part added by F. Noferini
4576 //-----------------------------------------------------------------------
4578 //-----------------------------------------------------------------------
4579 const char* AliFlowTrackCuts::PIDsourceName(PIDsource s)
4581 //get the name of the particle id source
4587 return "TPCbayesian";
4595 return "TOFbayesianPID";
4596 case kTOFbetaSimple:
4597 return "TOFbetaSimple";
4601 return "TPCTOFNsigma";
4607 //-----------------------------------------------------------------------
4608 const char* AliFlowTrackCuts::GetParamTypeName(trackParameterType type)
4610 //return the name of the selected parameter type
4617 case kTPCstandalone:
4618 return "TPCstandalone";
4620 return "SPDtracklets";
4625 case kMUON: // XZhang 20120604
4626 return "MUON"; // XZhang 20120604
4636 //-----------------------------------------------------------------------
4637 Bool_t AliFlowTrackCuts::PassesPMDcuts(const AliESDPmdTrack* track )
4639 //check PMD specific cuts
4640 //clean up from last iteration, and init label
4641 Int_t det = track->GetDetector();
4642 //Int_t smn = track->GetSmn();
4643 Float_t clsX = track->GetClusterX();
4644 Float_t clsY = track->GetClusterY();
4645 Float_t clsZ = track->GetClusterZ();
4646 Float_t ncell = track->GetClusterCells();
4647 Float_t adc = track->GetClusterADC();
4653 fTrackEta = GetPmdEta(clsX,clsY,clsZ);
4654 fTrackPhi = GetPmdPhi(clsX,clsY);
4658 if (fCutEta) {if ( fTrackEta < fEtaMin || fTrackEta >= fEtaMax ) pass = kFALSE;}
4659 if (fCutPhi) {if ( fTrackPhi < fPhiMin || fTrackPhi >= fPhiMax ) pass = kFALSE;}
4660 if (fCutPmdDet) {if(det != fPmdDet) pass = kFALSE;}
4661 if (fCutPmdAdc) {if(adc < fPmdAdc) pass = kFALSE;}
4662 if (fCutPmdNcell) {if(ncell < fPmdNcell) pass = kFALSE;}
4667 //-----------------------------------------------------------------------
4668 Bool_t AliFlowTrackCuts::PassesVZEROcuts(Int_t id)
4671 if (id<0) return kFALSE;
4673 //clean up from last iter
4676 fTrackPhi = TMath::PiOver4()*(0.5+id%8);
4678 // 10102013 weighting vzero tiles - rbertens@cern.ch
4679 if(!fVZEROgainEqualization) {
4680 // if for some reason the equalization is not initialized (e.g. 2011 data)
4681 // the fVZEROxpol[] weights are used to enable or disable vzero rings
4682 if(id<32) { // v0c side
4683 fTrackEta = -3.45+0.5*(id/8);
4684 if(id < 8) fTrackWeight = fEvent->GetVZEROEqMultiplicity(id)*fVZEROCpol[0];
4685 else if (id < 16 ) fTrackWeight = fEvent->GetVZEROEqMultiplicity(id)*fVZEROCpol[1];
4686 else if (id < 24 ) fTrackWeight = fEvent->GetVZEROEqMultiplicity(id)*fVZEROCpol[2];
4687 else if (id < 32 ) fTrackWeight = fEvent->GetVZEROEqMultiplicity(id)*fVZEROCpol[3];
4688 } else { // v0a side
4689 fTrackEta = +4.8-0.6*((id/8)-4);
4690 if( id < 40) fTrackWeight = fEvent->GetVZEROEqMultiplicity(id)*fVZEROApol[0];
4691 else if ( id < 48 ) fTrackWeight = fEvent->GetVZEROEqMultiplicity(id)*fVZEROApol[1];
4692 else if ( id < 56 ) fTrackWeight = fEvent->GetVZEROEqMultiplicity(id)*fVZEROApol[2];
4693 else if ( id < 64 ) fTrackWeight = fEvent->GetVZEROEqMultiplicity(id)*fVZEROApol[3];
4695 } else { // the equalization is initialized
4696 // note that disabled rings have already been excluded on calibration level in
4697 // AliFlowEvent (so for a disabled ring, fVZEROxpol is zero
4698 if(id<32) { // v0c side
4699 fTrackEta = -3.45+0.5*(id/8);
4700 if(id < 8) fTrackWeight = fEvent->GetVZEROData()->GetMultiplicity(id)*fVZEROCpol[0]/fVZEROgainEqualization->GetBinContent(1+id);
4701 else if (id < 16 ) fTrackWeight = fEvent->GetVZEROData()->GetMultiplicity(id)*fVZEROCpol[1]/fVZEROgainEqualization->GetBinContent(1+id);
4702 else if (id < 24 ) fTrackWeight = fEvent->GetVZEROData()->GetMultiplicity(id)*fVZEROCpol[2]/fVZEROgainEqualization->GetBinContent(1+id);
4703 else if (id < 32 ) fTrackWeight = fEvent->GetVZEROData()->GetMultiplicity(id)*fVZEROCpol[3]/fVZEROgainEqualization->GetBinContent(1+id);
4704 } else { // v0a side
4705 fTrackEta = +4.8-0.6*((id/8)-4);
4706 if( id < 40) fTrackWeight = fEvent->GetVZEROData()->GetMultiplicity(id)*fVZEROApol[0]/fVZEROgainEqualization->GetBinContent(1+id);
4707 else if ( id < 48 ) fTrackWeight = fEvent->GetVZEROData()->GetMultiplicity(id)*fVZEROApol[1]/fVZEROgainEqualization->GetBinContent(1+id);
4708 else if ( id < 56 ) fTrackWeight = fEvent->GetVZEROData()->GetMultiplicity(id)*fVZEROApol[2]/fVZEROgainEqualization->GetBinContent(1+id);
4709 else if ( id < 64 ) fTrackWeight = fEvent->GetVZEROData()->GetMultiplicity(id)*fVZEROApol[3]/fVZEROgainEqualization->GetBinContent(1+id);
4711 // printf ( " tile %i and weight %.2f \n", id, fTrackWeight);
4714 if (fLinearizeVZEROresponse && id < 64)
4716 //this is only needed in pass1 of LHC10h
4717 Float_t multVZERO[fgkNumberOfVZEROtracks];
4719 AliESDUtils::GetCorrV0((AliESDEvent*)fEvent,dummy,multVZERO);
4720 fTrackWeight = multVZERO[id];
4724 if (fCutEta) {if ( fTrackEta < fEtaMin || fTrackEta >= fEtaMax ) pass = kFALSE;}
4725 if (fCutPhi) {if ( fTrackPhi < fPhiMin || fTrackPhi >= fPhiMax ) pass = kFALSE;}
4730 //-----------------------------------------------------------------------------
4731 Bool_t AliFlowTrackCuts::PassesMuonCuts(AliVParticle* vparticle)
4735 fTrackLabel = (fFakesAreOK)?TMath::Abs(vparticle->GetLabel()):vparticle->GetLabel();
4736 if (fMCevent) fMCparticle = static_cast<AliMCParticle*>(fMCevent->GetTrack(fTrackLabel));
4737 else fMCparticle=NULL;
4739 AliESDMuonTrack *esdTrack = dynamic_cast<AliESDMuonTrack*>(vparticle);
4740 AliAODTrack *aodTrack = dynamic_cast<AliAODTrack*>(vparticle);
4741 if ((!esdTrack) && (!aodTrack)) return kFALSE;
4742 if (!fMuonTrackCuts->IsSelected(vparticle)) return kFALSE;
4743 HandleVParticle(vparticle); if (!fTrack) return kFALSE;
4747 //----------------------------------------------------------------------------//
4748 Double_t AliFlowTrackCuts::GetPmdEta(Float_t xPos, Float_t yPos, Float_t zPos)
4750 //get PMD "track" eta coordinate
4751 Float_t rpxpy, theta, eta;
4752 rpxpy = TMath::Sqrt(xPos*xPos + yPos*yPos);
4753 theta = TMath::ATan2(rpxpy,zPos);
4754 eta = -TMath::Log(TMath::Tan(0.5*theta));
4758 //--------------------------------------------------------------------------//
4759 Double_t AliFlowTrackCuts::GetPmdPhi(Float_t xPos, Float_t yPos)
4761 //Get PMD "track" phi coordinate
4762 Float_t pybypx, phi = 0., phi1;
4765 if(yPos>0) phi = 90.;
4766 if(yPos<0) phi = 270.;
4771 if(pybypx < 0) pybypx = - pybypx;
4772 phi1 = TMath::ATan(pybypx)*180./3.14159;
4774 if(xPos > 0 && yPos > 0) phi = phi1; // 1st Quadrant
4775 if(xPos < 0 && yPos > 0) phi = 180 - phi1; // 2nd Quadrant
4776 if(xPos < 0 && yPos < 0) phi = 180 + phi1; // 3rd Quadrant
4777 if(xPos > 0 && yPos < 0) phi = 360 - phi1; // 4th Quadrant
4780 phi = phi*3.14159/180.;
4784 //---------------------------------------------------------------//
4785 void AliFlowTrackCuts::Browse(TBrowser* b)
4787 //some browsing capabilities
4788 if (fQA) b->Add(fQA);
4791 //---------------------------------------------------------------//
4792 Long64_t AliFlowTrackCuts::Merge(TCollection* list)
4795 if (!fQA || !list) return 0;
4796 if (list->IsEmpty()) return 0;
4797 AliFlowTrackCuts* obj=NULL;
4800 while ( (obj = dynamic_cast<AliFlowTrackCuts*>(next())) )
4802 if (obj==this) continue;
4803 tmplist.Add(obj->GetQA());
4805 return fQA->Merge(&tmplist);