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.
42 #include "TMCProcess.h"
43 #include "TParticle.h"
48 #include "AliMCEvent.h"
49 #include "AliESDEvent.h"
50 #include "AliAODEvent.h"
51 #include "AliVParticle.h"
52 #include "AliVVZERO.h"
53 #include "AliMCParticle.h"
54 #include "AliESDkink.h"
56 #include "AliESDtrack.h"
57 #include "AliESDMuonTrack.h" // XZhang 20120604
58 #include "AliMultiplicity.h"
59 #include "AliAODTrack.h"
60 #include "AliAODTracklets.h" // XZhang 20120615
61 #include "AliFlowTrackSimple.h"
62 #include "AliFlowTrack.h"
63 #include "AliFlowTrackCuts.h"
65 #include "AliESDpid.h"
66 #include "AliESDPmdTrack.h"
67 #include "AliESDUtils.h" //TODO
68 #include "AliFlowBayesianPID.h"
69 #include "AliFlowCandidateTrack.h"
70 #include "AliKFParticle.h"
71 #include "AliESDVZERO.h"
72 #include "AliFlowCommonConstants.h"
73 #include "AliAnalysisManager.h"
74 #include "AliPIDResponse.h"
79 ClassImp(AliFlowTrackCuts)
81 //-----------------------------------------------------------------------
82 AliFlowTrackCuts::AliFlowTrackCuts():
83 AliFlowTrackSimpleCuts(),
84 fAliESDtrackCuts(NULL),
85 fMuonTrackCuts(NULL), // XZhang 20120604
88 fCutMChasTrackReferences(kFALSE),
89 fCutMCprocessType(kFALSE),
90 fMCprocessType(kPNoProcess),
93 fCutMCfirstMotherPID(kFALSE),
95 fIgnoreSignInMCPID(kFALSE),
96 fCutMCisPrimary(kFALSE),
97 fRequireTransportBitForPrimaries(kTRUE),
99 fRequireCharge(kFALSE),
101 fCutSPDtrackletDeltaPhi(kFALSE),
102 fSPDtrackletDeltaPhiMax(FLT_MAX),
103 fSPDtrackletDeltaPhiMin(-FLT_MAX),
104 fIgnoreTPCzRange(kFALSE),
105 fIgnoreTPCzRangeMax(FLT_MAX),
106 fIgnoreTPCzRangeMin(-FLT_MAX),
107 fCutChi2PerClusterTPC(kFALSE),
108 fMaxChi2PerClusterTPC(FLT_MAX),
109 fMinChi2PerClusterTPC(-FLT_MAX),
110 fCutNClustersTPC(kFALSE),
111 fNClustersTPCMax(INT_MAX),
112 fNClustersTPCMin(INT_MIN),
113 fCutNClustersITS(kFALSE),
114 fNClustersITSMax(INT_MAX),
115 fNClustersITSMin(INT_MIN),
116 fUseAODFilterBit(kTRUE),
118 fCutDCAToVertexXY(kFALSE),
119 fCutDCAToVertexZ(kFALSE),
120 fCutMinimalTPCdedx(kFALSE),
122 fLinearizeVZEROresponse(kFALSE),
123 fCentralityPercentileMin(0.),
124 fCentralityPercentileMax(5.),
129 fCutPmdNcell(kFALSE),
131 fMinKinkAngle(TMath::DegToRad()*2.),
132 fMinKinkRadius(130.),
133 fMaxKinkRadius(200.),
136 fMinKinkInvMassKmu(0.),
137 fMaxKinkInvMassKmu(0.6),
138 fForceTPCstandalone(kFALSE),
139 fRequireKinkDaughters(kFALSE),
150 fTrackLabel(INT_MIN),
156 fBayesianResponse(NULL),
160 fParticleID(AliPID::kUnknown),
161 fParticleProbability(.9),
162 fAllowTOFmismatchFlag(kFALSE),
163 fRequireStrictTOFTPCagreement(kFALSE),
164 fCutRejectElectronsWithTPCpid(kFALSE),
165 fUseTPCTOFNsigmaCutContours(kFALSE),
168 fVZEROgainEqualization(NULL),
169 fApplyRecentering(kFALSE),
170 fVZEROgainEqualizationPerRing(kFALSE),
179 fMaxITSclusterShared(0),
183 SetPriors(); //init arrays
184 // New PID procedure (Bayesian Combined PID)
185 // allocating here is necessary because we don't
186 // stream this member
187 // TODO: fix streaming problems AliFlowBayesianPID
188 fBayesianResponse = new AliFlowBayesianPID();
189 fBayesianResponse->SetNewTrackParam();
190 for(Int_t i(0); i < 4; i++) {
194 for(Int_t i(0); i < 8; i++) fUseVZERORing[i] = kTRUE;
196 for(int i=0;i<50;i++){
197 fCutContour[i]= NULL;
203 //-----------------------------------------------------------------------
204 AliFlowTrackCuts::AliFlowTrackCuts(const char* name):
205 AliFlowTrackSimpleCuts(name),
206 fAliESDtrackCuts(NULL),
207 fMuonTrackCuts(NULL), // XZhang 20120604
210 fCutMChasTrackReferences(kFALSE),
211 fCutMCprocessType(kFALSE),
212 fMCprocessType(kPNoProcess),
215 fCutMCfirstMotherPID(kFALSE),
216 fMCfirstMotherPID(0),
217 fIgnoreSignInMCPID(kFALSE),
218 fCutMCisPrimary(kFALSE),
219 fRequireTransportBitForPrimaries(kTRUE),
220 fMCisPrimary(kFALSE),
221 fRequireCharge(kFALSE),
223 fCutSPDtrackletDeltaPhi(kFALSE),
224 fSPDtrackletDeltaPhiMax(FLT_MAX),
225 fSPDtrackletDeltaPhiMin(-FLT_MAX),
226 fIgnoreTPCzRange(kFALSE),
227 fIgnoreTPCzRangeMax(FLT_MAX),
228 fIgnoreTPCzRangeMin(-FLT_MAX),
229 fCutChi2PerClusterTPC(kFALSE),
230 fMaxChi2PerClusterTPC(FLT_MAX),
231 fMinChi2PerClusterTPC(-FLT_MAX),
232 fCutNClustersTPC(kFALSE),
233 fNClustersTPCMax(INT_MAX),
234 fNClustersTPCMin(INT_MIN),
235 fCutNClustersITS(kFALSE),
236 fNClustersITSMax(INT_MAX),
237 fNClustersITSMin(INT_MIN),
238 fUseAODFilterBit(kTRUE),
240 fCutDCAToVertexXY(kFALSE),
241 fCutDCAToVertexZ(kFALSE),
242 fCutMinimalTPCdedx(kFALSE),
244 fLinearizeVZEROresponse(kFALSE),
245 fCentralityPercentileMin(0.),
246 fCentralityPercentileMax(5.),
251 fCutPmdNcell(kFALSE),
253 fMinKinkAngle(TMath::DegToRad()*2.),
254 fMinKinkRadius(130.),
255 fMaxKinkRadius(200.),
258 fMinKinkInvMassKmu(0.0),
259 fMaxKinkInvMassKmu(0.6),
260 fForceTPCstandalone(kFALSE),
261 fRequireKinkDaughters(kFALSE),
272 fTrackLabel(INT_MIN),
278 fBayesianResponse(NULL),
282 fParticleID(AliPID::kUnknown),
283 fParticleProbability(.9),
284 fAllowTOFmismatchFlag(kFALSE),
285 fRequireStrictTOFTPCagreement(kFALSE),
286 fCutRejectElectronsWithTPCpid(kFALSE),
287 fUseTPCTOFNsigmaCutContours(kFALSE),
290 fVZEROgainEqualization(NULL),
291 fApplyRecentering(kFALSE),
292 fVZEROgainEqualizationPerRing(kFALSE),
301 fMaxITSclusterShared(0),
305 SetTitle("AliFlowTrackCuts");
306 fESDpid.GetTPCResponse().SetBetheBlochParameters( 0.0283086,
311 SetPriors(); //init arrays
312 // New PID procedure (Bayesian Combined PID)
313 fBayesianResponse = new AliFlowBayesianPID();
314 fBayesianResponse->SetNewTrackParam();
315 for(Int_t i(0); i < 4; i++) {
319 for(Int_t i(0); i < 8; i++) fUseVZERORing[i] = kTRUE;
321 for(int i=0;i<50;i++){
322 fCutContour[i]= NULL;
327 //-----------------------------------------------------------------------
328 AliFlowTrackCuts::AliFlowTrackCuts(const AliFlowTrackCuts& that):
329 AliFlowTrackSimpleCuts(that),
330 fAliESDtrackCuts(NULL),
331 fMuonTrackCuts(NULL), // XZhang 20120604
334 fCutMChasTrackReferences(that.fCutMChasTrackReferences),
335 fCutMCprocessType(that.fCutMCprocessType),
336 fMCprocessType(that.fMCprocessType),
337 fCutMCPID(that.fCutMCPID),
339 fCutMCfirstMotherPID(that.fCutMCfirstMotherPID),
340 fMCfirstMotherPID(that.fMCfirstMotherPID),
341 fIgnoreSignInMCPID(that.fIgnoreSignInMCPID),
342 fCutMCisPrimary(that.fCutMCisPrimary),
343 fRequireTransportBitForPrimaries(that.fRequireTransportBitForPrimaries),
344 fMCisPrimary(that.fMCisPrimary),
345 fRequireCharge(that.fRequireCharge),
346 fFakesAreOK(that.fFakesAreOK),
347 fCutSPDtrackletDeltaPhi(that.fCutSPDtrackletDeltaPhi),
348 fSPDtrackletDeltaPhiMax(that.fSPDtrackletDeltaPhiMax),
349 fSPDtrackletDeltaPhiMin(that.fSPDtrackletDeltaPhiMin),
350 fIgnoreTPCzRange(that.fIgnoreTPCzRange),
351 fIgnoreTPCzRangeMax(that.fIgnoreTPCzRangeMax),
352 fIgnoreTPCzRangeMin(that.fIgnoreTPCzRangeMin),
353 fCutChi2PerClusterTPC(that.fCutChi2PerClusterTPC),
354 fMaxChi2PerClusterTPC(that.fMaxChi2PerClusterTPC),
355 fMinChi2PerClusterTPC(that.fMinChi2PerClusterTPC),
356 fCutNClustersTPC(that.fCutNClustersTPC),
357 fNClustersTPCMax(that.fNClustersTPCMax),
358 fNClustersTPCMin(that.fNClustersTPCMin),
359 fCutNClustersITS(that.fCutNClustersITS),
360 fNClustersITSMax(that.fNClustersITSMax),
361 fNClustersITSMin(that.fNClustersITSMin),
362 fUseAODFilterBit(that.fUseAODFilterBit),
363 fAODFilterBit(that.fAODFilterBit),
364 fCutDCAToVertexXY(that.fCutDCAToVertexXY),
365 fCutDCAToVertexZ(that.fCutDCAToVertexZ),
366 fCutMinimalTPCdedx(that.fCutMinimalTPCdedx),
367 fMinimalTPCdedx(that.fMinimalTPCdedx),
368 fLinearizeVZEROresponse(that.fLinearizeVZEROresponse),
369 fCentralityPercentileMin(that.fCentralityPercentileMin),
370 fCentralityPercentileMax(that.fCentralityPercentileMax),
371 fCutPmdDet(that.fCutPmdDet),
372 fPmdDet(that.fPmdDet),
373 fCutPmdAdc(that.fCutPmdAdc),
374 fPmdAdc(that.fPmdAdc),
375 fCutPmdNcell(that.fCutPmdNcell),
376 fPmdNcell(that.fPmdNcell),
377 fMinKinkAngle(that.fMinKinkAngle),
378 fMinKinkRadius(that.fMinKinkRadius),
379 fMaxKinkRadius(that.fMaxKinkRadius),
380 fMinKinkQt(that.fMinKinkQt),
381 fMaxKinkQt(that.fMaxKinkQt),
382 fMinKinkInvMassKmu(that.fMinKinkInvMassKmu),
383 fMaxKinkInvMassKmu(that.fMaxKinkInvMassKmu),
384 fForceTPCstandalone(that.fForceTPCstandalone),
385 fRequireKinkDaughters(that.fRequireKinkDaughters),
386 fParamType(that.fParamType),
387 fParamMix(that.fParamMix),
396 fTrackLabel(INT_MIN),
401 fESDpid(that.fESDpid),
402 fBayesianResponse(NULL),
403 fPIDsource(that.fPIDsource),
406 fParticleID(that.fParticleID),
407 fParticleProbability(that.fParticleProbability),
408 fAllowTOFmismatchFlag(that.fAllowTOFmismatchFlag),
409 fRequireStrictTOFTPCagreement(that.fRequireStrictTOFTPCagreement),
410 fCutRejectElectronsWithTPCpid(that.fCutRejectElectronsWithTPCpid),
411 fUseTPCTOFNsigmaCutContours(that.fUseTPCTOFNsigmaCutContours),
414 fVZEROgainEqualization(NULL),
415 fApplyRecentering(that.fApplyRecentering),
416 fVZEROgainEqualizationPerRing(that.fVZEROgainEqualizationPerRing),
421 fPIDResponse(that.fPIDResponse),
422 fNsigmaCut2(that.fNsigmaCut2),
425 fMaxITSclusterShared(0),
429 if (that.fTPCpidCuts) fTPCpidCuts = new TMatrixF(*(that.fTPCpidCuts));
430 if (that.fTOFpidCuts) fTOFpidCuts = new TMatrixF(*(that.fTOFpidCuts));
431 if (that.fAliESDtrackCuts) fAliESDtrackCuts = new AliESDtrackCuts(*(that.fAliESDtrackCuts));
432 if (that.fMuonTrackCuts) fMuonTrackCuts = new AliMuonTrackCuts(*(that.fMuonTrackCuts)); // XZhang 20120604
433 SetPriors(); //init arrays
434 if(fUseTPCTOFNsigmaCutContours) GetTPCTOFPIDContours();
435 if (that.fQA) DefineHistograms();
436 // would be neater via copy ctor of TArrayD
437 fChi2A = new TArrayD(that.fChi2A->GetSize(), that.fChi2A->GetArray());
438 fChi2C = new TArrayD(that.fChi2C->GetSize(), that.fChi2C->GetArray());
439 fChi3A = new TArrayD(that.fChi3A->GetSize(), that.fChi3A->GetArray());
440 fChi3C = new TArrayD(that.fChi3C->GetSize(), that.fChi3C->GetArray());
441 // New PID procedure (Bayesian Combined PID)
442 fBayesianResponse = new AliFlowBayesianPID();
443 fBayesianResponse->SetNewTrackParam();
445 // VZERO gain calibration
446 // no reason to init fVZEROgainEqualizationPerRing, will be initialized on node if necessary
447 // pointer is set to NULL in initialization list of this constructor
448 // if (that.fVZEROgainEqualization) fVZEROgainEqualization = new TH1(*(that.fVZEROgainEqualization));
449 for(Int_t i(0); i < 4; i++) { // no use to copy these guys since they're only initialized on worked node
453 for(Int_t i(0); i < 8; i++) fUseVZERORing[i] = that.fUseVZERORing[i];
455 for(int i=0;i<50;i++){
456 fCutContour[i]= that.fCutContour[i];
457 fCutGraph[i]=that.fCutGraph[i];
463 //-----------------------------------------------------------------------
464 AliFlowTrackCuts& AliFlowTrackCuts::operator=(const AliFlowTrackCuts& that)
467 if (this==&that) return *this;
469 AliFlowTrackSimpleCuts::operator=(that);
470 //the following may seem excessive but if AliESDtrackCuts properly does copy and clone
471 //this approach is better memory-fragmentation-wise in some cases
472 if (that.fAliESDtrackCuts && fAliESDtrackCuts) *fAliESDtrackCuts=*(that.fAliESDtrackCuts);
473 if (that.fAliESDtrackCuts && !fAliESDtrackCuts) fAliESDtrackCuts=new AliESDtrackCuts(*(that.fAliESDtrackCuts));
474 if (!that.fAliESDtrackCuts) delete fAliESDtrackCuts; fAliESDtrackCuts=NULL;
476 if ( that.fMuonTrackCuts && fMuonTrackCuts) *fMuonTrackCuts = *(that.fMuonTrackCuts); // XZhang 20120604
477 if ( that.fMuonTrackCuts && !fMuonTrackCuts) fMuonTrackCuts = new AliMuonTrackCuts(*(that.fMuonTrackCuts)); // XZhang 20120604
478 if (!that.fMuonTrackCuts) delete fMuonTrackCuts; fMuonTrackCuts = NULL; // XZhang 20120604
479 if (!that.fVZEROgainEqualization) delete fVZEROgainEqualization; fVZEROgainEqualization = NULL;
480 //these guys we don't need to copy, just reinit
481 if (that.fQA) {fQA->Delete(); delete fQA; fQA=NULL; DefineHistograms();}
483 fCutMChasTrackReferences=that.fCutMChasTrackReferences;
484 fCutMCprocessType=that.fCutMCprocessType;
485 fMCprocessType=that.fMCprocessType;
486 fCutMCPID=that.fCutMCPID;
488 fCutMCfirstMotherPID=that.fCutMCfirstMotherPID;
489 fMCfirstMotherPID=that.fMCfirstMotherPID;
490 fIgnoreSignInMCPID=that.fIgnoreSignInMCPID,
491 fCutMCisPrimary=that.fCutMCisPrimary;
492 fRequireTransportBitForPrimaries=that.fRequireTransportBitForPrimaries;
493 fMCisPrimary=that.fMCisPrimary;
494 fRequireCharge=that.fRequireCharge;
495 fFakesAreOK=that.fFakesAreOK;
496 fCutSPDtrackletDeltaPhi=that.fCutSPDtrackletDeltaPhi;
497 fSPDtrackletDeltaPhiMax=that.fSPDtrackletDeltaPhiMax;
498 fSPDtrackletDeltaPhiMin=that.fSPDtrackletDeltaPhiMin;
499 fIgnoreTPCzRange=that.fIgnoreTPCzRange;
500 fIgnoreTPCzRangeMax=that.fIgnoreTPCzRangeMax;
501 fIgnoreTPCzRangeMin=that.fIgnoreTPCzRangeMin;
502 fCutChi2PerClusterTPC=that.fCutChi2PerClusterTPC;
503 fMaxChi2PerClusterTPC=that.fMaxChi2PerClusterTPC;
504 fMinChi2PerClusterTPC=that.fMinChi2PerClusterTPC;
505 fCutNClustersTPC=that.fCutNClustersTPC;
506 fNClustersTPCMax=that.fNClustersTPCMax;
507 fNClustersTPCMin=that.fNClustersTPCMin;
508 fCutNClustersITS=that.fCutNClustersITS;
509 fNClustersITSMax=that.fNClustersITSMax;
510 fNClustersITSMin=that.fNClustersITSMin;
511 fUseAODFilterBit=that.fUseAODFilterBit;
512 fAODFilterBit=that.fAODFilterBit;
513 fCutDCAToVertexXY=that.fCutDCAToVertexXY;
514 fCutDCAToVertexZ=that.fCutDCAToVertexZ;
515 fCutMinimalTPCdedx=that.fCutMinimalTPCdedx;
516 fMinimalTPCdedx=that.fMinimalTPCdedx;
517 fLinearizeVZEROresponse=that.fLinearizeVZEROresponse;
518 fCentralityPercentileMin=that.fCentralityPercentileMin;
519 fCentralityPercentileMax=that.fCentralityPercentileMax;
520 fCutPmdDet=that.fCutPmdDet;
521 fPmdDet=that.fPmdDet;
522 fCutPmdAdc=that.fCutPmdAdc;
523 fPmdAdc=that.fPmdAdc;
524 fCutPmdNcell=that.fCutPmdNcell;
525 fPmdNcell=that.fPmdNcell;
526 fMinKinkAngle=that.fMinKinkAngle;
527 fMinKinkRadius=that.fMinKinkRadius;
528 fMaxKinkRadius=that.fMaxKinkRadius;
529 fMinKinkQt=that.fMinKinkQt;
530 fMaxKinkQt=that.fMaxKinkQt;
531 fMinKinkInvMassKmu=that.fMinKinkInvMassKmu;
532 fMaxKinkInvMassKmu=that.fMaxKinkInvMassKmu;
533 fForceTPCstandalone=that.fForceTPCstandalone;
534 fRequireKinkDaughters=that.fRequireKinkDaughters;
536 fParamType=that.fParamType;
537 fParamMix=that.fParamMix;
552 fESDpid = that.fESDpid;
553 fPIDsource = that.fPIDsource;
557 if (that.fTPCpidCuts) fTPCpidCuts = new TMatrixF(*(that.fTPCpidCuts));
558 if (that.fTOFpidCuts) fTOFpidCuts = new TMatrixF(*(that.fTOFpidCuts));
560 fParticleID=that.fParticleID;
561 fParticleProbability=that.fParticleProbability;
562 fAllowTOFmismatchFlag=that.fAllowTOFmismatchFlag;
563 fRequireStrictTOFTPCagreement=that.fRequireStrictTOFTPCagreement;
564 fCutRejectElectronsWithTPCpid=that.fCutRejectElectronsWithTPCpid;
565 fUseTPCTOFNsigmaCutContours=that.fUseTPCTOFNsigmaCutContours;
566 fProbBayes = that.fProbBayes;
567 fCurrCentr = that.fCurrCentr;
569 fApplyRecentering = that.fApplyRecentering;
570 fVZEROgainEqualizationPerRing = that.fVZEROgainEqualizationPerRing;
571 #if ROOT_VERSION_CODE < ROOT_VERSION(5,99,0)
572 if (that.fVZEROgainEqualization) fVZEROgainEqualization = new TH1(*(that.fVZEROgainEqualization));
574 //PH Lets try Clone, however the result might be wrong
575 if (that.fVZEROgainEqualization) fVZEROgainEqualization = (TH1*)that.fVZEROgainEqualization->Clone();
578 for(Int_t i(0); i < 4; i++) { // no use to copy these guys since they're only initialized on worked node
579 fVZEROApol[i] = that.fVZEROApol[i];
580 fVZEROCpol[i] = that.fVZEROCpol[i];
582 for(Int_t i(0); i < 8; i++) fUseVZERORing[i] = that.fUseVZERORing[i];
583 // would be neater via copy ctor of TArrayD
584 fChi2A = new TArrayD(that.fChi2A->GetSize(), that.fChi2A->GetArray());
585 fChi2C = new TArrayD(that.fChi2C->GetSize(), that.fChi2C->GetArray());
586 fChi3A = new TArrayD(that.fChi3A->GetSize(), that.fChi3A->GetArray());
587 fChi3C = new TArrayD(that.fChi3C->GetSize(), that.fChi3C->GetArray());
589 fPIDResponse = that.fPIDResponse;
590 fNsigmaCut2 = that.fNsigmaCut2;
595 //-----------------------------------------------------------------------
596 AliFlowTrackCuts::~AliFlowTrackCuts()
599 delete fAliESDtrackCuts;
602 if (fMuonTrackCuts) delete fMuonTrackCuts; // XZhang 20120604
603 if (fQA) { fQA->SetOwner(); fQA->Delete(); delete fQA; }
604 if (fVZEROgainEqualization) {
605 delete fVZEROgainEqualization;
606 fVZEROgainEqualization = 0x0;
624 fContoursFile->Close();
625 for(int i=0;i<50;i++){
626 delete fCutContour[i];
631 //-----------------------------------------------------------------------
632 void AliFlowTrackCuts::SetEvent(AliVEvent* event, AliMCEvent* mcEvent)
640 AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
642 AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
643 if(inputHandler) fPIDResponse=inputHandler->GetPIDResponse();
646 //do the magic for ESD
647 AliESDEvent* myESD = dynamic_cast<AliESDEvent*>(event);
648 AliAODEvent* myAOD = dynamic_cast<AliAODEvent*>(event);
649 if (fCutPID && myESD)
651 //TODO: maybe call it only for the TOF options?
652 // Added by F. Noferini for TOF PID
653 // old procedure now implemented inside fBayesianResponse
654 // fESDpid.MakePID(myESD,kFALSE);
656 fBayesianResponse->SetDetResponse(myESD, fCurrCentr,AliESDpid::kTOF_T0,kTRUE); // centrality = PbPb centrality class (0-100%) or -1 for pp collisions
657 fESDpid.SetTOFResponse(myESD,AliESDpid::kTOF_T0);
658 // End F. Noferini added part
660 if (fCutPID && myAOD){
661 fBayesianResponse->SetDetResponse(myAOD, fCurrCentr,AliESDpid::kTOF_T0); // centrality = PbPb centrality class (0-100%) or -1 for pp collisions
662 if(myAOD->GetTOFHeader()){
663 fESDpid.SetTOFResponse(myAOD,AliESDpid::kTOF_T0);
665 else{ // corrected on the fly track by track if tof header is not present (old AODs)
667 // End F. Noferini added part
670 if(fPIDsource==kTOFbayesian) fBayesianResponse->SetDetAND(1);
671 else if(fPIDsource==kTPCbayesian) fBayesianResponse->ResetDetOR(1);
673 if(fUseTPCTOFNsigmaCutContours) GetTPCTOFPIDContours();
676 //-----------------------------------------------------------------------
677 void AliFlowTrackCuts::SetCutMC( Bool_t b )
679 //will we be cutting on MC information?
682 //if we cut on MC info then also the Bethe Bloch should be the one tuned for MC
685 fESDpid.GetTPCResponse().SetBetheBlochParameters( 2.15898e+00/50.,
693 //-----------------------------------------------------------------------
694 Bool_t AliFlowTrackCuts::IsSelected(TObject* obj, Int_t id)
697 AliVParticle* vparticle = dynamic_cast<AliVParticle*>(obj);
698 //if (vparticle) return PassesCuts(vparticle); // XZhang 20120604
699 if (vparticle) { // XZhang 20120604
700 if (fParamType==kMUON) return PassesMuonCuts(vparticle); // XZhang 20120604
701 return PassesCuts(vparticle); // XZhang 20120604
704 AliFlowTrackSimple* flowtrack = dynamic_cast<AliFlowTrackSimple*>(obj);
705 if (flowtrack) return PassesCuts(flowtrack);
706 AliMultiplicity* tracklets = dynamic_cast<AliMultiplicity*>(obj);
707 if (tracklets) return PassesCuts(tracklets,id);
708 AliAODTracklets* trkletAOD = dynamic_cast<AliAODTracklets*>(obj); // XZhang 20120615
709 if (trkletAOD) return PassesCuts(trkletAOD,id); // XZhang 20120615
710 AliESDPmdTrack* pmdtrack = dynamic_cast<AliESDPmdTrack*>(obj);
711 if (pmdtrack) return PassesPMDcuts(pmdtrack);
712 AliVVZERO* vvzero = dynamic_cast<AliVVZERO*>(obj); // downcast to base class
713 if (vvzero) return PassesVZEROcuts(id);
714 AliESDkink* kink = dynamic_cast<AliESDkink*>(obj);
715 if (kink) return PassesCuts(kink);
716 //AliESDv0* v0 = dynamic_cast<AliESDv0*>(obj);
717 //if (v0) return PassesCuts(v0);
719 return kFALSE; //default when passed wrong type of object
722 //-----------------------------------------------------------------------
723 Bool_t AliFlowTrackCuts::IsSelectedMCtruth(TObject* obj, Int_t id)
726 AliVParticle* vparticle = dynamic_cast<AliVParticle*>(obj);
729 return PassesMCcuts(fMCevent,(fFakesAreOK)?TMath::Abs(vparticle->GetLabel()):vparticle->GetLabel());
731 AliMultiplicity* tracklets = dynamic_cast<AliMultiplicity*>(obj);
734 Int_t label0 = tracklets->GetLabel(id,0);
735 Int_t label1 = tracklets->GetLabel(id,1);
736 Int_t label = (fFakesAreOK)?TMath::Abs(label0):label0;
737 if (label0!=label1) label = -666;
738 return PassesMCcuts(fMCevent,label);
740 return kFALSE; //default when passed wrong type of object
743 //-----------------------------------------------------------------------
744 Bool_t AliFlowTrackCuts::PassesCuts(const AliFlowTrackSimple* track)
746 //check cuts on a flowtracksimple
748 //clean up from last iteration
750 return AliFlowTrackSimpleCuts::PassesCuts(track);
753 //-----------------------------------------------------------------------
754 Bool_t AliFlowTrackCuts::PassesCuts(const AliMultiplicity* tracklet, Int_t id)
756 //check cuts on a tracklets
758 if (id<0) return kFALSE;
760 //clean up from last iteration, and init label
763 fTrackPhi = tracklet->GetPhi(id);
764 fTrackEta = tracklet->GetEta(id);
766 if (fCutEta) {if ( fTrackEta < fEtaMin || fTrackEta >= fEtaMax ) return kFALSE;}
767 if (fCutPhi) {if ( fTrackPhi < fPhiMin || fTrackPhi >= fPhiMax ) return kFALSE;}
769 //check MC info if available
770 //if the 2 clusters have different label track cannot be good
771 //and should therefore not pass the mc cuts
772 Int_t label0 = tracklet->GetLabel(id,0);
773 Int_t label1 = tracklet->GetLabel(id,1);
774 //if possible get label and mcparticle
775 fTrackLabel = (label0==label1)?tracklet->GetLabel(id,1):-1;
776 if (!fFakesAreOK && fTrackLabel<0) return kFALSE;
777 if (fTrackLabel>=0 && fMCevent) fMCparticle = static_cast<AliMCParticle*>(fMCevent->GetTrack(fTrackLabel));
779 if (fCutMC && !PassesMCcuts()) return kFALSE;
783 //-----------------------------------------------------------------------
784 Bool_t AliFlowTrackCuts::PassesCuts(const AliAODTracklets* tracklet, Int_t id)
787 //check cuts on a tracklets
789 if (id<0) return kFALSE;
791 //clean up from last iteration, and init label
794 fTrackPhi = tracklet->GetPhi(id);
795 //fTrackEta = tracklet->GetEta(id);
796 fTrackEta = -1.*TMath::Log(TMath::Tan(tracklet->GetTheta(id)/2.));
798 if (fCutEta) {if ( fTrackEta < fEtaMin || fTrackEta >= fEtaMax ) return kFALSE;}
799 if (fCutPhi) {if ( fTrackPhi < fPhiMin || fTrackPhi >= fPhiMax ) return kFALSE;}
801 //check MC info if available
802 //if the 2 clusters have different label track cannot be good
803 //and should therefore not pass the mc cuts
804 Int_t label0 = tracklet->GetLabel(id,0);
805 Int_t label1 = tracklet->GetLabel(id,1);
806 //if possible get label and mcparticle
807 fTrackLabel = (label0==label1)?tracklet->GetLabel(id,1):-1;
808 if (!fFakesAreOK && fTrackLabel<0) return kFALSE;
809 if (fTrackLabel>=0 && fMCevent) fMCparticle = static_cast<AliMCParticle*>(fMCevent->GetTrack(fTrackLabel));
811 if (fCutMC && !PassesMCcuts()) return kFALSE;
815 //-----------------------------------------------------------------------
816 Bool_t AliFlowTrackCuts::PassesMCcuts(AliMCEvent* mcEvent, Int_t label)
819 if (!mcEvent) return kFALSE;
820 if (label<0) return kFALSE;//otherwise AliCMevent prints a warning before returning NULL
821 AliMCParticle* mcparticle = static_cast<AliMCParticle*>(mcEvent->GetTrack(label));
822 if (!mcparticle) {AliError("no MC track"); return kFALSE;}
826 if (IsPhysicalPrimary(mcEvent,label,fRequireTransportBitForPrimaries) != fMCisPrimary) return kFALSE;
830 Int_t pdgCode = mcparticle->PdgCode();
831 if (fIgnoreSignInMCPID)
833 if (TMath::Abs(fMCPID) != TMath::Abs(pdgCode)) return kFALSE;
837 if (fMCPID != pdgCode) return kFALSE;
840 if (fCutMCfirstMotherPID)
843 TParticle* tparticle=mcparticle->Particle();
844 Int_t firstMotherLabel = 0;
845 if (tparticle) { firstMotherLabel = tparticle->GetFirstMother(); }
846 AliVParticle* firstMotherParticle = mcEvent->GetTrack(firstMotherLabel);
847 Int_t pdgcodeFirstMother = 0;
848 if (firstMotherParticle) { pdgcodeFirstMother = firstMotherParticle->PdgCode(); }
849 if (pdgcodeFirstMother != fMCfirstMotherPID) return kFALSE;
851 if ( fCutMCprocessType )
853 TParticle* particle = mcparticle->Particle();
854 Int_t processID = particle->GetUniqueID();
855 if (processID != fMCprocessType ) return kFALSE;
857 if (fCutMChasTrackReferences)
859 if (mcparticle->GetNumberOfTrackReferences()<1) return kFALSE;
864 //-----------------------------------------------------------------------
865 Bool_t AliFlowTrackCuts::PassesMCcuts()
868 if (!fMCevent) return kFALSE;
869 if (fTrackLabel<0) return kFALSE;//otherwise AliCMevent prints a warning before returning NULL
870 fMCparticle = static_cast<AliMCParticle*>(fMCevent->GetTrack(fTrackLabel));
871 return PassesMCcuts(fMCevent,fTrackLabel);
874 //-----------------------------------------------------------------------
875 Bool_t AliFlowTrackCuts::PassesCuts(const AliESDv0* v0)
877 //check if the v0 passes cuts
879 //clean up from last iteration
882 fV0 = const_cast<AliESDv0*>(v0);
886 //first, extract/prepare the v0
887 if (!v0->GetOnFlyStatus()) return kFALSE; //skip offline V0 finder
888 const AliExternalTrackParam *negHelix=v0->GetParamN();
889 const AliExternalTrackParam *posHelix=v0->GetParamP();
890 AliVParticle *v0tracks[2];
891 v0tracks[0] = fEvent->GetTrack(v0->GetNindex());
892 v0tracks[1] = fEvent->GetTrack(v0->GetPindex());
893 if( v0tracks[1]->Charge() < 0)
895 v0tracks[1] = fEvent->GetTrack(v0->GetNindex());
896 v0tracks[0] = fEvent->GetTrack(v0->GetPindex());
897 negHelix=v0->GetParamP();
898 posHelix=v0->GetParamN();
901 int KalmanPidPairs[4][2] =
903 {-11,11}, // e-,e+ (gamma)
904 {-211,2212}, // pi- p (lambda)
905 {-2212,211}, // anti-p pi+ (anti-lambda)
906 {-211,211} // pi- pi+ (Kshort)
907 // {-321,321} // K- K+ (phi)
911 //refit using a mass hypothesis
912 AliKFParticle v0trackKFneg(*(negHelix),KalmanPidPairs[id][0]);
913 AliKFParticle v0trackKFpos(*(posHelix),KalmanPidPairs[id][1]);
914 AliKFParticle v0particleRefit;
915 v0particleRefit += v0trackKFneg;
916 v0particleRefit += v0trackKFpos;
917 Double_t invMassErr= -999;
918 v0particleRefit.GetMass(fTrackMass,invMassErr);
919 //Double_t openAngle = v0trackKFneg.GetAngle(v0trackKFpos);
920 fTrackEta = v0particleRefit.GetEta();
921 fTrackPt = v0particleRefit.GetPt();
922 fTrackPhi = TMath::Pi()+v0particleRefit.GetPhi();
923 ////find out which mass bin and put the number in fPOItype
924 //Int_t massBins = AliFlowCommonConstants::GetMaster()->GetNbinsMass();
925 //Double_t massMin = AliFlowCommonConstants::GetMaster()->GetMassMin();
926 //Double_t massMax = AliFlowCommonConstants::GetMaster()->GetMassMax();
927 //fPOItype = 1 + int(massBins*(fTrackMass-massMin)/(massMax-massMin));
929 /////////////////////////////////////////////////////////////////////////////
931 if ( v0tracks[0]->Charge() == v0tracks[1]->Charge() ) pass=kFALSE;
932 if ( v0tracks[0]->Pt()<0.15 || v0tracks[1]->Pt()<0.15 ) pass=kFALSE;
937 //-----------------------------------------------------------------------
938 Bool_t AliFlowTrackCuts::PassesCuts(const AliESDkink* kink)
940 //check if the kink passes cuts
942 //clean up from last iteration
944 fKink=const_cast<AliESDkink*>(kink);
948 Float_t kinkAngle = kink->GetAngle(2);
949 if (kinkAngle<fMinKinkAngle) pass = kFALSE;
950 Double_t kinkRadius = kink->GetR();
951 if (kinkRadius<fMinKinkRadius || kinkRadius>fMaxKinkRadius) pass = kFALSE;
954 const TVector3 motherMfromKink(kink->GetMotherP());
955 const TVector3 daughterMfromKink(kink->GetDaughterP());
956 Float_t qt=kink->GetQt();
957 if ( qt < fMinKinkQt || qt > fMaxKinkQt) pass = kFALSE;
960 Float_t energyDaughterMu = TMath::Sqrt( daughterMfromKink.Mag()*daughterMfromKink.Mag()+
962 Float_t p1XM = motherMfromKink.Px();
963 Float_t p1YM = motherMfromKink.Py();
964 Float_t p1ZM = motherMfromKink.Pz();
965 Float_t p2XM = daughterMfromKink.Px();
966 Float_t p2YM = daughterMfromKink.Py();
967 Float_t p2ZM = daughterMfromKink.Pz();
968 Float_t p3Daughter = TMath::Sqrt( ((p1XM-p2XM)*(p1XM-p2XM))+((p1YM-p2YM)*(p1YM-p2YM))+
969 ((p1ZM-p2ZM)*(p1ZM-p2ZM)) );
970 Double_t invariantMassKmu = TMath::Sqrt( (energyDaughterMu+p3Daughter)*(energyDaughterMu+p3Daughter)-
971 motherMfromKink.Mag()*motherMfromKink.Mag() );
972 if (invariantMassKmu > fMaxKinkInvMassKmu) pass=kFALSE;
973 if (invariantMassKmu < fMinKinkInvMassKmu) pass=kFALSE;
974 fTrackMass=invariantMassKmu;
978 QAbefore(13)->Fill(qt);
979 if (pass) QAafter(13)->Fill(qt);
980 QAbefore(14)->Fill(invariantMassKmu);
981 if (pass) QAafter(14)->Fill(invariantMassKmu);
982 const Double_t* kinkPosition = kink->GetPosition();
983 QAbefore(15)->Fill(kinkPosition[0],kinkPosition[1]);
984 if (pass) QAafter(15)->Fill(kinkPosition[0],kinkPosition[1]);
985 QAbefore(16)->Fill(motherMfromKink.Mag(),kinkAngle*TMath::RadToDeg());
986 if (pass) QAafter(16)->Fill(motherMfromKink.Mag(),kinkAngle*TMath::RadToDeg());
990 Int_t indexKinkMother = kink->GetIndex(0);
991 AliESDtrack* motherTrack = dynamic_cast<AliESDtrack*>(fEvent->GetTrack(indexKinkMother));
992 if (!motherTrack) return kFALSE;
993 if (!PassesCuts(motherTrack)) pass = kFALSE;
998 //-----------------------------------------------------------------------
999 Bool_t AliFlowTrackCuts::PassesCuts(AliVParticle* vparticle)
1001 //check cuts for an ESD vparticle
1003 ////////////////////////////////////////////////////////////////
1004 // start by preparing the track parameters to cut on //////////
1005 ////////////////////////////////////////////////////////////////
1006 //clean up from last iteration
1010 //get the label and the mc particle
1011 fTrackLabel = (fFakesAreOK)?TMath::Abs(vparticle->GetLabel()):vparticle->GetLabel();
1012 if (fMCevent) fMCparticle = static_cast<AliMCParticle*>(fMCevent->GetTrack(fTrackLabel));
1013 else fMCparticle=NULL;
1015 Bool_t isMCparticle = kFALSE; //some things are different for MC particles, check!
1016 AliESDtrack* esdTrack = dynamic_cast<AliESDtrack*>(vparticle);
1017 AliAODTrack* aodTrack = NULL;
1020 //for an ESD track we do some magic sometimes like constructing TPC only parameters
1021 //or doing some hybrid, handle that here
1022 HandleESDtrack(esdTrack);
1026 HandleVParticle(vparticle);
1027 //now check if produced particle is MC
1028 isMCparticle = (dynamic_cast<AliMCParticle*>(fTrack))!=NULL;
1029 aodTrack = dynamic_cast<AliAODTrack*>(vparticle); //keep the additional dynamic cast out of the way for ESDs
1031 ////////////////////////////////////////////////////////////////
1032 ////////////////////////////////////////////////////////////////
1034 if (!fTrack) return kFALSE;
1035 //because it may be different from global, not needed for aodTrack because we dont do anything funky there
1036 if (esdTrack) esdTrack = static_cast<AliESDtrack*>(fTrack);
1038 //check the common cuts for the current particle fTrack (MC,AOD,ESD)
1039 Double_t pt = fTrack->Pt();
1040 Double_t p = fTrack->P();
1041 if (!fFakesAreOK) {if (fTrackLabel<0) pass=kFALSE;}
1042 if (fCutPt) {if (pt < fPtMin || pt >= fPtMax ) pass=kFALSE;}
1043 if (fCutEta) {if (fTrack->Eta() < fEtaMin || fTrack->Eta() >= fEtaMax ) pass=kFALSE;}
1044 if (fCutPhi) {if (fTrack->Phi() < fPhiMin || fTrack->Phi() >= fPhiMax ) pass=kFALSE;}
1045 if (fRequireCharge) {if (fTrack->Charge() == 0) pass=kFALSE;}
1046 if (fCutCharge && !isMCparticle) {if (fTrack->Charge() != fCharge) pass=kFALSE;}
1047 if (fCutCharge && isMCparticle)
1049 //in case of an MC particle the charge is stored in units of 1/3|e|
1050 Int_t charge = TMath::Nint(fTrack->Charge()/3.0); //mc particles have charge in units of 1/3e
1051 if (charge!=fCharge) pass=kFALSE;
1053 //if(fCutPID) {if (fTrack->PID() != fPID) pass=kFALSE;}
1055 //when additionally MC info is required
1056 if (fCutMC && !PassesMCcuts()) pass=kFALSE;
1058 //the case of ESD or AOD
1059 if (esdTrack) { if (!PassesESDcuts(esdTrack)) { pass=kFALSE; } }
1060 if (aodTrack) { if (!PassesAODcuts(aodTrack,pass)) { pass=kFALSE; } }
1066 TParticle* tparticle=fMCparticle->Particle();
1067 Int_t processID = tparticle->GetUniqueID();
1068 Int_t firstMotherLabel = tparticle->GetFirstMother();
1069 Bool_t primary = IsPhysicalPrimary();
1071 //mcparticle->Particle()->ProductionVertex(v);
1072 //Double_t prodvtxX = v.X();
1073 //Double_t prodvtxY = v.Y();
1075 Int_t pdgcode = fMCparticle->PdgCode();
1076 AliVParticle* firstMotherParticle = fMCevent->GetTrack(firstMotherLabel);
1077 Int_t pdgcodeFirstMother = 0;
1078 if (firstMotherParticle) {pdgcodeFirstMother = firstMotherParticle->PdgCode();}
1081 switch (TMath::Abs(pdgcode))
1084 pdg = AliPID::kElectron + 0.5; break;
1086 pdg = AliPID::kMuon + 0.5; break;
1088 pdg = AliPID::kPion + 0.5; break;
1090 pdg = AliPID::kKaon + 0.5; break;
1092 pdg = AliPID::kProton + 0.5; break;
1094 pdg = AliPID::kUnknown + 0.5; break;
1096 pdg = TMath::Sign(pdg,static_cast<Float_t>(pdgcode));
1098 Float_t geantCode = 0;
1099 switch (pdgcodeFirstMother)
1110 case 12: case 14: case 16: //#nu
1114 geantCode=5; //#mu^{+}
1117 geantCode=6; //#mu^{-}
1125 case -211: //#pi^{-}
1128 case 130: //K^{0}_{L}
1144 geantCode=15; //#bar{p}
1147 geantCode=16; //K^{0}_{S}
1150 geantCode=17; //#eta
1153 geantCode=18; //#Lambda
1156 geantCode=19; //#Sigma^{+}
1159 geantCode=20; //#Sigma^{0}
1162 geantCode=21; //#Sigma^{-}
1165 geantCode=22; //#Theta^{0}
1168 geantCode=23; //#Theta^{-}
1171 geantCode=24; //#Omega^{-}
1174 geantCode=25; //#bar{n}
1177 geantCode=26; //#bar{#Lambda}
1180 geantCode=27; //#bar{#Sigma}^{-}
1183 geantCode=28; //#bar{#Sigma}^{0}
1186 geantCode=29; //#bar{#Sigma}^{+}
1189 geantCode=30; //#bar{#Theta}^{0}
1192 geantCode=31; //#bar{#Theta}^{+}
1195 geantCode=32; //#bar{#Omega}^{+}
1198 geantCode=33; //#tau^{+}
1201 geantCode=34; //#tau^{-}
1204 geantCode=35; //D^{+}
1207 geantCode=36; //D^{-}
1210 geantCode=37; //D^{0}
1213 geantCode=38; //#bar{D}^{0}
1216 geantCode=39; //D_{s}^{+}
1219 geantCode=40; //#bar{D_{s}}^{-}
1222 geantCode=41; //#Lambda_{c}^{+}
1225 geantCode=42; //W^{+}
1228 geantCode=43; //W^{-}
1231 geantCode=44; //Z^{0}
1238 QAbefore(2)->Fill(p,pdg);
1239 QAbefore(3)->Fill(p,primary?0.5:-0.5);
1240 QAbefore(4)->Fill(p,static_cast<Float_t>(processID));
1241 QAbefore(7)->Fill(p,geantCode+0.5);
1242 if (pass) QAafter(2)->Fill(p,pdg);
1243 if (pass) QAafter(3)->Fill(p,primary?0.5:-0.5);
1244 if (pass) QAafter(4)->Fill(p,static_cast<Float_t>(processID));
1245 if (pass) QAafter(7)->Fill(p,geantCode);
1249 //true by default, if we didn't set any cuts
1253 //_______________________________________________________________________
1254 Bool_t AliFlowTrackCuts::PassesAODcuts(const AliAODTrack* track, Bool_t passedFid)
1256 //check cuts for AOD
1257 Bool_t pass = passedFid;
1259 if (fCutNClustersTPC)
1261 Int_t ntpccls = track->GetTPCNcls();
1262 if (ntpccls < fNClustersTPCMin || ntpccls > fNClustersTPCMax) pass=kFALSE;
1265 if (fCutNClustersITS)
1267 Int_t nitscls = track->GetITSNcls();
1268 if (nitscls < fNClustersITSMin || nitscls > fNClustersITSMax) pass=kFALSE;
1271 if (fCutChi2PerClusterTPC)
1273 Double_t chi2tpc = track->Chi2perNDF();
1274 if (chi2tpc < fMinChi2PerClusterTPC || chi2tpc > fMaxChi2PerClusterTPC) pass=kFALSE;
1277 if (GetRequireTPCRefit() && !(track->GetStatus() & AliESDtrack::kTPCrefit) ) pass=kFALSE;
1278 if (GetRequireITSRefit() && !(track->GetStatus() & AliESDtrack::kITSrefit) ) pass=kFALSE;
1280 if (fUseAODFilterBit && !track->TestFilterBit(fAODFilterBit)) pass=kFALSE;
1282 if (fCutDCAToVertexXY && track->DCA()>GetMaxDCAToVertexXY()) pass=kFALSE;
1284 if (fCutDCAToVertexZ && track->ZAtDCA()>GetMaxDCAToVertexZ()) pass=kFALSE;
1286 Double_t dedx = track->GetTPCsignal();
1287 if (dedx < fMinimalTPCdedx) pass=kFALSE;
1289 track->GetIntegratedTimes(time);
1290 if (fCutPID && (fParticleID!=AliPID::kUnknown)) //if kUnknown don't cut on PID
1292 if (!PassesAODpidCut(track)) pass=kFALSE;
1295 if ( (track->IsOn(AliAODTrack::kITSin)) && (track->IsOn(AliAODTrack::kTOFpid)) ) {
1296 Double_t c = TMath::C()*1.E-9;
1297 Double_t length = -999., beta =-999, tofTime = -999., tof = -999.;
1298 tofTime = track->GetTOFsignal();//in ps
1299 length = track->GetIntegratedLength();
1301 tof = tofTime*1E-3; // ns
1302 if (tof > 0 && length > 0){
1303 length = length*0.01; // in meters
1307 QAbefore(18)->Fill(track->P()*track->Charge(),beta);
1308 if(pass) QAafter(18)->Fill(track->P()*track->Charge(),beta);
1314 // changed 04062014 used to be filled before possible PID cut
1315 Double_t momTPC = track->GetTPCmomentum();
1316 QAbefore( 0)->Fill(momTPC,GetBeta(track, kTRUE));
1317 if(pass) QAafter( 0)->Fill(momTPC, GetBeta(track, kTRUE));
1318 QAbefore( 1)->Fill(momTPC,dedx);
1319 QAbefore( 5)->Fill(track->Pt(),track->DCA());
1320 QAbefore( 6)->Fill(track->Pt(),track->ZAtDCA());
1321 if (pass) QAafter( 1)->Fill(momTPC,dedx);
1322 if (pass) QAafter( 5)->Fill(track->Pt(),track->DCA());
1323 if (pass) QAafter( 6)->Fill(track->Pt(),track->ZAtDCA());
1324 QAbefore( 8)->Fill(track->P(),(track->GetTOFsignal()-time[AliPID::kElectron]));
1325 if (pass) QAafter( 8)->Fill(track->P(),(track->GetTOFsignal()-time[AliPID::kElectron]));
1326 QAbefore( 9)->Fill(track->P(),(track->GetTOFsignal()-time[AliPID::kMuon]));
1327 if (pass) QAafter( 9)->Fill(track->P(),(track->GetTOFsignal()-time[AliPID::kMuon]));
1328 QAbefore(10)->Fill(track->P(),(track->GetTOFsignal()-time[AliPID::kPion]));
1329 if (pass) QAafter( 10)->Fill(track->P(),(track->GetTOFsignal()-time[AliPID::kPion]));
1330 QAbefore(11)->Fill(track->P(),(track->GetTOFsignal()-time[AliPID::kKaon]));
1331 if (pass) QAafter( 11)->Fill(track->P(),(track->GetTOFsignal()-time[AliPID::kKaon]));
1332 QAbefore(12)->Fill(track->P(),(track->GetTOFsignal()-time[AliPID::kProton]));
1333 if (pass) QAafter( 12)->Fill(track->P(),(track->GetTOFsignal()-time[AliPID::kProton]));
1335 //QAbefore(19)->Fill(track->P()*track->Charge(),track->GetDetPid()->GetTPCsignal());
1336 //if(pass) QAafter(19)->Fill(track->P()*track->Charge(),track->GetDetPid()->GetTPCsignal());
1344 //_______________________________________________________________________
1345 Bool_t AliFlowTrackCuts::PassesESDcuts(AliESDtrack* track)
1347 //check cuts on ESD tracks
1351 track->GetImpactParameters(dcaxy,dcaz);
1352 const AliExternalTrackParam* pout = track->GetOuterParam();
1353 const AliExternalTrackParam* pin = track->GetInnerParam();
1355 if (fIgnoreTPCzRange)
1359 Double_t zin = pin->GetZ();
1360 Double_t zout = pout->GetZ();
1361 if (zin*zout<0) pass=kFALSE; //reject if cross the membrane
1362 if (zin < fIgnoreTPCzRangeMin || zin > fIgnoreTPCzRangeMax) pass=kFALSE;
1363 if (zout < fIgnoreTPCzRangeMin || zout > fIgnoreTPCzRangeMax) pass=kFALSE;
1367 Int_t ntpccls = ( fParamType==kTPCstandalone )?
1368 track->GetTPCNclsIter1():track->GetTPCNcls();
1369 if (fCutChi2PerClusterTPC)
1371 Float_t tpcchi2 = (fParamType==kTPCstandalone)?
1372 track->GetTPCchi2Iter1():track->GetTPCchi2();
1373 tpcchi2 = (ntpccls>0)?tpcchi2/ntpccls:-FLT_MAX;
1374 if (tpcchi2<fMinChi2PerClusterTPC || tpcchi2 >=fMaxChi2PerClusterTPC)
1378 if (fCutMinimalTPCdedx)
1380 if (track->GetTPCsignal() < fMinimalTPCdedx) pass=kFALSE;
1383 if (fCutNClustersTPC)
1385 if (ntpccls < fNClustersTPCMin || ntpccls > fNClustersTPCMax) pass=kFALSE;
1388 Int_t nitscls = track->GetNcls(0);
1389 if (fCutNClustersITS)
1391 if (nitscls < fNClustersITSMin || nitscls > fNClustersITSMax) pass=kFALSE;
1394 //some stuff is still handled by AliESDtrackCuts class - delegate
1395 if (fAliESDtrackCuts)
1397 if (!fAliESDtrackCuts->IsSelected(track)) pass=kFALSE;
1400 //PID part with pid QA
1401 Double_t beta = GetBeta(track);
1402 Double_t dedx = Getdedx(track);
1405 if (pass) QAbefore(0)->Fill(track->GetP(),beta);
1406 if (pass) QAbefore(1)->Fill(pin->GetP(),dedx);
1408 if (fCutPID && (fParticleID!=AliPID::kUnknown)) //if kUnknown don't cut on PID
1410 if (!PassesESDpidCut(track)) pass=kFALSE;
1412 if (fCutRejectElectronsWithTPCpid)
1414 //reject electrons using standard TPC pid
1415 //TODO this should be rethought....
1416 Double_t pidTPC[AliPID::kSPECIES];
1417 track->GetTPCpid(pidTPC);
1418 if (pidTPC[AliPID::kElectron]<fParticleProbability) pass=kFALSE;
1421 Int_t counterForSharedCluster=MaxSharedITSClusterCuts(fMaxITSclusterShared, track);
1422 if(counterForSharedCluster >= fMaxITSclusterShared) pass=kFALSE;
1424 Double_t chi2perClusterITS = MaxChi2perITSClusterCuts(fMaxITSChi2, track);
1425 if(chi2perClusterITS >= fMaxITSChi2) pass=kFALSE;
1429 if (pass) QAafter(0)->Fill(track->GetP(),beta);
1430 if (pass) QAafter(1)->Fill(pin->GetP(),dedx);
1432 //end pid part with qa
1436 Double_t pt = track->Pt();
1437 QAbefore(5)->Fill(pt,dcaxy);
1438 QAbefore(6)->Fill(pt,dcaz);
1439 if (pass) QAafter(5)->Fill(pt,dcaxy);
1440 if (pass) QAafter(6)->Fill(pt,dcaz);
1441 QAbefore(17)->Fill(Float_t(track->GetKinkIndex(0)));
1442 if (pass) QAafter(17)->Fill(Float_t(track->GetKinkIndex(0)));
1448 //-----------------------------------------------------------------------
1449 void AliFlowTrackCuts::HandleVParticle(AliVParticle* track)
1451 //handle the general case
1460 //-----------------------------------------------------------------------
1461 void AliFlowTrackCuts::HandleESDtrack(AliESDtrack* track)
1469 case kTPCstandalone:
1470 if (!track->FillTPCOnlyTrack(fTPCtrack))
1477 fTrack = &fTPCtrack;
1478 //recalculate the label and mc particle, they may differ as TPClabel != global label
1479 fTrackLabel = (fFakesAreOK)?TMath::Abs(fTrack->GetLabel()):fTrack->GetLabel();
1480 if (fMCevent) fMCparticle = static_cast<AliMCParticle*>(fMCevent->GetTrack(fTrackLabel));
1481 else fMCparticle=NULL;
1484 if (fForceTPCstandalone)
1486 if (!track->FillTPCOnlyTrack(fTPCtrack))
1493 fTrack = &fTPCtrack;
1494 //recalculate the label and mc particle, they may differ as TPClabel != global label
1495 fTrackLabel = (fFakesAreOK)?TMath::Abs(fTrack->GetLabel()):fTrack->GetLabel();
1496 if (fMCevent) fMCparticle = static_cast<AliMCParticle*>(fMCevent->GetTrack(fTrackLabel));
1497 else fMCparticle=NULL;
1505 //-----------------------------------------------------------------------
1506 Int_t AliFlowTrackCuts::Count(AliVEvent* event)
1508 //calculate the number of track in given event.
1509 //if argument is NULL(default) take the event attached
1512 Int_t multiplicity = 0;
1515 for (Int_t i=0; i<GetNumberOfInputObjects(); i++)
1517 if (IsSelected(GetInputObject(i))) multiplicity++;
1522 for (Int_t i=0; i<event->GetNumberOfTracks(); i++)
1524 if (IsSelected(event->GetTrack(i))) multiplicity++;
1527 return multiplicity;
1530 //-----------------------------------------------------------------------
1531 AliFlowTrackCuts* AliFlowTrackCuts::GetAODTrackCutsForFilterBit(UInt_t bit, TString suffix)
1533 // object which in its default form only cuts on filterbit (for AOD analysis)
1534 // NOTE : the cut object is defined in such a way that ONLY filterbit is tested,
1535 // all other paramters are NOT checked
1536 // the exception is TPCdecx which is always cut for reasons of backward compatibility
1537 // but by setting the threshold to larger than -99999999 effectively there is no check
1538 AliFlowTrackCuts* cuts = new AliFlowTrackCuts(Form("AOD fitlerbit %i, %s", (int)bit, suffix.Data()));
1539 cuts->SetMinimalTPCdedx(-999999999);
1540 cuts->SetAODfilterBit(bit);
1541 cuts->SetParamType(AliFlowTrackCuts::kAODFilterBit);
1544 //-----------------------------------------------------------------------
1545 AliFlowTrackCuts* AliFlowTrackCuts::GetStandardVZEROOnlyTrackCuts()
1547 //returns the lhc10h vzero track cuts, this function
1548 //is left here for backward compatibility
1549 //if a run is recognized as 11h, the calibration method will
1550 //switch to 11h calbiration, which means that the cut
1551 //object is updated but not replaced.
1552 //calibratin is only available for PbPb runs
1553 return GetStandardVZEROOnlyTrackCuts2010();
1555 //-----------------------------------------------------------------------
1556 AliFlowTrackCuts* AliFlowTrackCuts::GetStandardVZEROOnlyTrackCuts2010()
1558 //get standard VZERO cuts
1559 //DISCLAIMER: LHC10h VZERO calibration consists (by default) of two steps
1560 //1) re-weigting of signal
1561 //2) re-centering of q-vectors
1562 //step 2 is available only for n==2 and n==3, for the higher harmonics the user
1563 //is repsonsible for making sure the q-sub distributions are (sufficiently) flat
1564 //or a sensible NUA procedure is applied !
1565 AliFlowTrackCuts* cuts = new AliFlowTrackCuts("standard vzero flow cuts");
1566 cuts->SetParamType(AliFlowTrackCuts::kVZERO);
1567 cuts->SetEtaRange( -10, +10 );
1568 cuts->SetEtaGap(-1., 1.);
1569 cuts->SetPhiMin( 0 );
1570 cuts->SetPhiMax( TMath::TwoPi() );
1571 // options for the reweighting
1572 cuts->SetVZEROgainEqualizationPerRing(kFALSE);
1573 cuts->SetApplyRecentering(kTRUE);
1574 // to exclude a ring , do e.g.
1575 // cuts->SetUseVZERORing(7, kFALSE);
1576 // excluding a ring will break the re-centering as re-centering relies on a
1577 // database file which tuned to receiving info from all rings
1580 //-----------------------------------------------------------------------
1581 AliFlowTrackCuts* AliFlowTrackCuts::GetStandardVZEROOnlyTrackCuts2011()
1583 //get standard VZERO cuts for 2011 data
1584 //in this case, the vzero segments will be weighted by
1585 //VZEROEqMultiplicity,
1586 //if recentering is enableded, the sub-q vectors
1587 //will be taken from the event header, so make sure to run
1588 //the VZERO event plane selection task before this task !
1589 //DISCLAIMER: recentering is only available for n==2
1590 //for the higher harmonics the user
1591 //is repsonsible for making sure the q-sub distributions are (sufficiently) flat
1592 //or a sensible NUA procedure is applied !
1593 //recentering replaces the already evaluated q-vectors, so
1594 //when chosen, additional settings (e.g. excluding rings)
1595 //have no effect. recentering is true by default
1597 //NOTE user is responsible for running the vzero event plane
1598 //selection task in advance, e.g. add to your launcher macro
1600 // gROOT->LoadMacro("$ALICE_ROOT/ANALYSIS/macros/AddTaskVZEROEPSelection.C");
1601 // AddTaskVZEROEPSelection();
1603 AliFlowTrackCuts* cuts = new AliFlowTrackCuts("standard vzero flow cuts 2011");
1604 cuts->SetParamType(kVZERO);
1605 cuts->SetEtaRange( -10, +10 );
1606 cuts->SetEtaGap(-1., 1.);
1607 cuts->SetPhiMin( 0 );
1608 cuts->SetPhiMax( TMath::TwoPi() );
1609 cuts->SetApplyRecentering(kTRUE);
1610 cuts->SetVZEROgainEqualizationPerRing(kFALSE);
1613 //-----------------------------------------------------------------------
1614 AliFlowTrackCuts* AliFlowTrackCuts::GetStandardGlobalTrackCuts2010()
1617 AliFlowTrackCuts* cuts = new AliFlowTrackCuts("standard Global tracks");
1618 cuts->SetParamType(kGlobal);
1619 cuts->SetPtRange(0.2,5.);
1620 cuts->SetEtaRange(-0.8,0.8);
1621 cuts->SetMinNClustersTPC(70);
1622 cuts->SetMinChi2PerClusterTPC(0.1);
1623 cuts->SetMaxChi2PerClusterTPC(4.0);
1624 cuts->SetMinNClustersITS(2);
1625 cuts->SetRequireITSRefit(kTRUE);
1626 cuts->SetRequireTPCRefit(kTRUE);
1627 cuts->SetMaxDCAToVertexXY(0.3);
1628 cuts->SetMaxDCAToVertexZ(0.3);
1629 cuts->SetAcceptKinkDaughters(kFALSE);
1630 cuts->SetMinimalTPCdedx(10.);
1635 //-----------------------------------------------------------------------
1636 AliFlowTrackCuts* AliFlowTrackCuts::GetStandardTPCStandaloneTrackCuts2010()
1639 AliFlowTrackCuts* cuts = new AliFlowTrackCuts("standard TPC standalone 2010");
1640 cuts->SetParamType(kTPCstandalone);
1641 cuts->SetPtRange(0.2,5.);
1642 cuts->SetEtaRange(-0.8,0.8);
1643 cuts->SetMinNClustersTPC(70);
1644 cuts->SetMinChi2PerClusterTPC(0.2);
1645 cuts->SetMaxChi2PerClusterTPC(4.0);
1646 cuts->SetMaxDCAToVertexXY(3.0);
1647 cuts->SetMaxDCAToVertexZ(3.0);
1648 cuts->SetDCAToVertex2D(kTRUE);
1649 cuts->SetAcceptKinkDaughters(kFALSE);
1650 cuts->SetMinimalTPCdedx(10.);
1655 //-----------------------------------------------------------------------
1656 AliFlowTrackCuts* AliFlowTrackCuts::GetStandardTPCStandaloneTrackCuts()
1659 AliFlowTrackCuts* cuts = new AliFlowTrackCuts("standard TPC standalone");
1660 cuts->SetParamType(kTPCstandalone);
1661 cuts->SetPtRange(0.2,5.);
1662 cuts->SetEtaRange(-0.8,0.8);
1663 cuts->SetMinNClustersTPC(70);
1664 cuts->SetMinChi2PerClusterTPC(0.2);
1665 cuts->SetMaxChi2PerClusterTPC(4.0);
1666 cuts->SetMaxDCAToVertexXY(3.0);
1667 cuts->SetMaxDCAToVertexZ(3.0);
1668 cuts->SetDCAToVertex2D(kTRUE);
1669 cuts->SetAcceptKinkDaughters(kFALSE);
1670 cuts->SetMinimalTPCdedx(10.);
1675 //-----------------------------------------------------------------------
1676 AliFlowTrackCuts* AliFlowTrackCuts::GetStandardITSTPCTrackCuts2009(Bool_t selPrimaries)
1679 AliFlowTrackCuts* cuts = new AliFlowTrackCuts("standard global track cuts 2009");
1680 delete cuts->fAliESDtrackCuts;
1681 cuts->fAliESDtrackCuts = AliESDtrackCuts::GetStandardITSTPCTrackCuts2009(selPrimaries);
1682 cuts->SetParamType(kGlobal);
1686 //-----------------------------------------------------------------------------
1687 AliFlowTrackCuts* AliFlowTrackCuts::GetStandardMuonTrackCuts(Bool_t isMC, Int_t passN)
1690 AliFlowTrackCuts* cuts = new AliFlowTrackCuts("standard muon track cuts");
1691 cuts->SetParamType(kMUON);
1692 cuts->SetStandardMuonTrackCuts();
1693 cuts->SetIsMuonMC(isMC);
1694 cuts->SetMuonPassNumber(passN);
1698 //-----------------------------------------------------------------------
1699 //AliFlowTrack* AliFlowTrackCuts::FillFlowTrackV0(TObjArray* trackCollection, Int_t trackIndex) const
1701 // //fill flow track from a reconstructed V0 (topological)
1702 // AliFlowTrack* flowtrack = static_cast<AliFlowTrack*>(trackCollection->At(trackIndex));
1705 // flowtrack->Clear();
1709 // flowtrack = new AliFlowCandidateTrack();
1710 // trackCollection->AddAtAndExpand(flowtrack,trackIndex);
1713 // TParticle *tmpTParticle=NULL;
1714 // AliMCParticle* tmpAliMCParticle=NULL;
1715 // AliExternalTrackParam* externalParams=NULL;
1716 // AliESDtrack* esdtrack=NULL;
1717 // switch(fParamMix)
1720 // flowtrack->Set(fTrack);
1722 // case kTrackWithMCkine:
1723 // flowtrack->Set(fMCparticle);
1725 // case kTrackWithMCPID:
1726 // flowtrack->Set(fTrack);
1727 // //flowtrack->setPID(...) from mc, when implemented
1729 // case kTrackWithMCpt:
1730 // if (!fMCparticle) return NULL;
1731 // flowtrack->Set(fTrack);
1732 // flowtrack->SetPt(fMCparticle->Pt());
1734 // case kTrackWithPtFromFirstMother:
1735 // if (!fMCparticle) return NULL;
1736 // flowtrack->Set(fTrack);
1737 // tmpTParticle = fMCparticle->Particle();
1738 // tmpAliMCParticle = static_cast<AliMCParticle*>(fMCevent->GetTrack(tmpTParticle->GetFirstMother()));
1739 // flowtrack->SetPt(tmpAliMCParticle->Pt());
1741 // case kTrackWithTPCInnerParams:
1742 // esdtrack = dynamic_cast<AliESDtrack*>(fTrack);
1743 // if (!esdtrack) return NULL;
1744 // externalParams = const_cast<AliExternalTrackParam*>(esdtrack->GetTPCInnerParam());
1745 // if (!externalParams) return NULL;
1746 // flowtrack->Set(externalParams);
1749 // flowtrack->Set(fTrack);
1752 // if (fParamType==kMC)
1754 // flowtrack->SetSource(AliFlowTrack::kFromMC);
1755 // flowtrack->SetID(fTrackLabel);
1757 // else if (dynamic_cast<AliAODTrack*>(fTrack))
1759 // if (fParamType==kMUON) // XZhang 20120604
1760 // flowtrack->SetSource(AliFlowTrack::kFromMUON); // XZhang 20120604
1761 // else // XZhang 20120604
1762 // flowtrack->SetSource(AliFlowTrack::kFromAOD); // XZhang 20120604
1763 // flowtrack->SetID(static_cast<AliVTrack*>(fTrack)->GetID());
1765 // else if (dynamic_cast<AliMCParticle*>(fTrack))
1767 // flowtrack->SetSource(AliFlowTrack::kFromMC);
1768 // flowtrack->SetID(static_cast<AliVTrack*>(fTrack)->GetID());
1773 // //add daughter indices
1776 // return flowtrack;
1779 //-----------------------------------------------------------------------
1780 AliFlowTrack* AliFlowTrackCuts::FillFlowTrackKink(TObjArray* trackCollection, Int_t trackIndex) const
1782 //fill flow track from AliVParticle (ESD,AOD,MC)
1783 AliFlowTrack* flowtrack = static_cast<AliFlowTrack*>(trackCollection->At(trackIndex));
1790 flowtrack = new AliFlowCandidateTrack();
1791 trackCollection->AddAtAndExpand(flowtrack,trackIndex);
1794 TParticle *tmpTParticle=NULL;
1795 AliMCParticle* tmpAliMCParticle=NULL;
1796 AliExternalTrackParam* externalParams=NULL;
1797 AliESDtrack* esdtrack=NULL;
1801 flowtrack->Set(fTrack);
1803 case kTrackWithMCkine:
1804 flowtrack->Set(fMCparticle);
1806 case kTrackWithMCPID:
1807 flowtrack->Set(fTrack);
1808 //flowtrack->setPID(...) from mc, when implemented
1810 case kTrackWithMCpt:
1811 if (!fMCparticle) return NULL;
1812 flowtrack->Set(fTrack);
1813 flowtrack->SetPt(fMCparticle->Pt());
1815 case kTrackWithPtFromFirstMother:
1816 if (!fMCparticle) return NULL;
1817 flowtrack->Set(fTrack);
1818 tmpTParticle = fMCparticle->Particle();
1819 tmpAliMCParticle = static_cast<AliMCParticle*>(fMCevent->GetTrack(tmpTParticle->GetFirstMother()));
1820 flowtrack->SetPt(tmpAliMCParticle->Pt());
1822 case kTrackWithTPCInnerParams:
1823 esdtrack = dynamic_cast<AliESDtrack*>(fTrack);
1824 if (!esdtrack) return NULL;
1825 externalParams = const_cast<AliExternalTrackParam*>(esdtrack->GetTPCInnerParam());
1826 if (!externalParams) return NULL;
1827 flowtrack->Set(externalParams);
1830 flowtrack->Set(fTrack);
1833 if (fParamType==kMC)
1835 flowtrack->SetSource(AliFlowTrack::kFromMC);
1836 flowtrack->SetID(fTrackLabel);
1838 else if (dynamic_cast<AliESDtrack*>(fTrack))
1840 flowtrack->SetSource(AliFlowTrack::kFromESD);
1841 flowtrack->SetID(static_cast<AliVTrack*>(fTrack)->GetID());
1843 else if (dynamic_cast<AliESDMuonTrack*>(fTrack)) // XZhang 20120604
1844 { // XZhang 20120604
1845 flowtrack->SetSource(AliFlowTrack::kFromMUON); // XZhang 20120604
1846 flowtrack->SetID((Int_t)static_cast<AliESDMuonTrack*>(fTrack)->GetUniqueID()); // XZhang 20120604
1847 } // XZhang 20120604
1848 else if (dynamic_cast<AliAODTrack*>(fTrack))
1850 if (fParamType==kMUON) // XZhang 20120604
1851 flowtrack->SetSource(AliFlowTrack::kFromMUON); // XZhang 20120604
1852 else // XZhang 20120604
1853 flowtrack->SetSource(AliFlowTrack::kFromAOD); // XZhang 20120604
1854 flowtrack->SetID(static_cast<AliVTrack*>(fTrack)->GetID());
1856 else if (dynamic_cast<AliMCParticle*>(fTrack))
1858 flowtrack->SetSource(AliFlowTrack::kFromMC);
1859 flowtrack->SetID(static_cast<AliVTrack*>(fTrack)->GetID());
1864 Int_t indexMother = fKink->GetIndex(0);
1865 Int_t indexDaughter = fKink->GetIndex(1);
1866 flowtrack->SetID(indexMother);
1867 flowtrack->AddDaughter(indexDaughter);
1868 flowtrack->SetMass(1.);
1869 flowtrack->SetSource(AliFlowTrack::kFromKink);
1872 flowtrack->SetMass(fTrackMass);
1877 //-----------------------------------------------------------------------
1878 AliFlowTrack* AliFlowTrackCuts::FillFlowTrackGeneric(TObjArray* trackCollection, Int_t trackIndex) const
1880 //fill a flow track from tracklet,vzero,pmd,...
1881 AliFlowTrack* flowtrack = static_cast<AliFlowTrack*>(trackCollection->At(trackIndex));
1888 flowtrack = new AliFlowTrack();
1889 trackCollection->AddAtAndExpand(flowtrack,trackIndex);
1892 if (FillFlowTrackGeneric(flowtrack)) return flowtrack;
1895 trackCollection->RemoveAt(trackIndex);
1901 //-----------------------------------------------------------------------
1902 Bool_t AliFlowTrackCuts::FillFlowTrackGeneric(AliFlowTrack* flowtrack) const
1904 //fill a flow track from tracklet,vzero,pmd,...
1905 TParticle *tmpTParticle=NULL;
1906 AliMCParticle* tmpAliMCParticle=NULL;
1910 flowtrack->SetPhi(fTrackPhi);
1911 flowtrack->SetEta(fTrackEta);
1912 flowtrack->SetWeight(fTrackWeight);
1913 flowtrack->SetPt(fTrackPt);
1914 flowtrack->SetMass(fTrackMass);
1916 case kTrackWithMCkine:
1917 if (!fMCparticle) return kFALSE;
1918 flowtrack->SetPhi( fMCparticle->Phi() );
1919 flowtrack->SetEta( fMCparticle->Eta() );
1920 flowtrack->SetPt( fMCparticle->Pt() );
1921 flowtrack->SetMass(fTrackMass);
1923 case kTrackWithMCpt:
1924 if (!fMCparticle) return kFALSE;
1925 flowtrack->SetPhi(fTrackPhi);
1926 flowtrack->SetEta(fTrackEta);
1927 flowtrack->SetWeight(fTrackWeight);
1928 flowtrack->SetPt(fMCparticle->Pt());
1929 flowtrack->SetMass(fTrackMass);
1931 case kTrackWithPtFromFirstMother:
1932 if (!fMCparticle) return kFALSE;
1933 flowtrack->SetPhi(fTrackPhi);
1934 flowtrack->SetEta(fTrackEta);
1935 flowtrack->SetWeight(fTrackWeight);
1936 tmpTParticle = fMCparticle->Particle();
1937 tmpAliMCParticle = static_cast<AliMCParticle*>(fMCevent->GetTrack(tmpTParticle->GetFirstMother()));
1938 flowtrack->SetPt(tmpAliMCParticle->Pt());
1939 flowtrack->SetMass(fTrackMass);
1942 flowtrack->SetPhi(fTrackPhi);
1943 flowtrack->SetEta(fTrackEta);
1944 flowtrack->SetWeight(fTrackWeight);
1945 flowtrack->SetPt(fTrackPt);
1946 flowtrack->SetMass(fTrackMass);
1949 flowtrack->SetSource(AliFlowTrack::kFromTracklet);
1953 //-----------------------------------------------------------------------
1954 AliFlowTrack* AliFlowTrackCuts::FillFlowTrackVParticle(TObjArray* trackCollection, Int_t trackIndex) const
1956 //fill flow track from AliVParticle (ESD,AOD,MC)
1958 AliFlowTrack* flowtrack = static_cast<AliFlowTrack*>(trackCollection->At(trackIndex));
1965 flowtrack = new AliFlowTrack();
1966 trackCollection->AddAtAndExpand(flowtrack,trackIndex);
1969 if (FillFlowTrackVParticle(flowtrack)) return flowtrack;
1972 trackCollection->RemoveAt(trackIndex);
1978 //-----------------------------------------------------------------------
1979 Bool_t AliFlowTrackCuts::FillFlowTrackVParticle(AliFlowTrack* flowtrack) const
1981 //fill flow track from AliVParticle (ESD,AOD,MC)
1982 if (!fTrack) return kFALSE;
1983 TParticle *tmpTParticle=NULL;
1984 AliMCParticle* tmpAliMCParticle=NULL;
1985 AliExternalTrackParam* externalParams=NULL;
1986 AliESDtrack* esdtrack=NULL;
1990 flowtrack->Set(fTrack);
1992 case kTrackWithMCkine:
1993 flowtrack->Set(fMCparticle);
1995 case kTrackWithMCPID:
1996 flowtrack->Set(fTrack);
1997 //flowtrack->setPID(...) from mc, when implemented
1999 case kTrackWithMCpt:
2000 if (!fMCparticle) return kFALSE;
2001 flowtrack->Set(fTrack);
2002 flowtrack->SetPt(fMCparticle->Pt());
2004 case kTrackWithPtFromFirstMother:
2005 if (!fMCparticle) return kFALSE;
2006 flowtrack->Set(fTrack);
2007 tmpTParticle = fMCparticle->Particle();
2008 tmpAliMCParticle = static_cast<AliMCParticle*>(fMCevent->GetTrack(tmpTParticle->GetFirstMother()));
2009 flowtrack->SetPt(tmpAliMCParticle->Pt());
2011 case kTrackWithTPCInnerParams:
2012 esdtrack = dynamic_cast<AliESDtrack*>(fTrack);
2013 if (!esdtrack) return kFALSE;
2014 externalParams = const_cast<AliExternalTrackParam*>(esdtrack->GetTPCInnerParam());
2015 if (!externalParams) return kFALSE;
2016 flowtrack->Set(externalParams);
2019 flowtrack->Set(fTrack);
2022 if (fParamType==kMC)
2024 flowtrack->SetSource(AliFlowTrack::kFromMC);
2025 flowtrack->SetID(fTrackLabel);
2027 else if (dynamic_cast<AliESDtrack*>(fTrack))
2029 flowtrack->SetSource(AliFlowTrack::kFromESD);
2030 flowtrack->SetID(static_cast<AliVTrack*>(fTrack)->GetID());
2032 else if (dynamic_cast<AliESDMuonTrack*>(fTrack)) // XZhang 20120604
2033 { // XZhang 20120604
2034 flowtrack->SetSource(AliFlowTrack::kFromMUON); // XZhang 20120604
2035 flowtrack->SetID((Int_t)static_cast<AliESDMuonTrack*>(fTrack)->GetUniqueID()); // XZhang 20120604
2036 } // XZhang 20120604
2037 else if (dynamic_cast<AliAODTrack*>(fTrack))
2039 if (fParamType==kMUON) // XZhang 20120604
2040 flowtrack->SetSource(AliFlowTrack::kFromMUON); // XZhang 20120604
2041 else // XZhang 20120604
2042 flowtrack->SetSource(AliFlowTrack::kFromAOD); // XZhang 20120604
2043 flowtrack->SetID(static_cast<AliVTrack*>(fTrack)->GetID());
2045 else if (dynamic_cast<AliMCParticle*>(fTrack))
2047 flowtrack->SetSource(AliFlowTrack::kFromMC);
2048 flowtrack->SetID(static_cast<AliVTrack*>(fTrack)->GetID());
2050 flowtrack->SetMass(fTrackMass);
2054 //-----------------------------------------------------------------------
2055 AliFlowTrack* AliFlowTrackCuts::FillFlowTrack(TObjArray* trackCollection, Int_t trackIndex) const
2057 //fill a flow track constructed from whatever we applied cuts on
2058 //return true on success
2062 return FillFlowTrackGeneric(trackCollection, trackIndex);
2064 return FillFlowTrackGeneric(trackCollection, trackIndex);
2066 return FillFlowTrackGeneric(trackCollection, trackIndex);
2068 return FillFlowTrackKink(trackCollection, trackIndex);
2070 // return FillFlowTrackV0(trackCollection, trackIndex);
2072 return FillFlowTrackVParticle(trackCollection, trackIndex);
2076 //-----------------------------------------------------------------------
2077 Bool_t AliFlowTrackCuts::FillFlowTrack(AliFlowTrack* track) const
2079 //fill a flow track constructed from whatever we applied cuts on
2080 //return true on success
2084 return FillFlowTrackGeneric(track);
2086 return FillFlowTrackGeneric(track);
2088 return FillFlowTrackGeneric(track);
2090 return FillFlowTrackVParticle(track);
2094 ////-----------------------------------------------------------------------
2095 //AliFlowTrack* AliFlowTrackCuts::MakeFlowTrackSPDtracklet() const
2097 // //make a flow track from tracklet
2098 // AliFlowTrack* flowtrack=NULL;
2099 // TParticle *tmpTParticle=NULL;
2100 // AliMCParticle* tmpAliMCParticle=NULL;
2101 // switch (fParamMix)
2104 // flowtrack = new AliFlowTrack();
2105 // flowtrack->SetPhi(fTrackPhi);
2106 // flowtrack->SetEta(fTrackEta);
2107 // flowtrack->SetWeight(fTrackWeight);
2109 // case kTrackWithMCkine:
2110 // if (!fMCparticle) return NULL;
2111 // flowtrack = new AliFlowTrack();
2112 // flowtrack->SetPhi( fMCparticle->Phi() );
2113 // flowtrack->SetEta( fMCparticle->Eta() );
2114 // flowtrack->SetPt( fMCparticle->Pt() );
2116 // case kTrackWithMCpt:
2117 // if (!fMCparticle) return NULL;
2118 // flowtrack = new AliFlowTrack();
2119 // flowtrack->SetPhi(fTrackPhi);
2120 // flowtrack->SetEta(fTrackEta);
2121 // flowtrack->SetWeight(fTrackWeight);
2122 // flowtrack->SetPt(fMCparticle->Pt());
2124 // case kTrackWithPtFromFirstMother:
2125 // if (!fMCparticle) return NULL;
2126 // flowtrack = new AliFlowTrack();
2127 // flowtrack->SetPhi(fTrackPhi);
2128 // flowtrack->SetEta(fTrackEta);
2129 // flowtrack->SetWeight(fTrackWeight);
2130 // tmpTParticle = fMCparticle->Particle();
2131 // tmpAliMCParticle = static_cast<AliMCParticle*>(fMCevent->GetTrack(tmpTParticle->GetFirstMother()));
2132 // flowtrack->SetPt(tmpAliMCParticle->Pt());
2135 // flowtrack = new AliFlowTrack();
2136 // flowtrack->SetPhi(fTrackPhi);
2137 // flowtrack->SetEta(fTrackEta);
2138 // flowtrack->SetWeight(fTrackWeight);
2141 // flowtrack->SetSource(AliFlowTrack::kFromTracklet);
2142 // return flowtrack;
2145 ////-----------------------------------------------------------------------
2146 //AliFlowTrack* AliFlowTrackCuts::MakeFlowTrackVParticle() const
2148 // //make flow track from AliVParticle (ESD,AOD,MC)
2149 // if (!fTrack) return NULL;
2150 // AliFlowTrack* flowtrack=NULL;
2151 // TParticle *tmpTParticle=NULL;
2152 // AliMCParticle* tmpAliMCParticle=NULL;
2153 // AliExternalTrackParam* externalParams=NULL;
2154 // AliESDtrack* esdtrack=NULL;
2155 // switch(fParamMix)
2158 // flowtrack = new AliFlowTrack(fTrack);
2160 // case kTrackWithMCkine:
2161 // flowtrack = new AliFlowTrack(fMCparticle);
2163 // case kTrackWithMCPID:
2164 // flowtrack = new AliFlowTrack(fTrack);
2165 // //flowtrack->setPID(...) from mc, when implemented
2167 // case kTrackWithMCpt:
2168 // if (!fMCparticle) return NULL;
2169 // flowtrack = new AliFlowTrack(fTrack);
2170 // flowtrack->SetPt(fMCparticle->Pt());
2172 // case kTrackWithPtFromFirstMother:
2173 // if (!fMCparticle) return NULL;
2174 // flowtrack = new AliFlowTrack(fTrack);
2175 // tmpTParticle = fMCparticle->Particle();
2176 // tmpAliMCParticle = static_cast<AliMCParticle*>(fMCevent->GetTrack(tmpTParticle->GetFirstMother()));
2177 // flowtrack->SetPt(tmpAliMCParticle->Pt());
2179 // case kTrackWithTPCInnerParams:
2180 // esdtrack = dynamic_cast<AliESDtrack*>(fTrack);
2181 // if (!esdtrack) return NULL;
2182 // externalParams = const_cast<AliExternalTrackParam*>(esdtrack->GetTPCInnerParam());
2183 // if (!externalParams) return NULL;
2184 // flowtrack = new AliFlowTrack(externalParams);
2187 // flowtrack = new AliFlowTrack(fTrack);
2190 // if (fParamType==kMC)
2192 // flowtrack->SetSource(AliFlowTrack::kFromMC);
2193 // flowtrack->SetID(fTrackLabel);
2195 // else if (dynamic_cast<AliESDtrack*>(fTrack))
2197 // flowtrack->SetSource(AliFlowTrack::kFromESD);
2198 // flowtrack->SetID(static_cast<AliVTrack*>(fTrack)->GetID());
2200 // else if (dynamic_cast<AliAODTrack*>(fTrack))
2202 // flowtrack->SetSource(AliFlowTrack::kFromAOD);
2203 // flowtrack->SetID(static_cast<AliVTrack*>(fTrack)->GetID());
2205 // else if (dynamic_cast<AliMCParticle*>(fTrack))
2207 // flowtrack->SetSource(AliFlowTrack::kFromMC);
2208 // flowtrack->SetID(static_cast<AliVTrack*>(fTrack)->GetID());
2210 // return flowtrack;
2213 ////-----------------------------------------------------------------------
2214 //AliFlowTrack* AliFlowTrackCuts::MakeFlowTrackPMDtrack() const
2216 // //make a flow track from PMD track
2217 // AliFlowTrack* flowtrack=NULL;
2218 // TParticle *tmpTParticle=NULL;
2219 // AliMCParticle* tmpAliMCParticle=NULL;
2220 // switch (fParamMix)
2223 // flowtrack = new AliFlowTrack();
2224 // flowtrack->SetPhi(fTrackPhi);
2225 // flowtrack->SetEta(fTrackEta);
2226 // flowtrack->SetWeight(fTrackWeight);
2228 // case kTrackWithMCkine:
2229 // if (!fMCparticle) return NULL;
2230 // flowtrack = new AliFlowTrack();
2231 // flowtrack->SetPhi( fMCparticle->Phi() );
2232 // flowtrack->SetEta( fMCparticle->Eta() );
2233 // flowtrack->SetWeight(fTrackWeight);
2234 // flowtrack->SetPt( fMCparticle->Pt() );
2236 // case kTrackWithMCpt:
2237 // if (!fMCparticle) return NULL;
2238 // flowtrack = new AliFlowTrack();
2239 // flowtrack->SetPhi(fTrackPhi);
2240 // flowtrack->SetEta(fTrackEta);
2241 // flowtrack->SetWeight(fTrackWeight);
2242 // flowtrack->SetPt(fMCparticle->Pt());
2244 // case kTrackWithPtFromFirstMother:
2245 // if (!fMCparticle) return NULL;
2246 // flowtrack = new AliFlowTrack();
2247 // flowtrack->SetPhi(fTrackPhi);
2248 // flowtrack->SetEta(fTrackEta);
2249 // flowtrack->SetWeight(fTrackWeight);
2250 // tmpTParticle = fMCparticle->Particle();
2251 // tmpAliMCParticle = static_cast<AliMCParticle*>(fMCevent->GetTrack(tmpTParticle->GetFirstMother()));
2252 // flowtrack->SetPt(tmpAliMCParticle->Pt());
2255 // flowtrack = new AliFlowTrack();
2256 // flowtrack->SetPhi(fTrackPhi);
2257 // flowtrack->SetEta(fTrackEta);
2258 // flowtrack->SetWeight(fTrackWeight);
2262 // flowtrack->SetSource(AliFlowTrack::kFromPMD);
2263 // return flowtrack;
2266 ////-----------------------------------------------------------------------
2267 //AliFlowTrack* AliFlowTrackCuts::MakeFlowTrackVZERO() const
2269 // //make a flow track from VZERO
2270 // AliFlowTrack* flowtrack=NULL;
2271 // TParticle *tmpTParticle=NULL;
2272 // AliMCParticle* tmpAliMCParticle=NULL;
2273 // switch (fParamMix)
2276 // flowtrack = new AliFlowTrack();
2277 // flowtrack->SetPhi(fTrackPhi);
2278 // flowtrack->SetEta(fTrackEta);
2279 // flowtrack->SetWeight(fTrackWeight);
2281 // case kTrackWithMCkine:
2282 // if (!fMCparticle) return NULL;
2283 // flowtrack = new AliFlowTrack();
2284 // flowtrack->SetPhi( fMCparticle->Phi() );
2285 // flowtrack->SetEta( fMCparticle->Eta() );
2286 // flowtrack->SetWeight(fTrackWeight);
2287 // flowtrack->SetPt( fMCparticle->Pt() );
2289 // case kTrackWithMCpt:
2290 // if (!fMCparticle) return NULL;
2291 // flowtrack = new AliFlowTrack();
2292 // flowtrack->SetPhi(fTrackPhi);
2293 // flowtrack->SetEta(fTrackEta);
2294 // flowtrack->SetWeight(fTrackWeight);
2295 // flowtrack->SetPt(fMCparticle->Pt());
2297 // case kTrackWithPtFromFirstMother:
2298 // if (!fMCparticle) return NULL;
2299 // flowtrack = new AliFlowTrack();
2300 // flowtrack->SetPhi(fTrackPhi);
2301 // flowtrack->SetEta(fTrackEta);
2302 // flowtrack->SetWeight(fTrackWeight);
2303 // tmpTParticle = fMCparticle->Particle();
2304 // tmpAliMCParticle = static_cast<AliMCParticle*>(fMCevent->GetTrack(tmpTParticle->GetFirstMother()));
2305 // flowtrack->SetPt(tmpAliMCParticle->Pt());
2308 // flowtrack = new AliFlowTrack();
2309 // flowtrack->SetPhi(fTrackPhi);
2310 // flowtrack->SetEta(fTrackEta);
2311 // flowtrack->SetWeight(fTrackWeight);
2315 // flowtrack->SetSource(AliFlowTrack::kFromVZERO);
2316 // return flowtrack;
2319 ////-----------------------------------------------------------------------
2320 //AliFlowTrack* AliFlowTrackCuts::MakeFlowTrack() const
2322 // //get a flow track constructed from whatever we applied cuts on
2323 // //caller is resposible for deletion
2324 // //if construction fails return NULL
2325 // //TODO: for tracklets, PMD and VZERO we probably need just one method,
2326 // //something like MakeFlowTrackGeneric(), wait with this until
2327 // //requirements quirks are known.
2328 // switch (fParamType)
2330 // case kSPDtracklet:
2331 // return MakeFlowTrackSPDtracklet();
2333 // return MakeFlowTrackPMDtrack();
2335 // return MakeFlowTrackVZERO();
2337 // return MakeFlowTrackVParticle();
2341 //-----------------------------------------------------------------------
2342 Bool_t AliFlowTrackCuts::IsPhysicalPrimary() const
2344 //check if current particle is a physical primary
2345 if (!fMCevent) return kFALSE;
2346 if (fTrackLabel<0) return kFALSE;
2347 return IsPhysicalPrimary(fMCevent, fTrackLabel, fRequireTransportBitForPrimaries);
2350 //-----------------------------------------------------------------------
2351 Bool_t AliFlowTrackCuts::IsPhysicalPrimary(AliMCEvent* mcEvent, Int_t label, Bool_t requiretransported)
2353 //check if current particle is a physical primary
2354 Bool_t physprim=mcEvent->IsPhysicalPrimary(label);
2355 AliMCParticle* track = static_cast<AliMCParticle*>(mcEvent->GetTrack(label));
2356 if (!track) return kFALSE;
2357 TParticle* particle = track->Particle();
2358 Bool_t transported = particle->TestBit(kTransportBit);
2359 //printf("label: %i prim: %s, transp: %s, pass: %s\n",label, (physprim)?"YES":"NO ",(transported)?"YES":"NO ",
2360 //(physprim && (transported || !requiretransported))?"YES":"NO" );
2361 return (physprim && (transported || !requiretransported));
2364 //-----------------------------------------------------------------------
2365 void AliFlowTrackCuts::DefineHistograms()
2367 //define qa histograms
2370 const Int_t kNbinsP=200;
2371 Double_t binsP[kNbinsP+1];
2373 for(int i=1; i<kNbinsP+1; i++)
2375 //if(binsP[i-1]+0.05<1.01)
2376 // binsP[i]=binsP[i-1]+0.05;
2378 binsP[i]=binsP[i-1]+0.05;
2381 const Int_t nBinsDCA=1000;
2382 Double_t binsDCA[nBinsDCA+1];
2383 for(int i=0; i<nBinsDCA+1; i++) {binsDCA[i]=0.01*i-5.;}
2384 //for(int i=1; i<41; i++) {binsDCA[i+100]=0.1*i+1.0;}
2386 Bool_t adddirstatus = TH1::AddDirectoryStatus();
2387 TH1::AddDirectory(kFALSE);
2388 fQA=new TList(); fQA->SetOwner();
2389 fQA->SetName(Form("%s QA",GetName()));
2390 TList* before = new TList(); before->SetOwner();
2391 before->SetName("before");
2392 TList* after = new TList(); after->SetOwner();
2393 after->SetName("after");
2396 before->Add(new TH2F("TOFbeta",";p [GeV/c];#beta",kNbinsP,binsP,1000,0.4,1.1)); //0
2397 after->Add(new TH2F("TOFbeta",";p [GeV/c];#beta",kNbinsP,binsP,1000,0.4,1.1)); //0
2398 before->Add(new TH2F("TPCdedx",";p [GeV/c];dEdx",kNbinsP,binsP,500,0,500)); //1
2399 after->Add(new TH2F("TPCdedx",";p [GeV/c];dEdx",kNbinsP,binsP,500,0,500)); //1
2400 before->Add(new TH2F("MC pid",";p[GeV/c];species",kNbinsP,binsP,10,-5, 5)); //2
2401 after->Add(new TH2F("MC pid",";p[GeV/c];species",kNbinsP,binsP,10,-5, 5)); //2
2403 TH2F* hb = new TH2F("MC primary",";p[GeV/c];primary",kNbinsP,binsP,2,-1,1);
2404 TH2F* ha = new TH2F("MC primary",";p[GeV/c];primary",kNbinsP,binsP,2,-1,1);
2406 axis = hb->GetYaxis();
2407 axis->SetBinLabel(1,"secondary");
2408 axis->SetBinLabel(2,"primary");
2409 axis = ha->GetYaxis();
2410 axis->SetBinLabel(1,"secondary");
2411 axis->SetBinLabel(2,"primary");
2412 before->Add(hb); //3
2414 //production process
2415 hb = new TH2F("MC production process",";p[GeV/c];",kNbinsP,binsP,kMaxMCProcess,
2416 -0.5, kMaxMCProcess-0.5);
2417 ha = new TH2F("MC production process",";p[GeV/c];",kNbinsP,binsP,kMaxMCProcess,
2418 -0.5, kMaxMCProcess-0.5);
2419 axis = hb->GetYaxis();
2420 for (Int_t i=0; i<kMaxMCProcess; i++)
2422 axis->SetBinLabel(i+1,TMCProcessName[i]);
2424 axis = ha->GetYaxis();
2425 for (Int_t i=0; i<kMaxMCProcess; i++)
2427 axis->SetBinLabel(i+1,TMCProcessName[i]);
2429 before->Add(hb); //4
2432 before->Add(new TH2F("DCAxy",";p_{t}[GeV/c];DCAxy[cm]", 100, 0., 10., nBinsDCA, binsDCA));//5
2433 after->Add(new TH2F("DCAxy",";p_{t}[GeV/c];DCAxy[cm]", 100, 0., 10., nBinsDCA, binsDCA));//5
2434 before->Add(new TH2F("DCAz",";p_{t}[GeV/c];DCAz[cm]", 100, 0., 10., nBinsDCA, binsDCA));//6
2435 after->Add(new TH2F("DCAz",";p_{t}[GeV/c];DCAz[cm]", 100, 0., 10., nBinsDCA, binsDCA));//6
2437 hb = new TH2F("MC first mother",";p[GeV/c];",kNbinsP,binsP,44,1.,45.);
2438 ha = new TH2F("MC first mother",";p[GeV/c];",kNbinsP,binsP,44,1.,45.);
2439 hb->GetYaxis()->SetBinLabel(1, "#gamma");
2440 ha->GetYaxis()->SetBinLabel(1, "#gamma");
2441 hb->GetYaxis()->SetBinLabel(2, "e^{+}");
2442 ha->GetYaxis()->SetBinLabel(2, "e^{+}");
2443 hb->GetYaxis()->SetBinLabel(3, "e^{-}");
2444 ha->GetYaxis()->SetBinLabel(3, "e^{-}");
2445 hb->GetYaxis()->SetBinLabel(4, "#nu");
2446 ha->GetYaxis()->SetBinLabel(4, "#nu");
2447 hb->GetYaxis()->SetBinLabel(5, "#mu^{+}");
2448 ha->GetYaxis()->SetBinLabel(5, "#mu^{+}");
2449 hb->GetYaxis()->SetBinLabel(6, "#mu^{-}");
2450 ha->GetYaxis()->SetBinLabel(6, "#mu^{-}");
2451 hb->GetYaxis()->SetBinLabel(7, "#pi^{0}");
2452 ha->GetYaxis()->SetBinLabel(7, "#pi^{0}");
2453 hb->GetYaxis()->SetBinLabel(8, "#pi^{+}");
2454 ha->GetYaxis()->SetBinLabel(8, "#pi^{+}");
2455 hb->GetYaxis()->SetBinLabel(9, "#pi^{-}");
2456 ha->GetYaxis()->SetBinLabel(9, "#pi^{-}");
2457 hb->GetYaxis()->SetBinLabel(10, "K^{0}_{L}");
2458 ha->GetYaxis()->SetBinLabel(10, "K^{0}_{L}");
2459 hb->GetYaxis()->SetBinLabel(11, "K^{+}");
2460 ha->GetYaxis()->SetBinLabel(11, "K^{+}");
2461 hb->GetYaxis()->SetBinLabel(12, "K^{-}");
2462 ha->GetYaxis()->SetBinLabel(12, "K^{-}");
2463 hb->GetYaxis()->SetBinLabel( 13, "n");
2464 ha->GetYaxis()->SetBinLabel( 13, "n");
2465 hb->GetYaxis()->SetBinLabel( 14, "p");
2466 ha->GetYaxis()->SetBinLabel( 14, "p");
2467 hb->GetYaxis()->SetBinLabel(15, "#bar{p}");
2468 ha->GetYaxis()->SetBinLabel(15, "#bar{p}");
2469 hb->GetYaxis()->SetBinLabel(16, "K^{0}_{S}");
2470 ha->GetYaxis()->SetBinLabel(16, "K^{0}_{S}");
2471 hb->GetYaxis()->SetBinLabel(17, "#eta");
2472 ha->GetYaxis()->SetBinLabel(17, "#eta");
2473 hb->GetYaxis()->SetBinLabel(18, "#Lambda");
2474 ha->GetYaxis()->SetBinLabel(18, "#Lambda");
2475 hb->GetYaxis()->SetBinLabel(19, "#Sigma^{+}");
2476 ha->GetYaxis()->SetBinLabel(19, "#Sigma^{+}");
2477 hb->GetYaxis()->SetBinLabel(20, "#Sigma^{0}");
2478 ha->GetYaxis()->SetBinLabel(20, "#Sigma^{0}");
2479 hb->GetYaxis()->SetBinLabel(21, "#Sigma^{-}");
2480 ha->GetYaxis()->SetBinLabel(21, "#Sigma^{-}");
2481 hb->GetYaxis()->SetBinLabel(22, "#Theta^{0}");
2482 ha->GetYaxis()->SetBinLabel(22, "#Theta^{0}");
2483 hb->GetYaxis()->SetBinLabel(23, "#Theta^{-}");
2484 ha->GetYaxis()->SetBinLabel(23, "#Theta^{-}");
2485 hb->GetYaxis()->SetBinLabel(24, "#Omega^{-}");
2486 ha->GetYaxis()->SetBinLabel(24, "#Omega^{-}");
2487 hb->GetYaxis()->SetBinLabel(25, "#bar{n}");
2488 ha->GetYaxis()->SetBinLabel(25, "#bar{n}");
2489 hb->GetYaxis()->SetBinLabel(26, "#bar{#Lambda}");
2490 ha->GetYaxis()->SetBinLabel(26, "#bar{#Lambda}");
2491 hb->GetYaxis()->SetBinLabel(27, "#bar{#Sigma}^{-}");
2492 ha->GetYaxis()->SetBinLabel(27, "#bar{#Sigma}^{-}");
2493 hb->GetYaxis()->SetBinLabel(28, "#bar{#Sigma}^{0}");
2494 ha->GetYaxis()->SetBinLabel(28, "#bar{#Sigma}^{0}");
2495 hb->GetYaxis()->SetBinLabel(29, "#bar{#Sigma}^{+}");
2496 ha->GetYaxis()->SetBinLabel(29, "#bar{#Sigma}^{+}");
2497 hb->GetYaxis()->SetBinLabel(30, "#bar{#Theta}^{0}");
2498 ha->GetYaxis()->SetBinLabel(30, "#bar{#Theta}^{0}");
2499 hb->GetYaxis()->SetBinLabel(31, "#bar{#Theta}^{+}");
2500 ha->GetYaxis()->SetBinLabel(31, "#bar{#Theta}^{+}");
2501 hb->GetYaxis()->SetBinLabel(32, "#bar{#Omega}^{+}");
2502 ha->GetYaxis()->SetBinLabel(32, "#bar{#Omega}^{+}");
2503 hb->GetYaxis()->SetBinLabel(33, "#tau^{+}");
2504 ha->GetYaxis()->SetBinLabel(33, "#tau^{+}");
2505 hb->GetYaxis()->SetBinLabel(34, "#tau^{-}");
2506 ha->GetYaxis()->SetBinLabel(34, "#tau^{-}");
2507 hb->GetYaxis()->SetBinLabel(35, "D^{+}");
2508 ha->GetYaxis()->SetBinLabel(35, "D^{+}");
2509 hb->GetYaxis()->SetBinLabel(36, "D^{-}");
2510 ha->GetYaxis()->SetBinLabel(36, "D^{-}");
2511 hb->GetYaxis()->SetBinLabel(37, "D^{0}");
2512 ha->GetYaxis()->SetBinLabel(37, "D^{0}");
2513 hb->GetYaxis()->SetBinLabel(38, "#bar{D}^{0}");
2514 ha->GetYaxis()->SetBinLabel(38, "#bar{D}^{0}");
2515 hb->GetYaxis()->SetBinLabel(39, "D_{s}^{+}");
2516 ha->GetYaxis()->SetBinLabel(39, "D_{s}^{+}");
2517 hb->GetYaxis()->SetBinLabel(40, "#bar{D_{s}}^{-}");
2518 ha->GetYaxis()->SetBinLabel(40, "#bar{D_{s}}^{-}");
2519 hb->GetYaxis()->SetBinLabel(41, "#Lambda_{c}^{+}");
2520 ha->GetYaxis()->SetBinLabel(41, "#Lambda_{c}^{+}");
2521 hb->GetYaxis()->SetBinLabel(42, "W^{+}");
2522 ha->GetYaxis()->SetBinLabel(42, "W^{+}");
2523 hb->GetYaxis()->SetBinLabel(43, "W^{-}");
2524 ha->GetYaxis()->SetBinLabel(43, "W^{-}");
2525 hb->GetYaxis()->SetBinLabel(44, "Z^{0}");
2526 ha->GetYaxis()->SetBinLabel(44, "Z^{0}");
2530 before->Add(new TH2F("TOFkElectron",";p_{t}[GeV/c];TOF signal - IT", kNbinsP,binsP,1000,-2e4, 2e4));//8
2531 after->Add( new TH2F("TOFkElectron",";p_{t}[GeV/c];TOF signal - IT", kNbinsP,binsP,1000,-2e4, 2e4));//8
2533 before->Add(new TH2F("TOFkMuon",";p_{t}[GeV/c];TOF signal - IT", kNbinsP,binsP,1000,-2e4, 2e4));//9
2534 after->Add( new TH2F("TOFkMuon",";p_{t}[GeV/c];TOF signal - IT", kNbinsP,binsP,1000,-2e4, 2e4));//9
2536 before->Add(new TH2F("TOFkPion",";p_{t}[GeV/c];TOF signal - IT", kNbinsP,binsP,1000,-2e4, 2e4));//10
2537 after->Add( new TH2F("TOFkPion",";p_{t}[GeV/c];TOF signal - IT", kNbinsP,binsP,1000,-2e4, 2e4));//10
2539 before->Add(new TH2F("TOFkKaon",";p_{t}[GeV/c];TOF signal - IT", kNbinsP,binsP,1000,-2e4, 2e4));//11
2540 after->Add( new TH2F("TOFkKaon",";p_{t}[GeV/c];TOF signal - IT", kNbinsP,binsP,1000,-2e4, 2e4));//11
2542 before->Add(new TH2F("TOFkProton",";p_{t}[GeV/c];TOF signal - IT", kNbinsP,binsP,1000,-2e4, 2e4));//12
2543 after->Add( new TH2F("TOFkProton",";p_{t}[GeV/c];TOF signal - IT", kNbinsP,binsP,1000,-2e4, 2e4));//12
2546 before->Add(new TH1F("KinkQt",";q_{t}[GeV/c];counts", 200, 0., 0.3));//13
2547 after->Add(new TH1F("KinkQt",";q_{t}[GeV/c];counts", 200, 0., 0.3));//13
2549 before->Add(new TH1F("KinkMinv",";m_{inv}(#mu#nu)[GeV/c^{2}];counts;Kink M_{inv}", 200, 0., 0.7));//14
2550 after->Add(new TH1F("KinkMinv",";m_{inv}(#mu#nu)[GeV/c^{2}];counts;Kink M_{inv}", 200, 0., 0.7));//14
2552 before->Add(new TH2F("KinkVertex",";x[cm];y[cm];Kink vertex position",250,-250.,250., 250,-250.,250.));//15
2553 after->Add(new TH2F("KinkVertex",";x[cm];y[cm];Kink vertex position",250,-250.,250., 250,-250.,250.));//15
2555 before->Add(new TH2F("KinkAngleMp",";p_{mother}[GeV/c];Kink decay angle [deg];", 100,0.,6., 100,0.,80.));//16
2556 after->Add(new TH2F("KinkAngleMp",";p_{mother}[GeV/c];Kink decay angle [deg];", 100,0.,6., 100,0.,80.));//16
2558 before->Add(new TH1F("KinkIndex",";Kink index;counts", 2, 0., 2.));//17
2559 after->Add(new TH1F("KinkIndex",";Kink index;counts", 2, 0., 2.));//17
2561 before->Add(new TH2F("Pionbeta",";p_{t}[GeV/c];#beta",kNbinsP,binsP,1000,0,1000 ));//18
2562 after->Add(new TH2F("Pionbeta",";p_{t}[GeV/c];#beta",kNbinsP,binsP,1000,0,1000 ));//18
2564 before->Add(new TH2F("PiondEdX",";p_{t}[GeV/c];dE/dX",kNbinsP,binsP,1000,0,1000 ));//19
2565 after->Add(new TH2F("PiondEdX",";p_{t}[GeV/c];dE/dX",kNbinsP,binsP,1000,0,1000 ));//19
2567 TH1::AddDirectory(adddirstatus);
2570 //-----------------------------------------------------------------------
2571 Int_t AliFlowTrackCuts::GetNumberOfInputObjects() const
2573 //get the number of tracks in the input event according source
2574 //selection (ESD tracks, tracklets, MC particles etc.)
2575 AliESDEvent* esd=NULL;
2576 AliAODEvent* aod=NULL; // XZhang 20120615
2580 if (!fEvent) return 0; // XZhang 20120615
2581 esd = dynamic_cast<AliESDEvent*>(fEvent);
2582 aod = dynamic_cast<AliAODEvent*>(fEvent); // XZhang 20120615
2583 // if (!esd) return 0; // XZhang 20120615
2584 // return esd->GetMultiplicity()->GetNumberOfTracklets(); // XZhang 20120615
2585 if (esd) return esd->GetMultiplicity()->GetNumberOfTracklets(); // XZhang 20120615
2586 if (aod) return aod->GetTracklets()->GetNumberOfTracklets(); // XZhang 20120615
2588 if (!fMCevent) return 0;
2589 return fMCevent->GetNumberOfTracks();
2591 esd = dynamic_cast<AliESDEvent*>(fEvent);
2593 return esd->GetNumberOfPmdTracks();
2595 return fgkNumberOfVZEROtracks;
2596 case kMUON: // XZhang 20120604
2597 if (!fEvent) return 0; // XZhang 20120604
2598 esd = dynamic_cast<AliESDEvent*>(fEvent); // XZhang 20120604
2599 if (esd) return esd->GetNumberOfMuonTracks(); // XZhang 20120604
2600 return fEvent->GetNumberOfTracks(); // if AOD // XZhang 20120604
2602 esd = dynamic_cast<AliESDEvent*>(fEvent);
2604 return esd->GetNumberOfKinks();
2606 esd = dynamic_cast<AliESDEvent*>(fEvent);
2608 return esd->GetNumberOfV0s();
2610 if (!fEvent) return 0;
2611 return fEvent->GetNumberOfTracks();
2616 //-----------------------------------------------------------------------
2617 TObject* AliFlowTrackCuts::GetInputObject(Int_t i)
2619 //get the input object according the data source selection:
2620 //(esd tracks, traclets, mc particles,etc...)
2621 AliESDEvent* esd=NULL;
2622 AliAODEvent* aod=NULL; // XZhang 20120615
2626 if (!fEvent) return NULL; // XZhang 20120615
2627 esd = dynamic_cast<AliESDEvent*>(fEvent);
2628 aod = dynamic_cast<AliAODEvent*>(fEvent); // XZhang 20120615
2629 // if (!esd) return NULL; // XZhang 20120615
2630 // return const_cast<AliMultiplicity*>(esd->GetMultiplicity()); // XZhang 20120615
2631 if (esd) return const_cast<AliMultiplicity*>(esd->GetMultiplicity()); // XZhang 20120615
2632 if (aod) return const_cast<AliAODTracklets*>(aod->GetTracklets()); // XZhang 20120615
2634 if (!fMCevent) return NULL;
2635 return fMCevent->GetTrack(i);
2637 esd = dynamic_cast<AliESDEvent*>(fEvent);
2638 if (!esd) return NULL;
2639 return esd->GetPmdTrack(i);
2641 esd = dynamic_cast<AliESDEvent*>(fEvent);
2642 if (!esd) //contributed by G.Ortona
2644 aod = dynamic_cast<AliAODEvent*>(fEvent);
2645 if(!aod)return NULL;
2646 return aod->GetVZEROData();
2648 return esd->GetVZEROData();
2649 case kMUON: // XZhang 20120604
2650 if (!fEvent) return NULL; // XZhang 20120604
2651 esd = dynamic_cast<AliESDEvent*>(fEvent); // XZhang 20120604
2652 if (esd) return esd->GetMuonTrack(i); // XZhang 20120604
2653 return fEvent->GetTrack(i); // if AOD // XZhang 20120604
2655 esd = dynamic_cast<AliESDEvent*>(fEvent);
2656 if (!esd) return NULL;
2657 return esd->GetKink(i);
2659 esd = dynamic_cast<AliESDEvent*>(fEvent);
2660 if (!esd) return NULL;
2661 return esd->GetV0(i);
2663 if (!fEvent) return NULL;
2664 return fEvent->GetTrack(i);
2668 //-----------------------------------------------------------------------
2669 void AliFlowTrackCuts::Clear(Option_t*)
2677 //-----------------------------------------------------------------------
2678 void AliFlowTrackCuts::ClearTrack(Option_t*)
2680 //clean up last track
2693 //-----------------------------------------------------------------------
2694 Bool_t AliFlowTrackCuts::PassesAODpidCut(const AliAODTrack* track )
2696 if(!track->GetAODEvent()->GetTOFHeader()){
2697 AliAODPid *pidObj = track->GetDetPid();
2698 if (!pidObj) fESDpid.GetTOFResponse().SetTimeResolution(84.);
2700 Double_t sigmaTOFPidInAOD[10];
2701 pidObj->GetTOFpidResolution(sigmaTOFPidInAOD);
2702 if(sigmaTOFPidInAOD[0] > 84.){
2703 fESDpid.GetTOFResponse().SetTimeResolution(sigmaTOFPidInAOD[0]); // use the electron TOF PID sigma as time resolution (including the T0 used)
2708 //check if passes the selected pid cut for ESDs
2709 Bool_t pass = kTRUE;
2713 if (!PassesTOFbetaCut(track)) pass=kFALSE;
2716 if (!PassesTOFbayesianCut(track)) pass=kFALSE;
2719 if (!PassesTPCbayesianCut(track)) pass=kFALSE;
2722 if (!PassesTPCTOFNsigmaCut(track)) pass = kFALSE;
2724 case kTPCTOFNsigmaPuritybased:
2725 if(!PassesTPCTOFNsigmaCutPuritybased(track)) pass = kFALSE;
2734 //-----------------------------------------------------------------------
2735 Bool_t AliFlowTrackCuts::PassesESDpidCut(const AliESDtrack* track )
2737 //check if passes the selected pid cut for ESDs
2738 Bool_t pass = kTRUE;
2742 if (!PassesTPCpidCut(track)) pass=kFALSE;
2745 if (!PassesTPCdedxCut(track)) pass=kFALSE;
2748 if (!PassesTOFpidCut(track)) pass=kFALSE;
2751 if (!PassesTOFbetaCut(track)) pass=kFALSE;
2753 case kTOFbetaSimple:
2754 if (!PassesTOFbetaSimpleCut(track)) pass=kFALSE;
2757 if (!PassesTPCbayesianCut(track)) pass=kFALSE;
2759 // part added by F. Noferini
2761 if (!PassesTOFbayesianCut(track)) pass=kFALSE;
2763 // end part added by F. Noferini
2765 //part added by Natasha
2767 if (!PassesNucleiSelection(track)) pass=kFALSE;
2769 //end part added by Natasha
2772 if (!PassesTPCTOFNsigmaCut(track)) pass = kFALSE;
2775 printf("AliFlowTrackCuts::PassesCuts() this should never be called!\n");
2782 //-----------------------------------------------------------------------
2783 Bool_t AliFlowTrackCuts::PassesTOFbetaSimpleCut(const AliESDtrack* track )
2785 //check if passes PID cut using timing in TOF
2786 Bool_t goodtrack = (track->GetStatus() & AliESDtrack::kTOFpid) &&
2787 (track->GetTOFsignal() > 12000) &&
2788 (track->GetTOFsignal() < 100000) &&
2789 (track->GetIntegratedLength() > 365);
2791 if (!fAllowTOFmismatchFlag) {if ((track->GetStatus() & AliESDtrack::kTOFmismatch)) return kFALSE;}
2793 Bool_t statusMatchingHard = TPCTOFagree(track);
2794 if (fRequireStrictTOFTPCagreement && (!statusMatchingHard))
2797 if (!goodtrack) return kFALSE;
2799 const Float_t c = 2.99792457999999984e-02;
2800 Float_t p = track->GetP();
2801 Float_t l = track->GetIntegratedLength();
2802 Float_t trackT0 = fESDpid.GetTOFResponse().GetStartTime(p);
2803 Float_t timeTOF = track->GetTOFsignal()- trackT0;
2804 Float_t beta = l/timeTOF/c;
2805 Double_t integratedTimes[9] = {-1.0,-1.0,-1.0,-1.0,-1.0, -1.0, -1.0, -1.0, -1.0};
2806 track->GetIntegratedTimes(integratedTimes);
2807 Float_t betaHypothesis[5] = {0.0,0.0,0.0,0.0,0.0};
2808 Float_t s[5] = {0.0,0.0,0.0,0.0,0.0};
2809 for (Int_t i=0;i<5;i++)
2811 betaHypothesis[i] = l/integratedTimes[i]/c;
2812 s[i] = beta-betaHypothesis[i];
2815 switch (fParticleID)
2818 return ( (s[2]<0.015) && (s[2]>-0.015) &&
2822 return ( (s[3]<0.015) && (s[3]>-0.015) &&
2825 case AliPID::kProton:
2826 return ( (s[4]<0.015) && (s[4]>-0.015) &&
2835 //-----------------------------------------------------------------------
2836 Float_t AliFlowTrackCuts::GetBeta(const AliVTrack* track, Bool_t QAmode)
2839 Double_t integratedTimes[9] = {-1.0,-1.0,-1.0,-1.0,-1.0, -1.0, -1.0, -1.0, -1.0};
2840 track->GetIntegratedTimes(integratedTimes);
2842 const Float_t c = 2.99792457999999984e-02;
2843 Float_t p = track->P();
2844 Float_t l = integratedTimes[0]*c;
2845 Float_t trackT0 = fESDpid.GetTOFResponse().GetStartTime(p);
2846 Float_t timeTOF = track->GetTOFsignal()- trackT0;
2847 if(QAmode && timeTOF <= 0) return -999; // avoid division by zero when filling 'before' qa histograms
2850 //-----------------------------------------------------------------------
2851 Bool_t AliFlowTrackCuts::PassesTOFbetaCut(const AliAODTrack* track )
2853 //check if track passes pid selection with an asymmetric TOF beta cut
2856 //printf("no TOFpidCuts\n");
2860 //check if passes PID cut using timing in TOF
2861 Bool_t goodtrack = (track->GetStatus() & AliESDtrack::kTOFpid) &&
2862 (track->GetTOFsignal() > 12000) &&
2863 (track->GetTOFsignal() < 100000);
2865 if (!goodtrack) return kFALSE;
2867 const Float_t c = 2.99792457999999984e-02;
2868 Double_t integratedTimes[9] = {-1.0,-1.0,-1.0,-1.0,-1.0, -1.0, -1.0, -1.0, -1.0};
2869 track->GetIntegratedTimes(integratedTimes);
2870 Float_t l = integratedTimes[0]*c;
2872 goodtrack = goodtrack && (l > 365);
2874 if (!goodtrack) return kFALSE;
2876 if (!fAllowTOFmismatchFlag) {if ((track->GetStatus() & AliESDtrack::kTOFmismatch)) return kFALSE;}
2878 Bool_t statusMatchingHard = TPCTOFagree(track);
2879 if (fRequireStrictTOFTPCagreement && (!statusMatchingHard))
2883 Float_t beta = GetBeta(track);
2885 //construct the pid index because it's not AliPID::EParticleType
2887 cout<<"TOFbeta: fParticleID = "<<fParticleID<<endl;
2888 switch (fParticleID)
2896 case AliPID::kProton:
2904 Float_t p = track->P();
2905 Float_t betahypothesis = l/integratedTimes[pid]/c;
2906 Float_t betadiff = beta-betahypothesis;
2908 Float_t* arr = fTOFpidCuts->GetMatrixArray();
2909 Int_t col = TMath::BinarySearch(fTOFpidCuts->GetNcols(),arr,static_cast<Float_t>(p));
2910 if (col<0) return kFALSE;
2911 Float_t min = (*fTOFpidCuts)(1,col);
2912 Float_t max = (*fTOFpidCuts)(2,col);
2914 Bool_t pass = (betadiff>min && betadiff<max);
2918 //-----------------------------------------------------------------------
2919 Bool_t AliFlowTrackCuts::PassesTOFbetaCut(const AliESDtrack* track )
2921 //check if track passes pid selection with an asymmetric TOF beta cut
2924 //printf("no TOFpidCuts\n");
2928 //check if passes PID cut using timing in TOF
2929 Bool_t goodtrack = (track->GetStatus() & AliESDtrack::kTOFpid) &&
2930 (track->GetTOFsignal() > 12000) &&
2931 (track->GetTOFsignal() < 100000) &&
2932 (track->GetIntegratedLength() > 365);
2934 if (!fAllowTOFmismatchFlag) {if ((track->GetStatus() & AliESDtrack::kTOFmismatch)) return kFALSE;}
2936 if (!goodtrack) return kFALSE;
2938 Bool_t statusMatchingHard = TPCTOFagree(track);
2939 if (fRequireStrictTOFTPCagreement && (!statusMatchingHard))
2942 Float_t beta = GetBeta(track);
2943 Double_t integratedTimes[9] = {-1.0,-1.0,-1.0,-1.0,-1.0, -1.0, -1.0, -1.0, -1.0};
2944 track->GetIntegratedTimes(integratedTimes);
2946 //construct the pid index because it's not AliPID::EParticleType
2948 switch (fParticleID)
2956 case AliPID::kProton:
2964 const Float_t c = 2.99792457999999984e-02;
2965 Float_t l = track->GetIntegratedLength();
2966 Float_t p = track->GetP();
2967 Float_t betahypothesis = l/integratedTimes[pid]/c;
2968 Float_t betadiff = beta-betahypothesis;
2970 Float_t* arr = fTOFpidCuts->GetMatrixArray();
2971 Int_t col = TMath::BinarySearch(fTOFpidCuts->GetNcols(),arr,static_cast<Float_t>(p));
2972 if (col<0) return kFALSE;
2973 Float_t min = (*fTOFpidCuts)(1,col);
2974 Float_t max = (*fTOFpidCuts)(2,col);
2976 Bool_t pass = (betadiff>min && betadiff<max);
2981 //-----------------------------------------------------------------------
2982 Bool_t AliFlowTrackCuts::PassesTOFpidCut(const AliESDtrack* track) const
2984 //check if passes PID cut using default TOF pid
2985 Double_t pidTOF[AliPID::kSPECIES];
2986 track->GetTOFpid(pidTOF);
2987 if (pidTOF[fParticleID]>=fParticleProbability) return kTRUE;
2991 //-----------------------------------------------------------------------
2992 Bool_t AliFlowTrackCuts::PassesTPCpidCut(const AliESDtrack* track) const
2994 //check if passes PID cut using default TPC pid
2995 Double_t pidTPC[AliPID::kSPECIES];
2996 track->GetTPCpid(pidTPC);
2997 Double_t probablity = 0.;
2998 switch (fParticleID)
3001 probablity = pidTPC[AliPID::kPion] + pidTPC[AliPID::kMuon];
3004 probablity = pidTPC[fParticleID];
3006 if (probablity >= fParticleProbability) return kTRUE;
3010 //-----------------------------------------------------------------------
3011 Float_t AliFlowTrackCuts::Getdedx(const AliESDtrack* track) const
3014 return track->GetTPCsignal();
3017 //-----------------------------------------------------------------------
3018 Bool_t AliFlowTrackCuts::PassesTPCdedxCut(const AliESDtrack* track)
3020 //check if passes PID cut using dedx signal in the TPC
3023 //printf("no TPCpidCuts\n");
3027 const AliExternalTrackParam* tpcparam = track->GetInnerParam(); //tpc only params at the inner wall
3028 if (!tpcparam) return kFALSE;
3029 Double_t p = tpcparam->GetP();
3030 Float_t sigExp = fESDpid.GetTPCResponse().GetExpectedSignal(p, fParticleID);
3031 Float_t sigTPC = track->GetTPCsignal();
3032 Float_t s = (sigTPC-sigExp)/sigExp;
3034 Float_t* arr = fTPCpidCuts->GetMatrixArray();
3035 Int_t arrSize = fTPCpidCuts->GetNcols();
3036 Int_t col = TMath::BinarySearch( arrSize, arr, static_cast<Float_t>(p));
3037 if (col<0) return kFALSE;
3038 Float_t min = (*fTPCpidCuts)(1,col);
3039 Float_t max = (*fTPCpidCuts)(2,col);
3041 //printf("------------TPC pid cut %s\n",(s>min && s<max)?"PASS":"FAIL");
3042 return (s>min && s<max);
3045 //-----------------------------------------------------------------------
3046 void AliFlowTrackCuts::InitPIDcuts()
3048 //init matrices with PID cuts
3052 if (fParticleID==AliPID::kPion)
3054 t = new TMatrixF(3,15);
3055 (*t)(0,0) = 0.20; (*t)(1,0) = -0.4; (*t)(2,0) = 0.0;
3056 (*t)(0,1) = 0.25; (*t)(1,1) = -0.4; (*t)(2,1) = 0.1;
3057 (*t)(0,2) = 0.30; (*t)(1,2) = -0.4; (*t)(2,2) = 0.2;
3058 (*t)(0,3) = 0.35; (*t)(1,3) = -0.4; (*t)(2,3) = 0.2;
3059 (*t)(0,4) = 0.40; (*t)(1,4) = -0.4; (*t)(2,4) = 0.3;
3060 (*t)(0,5) = 0.45; (*t)(1,5) = -0.4; (*t)(2,5) = 0.3;
3061 (*t)(0,6) = 0.50; (*t)(1,6) = -0.4; (*t)(2,6) = 0.25;
3062 (*t)(0,7) = 0.55; (*t)(1,7) = -0.4; (*t)(2,7) = 0.15;
3063 (*t)(0,8) = 0.60; (*t)(1,8) = -0.4; (*t)(2,8) = 0.1;
3064 (*t)(0,9) = 0.65; (*t)(1,9) = -0.4; (*t)(2,9) = 0.05;
3065 (*t)(0,10) = 0.70; (*t)(1,10) = -0.4; (*t)(2,10) = 0;
3066 (*t)(0,11) = 0.75; (*t)(1,11) = -0.4; (*t)(2,11) = 0;
3067 (*t)(0,12) = 0.80; (*t)(1,12) = -0.4; (*t)(2,12) = -0.05;
3068 (*t)(0,13) = 0.85; (*t)(1,13) = -0.4; (*t)(2,13) = -0.1;
3069 (*t)(0,14) = 0.90; (*t)(1,14) = 0; (*t)(2,14) = 0;
3072 if (fParticleID==AliPID::kKaon)
3074 t = new TMatrixF(3,12);
3075 (*t)(0,0) = 0.20; (*t)(1,0) = -0.2; (*t)(2,0) = 0.2;
3076 (*t)(0,1) = 0.25; (*t)(1,1) = -0.2; (*t)(2,1) = 0.2;
3077 (*t)(0,2) = 0.30; (*t)(1,2) = -0.2; (*t)(2,2) = 0.2;
3078 (*t)(0,3) = 0.35; (*t)(1,3) = -0.2; (*t)(2,3) = 0.2;
3079 (*t)(0,4) = 0.40; (*t)(1,4) = -0.1; (*t)(2,4) = 0.2;
3080 (*t)(0,5) = 0.45; (*t)(1,5) = -0.1; (*t)(2,5) = 0.2;
3081 (*t)(0,6) = 0.50; (*t)(1,6) =-0.05; (*t)(2,6) = 0.2;
3082 (*t)(0,7) = 0.55; (*t)(1,7) = -0.1; (*t)(2,7) = 0.1;
3083 (*t)(0,8) = 0.60; (*t)(1,8) =-0.05; (*t)(2,8) = 0.1;
3084 (*t)(0,9) = 0.65; (*t)(1,9) = 0; (*t)(2,9) = 0.15;
3085 (*t)(0,10) = 0.70; (*t)(1,10) = 0.05; (*t)(2,10) = 0.2;
3086 (*t)(0,11) = 0.75; (*t)(1,11) = 0; (*t)(2,11) = 0;
3089 if (fParticleID==AliPID::kProton)
3091 t = new TMatrixF(3,9);
3092 (*t)(0,0) = 0.20; (*t)(1,0) = -0.1; (*t)(2,0) = 0.1;
3093 (*t)(0,1) = 0.25; (*t)(1,1) = -0.2; (*t)(2,1) = 0.2;
3094 (*t)(0,2) = 0.80; (*t)(1,2) = -0.1; (*t)(2,2) = 0.2;
3095 (*t)(0,3) = 0.85; (*t)(1,3) =-0.05; (*t)(2,3) = 0.2;
3096 (*t)(0,4) = 0.90; (*t)(1,4) =-0.05; (*t)(2,4) = 0.25;
3097 (*t)(0,5) = 0.95; (*t)(1,5) =-0.05; (*t)(2,5) = 0.25;
3098 (*t)(0,6) = 1.00; (*t)(1,6) = -0.1; (*t)(2,6) = 0.25;
3099 (*t)(0,7) = 1.10; (*t)(1,7) =-0.05; (*t)(2,7) = 0.3;
3100 (*t)(0,8) = 1.20; (*t)(1,8) = 0; (*t)(2,8) = 0;
3108 if (fParticleID==AliPID::kPion)
3110 //TOF pions, 0.9 purity
3111 t = new TMatrixF(3,61);
3112 (*t)(0,0) = 0.000; (*t)(1,0) = 0.000; (*t)(2,0) = 0.000;
3113 (*t)(0,1) = 0.050; (*t)(1,1) = 0.000; (*t)(2,1) = 0.000;
3114 (*t)(0,2) = 0.100; (*t)(1,2) = 0.000; (*t)(2,2) = 0.000;
3115 (*t)(0,3) = 0.150; (*t)(1,3) = 0.000; (*t)(2,3) = 0.000;
3116 (*t)(0,4) = 0.200; (*t)(1,4) = -0.030; (*t)(2,4) = 0.030;
3117 (*t)(0,5) = 0.250; (*t)(1,5) = -0.036; (*t)(2,5) = 0.032;
3118 (*t)(0,6) = 0.300; (*t)(1,6) = -0.038; (*t)(2,6) = 0.032;
3119 (*t)(0,7) = 0.350; (*t)(1,7) = -0.034; (*t)(2,7) = 0.032;
3120 (*t)(0,8) = 0.400; (*t)(1,8) = -0.032; (*t)(2,8) = 0.020;
3121 (*t)(0,9) = 0.450; (*t)(1,9) = -0.030; (*t)(2,9) = 0.020;
3122 (*t)(0,10) = 0.500; (*t)(1,10) = -0.030; (*t)(2,10) = 0.020;
3123 (*t)(0,11) = 0.550; (*t)(1,11) = -0.030; (*t)(2,11) = 0.020;
3124 (*t)(0,12) = 0.600; (*t)(1,12) = -0.030; (*t)(2,12) = 0.020;
3125 (*t)(0,13) = 0.650; (*t)(1,13) = -0.030; (*t)(2,13) = 0.020;
3126 (*t)(0,14) = 0.700; (*t)(1,14) = -0.030; (*t)(2,14) = 0.020;
3127 (*t)(0,15) = 0.750; (*t)(1,15) = -0.030; (*t)(2,15) = 0.020;
3128 (*t)(0,16) = 0.800; (*t)(1,16) = -0.030; (*t)(2,16) = 0.020;
3129 (*t)(0,17) = 0.850; (*t)(1,17) = -0.030; (*t)(2,17) = 0.020;
3130 (*t)(0,18) = 0.900; (*t)(1,18) = -0.030; (*t)(2,18) = 0.020;
3131 (*t)(0,19) = 0.950; (*t)(1,19) = -0.028; (*t)(2,19) = 0.028;
3132 (*t)(0,20) = 1.000; (*t)(1,20) = -0.028; (*t)(2,20) = 0.028;
3133 (*t)(0,21) = 1.100; (*t)(1,21) = -0.028; (*t)(2,21) = 0.028;
3134 (*t)(0,22) = 1.200; (*t)(1,22) = -0.026; (*t)(2,22) = 0.028;
3135 (*t)(0,23) = 1.300; (*t)(1,23) = -0.024; (*t)(2,23) = 0.028;
3136 (*t)(0,24) = 1.400; (*t)(1,24) = -0.020; (*t)(2,24) = 0.028;
3137 (*t)(0,25) = 1.500; (*t)(1,25) = -0.018; (*t)(2,25) = 0.028;
3138 (*t)(0,26) = 1.600; (*t)(1,26) = -0.016; (*t)(2,26) = 0.028;
3139 (*t)(0,27) = 1.700; (*t)(1,27) = -0.014; (*t)(2,27) = 0.028;
3140 (*t)(0,28) = 1.800; (*t)(1,28) = -0.012; (*t)(2,28) = 0.026;
3141 (*t)(0,29) = 1.900; (*t)(1,29) = -0.010; (*t)(2,29) = 0.026;
3142 (*t)(0,30) = 2.000; (*t)(1,30) = -0.008; (*t)(2,30) = 0.026;
3143 (*t)(0,31) = 2.100; (*t)(1,31) = -0.008; (*t)(2,31) = 0.024;
3144 (*t)(0,32) = 2.200; (*t)(1,32) = -0.006; (*t)(2,32) = 0.024;
3145 (*t)(0,33) = 2.300; (*t)(1,33) = -0.004; (*t)(2,33) = 0.024;
3146 (*t)(0,34) = 2.400; (*t)(1,34) = -0.004; (*t)(2,34) = 0.024;
3147 (*t)(0,35) = 2.500; (*t)(1,35) = -0.002; (*t)(2,35) = 0.024;
3148 (*t)(0,36) = 2.600; (*t)(1,36) = -0.002; (*t)(2,36) = 0.024;
3149 (*t)(0,37) = 2.700; (*t)(1,37) = 0.000; (*t)(2,37) = 0.024;
3150 (*t)(0,38) = 2.800; (*t)(1,38) = 0.000; (*t)(2,38) = 0.026;
3151 (*t)(0,39) = 2.900; (*t)(1,39) = 0.000; (*t)(2,39) = 0.024;
3152 (*t)(0,40) = 3.000; (*t)(1,40) = 0.002; (*t)(2,40) = 0.026;
3153 (*t)(0,41) = 3.100; (*t)(1,41) = 0.002; (*t)(2,41) = 0.026;
3154 (*t)(0,42) = 3.200; (*t)(1,42) = 0.002; (*t)(2,42) = 0.026;
3155 (*t)(0,43) = 3.300; (*t)(1,43) = 0.002; (*t)(2,43) = 0.026;
3156 (*t)(0,44) = 3.400; (*t)(1,44) = 0.002; (*t)(2,44) = 0.026;
3157 (*t)(0,45) = 3.500; (*t)(1,45) = 0.002; (*t)(2,45) = 0.026;
3158 (*t)(0,46) = 3.600; (*t)(1,46) = 0.002; (*t)(2,46) = 0.026;
3159 (*t)(0,47) = 3.700; (*t)(1,47) = 0.002; (*t)(2,47) = 0.026;
3160 (*t)(0,48) = 3.800; (*t)(1,48) = 0.002; (*t)(2,48) = 0.026;
3161 (*t)(0,49) = 3.900; (*t)(1,49) = 0.004; (*t)(2,49) = 0.024;
3162 (*t)(0,50) = 4.000; (*t)(1,50) = 0.004; (*t)(2,50) = 0.026;
3163 (*t)(0,51) = 4.100; (*t)(1,51) = 0.004; (*t)(2,51) = 0.026;
3164 (*t)(0,52) = 4.200; (*t)(1,52) = 0.004; (*t)(2,52) = 0.024;
3165 (*t)(0,53) = 4.300; (*t)(1,53) = 0.006; (*t)(2,53) = 0.024;
3166 (*t)(0,54) = 4.400; (*t)(1,54) = 0.000; (*t)(2,54) = 0.000;
3167 (*t)(0,55) = 4.500; (*t)(1,55) = 0.000; (*t)(2,55) = 0.000;
3168 (*t)(0,56) = 4.600; (*t)(1,56) = 0.000; (*t)(2,56) = 0.000;
3169 (*t)(0,57) = 4.700; (*t)(1,57) = 0.000; (*t)(2,57) = 0.000;
3170 (*t)(0,58) = 4.800; (*t)(1,58) = 0.000; (*t)(2,58) = 0.000;
3171 (*t)(0,59) = 4.900; (*t)(1,59) = 0.000; (*t)(2,59) = 0.000;
3172 (*t)(0,60) = 5.900; (*t)(1,60) = 0.000; (*t)(2,60) = 0.000;
3175 if (fParticleID==AliPID::kProton)
3177 //TOF protons, 0.9 purity
3178 t = new TMatrixF(3,61);
3179 (*t)(0,0) = 0.000; (*t)(1,0) = 0.000; (*t)(2,0) = 0.000;
3180 (*t)(0,1) = 0.050; (*t)(1,1) = 0.000; (*t)(2,1) = 0.000;
3181 (*t)(0,2) = 0.100; (*t)(1,2) = 0.000; (*t)(2,2) = 0.000;
3182 (*t)(0,3) = 0.150; (*t)(1,3) = 0.000; (*t)(2,3) = 0.000;
3183 (*t)(0,4) = 0.200; (*t)(1,4) = -0.07; (*t)(2,4) = 0.07;
3184 (*t)(0,5) = 0.200; (*t)(1,5) = -0.07; (*t)(2,5) = 0.07;
3185 (*t)(0,6) = 0.200; (*t)(1,6) = -0.07; (*t)(2,6) = 0.07;
3186 (*t)(0,7) = 0.200; (*t)(1,7) = -0.07; (*t)(2,7) = 0.07;
3187 (*t)(0,8) = 0.200; (*t)(1,8) = -0.07; (*t)(2,8) = 0.07;
3188 (*t)(0,9) = 0.200; (*t)(1,9) = -0.07; (*t)(2,9) = 0.07;
3189 (*t)(0,10) = 0.200; (*t)(1,10) = -0.07; (*t)(2,10) = 0.07;
3190 (*t)(0,11) = 0.200; (*t)(1,11) = -0.07; (*t)(2,11) = 0.07;
3191 (*t)(0,12) = 0.200; (*t)(1,12) = -0.07; (*t)(2,12) = 0.07;
3192 (*t)(0,13) = 0.200; (*t)(1,13) = -0.07; (*t)(2,13) = 0.07;
3193 (*t)(0,14) = 0.200; (*t)(1,14) = -0.07; (*t)(2,14) = 0.07;
3194 (*t)(0,15) = 0.200; (*t)(1,15) = -0.07; (*t)(2,15) = 0.07;
3195 (*t)(0,16) = 0.200; (*t)(1,16) = -0.07; (*t)(2,16) = 0.07;
3196 (*t)(0,17) = 0.850; (*t)(1,17) = -0.070; (*t)(2,17) = 0.070;
3197 (*t)(0,18) = 0.900; (*t)(1,18) = -0.072; (*t)(2,18) = 0.072;
3198 (*t)(0,19) = 0.950; (*t)(1,19) = -0.072; (*t)(2,19) = 0.072;
3199 (*t)(0,20) = 1.000; (*t)(1,20) = -0.074; (*t)(2,20) = 0.074;
3200 (*t)(0,21) = 1.100; (*t)(1,21) = -0.032; (*t)(2,21) = 0.032;
3201 (*t)(0,22) = 1.200; (*t)(1,22) = -0.026; (*t)(2,22) = 0.026;
3202 (*t)(0,23) = 1.300; (*t)(1,23) = -0.026; (*t)(2,23) = 0.026;
3203 (*t)(0,24) = 1.400; (*t)(1,24) = -0.024; (*t)(2,24) = 0.024;
3204 (*t)(0,25) = 1.500; (*t)(1,25) = -0.024; (*t)(2,25) = 0.024;
3205 (*t)(0,26) = 1.600; (*t)(1,26) = -0.026; (*t)(2,26) = 0.026;
3206 (*t)(0,27) = 1.700; (*t)(1,27) = -0.026; (*t)(2,27) = 0.026;
3207 (*t)(0,28) = 1.800; (*t)(1,28) = -0.026; (*t)(2,28) = 0.026;
3208 (*t)(0,29) = 1.900; (*t)(1,29) = -0.026; (*t)(2,29) = 0.026;
3209 (*t)(0,30) = 2.000; (*t)(1,30) = -0.026; (*t)(2,30) = 0.026;
3210 (*t)(0,31) = 2.100; (*t)(1,31) = -0.026; (*t)(2,31) = 0.026;
3211 (*t)(0,32) = 2.200; (*t)(1,32) = -0.026; (*t)(2,32) = 0.024;
3212 (*t)(0,33) = 2.300; (*t)(1,33) = -0.028; (*t)(2,33) = 0.022;
3213 (*t)(0,34) = 2.400; (*t)(1,34) = -0.028; (*t)(2,34) = 0.020;
3214 (*t)(0,35) = 2.500; (*t)(1,35) = -0.028; (*t)(2,35) = 0.018;
3215 (*t)(0,36) = 2.600; (*t)(1,36) = -0.028; (*t)(2,36) = 0.016;
3216 (*t)(0,37) = 2.700; (*t)(1,37) = -0.028; (*t)(2,37) = 0.016;
3217 (*t)(0,38) = 2.800; (*t)(1,38) = -0.030; (*t)(2,38) = 0.014;
3218 (*t)(0,39) = 2.900; (*t)(1,39) = -0.030; (*t)(2,39) = 0.012;
3219 (*t)(0,40) = 3.000; (*t)(1,40) = -0.030; (*t)(2,40) = 0.012;
3220 (*t)(0,41) = 3.100; (*t)(1,41) = -0.030; (*t)(2,41) = 0.010;
3221 (*t)(0,42) = 3.200; (*t)(1,42) = -0.030; (*t)(2,42) = 0.010;
3222 (*t)(0,43) = 3.300; (*t)(1,43) = -0.030; (*t)(2,43) = 0.010;
3223 (*t)(0,44) = 3.400; (*t)(1,44) = -0.030; (*t)(2,44) = 0.008;
3224 (*t)(0,45) = 3.500; (*t)(1,45) = -0.030; (*t)(2,45) = 0.008;
3225 (*t)(0,46) = 3.600; (*t)(1,46) = -0.030; (*t)(2,46) = 0.008;
3226 (*t)(0,47) = 3.700; (*t)(1,47) = -0.030; (*t)(2,47) = 0.006;
3227 (*t)(0,48) = 3.800; (*t)(1,48) = -0.030; (*t)(2,48) = 0.006;
3228 (*t)(0,49) = 3.900; (*t)(1,49) = -0.030; (*t)(2,49) = 0.006;
3229 (*t)(0,50) = 4.000; (*t)(1,50) = -0.028; (*t)(2,50) = 0.004;
3230 (*t)(0,51) = 4.100; (*t)(1,51) = -0.030; (*t)(2,51) = 0.004;
3231 (*t)(0,52) = 4.200; (*t)(1,52) = -0.030; (*t)(2,52) = 0.004;
3232 (*t)(0,53) = 4.300; (*t)(1,53) = -0.028; (*t)(2,53) = 0.002;
3233 (*t)(0,54) = 4.400; (*t)(1,54) = -0.030; (*t)(2,54) = 0.002;
3234 (*t)(0,55) = 4.500; (*t)(1,55) = -0.028; (*t)(2,55) = 0.002;
3235 (*t)(0,56) = 4.600; (*t)(1,56) = -0.028; (*t)(2,56) = 0.002;
3236 (*t)(0,57) = 4.700; (*t)(1,57) = -0.028; (*t)(2,57) = 0.000;
3237 (*t)(0,58) = 4.800; (*t)(1,58) = -0.028; (*t)(2,58) = 0.002;
3238 (*t)(0,59) = 4.900; (*t)(1,59) = 0.000; (*t)(2,59) = 0.000;
3239 (*t)(0,60) = 5.900; (*t)(1,60) = 0.000; (*t)(2,60) = 0.000;
3242 if (fParticleID==AliPID::kKaon)
3244 //TOF kaons, 0.9 purity
3245 t = new TMatrixF(3,61);
3246 (*t)(0,0) = 0.000; (*t)(1,0) = 0.000; (*t)(2,0) = 0.000;
3247 (*t)(0,1) = 0.050; (*t)(1,1) = 0.000; (*t)(2,1) = 0.000;
3248 (*t)(0,2) = 0.100; (*t)(1,2) = 0.000; (*t)(2,2) = 0.000;
3249 (*t)(0,3) = 0.150; (*t)(1,3) = 0.000; (*t)(2,3) = 0.000;
3250 (*t)(0,4) = 0.200; (*t)(1,4) = -0.05; (*t)(2,4) = 0.05;
3251 (*t)(0,5) = 0.200; (*t)(1,5) = -0.05; (*t)(2,5) = 0.05;
3252 (*t)(0,6) = 0.200; (*t)(1,6) = -0.05; (*t)(2,6) = 0.05;
3253 (*t)(0,7) = 0.200; (*t)(1,7) = -0.05; (*t)(2,7) = 0.05;
3254 (*t)(0,8) = 0.200; (*t)(1,8) = -0.05; (*t)(2,8) = 0.05;
3255 (*t)(0,9) = 0.200; (*t)(1,9) = -0.05; (*t)(2,9) = 0.05;
3256 (*t)(0,10) = 0.200; (*t)(1,10) = -0.05; (*t)(2,10) = 0.05;
3257 (*t)(0,11) = 0.550; (*t)(1,11) = -0.026; (*t)(2,11) = 0.026;
3258 (*t)(0,12) = 0.600; (*t)(1,12) = -0.026; (*t)(2,12) = 0.026;
3259 (*t)(0,13) = 0.650; (*t)(1,13) = -0.026; (*t)(2,13) = 0.026;
3260 (*t)(0,14) = 0.700; (*t)(1,14) = -0.026; (*t)(2,14) = 0.026;
3261 (*t)(0,15) = 0.750; (*t)(1,15) = -0.026; (*t)(2,15) = 0.026;
3262 (*t)(0,16) = 0.800; (*t)(1,16) = -0.026; (*t)(2,16) = 0.026;
3263 (*t)(0,17) = 0.850; (*t)(1,17) = -0.024; (*t)(2,17) = 0.024;
3264 (*t)(0,18) = 0.900; (*t)(1,18) = -0.024; (*t)(2,18) = 0.024;
3265 (*t)(0,19) = 0.950; (*t)(1,19) = -0.024; (*t)(2,19) = 0.024;
3266 (*t)(0,20) = 1.000; (*t)(1,20) = -0.024; (*t)(2,20) = 0.024;
3267 (*t)(0,21) = 1.100; (*t)(1,21) = -0.024; (*t)(2,21) = 0.024;
3268 (*t)(0,22) = 1.200; (*t)(1,22) = -0.024; (*t)(2,22) = 0.022;
3269 (*t)(0,23) = 1.300; (*t)(1,23) = -0.024; (*t)(2,23) = 0.020;
3270 (*t)(0,24) = 1.400; (*t)(1,24) = -0.026; (*t)(2,24) = 0.016;
3271 (*t)(0,25) = 1.500; (*t)(1,25) = -0.028; (*t)(2,25) = 0.014;
3272 (*t)(0,26) = 1.600; (*t)(1,26) = -0.028; (*t)(2,26) = 0.012;
3273 (*t)(0,27) = 1.700; (*t)(1,27) = -0.028; (*t)(2,27) = 0.010;
3274 (*t)(0,28) = 1.800; (*t)(1,28) = -0.028; (*t)(2,28) = 0.010;
3275 (*t)(0,29) = 1.900; (*t)(1,29) = -0.028; (*t)(2,29) = 0.008;
3276 (*t)(0,30) = 2.000; (*t)(1,30) = -0.028; (*t)(2,30) = 0.006;
3277 (*t)(0,31) = 2.100; (*t)(1,31) = -0.026; (*t)(2,31) = 0.006;
3278 (*t)(0,32) = 2.200; (*t)(1,32) = -0.024; (*t)(2,32) = 0.004;
3279 (*t)(0,33) = 2.300; (*t)(1,33) = -0.020; (*t)(2,33) = 0.002;
3280 (*t)(0,34) = 2.400; (*t)(1,34) = -0.020; (*t)(2,34) = 0.002;
3281 (*t)(0,35) = 2.500; (*t)(1,35) = -0.018; (*t)(2,35) = 0.000;
3282 (*t)(0,36) = 2.600; (*t)(1,36) = -0.016; (*t)(2,36) = 0.000;
3283 (*t)(0,37) = 2.700; (*t)(1,37) = -0.014; (*t)(2,37) = -0.002;
3284 (*t)(0,38) = 2.800; (*t)(1,38) = -0.014; (*t)(2,38) = -0.004;
3285 (*t)(0,39) = 2.900; (*t)(1,39) = -0.012; (*t)(2,39) = -0.004;
3286 (*t)(0,40) = 3.000; (*t)(1,40) = -0.010; (*t)(2,40) = -0.006;
3287 (*t)(0,41) = 3.100; (*t)(1,41) = 0.000; (*t)(2,41) = 0.000;
3288 (*t)(0,42) = 3.200; (*t)(1,42) = 0.000; (*t)(2,42) = 0.000;
3289 (*t)(0,43) = 3.300; (*t)(1,43) = 0.000; (*t)(2,43) = 0.000;
3290 (*t)(0,44) = 3.400; (*t)(1,44) = 0.000; (*t)(2,44) = 0.000;
3291 (*t)(0,45) = 3.500; (*t)(1,45) = 0.000; (*t)(2,45) = 0.000;
3292 (*t)(0,46) = 3.600; (*t)(1,46) = 0.000; (*t)(2,46) = 0.000;
3293 (*t)(0,47) = 3.700; (*t)(1,47) = 0.000; (*t)(2,47) = 0.000;
3294 (*t)(0,48) = 3.800; (*t)(1,48) = 0.000; (*t)(2,48) = 0.000;
3295 (*t)(0,49) = 3.900; (*t)(1,49) = 0.000; (*t)(2,49) = 0.000;
3296 (*t)(0,50) = 4.000; (*t)(1,50) = 0.000; (*t)(2,50) = 0.000;
3297 (*t)(0,51) = 4.100; (*t)(1,51) = 0.000; (*t)(2,51) = 0.000;
3298 (*t)(0,52) = 4.200; (*t)(1,52) = 0.000; (*t)(2,52) = 0.000;
3299 (*t)(0,53) = 4.300; (*t)(1,53) = 0.000; (*t)(2,53) = 0.000;
3300 (*t)(0,54) = 4.400; (*t)(1,54) = 0.000; (*t)(2,54) = 0.000;
3301 (*t)(0,55) = 4.500; (*t)(1,55) = 0.000; (*t)(2,55) = 0.000;
3302 (*t)(0,56) = 4.600; (*t)(1,56) = 0.000; (*t)(2,56) = 0.000;
3303 (*t)(0,57) = 4.700; (*t)(1,57) = 0.000; (*t)(2,57) = 0.000;
3304 (*t)(0,58) = 4.800; (*t)(1,58) = 0.000; (*t)(2,58) = 0.000;
3305 (*t)(0,59) = 4.900; (*t)(1,59) = 0.000; (*t)(2,59) = 0.000;
3306 (*t)(0,60) = 5.900; (*t)(1,60) = 0.000; (*t)(2,60) = 0.000;
3313 //-----------------------------------------------------------------------
3314 //-----------------------------------------------------------------------
3315 Bool_t AliFlowTrackCuts::PassesTPCbayesianCut(const AliAODTrack* track)
3317 fBayesianResponse->ComputeProb(track,track->GetAODEvent()); // fCurrCentr is needed for mismatch fraction
3318 Float_t *probabilities = fBayesianResponse->GetProb(); // Bayesian Probability (from 0 to 4) (Combined TPC || TOF) including a tuning of priors and TOF mism$
3320 Int_t kTPC = fBayesianResponse->GetCurrentMask(0); // is TPC on
3322 if(! kTPC) return kFALSE;
3326 switch (fParticleID)
3329 fProbBayes = probabilities[2];
3332 fProbBayes = probabilities[3];
3334 case AliPID::kProton:
3335 fProbBayes = probabilities[4];
3337 case AliPID::kElectron:
3338 fProbBayes = probabilities[0];
3341 fProbBayes = probabilities[1];
3343 case AliPID::kDeuteron:
3344 fProbBayes = probabilities[5];
3346 case AliPID::kTriton:
3347 fProbBayes = probabilities[6];
3350 fProbBayes = probabilities[7];
3356 if(fProbBayes > fParticleProbability){
3359 else if (fCutCharge && fCharge * track->Charge() > 0)
3364 //-----------------------------------------------------------------------
3365 Bool_t AliFlowTrackCuts::PassesTPCbayesianCut(const AliESDtrack* track)
3367 //cut on TPC bayesian pid
3368 //if (! fAllowTOFmismatchFlag) {if (track->GetStatus() & AliESDtrack::kTOFmismatch) return kFALSE;}
3370 //Bool_t statusMatchingHard = TPCTOFagree(track);
3371 //if (fRequireStrictTOFTPCagreement && (!statusMatchingHard))
3373 fBayesianResponse->ComputeProb(track,fCurrCentr); // fCurrCentr is needed for mismatch fraction
3374 Int_t kTPC = fBayesianResponse->GetCurrentMask(0); // is TPC on
3375 //Int_t kTOF = fBayesianResponse->GetCurrentMask(1); // is TOF on
3377 if(! kTPC) return kFALSE;
3379 // Bool_t statusMatchingHard = 1;
3380 // Float_t mismProb = 0;
3382 // statusMatchingHard = TPCTOFagree(track);
3383 // mismProb = fBayesianResponse->GetTOFMismProb();
3385 // if (fRequireStrictTOFTPCagreement && (!statusMatchingHard))
3388 Float_t *probabilities = fBayesianResponse->GetProb(); // Bayesian Probability (from 0 to 4) (Combined TPC || TOF) including a tuning of priors and TOF mismatch parameterization
3392 switch (fParticleID)
3395 fProbBayes = probabilities[2];
3398 fProbBayes = probabilities[3];
3400 case AliPID::kProton:
3401 fProbBayes = probabilities[4];
3403 case AliPID::kElectron:
3404 fProbBayes = probabilities[0];
3407 fProbBayes = probabilities[1];
3409 case AliPID::kDeuteron:
3410 fProbBayes = probabilities[5];
3412 case AliPID::kTriton:
3413 fProbBayes = probabilities[6];
3416 fProbBayes = probabilities[7];
3422 if(fProbBayes > fParticleProbability)
3426 else if (fCutCharge && fCharge * track->GetSign() > 0)
3431 //-----------------------------------------------------------------------
3432 Bool_t AliFlowTrackCuts::PassesTOFbayesianCut(const AliAODTrack* track)
3434 //check is track passes bayesian combined TOF+TPC pid cut
3435 Bool_t goodtrack = (track->GetStatus() & AliESDtrack::kTOFout) &&
3436 (track->GetStatus() & AliESDtrack::kTIME) &&
3437 (track->GetTOFsignal() > 12000) &&
3438 (track->GetTOFsignal() < 100000);
3443 Bool_t statusMatchingHard = TPCTOFagree(track);
3444 if (fRequireStrictTOFTPCagreement && (!statusMatchingHard))
3447 fBayesianResponse->ComputeProb(track,track->GetAODEvent()); // fCurrCentr is needed for mismatch fraction
3448 Float_t *probabilities = fBayesianResponse->GetProb(); // Bayesian Probability (from 0 to 4) (Combined TPC || TOF) including a tuning of priors and TOF mism$
3450 Float_t mismProb = fBayesianResponse->GetTOFMismProb(); // mismatch Bayesian probabilities
3454 switch (fParticleID)
3457 fProbBayes = probabilities[2];
3460 fProbBayes = probabilities[3];
3462 case AliPID::kProton:
3463 fProbBayes = probabilities[4];
3465 case AliPID::kElectron:
3466 fProbBayes = probabilities[0];
3469 fProbBayes = probabilities[1];
3471 case AliPID::kDeuteron:
3472 fProbBayes = probabilities[5];
3474 case AliPID::kTriton:
3475 fProbBayes = probabilities[6];
3478 fProbBayes = probabilities[7];
3484 if(fProbBayes > fParticleProbability && mismProb < 0.5){
3487 else if (fCutCharge && fCharge * track->Charge() > 0)
3493 //-----------------------------------------------------------------------
3494 // part added by F. Noferini (some methods)
3495 Bool_t AliFlowTrackCuts::PassesTOFbayesianCut(const AliESDtrack* track)
3497 //check is track passes bayesian combined TOF+TPC pid cut
3498 Bool_t goodtrack = (track->GetStatus() & AliESDtrack::kTOFout) &&
3499 (track->GetStatus() & AliESDtrack::kTIME) &&
3500 (track->GetTOFsignal() > 12000) &&
3501 (track->GetTOFsignal() < 100000) &&
3502 (track->GetIntegratedLength() > 365);
3507 if (! fAllowTOFmismatchFlag) {if (track->GetStatus() & AliESDtrack::kTOFmismatch) return kFALSE;}
3509 Bool_t statusMatchingHard = TPCTOFagree(track);
3510 if (fRequireStrictTOFTPCagreement && (!statusMatchingHard))
3513 fBayesianResponse->ComputeProb(track,fCurrCentr); // fCurrCentr is needed for mismatch fraction
3514 Float_t *probabilities = fBayesianResponse->GetProb(); // Bayesian Probability (from 0 to 4) (Combined TPC || TOF) including a tuning of priors and TOF mismatch parameterization
3516 Float_t mismProb = fBayesianResponse->GetTOFMismProb(); // mismatch Bayesian probabilities
3520 switch (fParticleID)
3523 fProbBayes = probabilities[2];
3526 fProbBayes = probabilities[3];
3528 case AliPID::kProton:
3529 fProbBayes = probabilities[4];
3531 case AliPID::kElectron:
3532 fProbBayes = probabilities[0];
3535 fProbBayes = probabilities[1];
3537 case AliPID::kDeuteron:
3538 fProbBayes = probabilities[5];
3540 case AliPID::kTriton:
3541 fProbBayes = probabilities[6];
3544 fProbBayes = probabilities[7];
3550 // 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);
3551 if(fProbBayes > fParticleProbability && mismProb < 0.5){
3554 else if (fCutCharge && fCharge * track->GetSign() > 0)
3561 //-----------------------------------------------------------------------
3562 // part added by Natasha
3563 Bool_t AliFlowTrackCuts::PassesNucleiSelection(const AliESDtrack* track)
3565 //pid selection for heavy nuclei
3566 Bool_t select=kFALSE;
3568 //if (!track) continue;
3570 if (!track->GetInnerParam())
3571 return kFALSE; //break;
3573 const AliExternalTrackParam* tpcTrack = track->GetInnerParam();
3575 Double_t ptotTPC = tpcTrack->GetP();
3576 Double_t sigTPC = track->GetTPCsignal();
3577 Double_t dEdxBBA = 0.;
3578 Double_t dSigma = 0.;
3580 switch (fParticleID)
3582 case AliPID::kDeuteron:
3584 dEdxBBA = AliExternalTrackParam::BetheBlochAleph(ptotTPC/1.8756,
3590 dSigma = (sigTPC - dEdxBBA)/dEdxBBA;
3592 if( ptotTPC<=1.1 && (dSigma < (0.5 - (0.1818*ptotTPC)) ) && (dSigma > ( (0.218*ptotTPC - 0.4) ) ) )
3596 case AliPID::kTriton:
3603 // ----- Pass 2 -------
3604 dEdxBBA = 4.0 * AliExternalTrackParam::BetheBlochAleph( (2.*ptotTPC)/2.8084,
3610 dSigma = (sigTPC - dEdxBBA)/dEdxBBA;
3611 if(ptotTPC<=5.0 && (dSigma >= (-0.03968*ptotTPC - 0.1)) && (dSigma <= (0.31 - 0.0217*ptotTPC)))
3615 case AliPID::kAlpha:
3626 // end part added by Natasha
3627 //-----------------------------------------------------------------------
3628 Bool_t AliFlowTrackCuts::PassesTPCTOFNsigmaCut(const AliAODTrack* track)
3630 // do a simple combined cut on the n sigma from tpc and tof
3631 // with information of the pid response object (needs pid response task)
3632 // stub, not implemented yet
3633 if(!fPIDResponse) return kFALSE;
3634 if(!track) return kFALSE;
3637 if ((track->GetStatus()&AliVTrack::kTOFout)==0) return kFALSE;
3638 if ((track->GetStatus()&AliVTrack::kTIME)==0) return kFALSE;
3641 if(track->GetTPCsignal() < 10) return kFALSE;
3643 Float_t nsigmaTPC = fPIDResponse->NumberOfSigmas(AliPIDResponse::kTPC,track,fParticleID);
3644 Float_t nsigmaTOF = fPIDResponse->NumberOfSigmas(AliPIDResponse::kTOF,track,fParticleID);
3646 Float_t nsigma2 = nsigmaTPC*nsigmaTPC + nsigmaTOF*nsigmaTOF;
3648 return (nsigma2 < fNsigmaCut2);
3651 //-----------------------------------------------------------------------------
3652 Bool_t AliFlowTrackCuts::PassesTPCTOFNsigmaCut(const AliESDtrack* track)
3654 // do a simple combined cut on the n sigma from tpc and tof
3655 // with information of the pid response object (needs pid response task)
3656 // stub, not implemented yet
3657 if(!fPIDResponse) return kFALSE;
3658 if(!track) return kFALSE;
3661 if ((track->GetStatus()&AliVTrack::kTOFout)==0) return kFALSE;
3662 if ((track->GetStatus()&AliVTrack::kTIME)==0) return kFALSE;
3665 if(track->GetTPCsignal() < 10) return kFALSE;
3667 Float_t nsigmaTPC = fPIDResponse->NumberOfSigmas(AliPIDResponse::kTPC,track,fParticleID);
3668 Float_t nsigmaTOF = fPIDResponse->NumberOfSigmas(AliPIDResponse::kTOF,track,fParticleID);
3670 Float_t nsigma2 = nsigmaTPC*nsigmaTPC + nsigmaTOF*nsigmaTOF;
3672 return (nsigma2 < fNsigmaCut2);
3675 //-----------------------------------------------------------------------------
3676 Bool_t AliFlowTrackCuts::PassesTPCTOFNsigmaCutPuritybased(const AliAODTrack* track)
3678 // do a combined cut on the n sigma from tpc and tof based on purity of the identified particle. (Particle is selected if Purity>0.8)
3679 // with information of the pid response object (needs pid response task)
3681 if(!fPIDResponse) return kFALSE;
3682 if(!track) return kFALSE;
3683 if(!fUseTPCTOFNsigmaCutContours) return kFALSE;
3686 Bool_t pWithinRange = kFALSE;
3689 for(int b=0;b<50;b++){pBins[b] = 0.1*b;}
3690 for(int i=0;i<49;i++){ // fixed from <50 14012015 to avoid out-of-bounds RAB
3691 if(track->P()>pBins[i] && track->P()<(pBins[i+1])){
3696 switch (fParticleID)
3704 case AliPID::kProton:
3711 Double_t LowPtPIDTPCnsigLow_Pion[6] = {-3,-3,-3,-3,-3,-3};
3712 Double_t LowPtPIDTPCnsigLow_Kaon[6] = {-3,-2,0,-1.8,-1.2,-0.8}; //for0.4<Pt<0.5 the purity is lower than 0.7
3713 Double_t LowPtPIDTPCnsigHigh_Pion[6] ={2.4,3,3,3,2,1.4};
3714 Double_t LowPtPIDTPCnsigHigh_Kaon[6] ={3,2.2,0,-0.2,1,1.8}; //for 0.4<Pt<0.5 he purity is lower than 0.7
3716 Double_t nSigmaTOF=fPIDResponse->NumberOfSigmasTOF(track, (AliPID::EParticleType)ispecie);
3717 Double_t nSigmaTPC=fPIDResponse->NumberOfSigmasTPC(track, (AliPID::EParticleType)ispecie);
3720 if ( (track->IsOn(AliAODTrack::kITSin)) && (track->IsOn(AliAODTrack::kTOFpid))){
3721 if(p_bin<0) return kFALSE;
3722 if(!fCutContour[p_bin]) cout<<"fCutContour[p_bin] does not exist"<<endl;
3724 if(p_bin==4 || p_bin>7){
3725 if(fCutContour[p_bin]->IsInside(nSigmaTOF,nSigmaTPC)){
3733 if(p_bin<8 && p_bin!=4){
3734 if(fParticleID==AliPID::kPion && nSigmaTPC>LowPtPIDTPCnsigLow_Pion[p_bin-2] && nSigmaTPC<LowPtPIDTPCnsigHigh_Pion[p_bin-2]){
3737 if(fParticleID==AliPID::kKaon && nSigmaTPC>LowPtPIDTPCnsigLow_Kaon[p_bin-2] && nSigmaTPC<LowPtPIDTPCnsigHigh_Kaon[p_bin-2]){return kTRUE;}
3739 if(fParticleID==AliPID::kProton && nSigmaTPC>-3 && nSigmaTPC<3){return kTRUE;}
3745 //-----------------------------------------------------------------------
3746 void AliFlowTrackCuts::SetPriors(Float_t centrCur){
3747 //set priors for the bayesian pid selection
3748 fCurrCentr = centrCur;
3750 fBinLimitPID[0] = 0.300000;
3751 fBinLimitPID[1] = 0.400000;
3752 fBinLimitPID[2] = 0.500000;
3753 fBinLimitPID[3] = 0.600000;
3754 fBinLimitPID[4] = 0.700000;
3755 fBinLimitPID[5] = 0.800000;
3756 fBinLimitPID[6] = 0.900000;
3757 fBinLimitPID[7] = 1.000000;
3758 fBinLimitPID[8] = 1.200000;
3759 fBinLimitPID[9] = 1.400000;
3760 fBinLimitPID[10] = 1.600000;
3761 fBinLimitPID[11] = 1.800000;
3762 fBinLimitPID[12] = 2.000000;
3763 fBinLimitPID[13] = 2.200000;
3764 fBinLimitPID[14] = 2.400000;
3765 fBinLimitPID[15] = 2.600000;
3766 fBinLimitPID[16] = 2.800000;
3767 fBinLimitPID[17] = 3.000000;
3880 else if(centrCur < 20){
3990 else if(centrCur < 30){
4100 else if(centrCur < 40){
4210 else if(centrCur < 50){
4320 else if(centrCur < 60){
4430 else if(centrCur < 70){
4540 else if(centrCur < 80){
4760 for(Int_t i=18;i<fgkPIDptBin;i++){
4761 fBinLimitPID[i] = 3.0 + 0.2 * (i-18);
4762 fC[i][0] = fC[17][0];
4763 fC[i][1] = fC[17][1];
4764 fC[i][2] = fC[17][2];
4765 fC[i][3] = fC[17][3];
4766 fC[i][4] = fC[17][4];
4770 //---------------------------------------------------------------//
4771 Bool_t AliFlowTrackCuts::TPCTOFagree(const AliVTrack *track)
4773 //check pid agreement between TPC and TOF
4774 Bool_t status = kFALSE;
4776 const Float_t c = 2.99792457999999984e-02;
4778 Float_t mass[5] = {5.10998909999999971e-04,1.05658000000000002e-01,1.39570000000000000e-01,4.93676999999999977e-01,9.38271999999999995e-01};
4781 Double_t exptimes[9];
4782 track->GetIntegratedTimes(exptimes);
4784 Float_t dedx = track->GetTPCsignal();
4786 Float_t p = track->P();
4787 Float_t time = track->GetTOFsignal()- fESDpid.GetTOFResponse().GetStartTime(p);
4788 Float_t tl = exptimes[0]*c; // to work both for ESD and AOD
4790 Float_t betagammares = fESDpid.GetTOFResponse().GetExpectedSigma(p, exptimes[4], mass[4]);
4792 Float_t betagamma1 = tl/(time-5 *betagammares) * 33.3564095198152043;
4794 // printf("betagamma1 = %f\n",betagamma1);
4796 if(betagamma1 < 0.1) betagamma1 = 0.1;
4798 if(betagamma1 < 0.99999) betagamma1 /= TMath::Sqrt(1-betagamma1*betagamma1);
4799 else betagamma1 = 100;
4801 Float_t betagamma2 = tl/(time+5 *betagammares) * 33.3564095198152043;
4802 // printf("betagamma2 = %f\n",betagamma2);
4804 if(betagamma2 < 0.1) betagamma2 = 0.1;
4806 if(betagamma2 < 0.99999) betagamma2 /= TMath::Sqrt(1-betagamma2*betagamma2);
4807 else betagamma2 = 100;
4810 Float_t momtpc=track->GetTPCmomentum();
4812 for(Int_t i=0;i < 5;i++){
4813 Float_t resolutionTOF = fESDpid.GetTOFResponse().GetExpectedSigma(p, exptimes[i], mass[i]);
4814 if(TMath::Abs(exptimes[i] - time) < 5 * resolutionTOF){
4815 Float_t dedxExp = 0;
4816 if(i==0) dedxExp = fESDpid.GetTPCResponse().GetExpectedSignal(momtpc,AliPID::kElectron);
4817 else if(i==1) dedxExp = fESDpid.GetTPCResponse().GetExpectedSignal(momtpc,AliPID::kMuon);
4818 else if(i==2) dedxExp = fESDpid.GetTPCResponse().GetExpectedSignal(momtpc,AliPID::kPion);
4819 else if(i==3) dedxExp = fESDpid.GetTPCResponse().GetExpectedSignal(momtpc,AliPID::kKaon);
4820 else if(i==4) dedxExp = fESDpid.GetTPCResponse().GetExpectedSignal(momtpc,AliPID::kProton);
4822 Float_t resolutionTPC = 2;
4823 if(i==0) resolutionTPC = fESDpid.GetTPCResponse().GetExpectedSigma(momtpc,track->GetTPCsignalN(),AliPID::kElectron);
4824 else if(i==1) resolutionTPC = fESDpid.GetTPCResponse().GetExpectedSigma(momtpc,track->GetTPCsignalN(),AliPID::kMuon);
4825 else if(i==2) resolutionTPC = fESDpid.GetTPCResponse().GetExpectedSigma(momtpc,track->GetTPCsignalN(),AliPID::kPion);
4826 else if(i==3) resolutionTPC = fESDpid.GetTPCResponse().GetExpectedSigma(momtpc,track->GetTPCsignalN(),AliPID::kKaon);
4827 else if(i==4) resolutionTPC = fESDpid.GetTPCResponse().GetExpectedSigma(momtpc,track->GetTPCsignalN(),AliPID::kProton);
4829 if(TMath::Abs(dedx - dedxExp) < 3 * resolutionTPC){
4835 Float_t bb1 = fESDpid.GetTPCResponse().Bethe(betagamma1);
4836 Float_t bb2 = fESDpid.GetTPCResponse().Bethe(betagamma2);
4837 Float_t bbM = fESDpid.GetTPCResponse().Bethe((betagamma1+betagamma2)*0.5);
4842 Float_t resolutionTOFpr = fESDpid.GetTOFResponse().GetExpectedSigma(p, exptimes[4], mass[4]);
4843 Float_t resolutionTPCpr = fESDpid.GetTPCResponse().GetExpectedSigma(momtpc,track->GetTPCsignalN(),AliPID::kProton);
4844 if(TMath::Abs(dedx-bb1) < resolutionTPCpr*3 && exptimes[4] < time-7*resolutionTOFpr){
4847 else if(TMath::Abs(dedx-bb2) < resolutionTPCpr*3 && exptimes[4] < time-7*resolutionTOFpr){
4850 else if(TMath::Abs(dedx-bbM) < resolutionTPCpr*3 && exptimes[4] < time-7*resolutionTOFpr){
4856 // end part added by F. Noferini
4857 //-----------------------------------------------------------------------
4859 //-----------------------------------------------------------------------
4860 const char* AliFlowTrackCuts::PIDsourceName(PIDsource s)
4862 //get the name of the particle id source
4868 return "TPCbayesian";
4876 return "TOFbayesianPID";
4877 case kTOFbetaSimple:
4878 return "TOFbetaSimple";
4882 return "TPCTOFNsigma";
4883 case kTPCTOFNsigmaPuritybased:
4884 return "TPCTOFNsigmaPuritybased";
4890 //-----------------------------------------------------------------------
4891 const char* AliFlowTrackCuts::GetParamTypeName(trackParameterType type)
4893 //return the name of the selected parameter type
4900 case kTPCstandalone:
4901 return "TPCstandalone";
4903 return "SPDtracklets";
4908 case kMUON: // XZhang 20120604
4909 return "MUON"; // XZhang 20120604
4919 //-----------------------------------------------------------------------
4920 Bool_t AliFlowTrackCuts::PassesPMDcuts(const AliESDPmdTrack* track )
4922 //check PMD specific cuts
4923 //clean up from last iteration, and init label
4924 Int_t det = track->GetDetector();
4925 //Int_t smn = track->GetSmn();
4926 Float_t clsX = track->GetClusterX();
4927 Float_t clsY = track->GetClusterY();
4928 Float_t clsZ = track->GetClusterZ();
4929 Float_t ncell = track->GetClusterCells();
4930 Float_t adc = track->GetClusterADC();
4936 fTrackEta = GetPmdEta(clsX,clsY,clsZ);
4937 fTrackPhi = GetPmdPhi(clsX,clsY);
4941 if (fCutEta) {if ( fTrackEta < fEtaMin || fTrackEta >= fEtaMax ) pass = kFALSE;}
4942 if (fCutPhi) {if ( fTrackPhi < fPhiMin || fTrackPhi >= fPhiMax ) pass = kFALSE;}
4943 if (fCutPmdDet) {if(det != fPmdDet) pass = kFALSE;}
4944 if (fCutPmdAdc) {if(adc < fPmdAdc) pass = kFALSE;}
4945 if (fCutPmdNcell) {if(ncell < fPmdNcell) pass = kFALSE;}
4950 //-----------------------------------------------------------------------
4951 Bool_t AliFlowTrackCuts::PassesVZEROcuts(Int_t id)
4954 if (id<0) return kFALSE;
4956 //clean up from last iter
4959 fTrackPhi = TMath::PiOver4()*(0.5+id%8);
4961 // 10102013 weighting vzero tiles - rbertens@cern.ch
4962 if(!fVZEROgainEqualization) {
4963 // if for some reason the equalization is not initialized (e.g. 2011 data)
4964 // the fVZEROxpol[] weights are used to enable or disable vzero rings
4965 if(id<32) { // v0c side
4966 fTrackEta = -3.45+0.5*(id/8);
4967 if(id < 8) fTrackWeight = fEvent->GetVZEROEqMultiplicity(id)*fVZEROCpol[0];
4968 else if (id < 16 ) fTrackWeight = fEvent->GetVZEROEqMultiplicity(id)*fVZEROCpol[1];
4969 else if (id < 24 ) fTrackWeight = fEvent->GetVZEROEqMultiplicity(id)*fVZEROCpol[2];
4970 else if (id < 32 ) fTrackWeight = fEvent->GetVZEROEqMultiplicity(id)*fVZEROCpol[3];
4971 } else { // v0a side
4972 fTrackEta = +4.8-0.6*((id/8)-4);
4973 if( id < 40) fTrackWeight = fEvent->GetVZEROEqMultiplicity(id)*fVZEROApol[0];
4974 else if ( id < 48 ) fTrackWeight = fEvent->GetVZEROEqMultiplicity(id)*fVZEROApol[1];
4975 else if ( id < 56 ) fTrackWeight = fEvent->GetVZEROEqMultiplicity(id)*fVZEROApol[2];
4976 else if ( id < 64 ) fTrackWeight = fEvent->GetVZEROEqMultiplicity(id)*fVZEROApol[3];
4978 } else { // the equalization is initialized
4979 // note that disabled rings have already been excluded on calibration level in
4980 // AliFlowEvent (so for a disabled ring, fVZEROxpol is zero
4981 if(id<32) { // v0c side
4982 fTrackEta = -3.45+0.5*(id/8);
4983 if(id < 8) fTrackWeight = fEvent->GetVZEROData()->GetMultiplicity(id)*fVZEROCpol[0]/fVZEROgainEqualization->GetBinContent(1+id);
4984 else if (id < 16 ) fTrackWeight = fEvent->GetVZEROData()->GetMultiplicity(id)*fVZEROCpol[1]/fVZEROgainEqualization->GetBinContent(1+id);
4985 else if (id < 24 ) fTrackWeight = fEvent->GetVZEROData()->GetMultiplicity(id)*fVZEROCpol[2]/fVZEROgainEqualization->GetBinContent(1+id);
4986 else if (id < 32 ) fTrackWeight = fEvent->GetVZEROData()->GetMultiplicity(id)*fVZEROCpol[3]/fVZEROgainEqualization->GetBinContent(1+id);
4987 } else { // v0a side
4988 fTrackEta = +4.8-0.6*((id/8)-4);
4989 if( id < 40) fTrackWeight = fEvent->GetVZEROData()->GetMultiplicity(id)*fVZEROApol[0]/fVZEROgainEqualization->GetBinContent(1+id);
4990 else if ( id < 48 ) fTrackWeight = fEvent->GetVZEROData()->GetMultiplicity(id)*fVZEROApol[1]/fVZEROgainEqualization->GetBinContent(1+id);
4991 else if ( id < 56 ) fTrackWeight = fEvent->GetVZEROData()->GetMultiplicity(id)*fVZEROApol[2]/fVZEROgainEqualization->GetBinContent(1+id);
4992 else if ( id < 64 ) fTrackWeight = fEvent->GetVZEROData()->GetMultiplicity(id)*fVZEROApol[3]/fVZEROgainEqualization->GetBinContent(1+id);
4994 // printf ( " tile %i and weight %.2f \n", id, fTrackWeight);
4997 if (fLinearizeVZEROresponse && id < 64)
4999 //this is only needed in pass1 of LHC10h
5000 Float_t multVZERO[fgkNumberOfVZEROtracks];
5002 AliESDUtils::GetCorrV0((AliESDEvent*)fEvent,dummy,multVZERO);
5003 fTrackWeight = multVZERO[id];
5007 if (fCutEta) {if ( fTrackEta < fEtaMin || fTrackEta >= fEtaMax ) pass = kFALSE;}
5008 if (fCutPhi) {if ( fTrackPhi < fPhiMin || fTrackPhi >= fPhiMax ) pass = kFALSE;}
5013 //-----------------------------------------------------------------------------
5014 Bool_t AliFlowTrackCuts::PassesMuonCuts(AliVParticle* vparticle)
5018 fTrackLabel = (fFakesAreOK)?TMath::Abs(vparticle->GetLabel()):vparticle->GetLabel();
5019 if (fMCevent) fMCparticle = static_cast<AliMCParticle*>(fMCevent->GetTrack(fTrackLabel));
5020 else fMCparticle=NULL;
5022 AliESDMuonTrack *esdTrack = dynamic_cast<AliESDMuonTrack*>(vparticle);
5023 AliAODTrack *aodTrack = dynamic_cast<AliAODTrack*>(vparticle);
5024 if ((!esdTrack) && (!aodTrack)) return kFALSE;
5025 if (!fMuonTrackCuts->IsSelected(vparticle)) return kFALSE;
5026 HandleVParticle(vparticle); if (!fTrack) return kFALSE;
5030 //----------------------------------------------------------------------------//
5031 Double_t AliFlowTrackCuts::GetPmdEta(Float_t xPos, Float_t yPos, Float_t zPos)
5033 //get PMD "track" eta coordinate
5034 Float_t rpxpy, theta, eta;
5035 rpxpy = TMath::Sqrt(xPos*xPos + yPos*yPos);
5036 theta = TMath::ATan2(rpxpy,zPos);
5037 eta = -TMath::Log(TMath::Tan(0.5*theta));
5041 //--------------------------------------------------------------------------//
5042 Double_t AliFlowTrackCuts::GetPmdPhi(Float_t xPos, Float_t yPos)
5044 //Get PMD "track" phi coordinate
5045 Float_t pybypx, phi = 0., phi1;
5048 if(yPos>0) phi = 90.;
5049 if(yPos<0) phi = 270.;
5054 if(pybypx < 0) pybypx = - pybypx;
5055 phi1 = TMath::ATan(pybypx)*180./3.14159;
5057 if(xPos > 0 && yPos > 0) phi = phi1; // 1st Quadrant
5058 if(xPos < 0 && yPos > 0) phi = 180 - phi1; // 2nd Quadrant
5059 if(xPos < 0 && yPos < 0) phi = 180 + phi1; // 3rd Quadrant
5060 if(xPos > 0 && yPos < 0) phi = 360 - phi1; // 4th Quadrant
5063 phi = phi*3.14159/180.;
5067 //---------------------------------------------------------------//
5068 void AliFlowTrackCuts::Browse(TBrowser* b)
5070 //some browsing capabilities
5071 if (fQA) b->Add(fQA);
5074 //---------------------------------------------------------------//
5075 Long64_t AliFlowTrackCuts::Merge(TCollection* list)
5078 if (!fQA || !list) return 0;
5079 if (list->IsEmpty()) return 0;
5080 AliFlowTrackCuts* obj=NULL;
5083 while ( (obj = dynamic_cast<AliFlowTrackCuts*>(next())) )
5085 if (obj==this) continue;
5086 tmplist.Add(obj->GetQA());
5088 return fQA->Merge(&tmplist);
5090 //________________________________________________________________//
5091 void AliFlowTrackCuts::GetTPCTOFPIDContours()
5093 fContoursFile = TFile::Open(Form("$ALICE_ROOT/PWGCF/FLOW/database/PIDCutContours_%i-%i.root",fCentralityPercentileMin,fCentralityPercentileMax));
5094 fCutContourList=(TDirectory*)fContoursFile->Get("Filterbit1");
5095 if(!fCutContourList){printf("The contour file is empty"); return;}
5097 Double_t pBinning[50];
5098 for(int b=0;b<50;b++){pBinning[b]=b;}
5099 TString species[3] = {"pion","kaon","proton"};
5100 TList *Species_contours[3];
5102 for(ispecie = 0; ispecie < 3; ispecie++) {
5103 Species_contours[ispecie] = (TList*)fCutContourList->Get(species[ispecie]);
5104 if(!Species_contours[ispecie]) {
5105 cout<<"Contours for species: "<<species[ispecie]<<" not found!!!"<<endl;
5109 Int_t iParticle = 0;
5111 switch (fParticleID)
5119 case AliPID::kProton:
5127 for(int i=0;i<50;i++){
5129 TString Graph_Name = "contourlines_";
5130 Graph_Name += species[iParticle];
5131 Graph_Name += Form("%.f%.f-%i%icent",pBinning[i],pBinning[i]+1,fCentralityPercentileMin,fCentralityPercentileMax);
5132 fCutGraph[i] = (TGraph*)Species_contours[iParticle]->FindObject(Graph_Name);
5134 if(!fCutGraph[i]){cout<<"Contour Graph does not exist"<<endl; continue;}
5136 fCutContour[i] = new TCutG(Graph_Name.Data(),fCutGraph[i]->GetN(),fCutGraph[i]->GetX(),fCutGraph[i]->GetY());
5141 //__________________
5142 Int_t AliFlowTrackCuts::MaxSharedITSClusterCuts(Int_t maxITSclusterShared, AliESDtrack* track){
5144 Int_t counterForSharedCluster = 0;
5145 for(int i =0;i<6;i++){
5146 Bool_t sharedITSCluster = track->HasSharedPointOnITSLayer(i);
5147 Bool_t PointOnITSLayer = track->HasPointOnITSLayer(i);
5148 // cout << "has a point??? " << PointOnITSLayer << " is it shared or not??? " << sharedITSCluster << endl;
5149 if(sharedITSCluster == 1) counterForSharedCluster++;
5151 //if(counterForSharedCluster >= maxITSclusterShared) pass=kFALSE;
5153 return counterForSharedCluster;
5156 //___________________
5157 Double_t AliFlowTrackCuts::MaxChi2perITSClusterCuts(Double_t maxITSChi2, AliESDtrack* track){
5159 // cout << " Total Shared Cluster == " <<counterForSharedCluster<< endl;
5160 Double_t chi2perClusterITS = track->GetITSchi2()/track->GetNcls(0);
5161 // cout << " chi2perClusterITS == " <<chi2perClusterITS <<endl;
5164 //if(chi2perClusterITS >= maxITSChi2) pass=kFALSE;
5166 return chi2perClusterITS;