]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWG2/FLOW/AliFlowTasks/AliFlowTrackCuts.cxx
Macros to plot QA train output
[u/mrichter/AliRoot.git] / PWG2 / FLOW / AliFlowTasks / AliFlowTrackCuts.cxx
CommitLineData
daf66719 1/**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3 * *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
6 * *
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 **************************************************************************/
15
16/* $Id$ */
17
18// AliFlowTrackCuts:
19// ESD track cuts for flow framework
20//
21// origin: Mikolaj Krzewicki (mikolaj.krzewicki@cern.ch)
5559ce24 22//
23// This class gurantees consistency of cut methods, trackparameter
24// selection (global tracks, TPC only, etc..) and parameter mixing
25// in the flow framework. Transparently handles different input types:
26// ESD, MC, AOD.
27// This class works in 2 steps: first the requested track parameters are
28// constructed (to be set by SetParamType() ), then cuts are applied.
29// the constructed track can be requested AFTER checking the cuts by
30// calling GetTrack(), in this case the cut object stays in control,
31// caller does not have to delete the track.
32// Additionally caller can request an AliFlowTrack object to be constructed
33// according the parameter mixing scenario requested by SetParamMix().
34// AliFlowTrack is made using MakeFlowTrack() method, its an 'object factory'
35// so caller needs to take care of the freshly created object.
daf66719 36
37#include <limits.h>
38#include <float.h>
32b846cd 39#include <TMatrix.h>
875ee12a 40#include "TMCProcess.h"
9a0783cc 41#include "TParticle.h"
1a80f9f6 42#include "TH2F.h"
9a0783cc 43#include "AliStack.h"
499fe731 44#include "TBrowser.h"
daf66719 45#include "AliMCEvent.h"
9a0783cc 46#include "AliESDEvent.h"
daf66719 47#include "AliVParticle.h"
48#include "AliMCParticle.h"
49#include "AliESDtrack.h"
12b2b8bc 50#include "AliMultiplicity.h"
daf66719 51#include "AliAODTrack.h"
52#include "AliFlowTrack.h"
53#include "AliFlowTrackCuts.h"
54#include "AliLog.h"
32b846cd 55#include "AliESDpid.h"
d148af7e 56#include "AliESDPmdTrack.h"
22289738 57#include "AliESDVZERO.h"
daf66719 58
59ClassImp(AliFlowTrackCuts)
60
61//-----------------------------------------------------------------------
62AliFlowTrackCuts::AliFlowTrackCuts():
441ea1cf 63 AliFlowTrackSimpleCuts(),
64 fAliESDtrackCuts(NULL),
65 fQA(NULL),
66 fCutMC(kFALSE),
f21bdf48 67 fCutMChasTrackReferences(kFALSE),
441ea1cf 68 fCutMCprocessType(kFALSE),
69 fMCprocessType(kPNoProcess),
70 fCutMCPID(kFALSE),
71 fMCPID(0),
a14b8f3c 72 fIgnoreSignInMCPID(kFALSE),
441ea1cf 73 fCutMCisPrimary(kFALSE),
74 fRequireTransportBitForPrimaries(kTRUE),
75 fMCisPrimary(kFALSE),
76 fRequireCharge(kFALSE),
77 fFakesAreOK(kTRUE),
78 fCutSPDtrackletDeltaPhi(kFALSE),
79 fSPDtrackletDeltaPhiMax(FLT_MAX),
80 fSPDtrackletDeltaPhiMin(-FLT_MAX),
81 fIgnoreTPCzRange(kFALSE),
82 fIgnoreTPCzRangeMax(FLT_MAX),
83 fIgnoreTPCzRangeMin(-FLT_MAX),
84 fCutChi2PerClusterTPC(kFALSE),
85 fMaxChi2PerClusterTPC(FLT_MAX),
86 fMinChi2PerClusterTPC(-FLT_MAX),
87 fCutNClustersTPC(kFALSE),
88 fNClustersTPCMax(INT_MAX),
89 fNClustersTPCMin(INT_MIN),
42655d16 90 fCutNClustersITS(kFALSE),
91 fNClustersITSMax(INT_MAX),
92 fNClustersITSMin(INT_MIN),
5ba02b32 93 fUseAODFilterBit(kFALSE),
94 fAODFilterBit(0),
a63303bd 95 fCutDCAToVertexXY(kFALSE),
96 fCutDCAToVertexZ(kFALSE),
2b1eaa10 97 fCutMinimalTPCdedx(kFALSE),
98 fMinimalTPCdedx(0.),
1a80f9f6 99 fCutPmdDet(kFALSE),
100 fPmdDet(0),
101 fCutPmdAdc(kFALSE),
102 fPmdAdc(0.),
103 fCutPmdNcell(kFALSE),
104 fPmdNcell(0.),
441ea1cf 105 fParamType(kGlobal),
106 fParamMix(kPure),
107 fTrack(NULL),
108 fTrackPhi(0.),
109 fTrackEta(0.),
110 fTrackWeight(0.),
111 fTrackLabel(INT_MIN),
112 fMCevent(NULL),
113 fMCparticle(NULL),
114 fEvent(NULL),
115 fTPCtrack(),
aab6527a 116 fESDpid(),
2b1eaa10 117 fPIDsource(kTOFpid),
441ea1cf 118 fTPCpidCuts(NULL),
119 fTOFpidCuts(NULL),
a14b8f3c 120 fParticleID(AliPID::kUnknown),
499fe731 121 fParticleProbability(.9),
875ee12a 122 fAllowTOFmismatchFlag(kFALSE),
0b14d0f4 123 fRequireStrictTOFTPCagreement(kFALSE),
124 fCutRejectElectronsWithTPCpid(kFALSE)
441ea1cf 125{
126 //io constructor
5104aa35 127 for ( Int_t i=0; i<5; i++ ) { fProbBayes[i]=0.0; }
422c61c7 128 SetPriors(); //init arrays
441ea1cf 129}
130
131//-----------------------------------------------------------------------
132AliFlowTrackCuts::AliFlowTrackCuts(const char* name):
daf66719 133 AliFlowTrackSimpleCuts(),
1a80f9f6 134 fAliESDtrackCuts(NULL),
a1c43d26 135 fQA(NULL),
1ff4bda1 136 fCutMC(kFALSE),
f21bdf48 137 fCutMChasTrackReferences(kFALSE),
daf66719 138 fCutMCprocessType(kFALSE),
139 fMCprocessType(kPNoProcess),
140 fCutMCPID(kFALSE),
141 fMCPID(0),
a14b8f3c 142 fIgnoreSignInMCPID(kFALSE),
daf66719 143 fCutMCisPrimary(kFALSE),
441ea1cf 144 fRequireTransportBitForPrimaries(kTRUE),
daf66719 145 fMCisPrimary(kFALSE),
957517fa 146 fRequireCharge(kFALSE),
127a5825 147 fFakesAreOK(kTRUE),
9a0783cc 148 fCutSPDtrackletDeltaPhi(kFALSE),
149 fSPDtrackletDeltaPhiMax(FLT_MAX),
150 fSPDtrackletDeltaPhiMin(-FLT_MAX),
1ff4bda1 151 fIgnoreTPCzRange(kFALSE),
152 fIgnoreTPCzRangeMax(FLT_MAX),
153 fIgnoreTPCzRangeMin(-FLT_MAX),
2948ac5a 154 fCutChi2PerClusterTPC(kFALSE),
155 fMaxChi2PerClusterTPC(FLT_MAX),
156 fMinChi2PerClusterTPC(-FLT_MAX),
32b846cd 157 fCutNClustersTPC(kFALSE),
158 fNClustersTPCMax(INT_MAX),
159 fNClustersTPCMin(INT_MIN),
42655d16 160 fCutNClustersITS(kFALSE),
161 fNClustersITSMax(INT_MAX),
5ba02b32 162 fNClustersITSMin(INT_MIN),
163 fUseAODFilterBit(kFALSE),
164 fAODFilterBit(0),
a63303bd 165 fCutDCAToVertexXY(kFALSE),
166 fCutDCAToVertexZ(kFALSE),
2b1eaa10 167 fCutMinimalTPCdedx(kFALSE),
168 fMinimalTPCdedx(0.),
1a80f9f6 169 fCutPmdDet(kFALSE),
170 fPmdDet(0),
171 fCutPmdAdc(kFALSE),
172 fPmdAdc(0.),
173 fCutPmdNcell(kFALSE),
174 fPmdNcell(0.),
12b2b8bc 175 fParamType(kGlobal),
daf66719 176 fParamMix(kPure),
daf66719 177 fTrack(NULL),
12b2b8bc 178 fTrackPhi(0.),
179 fTrackEta(0.),
180 fTrackWeight(0.),
127a5825 181 fTrackLabel(INT_MIN),
957517fa 182 fMCevent(NULL),
9a0783cc 183 fMCparticle(NULL),
1ff4bda1 184 fEvent(NULL),
32b846cd 185 fTPCtrack(),
aab6527a 186 fESDpid(),
2b1eaa10 187 fPIDsource(kTOFpid),
32b846cd 188 fTPCpidCuts(NULL),
189 fTOFpidCuts(NULL),
a14b8f3c 190 fParticleID(AliPID::kUnknown),
499fe731 191 fParticleProbability(.9),
875ee12a 192 fAllowTOFmismatchFlag(kFALSE),
0b14d0f4 193 fRequireStrictTOFTPCagreement(kFALSE),
194 fCutRejectElectronsWithTPCpid(kFALSE)
daf66719 195{
196 //constructor
441ea1cf 197 SetName(name);
198 SetTitle("AliFlowTrackCuts");
aab6527a 199 fESDpid.GetTPCResponse().SetBetheBlochParameters( 0.0283086,
200 2.63394e+01,
201 5.04114e-11,
202 2.12543e+00,
203 4.88663e+00 );
5104aa35 204 for ( Int_t i=0; i<5; i++ ) { fProbBayes[i]=0.0; }
422c61c7 205 SetPriors(); //init arrays
1a80f9f6 206
daf66719 207}
208
209//-----------------------------------------------------------------------
ee242db3 210AliFlowTrackCuts::AliFlowTrackCuts(const AliFlowTrackCuts& that):
211 AliFlowTrackSimpleCuts(that),
441ea1cf 212 fAliESDtrackCuts(NULL),
a1c43d26 213 fQA(NULL),
1ff4bda1 214 fCutMC(that.fCutMC),
f21bdf48 215 fCutMChasTrackReferences(that.fCutMChasTrackReferences),
ee242db3 216 fCutMCprocessType(that.fCutMCprocessType),
217 fMCprocessType(that.fMCprocessType),
218 fCutMCPID(that.fCutMCPID),
219 fMCPID(that.fMCPID),
a14b8f3c 220 fIgnoreSignInMCPID(that.fIgnoreSignInMCPID),
ee242db3 221 fCutMCisPrimary(that.fCutMCisPrimary),
441ea1cf 222 fRequireTransportBitForPrimaries(that.fRequireTransportBitForPrimaries),
ee242db3 223 fMCisPrimary(that.fMCisPrimary),
224 fRequireCharge(that.fRequireCharge),
225 fFakesAreOK(that.fFakesAreOK),
226 fCutSPDtrackletDeltaPhi(that.fCutSPDtrackletDeltaPhi),
227 fSPDtrackletDeltaPhiMax(that.fSPDtrackletDeltaPhiMax),
228 fSPDtrackletDeltaPhiMin(that.fSPDtrackletDeltaPhiMin),
1ff4bda1 229 fIgnoreTPCzRange(that.fIgnoreTPCzRange),
230 fIgnoreTPCzRangeMax(that.fIgnoreTPCzRangeMax),
231 fIgnoreTPCzRangeMin(that.fIgnoreTPCzRangeMin),
2948ac5a 232 fCutChi2PerClusterTPC(that.fCutChi2PerClusterTPC),
233 fMaxChi2PerClusterTPC(that.fMaxChi2PerClusterTPC),
234 fMinChi2PerClusterTPC(that.fMinChi2PerClusterTPC),
32b846cd 235 fCutNClustersTPC(that.fCutNClustersTPC),
236 fNClustersTPCMax(that.fNClustersTPCMax),
237 fNClustersTPCMin(that.fNClustersTPCMin),
42655d16 238 fCutNClustersITS(that.fCutNClustersITS),
239 fNClustersITSMax(that.fNClustersITSMax),
240 fNClustersITSMin(that.fNClustersITSMin),
5ba02b32 241 fUseAODFilterBit(that.fUseAODFilterBit),
242 fAODFilterBit(that.fAODFilterBit),
a63303bd 243 fCutDCAToVertexXY(that.fCutDCAToVertexXY),
244 fCutDCAToVertexZ(that.fCutDCAToVertexZ),
2b1eaa10 245 fCutMinimalTPCdedx(that.fCutMinimalTPCdedx),
246 fMinimalTPCdedx(that.fMinimalTPCdedx),
1a80f9f6 247 fCutPmdDet(that.fCutPmdDet),
248 fPmdDet(that.fPmdDet),
249 fCutPmdAdc(that.fCutPmdAdc),
250 fPmdAdc(that.fPmdAdc),
251 fCutPmdNcell(that.fCutPmdNcell),
252 fPmdNcell(that.fPmdNcell),
ee242db3 253 fParamType(that.fParamType),
254 fParamMix(that.fParamMix),
daf66719 255 fTrack(NULL),
ee242db3 256 fTrackPhi(0.),
257 fTrackEta(0.),
258 fTrackWeight(0.),
127a5825 259 fTrackLabel(INT_MIN),
957517fa 260 fMCevent(NULL),
9a0783cc 261 fMCparticle(NULL),
1ff4bda1 262 fEvent(NULL),
32b846cd 263 fTPCtrack(),
264 fESDpid(that.fESDpid),
265 fPIDsource(that.fPIDsource),
266 fTPCpidCuts(NULL),
267 fTOFpidCuts(NULL),
2b1eaa10 268 fParticleID(that.fParticleID),
499fe731 269 fParticleProbability(that.fParticleProbability),
875ee12a 270 fAllowTOFmismatchFlag(that.fAllowTOFmismatchFlag),
0b14d0f4 271 fRequireStrictTOFTPCagreement(that.fRequireStrictTOFTPCagreement),
272 fCutRejectElectronsWithTPCpid(that.fCutRejectElectronsWithTPCpid)
daf66719 273{
274 //copy constructor
32b846cd 275 if (that.fTPCpidCuts) fTPCpidCuts = new TMatrixF(*(that.fTPCpidCuts));
276 if (that.fTOFpidCuts) fTOFpidCuts = new TMatrixF(*(that.fTOFpidCuts));
441ea1cf 277 if (that.fAliESDtrackCuts) fAliESDtrackCuts = new AliESDtrackCuts(*(that.fAliESDtrackCuts));
5104aa35 278 memcpy(fProbBayes,that.fProbBayes,sizeof(fProbBayes));
422c61c7 279 SetPriors(); //init arrays
1a80f9f6 280 if (that.fQA) DefineHistograms();
daf66719 281}
282
283//-----------------------------------------------------------------------
ee242db3 284AliFlowTrackCuts& AliFlowTrackCuts::operator=(const AliFlowTrackCuts& that)
daf66719 285{
286 //assignment
cdc20344 287 if (this==&that) return *this;
288
ee242db3 289 AliFlowTrackSimpleCuts::operator=(that);
1a80f9f6 290 //the following may seem excessive but if AliESDtrackCuts properly does copy and clone
291 //this approach is better memory-fragmentation-wise in some cases
292 if (that.fAliESDtrackCuts && fAliESDtrackCuts) *fAliESDtrackCuts=*(that.fAliESDtrackCuts);
293 if (that.fAliESDtrackCuts && !fAliESDtrackCuts) fAliESDtrackCuts=new AliESDtrackCuts(*(that.fAliESDtrackCuts));
294 if (!that.fAliESDtrackCuts) delete fAliESDtrackCuts; fAliESDtrackCuts=NULL;
295 //these guys we don't need to copy, just reinit
296 if (that.fQA) {fQA->Delete(); delete fQA; fQA=NULL; DefineHistograms();}
1ff4bda1 297 fCutMC=that.fCutMC;
f21bdf48 298 fCutMChasTrackReferences=that.fCutMChasTrackReferences;
ee242db3 299 fCutMCprocessType=that.fCutMCprocessType;
300 fMCprocessType=that.fMCprocessType;
301 fCutMCPID=that.fCutMCPID;
302 fMCPID=that.fMCPID;
a14b8f3c 303 fIgnoreSignInMCPID=that.fIgnoreSignInMCPID,
ee242db3 304 fCutMCisPrimary=that.fCutMCisPrimary;
441ea1cf 305 fRequireTransportBitForPrimaries=that.fRequireTransportBitForPrimaries;
ee242db3 306 fMCisPrimary=that.fMCisPrimary;
307 fRequireCharge=that.fRequireCharge;
308 fFakesAreOK=that.fFakesAreOK;
309 fCutSPDtrackletDeltaPhi=that.fCutSPDtrackletDeltaPhi;
310 fSPDtrackletDeltaPhiMax=that.fSPDtrackletDeltaPhiMax;
311 fSPDtrackletDeltaPhiMin=that.fSPDtrackletDeltaPhiMin;
1ff4bda1 312 fIgnoreTPCzRange=that.fIgnoreTPCzRange;
313 fIgnoreTPCzRangeMax=that.fIgnoreTPCzRangeMax;
314 fIgnoreTPCzRangeMin=that.fIgnoreTPCzRangeMin;
2948ac5a 315 fCutChi2PerClusterTPC=that.fCutChi2PerClusterTPC;
316 fMaxChi2PerClusterTPC=that.fMaxChi2PerClusterTPC;
317 fMinChi2PerClusterTPC=that.fMinChi2PerClusterTPC;
32b846cd 318 fCutNClustersTPC=that.fCutNClustersTPC;
319 fNClustersTPCMax=that.fNClustersTPCMax;
320 fNClustersTPCMin=that.fNClustersTPCMin;
42655d16 321 fCutNClustersITS=that.fCutNClustersITS;
322 fNClustersITSMax=that.fNClustersITSMax;
323 fNClustersITSMin=that.fNClustersITSMin;
a63303bd 324 fUseAODFilterBit=that.fUseAODFilterBit;
325 fAODFilterBit=that.fAODFilterBit;
326 fCutDCAToVertexXY=that.fCutDCAToVertexXY;
327 fCutDCAToVertexZ=that.fCutDCAToVertexZ;
2b1eaa10 328 fCutMinimalTPCdedx=that.fCutMinimalTPCdedx;
329 fMinimalTPCdedx=that.fMinimalTPCdedx;
1a80f9f6 330 fCutPmdDet=that.fCutPmdDet;
331 fPmdDet=that.fPmdDet;
332 fCutPmdAdc=that.fCutPmdAdc;
333 fPmdAdc=that.fPmdAdc;
334 fCutPmdNcell=that.fCutPmdNcell;
335 fPmdNcell=that.fPmdNcell;
336
ee242db3 337 fParamType=that.fParamType;
338 fParamMix=that.fParamMix;
daf66719 339
daf66719 340 fTrack=NULL;
1a80f9f6 341 fTrackEta=0.;
ee242db3 342 fTrackPhi=0.;
343 fTrackWeight=0.;
127a5825 344 fTrackLabel=INT_MIN;
957517fa 345 fMCevent=NULL;
daf66719 346 fMCparticle=NULL;
9a0783cc 347 fEvent=NULL;
daf66719 348
32b846cd 349 fESDpid = that.fESDpid;
350 fPIDsource = that.fPIDsource;
351
cdc20344 352 delete fTPCpidCuts;
353 delete fTOFpidCuts;
32b846cd 354 if (that.fTPCpidCuts) fTPCpidCuts = new TMatrixF(*(that.fTPCpidCuts));
355 if (that.fTOFpidCuts) fTOFpidCuts = new TMatrixF(*(that.fTOFpidCuts));
32b846cd 356
2b1eaa10 357 fParticleID=that.fParticleID;
358 fParticleProbability=that.fParticleProbability;
875ee12a 359 fAllowTOFmismatchFlag=that.fAllowTOFmismatchFlag;
360 fRequireStrictTOFTPCagreement=that.fRequireStrictTOFTPCagreement;
0b14d0f4 361 fCutRejectElectronsWithTPCpid=that.fCutRejectElectronsWithTPCpid;
5104aa35 362 memcpy(fProbBayes,that.fProbBayes,sizeof(fProbBayes));
32b846cd 363
daf66719 364 return *this;
365}
366
367//-----------------------------------------------------------------------
368AliFlowTrackCuts::~AliFlowTrackCuts()
369{
370 //dtor
daf66719 371 delete fAliESDtrackCuts;
32b846cd 372 delete fTPCpidCuts;
373 delete fTOFpidCuts;
499fe731 374 if (fQA) { fQA->SetOwner(); fQA->Delete(); delete fQA; }
daf66719 375}
376
aab6527a 377//-----------------------------------------------------------------------
378void AliFlowTrackCuts::SetEvent(AliVEvent* event, AliMCEvent* mcEvent)
379{
380 //set the event
381 Clear();
382 fEvent=event;
383 fMCevent=mcEvent;
384
385 //do the magic for ESD
386 AliESDEvent* myESD = dynamic_cast<AliESDEvent*>(event);
387 if (fCutPID && myESD)
388 {
389 //TODO: maybe call it only for the TOF options?
390 // Added by F. Noferini for TOF PID
391 fESDpid.SetTOFResponse(myESD,AliESDpid::kTOF_T0);
392 fESDpid.MakePID(myESD,kFALSE);
393 // End F. Noferini added part
394 }
395
396 //TODO: AOD
397}
398
399//-----------------------------------------------------------------------
400void AliFlowTrackCuts::SetCutMC( Bool_t b )
401{
402 //will we be cutting on MC information?
403 fCutMC=b;
404
405 //if we cut on MC info then also the Bethe Bloch should be the one tuned for MC
406 if (fCutMC)
407 {
408 fESDpid.GetTPCResponse().SetBetheBlochParameters( 2.15898e+00/50.,
409 1.75295e+01,
410 3.40030e-09,
411 1.96178e+00,
412 3.91720e+00);
413 }
414}
415
daf66719 416//-----------------------------------------------------------------------
12b2b8bc 417Bool_t AliFlowTrackCuts::IsSelected(TObject* obj, Int_t id)
daf66719 418{
419 //check cuts
420 AliVParticle* vparticle = dynamic_cast<AliVParticle*>(obj);
421 if (vparticle) return PassesCuts(vparticle);
422 AliFlowTrackSimple* flowtrack = dynamic_cast<AliFlowTrackSimple*>(obj);
423 if (flowtrack) return PassesCuts(flowtrack);
12b2b8bc 424 AliMultiplicity* tracklets = dynamic_cast<AliMultiplicity*>(obj);
425 if (tracklets) return PassesCuts(tracklets,id);
d148af7e 426 AliESDPmdTrack* pmdtrack = dynamic_cast<AliESDPmdTrack*>(obj);
427 if (pmdtrack) return PassesPMDcuts(pmdtrack);
22289738 428 AliESDVZERO* esdvzero = dynamic_cast<AliESDVZERO*>(obj);
429 if (esdvzero) return PassesV0cuts(esdvzero,id);
daf66719 430 return kFALSE; //default when passed wrong type of object
431}
432
1ff4bda1 433//-----------------------------------------------------------------------
434Bool_t AliFlowTrackCuts::IsSelectedMCtruth(TObject* obj, Int_t id)
435{
436 //check cuts
437 AliVParticle* vparticle = dynamic_cast<AliVParticle*>(obj);
438 if (vparticle)
439 {
440 return PassesMCcuts(fMCevent,vparticle->GetLabel());
441 }
442 AliMultiplicity* tracklets = dynamic_cast<AliMultiplicity*>(obj);
443 if (tracklets)
444 {
445 Int_t label0 = tracklets->GetLabel(id,0);
446 Int_t label1 = tracklets->GetLabel(id,1);
447 Int_t label = (label0==label1)?tracklets->GetLabel(id,1):-666;
448 return PassesMCcuts(fMCevent,label);
449 }
450 return kFALSE; //default when passed wrong type of object
451}
452
daf66719 453//-----------------------------------------------------------------------
1a80f9f6 454Bool_t AliFlowTrackCuts::PassesCuts(const AliFlowTrackSimple* track)
daf66719 455{
456 //check cuts on a flowtracksimple
5559ce24 457
458 //clean up from last iteration
1ff4bda1 459 fTrack = NULL;
daf66719 460 return AliFlowTrackSimpleCuts::PassesCuts(track);
461}
462
12b2b8bc 463//-----------------------------------------------------------------------
1a80f9f6 464Bool_t AliFlowTrackCuts::PassesCuts(const AliMultiplicity* tracklet, Int_t id)
12b2b8bc 465{
466 //check cuts on a tracklets
467
9a0783cc 468 //clean up from last iteration, and init label
1ff4bda1 469 fTrack = NULL;
12b2b8bc 470 fMCparticle=NULL;
9a0783cc 471 fTrackLabel=-1;
12b2b8bc 472
473 fTrackPhi = tracklet->GetPhi(id);
474 fTrackEta = tracklet->GetEta(id);
475 fTrackWeight = 1.0;
476 if (fCutEta) {if ( fTrackEta < fEtaMin || fTrackEta >= fEtaMax ) return kFALSE;}
477 if (fCutPhi) {if ( fTrackPhi < fPhiMin || fTrackPhi >= fPhiMax ) return kFALSE;}
478
479 //check MC info if available
9a0783cc 480 //if the 2 clusters have different label track cannot be good
481 //and should therefore not pass the mc cuts
482 Int_t label0 = tracklet->GetLabel(id,0);
483 Int_t label1 = tracklet->GetLabel(id,1);
d0471ea0 484 //if possible get label and mcparticle
9a0783cc 485 fTrackLabel = (label0==label1)?tracklet->GetLabel(id,1):-1;
7afa829c 486 if (!fFakesAreOK && fTrackLabel<0) return kFALSE;
d0471ea0 487 if (fTrackLabel>=0 && fMCevent) fMCparticle = static_cast<AliMCParticle*>(fMCevent->GetTrack(fTrackLabel));
488 //check MC cuts
1ff4bda1 489 if (fCutMC && !PassesMCcuts()) return kFALSE;
12b2b8bc 490 return kTRUE;
491}
492
493//-----------------------------------------------------------------------
1ff4bda1 494Bool_t AliFlowTrackCuts::PassesMCcuts(AliMCEvent* mcEvent, Int_t label)
12b2b8bc 495{
496 //check the MC info
1ff4bda1 497 if (!mcEvent) return kFALSE;
498 if (label<0) return kFALSE;//otherwise AliCMevent prints a warning before returning NULL
499 AliMCParticle* mcparticle = static_cast<AliMCParticle*>(mcEvent->GetTrack(label));
500 if (!mcparticle) {AliError("no MC track"); return kFALSE;}
12b2b8bc 501
502 if (fCutMCisPrimary)
503 {
441ea1cf 504 if (IsPhysicalPrimary(mcEvent,label,fRequireTransportBitForPrimaries) != fMCisPrimary) return kFALSE;
12b2b8bc 505 }
506 if (fCutMCPID)
507 {
1ff4bda1 508 Int_t pdgCode = mcparticle->PdgCode();
a14b8f3c 509 if (fIgnoreSignInMCPID)
4cbcbead 510 {
511 if (TMath::Abs(fMCPID) != TMath::Abs(pdgCode)) return kFALSE;
512 }
513 else
514 {
515 if (fMCPID != pdgCode) return kFALSE;
516 }
12b2b8bc 517 }
518 if ( fCutMCprocessType )
519 {
1ff4bda1 520 TParticle* particle = mcparticle->Particle();
12b2b8bc 521 Int_t processID = particle->GetUniqueID();
522 if (processID != fMCprocessType ) return kFALSE;
523 }
f21bdf48 524 if (fCutMChasTrackReferences)
525 {
526 if (mcparticle->GetNumberOfTrackReferences()<1) return kFALSE;
527 }
12b2b8bc 528 return kTRUE;
529}
1a80f9f6 530
1ff4bda1 531//-----------------------------------------------------------------------
532Bool_t AliFlowTrackCuts::PassesMCcuts()
533{
1a80f9f6 534 //check MC info
1ff4bda1 535 if (!fMCevent) return kFALSE;
536 if (fTrackLabel<0) return kFALSE;//otherwise AliCMevent prints a warning before returning NULL
537 fMCparticle = static_cast<AliMCParticle*>(fMCevent->GetTrack(fTrackLabel));
538 return PassesMCcuts(fMCevent,fTrackLabel);
539}
12b2b8bc 540
daf66719 541//-----------------------------------------------------------------------
542Bool_t AliFlowTrackCuts::PassesCuts(AliVParticle* vparticle)
543{
544 //check cuts for an ESD vparticle
545
127a5825 546 ////////////////////////////////////////////////////////////////
547 // start by preparing the track parameters to cut on //////////
548 ////////////////////////////////////////////////////////////////
5559ce24 549 //clean up from last iteration
1ff4bda1 550 fTrack=NULL;
5559ce24 551
957517fa 552 //get the label and the mc particle
127a5825 553 fTrackLabel = (fFakesAreOK)?TMath::Abs(vparticle->GetLabel()):vparticle->GetLabel();
554 if (fMCevent) fMCparticle = static_cast<AliMCParticle*>(fMCevent->GetTrack(fTrackLabel));
daf66719 555 else fMCparticle=NULL;
556
957517fa 557 Bool_t isMCparticle = kFALSE; //some things are different for MC particles, check!
daf66719 558 AliESDtrack* esdTrack = dynamic_cast<AliESDtrack*>(vparticle);
42655d16 559 AliAODTrack* aodTrack = NULL;
daf66719 560 if (esdTrack)
7d27a354 561 {
42655d16 562 //for an ESD track we do some magic sometimes like constructing TPC only parameters
563 //or doing some hybrid, handle that here
daf66719 564 HandleESDtrack(esdTrack);
7d27a354 565 }
daf66719 566 else
957517fa 567 {
daf66719 568 HandleVParticle(vparticle);
957517fa 569 //now check if produced particle is MC
570 isMCparticle = (dynamic_cast<AliMCParticle*>(fTrack))!=NULL;
42655d16 571 aodTrack = dynamic_cast<AliAODTrack*>(vparticle); //keep the additional dynamic cast out of the way for ESDs
957517fa 572 }
127a5825 573 ////////////////////////////////////////////////////////////////
574 ////////////////////////////////////////////////////////////////
575
1ff4bda1 576 if (!fTrack) return kFALSE;
42655d16 577 //because it may be different from global, not needed for aodTrack because we dont do anything funky there
578 if (esdTrack) esdTrack = static_cast<AliESDtrack*>(fTrack);
2948ac5a 579
924b02b0 580 Bool_t pass=kTRUE;
9a0783cc 581 //check the common cuts for the current particle fTrack (MC,AOD,ESD)
32b846cd 582 Double_t pt = fTrack->Pt();
f21bdf48 583 Double_t p = fTrack->P();
7afa829c 584 if (!fFakesAreOK) {if (fTrackLabel<0) pass=kFALSE;}
32b846cd 585 if (fCutPt) {if (pt < fPtMin || pt >= fPtMax ) pass=kFALSE;}
924b02b0 586 if (fCutEta) {if (fTrack->Eta() < fEtaMin || fTrack->Eta() >= fEtaMax ) pass=kFALSE;}
587 if (fCutPhi) {if (fTrack->Phi() < fPhiMin || fTrack->Phi() >= fPhiMax ) pass=kFALSE;}
588 if (fRequireCharge) {if (fTrack->Charge() == 0) pass=kFALSE;}
589 if (fCutCharge && !isMCparticle) {if (fTrack->Charge() != fCharge) pass=kFALSE;}
957517fa 590 if (fCutCharge && isMCparticle)
591 {
592 //in case of an MC particle the charge is stored in units of 1/3|e|
593 Int_t charge = TMath::Nint(fTrack->Charge()/3.0); //mc particles have charge in units of 1/3e
32b846cd 594 if (charge!=fCharge) pass=kFALSE;
957517fa 595 }
924b02b0 596 //if(fCutPID) {if (fTrack->PID() != fPID) pass=kFALSE;}
daf66719 597
957517fa 598 //when additionally MC info is required
1ff4bda1 599 if (fCutMC && !PassesMCcuts()) pass=kFALSE;
daf66719 600
42655d16 601 //the case of ESD or AOD
bb6ca457 602 if (esdTrack) { if (!PassesESDcuts(esdTrack)) { pass=kFALSE; } }
603 if (aodTrack) { if (!PassesAODcuts(aodTrack)) { pass=kFALSE; } }
42655d16 604
f21bdf48 605 if (fQA)
606 {
c3eb0b6c 607 if (fMCparticle)
f21bdf48 608 {
875ee12a 609 TParticle* tparticle=fMCparticle->Particle();
610 Int_t processID = tparticle->GetUniqueID();
611 //TLorentzVector v;
612 //mcparticle->Particle()->ProductionVertex(v);
613 //Double_t prodvtxX = v.X();
614 //Double_t prodvtxY = v.Y();
615
c3eb0b6c 616 Float_t pdg = 0;
617 Int_t pdgcode = fMCparticle->PdgCode();
618 switch (TMath::Abs(pdgcode))
619 {
620 case 11:
621 pdg = AliPID::kElectron + 0.5; break;
622 case 13:
623 pdg = AliPID::kMuon + 0.5; break;
624 case 211:
625 pdg = AliPID::kPion + 0.5; break;
626 case 321:
627 pdg = AliPID::kKaon + 0.5; break;
628 case 2212:
629 pdg = AliPID::kProton + 0.5; break;
630 default:
631 pdg = AliPID::kUnknown + 0.5; break;
632 }
633 pdg = TMath::Sign(pdg,static_cast<Float_t>(pdgcode));
634 QAbefore(2)->Fill(p,pdg);
635 QAbefore(3)->Fill(p,IsPhysicalPrimary()?0.5:-0.5);
875ee12a 636 QAbefore(4)->Fill(p,static_cast<Float_t>(processID));
c3eb0b6c 637 if (pass) QAafter(2)->Fill(p,pdg);
638 if (pass) QAafter(3)->Fill(p,IsPhysicalPrimary()?0.5:-0.5);
875ee12a 639 if (pass) QAafter(4)->Fill(p,static_cast<Float_t>(processID));
f21bdf48 640 }
f21bdf48 641 }
642
42655d16 643 //true by default, if we didn't set any cuts
644 return pass;
645}
646
647//_______________________________________________________________________
1a80f9f6 648Bool_t AliFlowTrackCuts::PassesAODcuts(const AliAODTrack* track)
42655d16 649{
1a80f9f6 650 //check cuts for AOD
42655d16 651 Bool_t pass = kTRUE;
652
653 if (fCutNClustersTPC)
1ff4bda1 654 {
42655d16 655 Int_t ntpccls = track->GetTPCNcls();
656 if (ntpccls < fNClustersTPCMin || ntpccls > fNClustersTPCMax) pass=kFALSE;
657 }
658
659 if (fCutNClustersITS)
660 {
661 Int_t nitscls = track->GetITSNcls();
662 if (nitscls < fNClustersITSMin || nitscls > fNClustersITSMax) pass=kFALSE;
663 }
5ba02b32 664
665 if (fCutChi2PerClusterTPC)
666 {
667 Double_t chi2tpc = track->Chi2perNDF();
668 if (chi2tpc < fMinChi2PerClusterTPC || chi2tpc > fMaxChi2PerClusterTPC) pass=kFALSE;
669 }
670
671 if (GetRequireTPCRefit() && !(track->GetStatus() & AliESDtrack::kTPCrefit) ) pass=kFALSE;
672 if (GetRequireITSRefit() && !(track->GetStatus() & AliESDtrack::kITSrefit) ) pass=kFALSE;
673
674 if (fUseAODFilterBit && !track->TestFilterBit(fAODFilterBit)) pass=kFALSE;
675
a63303bd 676 if (fCutDCAToVertexXY && track->DCA()>GetMaxDCAToVertexXY()) pass=kFALSE;
42655d16 677
678 return pass;
679}
680
681//_______________________________________________________________________
682Bool_t AliFlowTrackCuts::PassesESDcuts(AliESDtrack* track)
683{
1a80f9f6 684 //check cuts on ESD tracks
42655d16 685 Bool_t pass=kTRUE;
cd62a2a8 686 Float_t dcaxy=0.0;
687 Float_t dcaz=0.0;
688 track->GetImpactParameters(dcaxy,dcaz);
499fe731 689 const AliExternalTrackParam* pout = track->GetOuterParam();
690 const AliExternalTrackParam* pin = track->GetInnerParam();
42655d16 691 if (fIgnoreTPCzRange)
692 {
42655d16 693 if (pin&&pout)
441ea1cf 694 {
42655d16 695 Double_t zin = pin->GetZ();
696 Double_t zout = pout->GetZ();
697 if (zin*zout<0) pass=kFALSE; //reject if cross the membrane
698 if (zin < fIgnoreTPCzRangeMin || zin > fIgnoreTPCzRangeMax) pass=kFALSE;
699 if (zout < fIgnoreTPCzRangeMin || zout > fIgnoreTPCzRangeMax) pass=kFALSE;
441ea1cf 700 }
42655d16 701 }
32b846cd 702
1a80f9f6 703 Int_t ntpccls = ( fParamType==kTPCstandalone )?
42655d16 704 track->GetTPCNclsIter1():track->GetTPCNcls();
705 if (fCutChi2PerClusterTPC)
706 {
1a80f9f6 707 Float_t tpcchi2 = (fParamType==kTPCstandalone)?
42655d16 708 track->GetTPCchi2Iter1():track->GetTPCchi2();
709 tpcchi2 = (ntpccls>0)?tpcchi2/ntpccls:-FLT_MAX;
710 if (tpcchi2<fMinChi2PerClusterTPC || tpcchi2 >=fMaxChi2PerClusterTPC)
711 pass=kFALSE;
712 }
713
2b1eaa10 714 if (fCutMinimalTPCdedx)
715 {
716 if (track->GetTPCsignal() < fMinimalTPCdedx) pass=kFALSE;
717 }
718
42655d16 719 if (fCutNClustersTPC)
720 {
721 if (ntpccls < fNClustersTPCMin || ntpccls > fNClustersTPCMax) pass=kFALSE;
722 }
723
724 Int_t nitscls = track->GetNcls(0);
725 if (fCutNClustersITS)
726 {
727 if (nitscls < fNClustersITSMin || nitscls > fNClustersITSMax) pass=kFALSE;
728 }
32b846cd 729
1a80f9f6 730 //some stuff is still handled by AliESDtrackCuts class - delegate
731 if (fAliESDtrackCuts)
732 {
733 if (!fAliESDtrackCuts->IsSelected(track)) pass=kFALSE;
734 }
735
cd62a2a8 736 //PID part with pid QA
499fe731 737 Double_t beta = GetBeta(track);
738 Double_t dedx = Getdedx(track);
739 if (fQA)
740 {
741 if (pass) QAbefore(0)->Fill(track->GetP(),beta);
742 if (pass) QAbefore(1)->Fill(pin->GetP(),dedx);
743 }
a14b8f3c 744 if (fCutPID && (fParticleID!=AliPID::kUnknown)) //if kUnknown don't cut on PID
42655d16 745 {
746 switch (fPIDsource)
32b846cd 747 {
42655d16 748 case kTPCpid:
749 if (!PassesTPCpidCut(track)) pass=kFALSE;
750 break;
2b1eaa10 751 case kTPCdedx:
752 if (!PassesTPCdedxCut(track)) pass=kFALSE;
753 break;
42655d16 754 case kTOFpid:
755 if (!PassesTOFpidCut(track)) pass=kFALSE;
756 break;
2b1eaa10 757 case kTOFbeta:
758 if (!PassesTOFbetaCut(track)) pass=kFALSE;
1a80f9f6 759 break;
760 case kTOFbetaSimple:
761 if (!PassesTOFbetaSimpleCut(track)) pass=kFALSE;
cd62a2a8 762 break;
763 case kTPCbayesian:
764 if (!PassesTPCbayesianCut(track)) pass=kFALSE;
42655d16 765 break;
766 // part added by F. Noferini
767 case kTOFbayesian:
768 if (!PassesTOFbayesianCut(track)) pass=kFALSE;
769 break;
770 // end part added by F. Noferini
771 default:
772 printf("AliFlowTrackCuts::PassesCuts() this should never be called!\n");
773 pass=kFALSE;
774 break;
32b846cd 775 }
42655d16 776 }
0b14d0f4 777 if (fCutRejectElectronsWithTPCpid)
778 {
779 //reject electrons using standard TPC pid
780 Double_t pidTPC[AliPID::kSPECIES];
781 track->GetTPCpid(pidTPC);
782 if (pidTPC[AliPID::kElectron]<fParticleProbability) pass=kFALSE;
783 }
499fe731 784 if (fQA)
785 {
786 if (pass) QAafter(0)->Fill(track->GetP(),beta);
787 if (pass) QAafter(1)->Fill(pin->GetP(),dedx);
788 }
cd62a2a8 789 //end pid part with qa
790 if (fQA)
791 {
792 Double_t pt = track->Pt();
793 QAbefore(5)->Fill(pt,dcaxy);
794 QAbefore(6)->Fill(pt,dcaz);
795 if (pass) QAafter(5)->Fill(pt,dcaxy);
796 if (pass) QAafter(6)->Fill(pt,dcaz);
797 }
32b846cd 798
42655d16 799 return pass;
daf66719 800}
801
802//-----------------------------------------------------------------------
803void AliFlowTrackCuts::HandleVParticle(AliVParticle* track)
804{
805 //handle the general case
daf66719 806 switch (fParamType)
807 {
daf66719 808 default:
daf66719 809 fTrack = track;
32b846cd 810 break;
daf66719 811 }
812}
813
814//-----------------------------------------------------------------------
815void AliFlowTrackCuts::HandleESDtrack(AliESDtrack* track)
816{
817 //handle esd track
daf66719 818 switch (fParamType)
819 {
12b2b8bc 820 case kGlobal:
daf66719 821 fTrack = track;
daf66719 822 break;
1a80f9f6 823 case kTPCstandalone:
2b1eaa10 824 if (!track->FillTPCOnlyTrack(fTPCtrack))
1ff4bda1 825 {
826 fTrack=NULL;
827 fMCparticle=NULL;
828 fTrackLabel=-1;
829 return;
830 }
831 fTrack = &fTPCtrack;
957517fa 832 //recalculate the label and mc particle, they may differ as TPClabel != global label
127a5825 833 fTrackLabel = (fFakesAreOK)?TMath::Abs(fTrack->GetLabel()):fTrack->GetLabel();
834 if (fMCevent) fMCparticle = static_cast<AliMCParticle*>(fMCevent->GetTrack(fTrackLabel));
957517fa 835 else fMCparticle=NULL;
daf66719 836 break;
daf66719 837 default:
838 fTrack = track;
32b846cd 839 break;
daf66719 840 }
841}
842
a0241c3a 843//-----------------------------------------------------------------------
844Int_t AliFlowTrackCuts::Count(AliVEvent* event)
845{
846 //calculate the number of track in given event.
847 //if argument is NULL(default) take the event attached
848 //by SetEvent()
849 Int_t multiplicity = 0;
850 if (!event)
851 {
852 for (Int_t i=0; i<GetNumberOfInputObjects(); i++)
853 {
854 if (IsSelected(GetInputObject(i))) multiplicity++;
855 }
856 }
857 else
858 {
859 for (Int_t i=0; i<event->GetNumberOfTracks(); i++)
860 {
861 if (IsSelected(event->GetTrack(i))) multiplicity++;
862 }
863 }
864 return multiplicity;
865}
866
1a80f9f6 867//-----------------------------------------------------------------------
868AliFlowTrackCuts* AliFlowTrackCuts::GetStandardVZEROOnlyTrackCuts()
869{
870 AliFlowTrackCuts* cuts = new AliFlowTrackCuts("standard vzero flow cuts");
871 cuts->SetParamType(kV0);
872 cuts->SetEtaRange( -10, +10 );
873 cuts->SetPhiMin( 0 );
874 cuts->SetPhiMax( TMath::TwoPi() );
875 return cuts;
876}
877
a0241c3a 878//-----------------------------------------------------------------------
879AliFlowTrackCuts* AliFlowTrackCuts::GetStandardGlobalTrackCuts2010()
880{
881 //get standard cuts
1a80f9f6 882 AliFlowTrackCuts* cuts = new AliFlowTrackCuts("standard Global tracks");
a0241c3a 883 cuts->SetParamType(kGlobal);
884 cuts->SetPtRange(0.2,5.);
885 cuts->SetEtaRange(-0.8,0.8);
886 cuts->SetMinNClustersTPC(70);
887 cuts->SetMinChi2PerClusterTPC(0.1);
888 cuts->SetMaxChi2PerClusterTPC(4.0);
889 cuts->SetMinNClustersITS(2);
890 cuts->SetRequireITSRefit(kTRUE);
891 cuts->SetRequireTPCRefit(kTRUE);
892 cuts->SetMaxDCAToVertexXY(0.3);
893 cuts->SetMaxDCAToVertexZ(0.3);
894 cuts->SetAcceptKinkDaughters(kFALSE);
2b1eaa10 895 cuts->SetMinimalTPCdedx(10.);
a0241c3a 896
897 return cuts;
898}
899
900//-----------------------------------------------------------------------
1a80f9f6 901AliFlowTrackCuts* AliFlowTrackCuts::GetStandardTPCStandaloneTrackCuts2010()
a0241c3a 902{
903 //get standard cuts
1a80f9f6 904 AliFlowTrackCuts* cuts = new AliFlowTrackCuts("standard TPC standalone 2010");
905 cuts->SetParamType(kTPCstandalone);
a0241c3a 906 cuts->SetPtRange(0.2,5.);
907 cuts->SetEtaRange(-0.8,0.8);
908 cuts->SetMinNClustersTPC(70);
909 cuts->SetMinChi2PerClusterTPC(0.2);
910 cuts->SetMaxChi2PerClusterTPC(4.0);
911 cuts->SetMaxDCAToVertexXY(3.0);
912 cuts->SetMaxDCAToVertexZ(3.0);
913 cuts->SetDCAToVertex2D(kTRUE);
914 cuts->SetAcceptKinkDaughters(kFALSE);
2b1eaa10 915 cuts->SetMinimalTPCdedx(10.);
a0241c3a 916
917 return cuts;
918}
919
daf66719 920//-----------------------------------------------------------------------
1a80f9f6 921AliFlowTrackCuts* AliFlowTrackCuts::GetStandardTPCStandaloneTrackCuts()
daf66719 922{
923 //get standard cuts
1a80f9f6 924 AliFlowTrackCuts* cuts = new AliFlowTrackCuts("standard TPC standalone");
925 cuts->SetParamType(kTPCstandalone);
a0241c3a 926 cuts->SetPtRange(0.2,5.);
927 cuts->SetEtaRange(-0.8,0.8);
928 cuts->SetMinNClustersTPC(70);
929 cuts->SetMinChi2PerClusterTPC(0.2);
930 cuts->SetMaxChi2PerClusterTPC(4.0);
931 cuts->SetMaxDCAToVertexXY(3.0);
932 cuts->SetMaxDCAToVertexZ(3.0);
933 cuts->SetDCAToVertex2D(kTRUE);
934 cuts->SetAcceptKinkDaughters(kFALSE);
2b1eaa10 935 cuts->SetMinimalTPCdedx(10.);
a0241c3a 936
daf66719 937 return cuts;
938}
939
940//-----------------------------------------------------------------------
941AliFlowTrackCuts* AliFlowTrackCuts::GetStandardITSTPCTrackCuts2009(Bool_t selPrimaries)
942{
943 //get standard cuts
441ea1cf 944 AliFlowTrackCuts* cuts = new AliFlowTrackCuts("standard global track cuts 2009");
daf66719 945 delete cuts->fAliESDtrackCuts;
946 cuts->fAliESDtrackCuts = AliESDtrackCuts::GetStandardITSTPCTrackCuts2009(selPrimaries);
12b2b8bc 947 cuts->SetParamType(kGlobal);
daf66719 948 return cuts;
949}
950
7d27a354 951//-----------------------------------------------------------------------
952Bool_t AliFlowTrackCuts::FillFlowTrackGeneric(AliFlowTrack* flowtrack) const
953{
954 //fill a flow track from tracklet,vzero,pmd,...
955 TParticle *tmpTParticle=NULL;
956 AliMCParticle* tmpAliMCParticle=NULL;
957 switch (fParamMix)
958 {
959 case kPure:
960 flowtrack->SetPhi(fTrackPhi);
961 flowtrack->SetEta(fTrackEta);
962 break;
963 case kTrackWithMCkine:
964 if (!fMCparticle) return kFALSE;
965 flowtrack->SetPhi( fMCparticle->Phi() );
966 flowtrack->SetEta( fMCparticle->Eta() );
967 flowtrack->SetPt( fMCparticle->Pt() );
968 break;
969 case kTrackWithMCpt:
970 if (!fMCparticle) return kFALSE;
971 flowtrack->SetPhi(fTrackPhi);
972 flowtrack->SetEta(fTrackEta);
973 flowtrack->SetPt(fMCparticle->Pt());
974 break;
975 case kTrackWithPtFromFirstMother:
976 if (!fMCparticle) return kFALSE;
977 flowtrack->SetPhi(fTrackPhi);
978 flowtrack->SetEta(fTrackEta);
979 tmpTParticle = fMCparticle->Particle();
980 tmpAliMCParticle = static_cast<AliMCParticle*>(fMCevent->GetTrack(tmpTParticle->GetFirstMother()));
981 flowtrack->SetPt(tmpAliMCParticle->Pt());
982 break;
983 default:
984 flowtrack->SetPhi(fTrackPhi);
985 flowtrack->SetEta(fTrackEta);
986 break;
987 }
988 flowtrack->SetSource(AliFlowTrack::kFromTracklet);
989 return kTRUE;
990}
991
992//-----------------------------------------------------------------------
993Bool_t AliFlowTrackCuts::FillFlowTrackVParticle(AliFlowTrack* flowtrack) const
994{
995 //fill flow track from AliVParticle (ESD,AOD,MC)
996 if (!fTrack) return kFALSE;
997 TParticle *tmpTParticle=NULL;
998 AliMCParticle* tmpAliMCParticle=NULL;
999 AliExternalTrackParam* externalParams=NULL;
1000 AliESDtrack* esdtrack=NULL;
1001 switch(fParamMix)
1002 {
1003 case kPure:
1004 flowtrack->Set(fTrack);
1005 break;
1006 case kTrackWithMCkine:
1007 flowtrack->Set(fMCparticle);
1008 break;
1009 case kTrackWithMCPID:
1010 flowtrack->Set(fTrack);
1011 //flowtrack->setPID(...) from mc, when implemented
1012 break;
1013 case kTrackWithMCpt:
1014 if (!fMCparticle) return kFALSE;
1015 flowtrack->Set(fTrack);
1016 flowtrack->SetPt(fMCparticle->Pt());
1017 break;
1018 case kTrackWithPtFromFirstMother:
1019 if (!fMCparticle) return kFALSE;
1020 flowtrack->Set(fTrack);
1021 tmpTParticle = fMCparticle->Particle();
1022 tmpAliMCParticle = static_cast<AliMCParticle*>(fMCevent->GetTrack(tmpTParticle->GetFirstMother()));
1023 flowtrack->SetPt(tmpAliMCParticle->Pt());
1024 break;
1025 case kTrackWithTPCInnerParams:
1026 esdtrack = dynamic_cast<AliESDtrack*>(fTrack);
1027 if (!esdtrack) return kFALSE;
1028 externalParams = const_cast<AliExternalTrackParam*>(esdtrack->GetTPCInnerParam());
1029 if (!externalParams) return kFALSE;
1030 flowtrack->Set(externalParams);
1031 break;
1032 default:
1033 flowtrack->Set(fTrack);
1034 break;
1035 }
499fe731 1036 if (fParamType==kMC)
1037 {
1038 flowtrack->SetSource(AliFlowTrack::kFromMC);
1039 flowtrack->SetID(fTrack->GetLabel());
1040 }
1041 else if (dynamic_cast<AliESDtrack*>(fTrack))
1042 {
1043 flowtrack->SetSource(AliFlowTrack::kFromESD);
1044 flowtrack->SetID(static_cast<AliVTrack*>(fTrack)->GetID());
1045 }
1046 else if (dynamic_cast<AliAODTrack*>(fTrack))
1047 {
1048 flowtrack->SetSource(AliFlowTrack::kFromAOD);
1049 flowtrack->SetID(static_cast<AliVTrack*>(fTrack)->GetID());
1050 }
1051 else if (dynamic_cast<AliMCParticle*>(fTrack))
1052 {
1053 flowtrack->SetSource(AliFlowTrack::kFromMC);
1054 flowtrack->SetID(static_cast<AliVTrack*>(fTrack)->GetID());
1055 }
7d27a354 1056 return kTRUE;
1057}
1058
1059//-----------------------------------------------------------------------
1060Bool_t AliFlowTrackCuts::FillFlowTrack(AliFlowTrack* track) const
1061{
1062 //fill a flow track constructed from whatever we applied cuts on
1063 //return true on success
1064 switch (fParamType)
1065 {
1066 case kSPDtracklet:
1067 return FillFlowTrackGeneric(track);
1068 case kPMD:
1069 return FillFlowTrackGeneric(track);
1070 case kV0:
1071 return FillFlowTrackGeneric(track);
1072 default:
1073 return FillFlowTrackVParticle(track);
1074 }
1075}
1076
daf66719 1077//-----------------------------------------------------------------------
d148af7e 1078AliFlowTrack* AliFlowTrackCuts::MakeFlowTrackSPDtracklet() const
daf66719 1079{
d148af7e 1080 //make a flow track from tracklet
daf66719 1081 AliFlowTrack* flowtrack=NULL;
d0471ea0 1082 TParticle *tmpTParticle=NULL;
1083 AliMCParticle* tmpAliMCParticle=NULL;
d148af7e 1084 switch (fParamMix)
daf66719 1085 {
d148af7e 1086 case kPure:
1087 flowtrack = new AliFlowTrack();
1088 flowtrack->SetPhi(fTrackPhi);
1089 flowtrack->SetEta(fTrackEta);
1090 break;
1091 case kTrackWithMCkine:
1092 if (!fMCparticle) return NULL;
1093 flowtrack = new AliFlowTrack();
1094 flowtrack->SetPhi( fMCparticle->Phi() );
1095 flowtrack->SetEta( fMCparticle->Eta() );
1096 flowtrack->SetPt( fMCparticle->Pt() );
1097 break;
1098 case kTrackWithMCpt:
1099 if (!fMCparticle) return NULL;
1100 flowtrack = new AliFlowTrack();
1101 flowtrack->SetPhi(fTrackPhi);
1102 flowtrack->SetEta(fTrackEta);
1103 flowtrack->SetPt(fMCparticle->Pt());
1104 break;
1105 case kTrackWithPtFromFirstMother:
1106 if (!fMCparticle) return NULL;
1107 flowtrack = new AliFlowTrack();
1108 flowtrack->SetPhi(fTrackPhi);
1109 flowtrack->SetEta(fTrackEta);
1110 tmpTParticle = fMCparticle->Particle();
1111 tmpAliMCParticle = static_cast<AliMCParticle*>(fMCevent->GetTrack(tmpTParticle->GetFirstMother()));
1112 flowtrack->SetPt(tmpAliMCParticle->Pt());
1113 break;
1114 default:
1115 flowtrack = new AliFlowTrack();
1116 flowtrack->SetPhi(fTrackPhi);
1117 flowtrack->SetEta(fTrackEta);
1118 break;
12b2b8bc 1119 }
d148af7e 1120 flowtrack->SetSource(AliFlowTrack::kFromTracklet);
1121 return flowtrack;
1122}
1123
1124//-----------------------------------------------------------------------
1125AliFlowTrack* AliFlowTrackCuts::MakeFlowTrackVParticle() const
1126{
1127 //make flow track from AliVParticle (ESD,AOD,MC)
1128 if (!fTrack) return NULL;
1129 AliFlowTrack* flowtrack=NULL;
1130 TParticle *tmpTParticle=NULL;
1131 AliMCParticle* tmpAliMCParticle=NULL;
d79d61fb 1132 AliExternalTrackParam* externalParams=NULL;
1133 AliESDtrack* esdtrack=NULL;
d148af7e 1134 switch(fParamMix)
12b2b8bc 1135 {
d148af7e 1136 case kPure:
1137 flowtrack = new AliFlowTrack(fTrack);
1138 break;
1139 case kTrackWithMCkine:
1140 flowtrack = new AliFlowTrack(fMCparticle);
1141 break;
1142 case kTrackWithMCPID:
1143 flowtrack = new AliFlowTrack(fTrack);
1144 //flowtrack->setPID(...) from mc, when implemented
1145 break;
1146 case kTrackWithMCpt:
1147 if (!fMCparticle) return NULL;
1148 flowtrack = new AliFlowTrack(fTrack);
1149 flowtrack->SetPt(fMCparticle->Pt());
1150 break;
1151 case kTrackWithPtFromFirstMother:
1152 if (!fMCparticle) return NULL;
1153 flowtrack = new AliFlowTrack(fTrack);
1154 tmpTParticle = fMCparticle->Particle();
1155 tmpAliMCParticle = static_cast<AliMCParticle*>(fMCevent->GetTrack(tmpTParticle->GetFirstMother()));
1156 flowtrack->SetPt(tmpAliMCParticle->Pt());
1157 break;
d79d61fb 1158 case kTrackWithTPCInnerParams:
1159 esdtrack = dynamic_cast<AliESDtrack*>(fTrack);
1160 if (!esdtrack) return NULL;
1161 externalParams = const_cast<AliExternalTrackParam*>(esdtrack->GetTPCInnerParam());
1162 if (!externalParams) return NULL;
1163 flowtrack = new AliFlowTrack(externalParams);
99cdfc57 1164 break;
d148af7e 1165 default:
1166 flowtrack = new AliFlowTrack(fTrack);
1167 break;
1168 }
499fe731 1169 if (fParamType==kMC)
1170 {
1171 flowtrack->SetSource(AliFlowTrack::kFromMC);
1172 flowtrack->SetID(fTrack->GetLabel());
1173 }
1174 else if (dynamic_cast<AliESDtrack*>(fTrack))
1175 {
1176 flowtrack->SetSource(AliFlowTrack::kFromESD);
1177 flowtrack->SetID(static_cast<AliVTrack*>(fTrack)->GetID());
1178 }
1179 else if (dynamic_cast<AliAODTrack*>(fTrack))
1180 {
1181 flowtrack->SetSource(AliFlowTrack::kFromAOD);
1182 flowtrack->SetID(static_cast<AliVTrack*>(fTrack)->GetID());
1183 }
1184 else if (dynamic_cast<AliMCParticle*>(fTrack))
1185 {
1186 flowtrack->SetSource(AliFlowTrack::kFromMC);
1187 flowtrack->SetID(static_cast<AliVTrack*>(fTrack)->GetID());
1188 }
d148af7e 1189 return flowtrack;
1190}
1191
1192//-----------------------------------------------------------------------
1193AliFlowTrack* AliFlowTrackCuts::MakeFlowTrackPMDtrack() const
1194{
1195 //make a flow track from PMD track
1196 AliFlowTrack* flowtrack=NULL;
1197 TParticle *tmpTParticle=NULL;
1198 AliMCParticle* tmpAliMCParticle=NULL;
1199 switch (fParamMix)
1200 {
1201 case kPure:
1202 flowtrack = new AliFlowTrack();
1203 flowtrack->SetPhi(fTrackPhi);
1204 flowtrack->SetEta(fTrackEta);
1205 flowtrack->SetWeight(fTrackWeight);
1206 break;
1207 case kTrackWithMCkine:
1208 if (!fMCparticle) return NULL;
1209 flowtrack = new AliFlowTrack();
1210 flowtrack->SetPhi( fMCparticle->Phi() );
1211 flowtrack->SetEta( fMCparticle->Eta() );
1212 flowtrack->SetWeight(fTrackWeight);
1213 flowtrack->SetPt( fMCparticle->Pt() );
1214 break;
1215 case kTrackWithMCpt:
1216 if (!fMCparticle) return NULL;
1217 flowtrack = new AliFlowTrack();
1218 flowtrack->SetPhi(fTrackPhi);
1219 flowtrack->SetEta(fTrackEta);
1220 flowtrack->SetWeight(fTrackWeight);
1221 flowtrack->SetPt(fMCparticle->Pt());
1222 break;
1223 case kTrackWithPtFromFirstMother:
1224 if (!fMCparticle) return NULL;
1225 flowtrack = new AliFlowTrack();
1226 flowtrack->SetPhi(fTrackPhi);
1227 flowtrack->SetEta(fTrackEta);
1228 flowtrack->SetWeight(fTrackWeight);
1229 tmpTParticle = fMCparticle->Particle();
1230 tmpAliMCParticle = static_cast<AliMCParticle*>(fMCevent->GetTrack(tmpTParticle->GetFirstMother()));
1231 flowtrack->SetPt(tmpAliMCParticle->Pt());
1232 break;
1233 default:
1234 flowtrack = new AliFlowTrack();
1235 flowtrack->SetPhi(fTrackPhi);
1236 flowtrack->SetEta(fTrackEta);
1237 flowtrack->SetWeight(fTrackWeight);
1238 break;
daf66719 1239 }
6e214c87 1240
d148af7e 1241 flowtrack->SetSource(AliFlowTrack::kFromPMD);
daf66719 1242 return flowtrack;
1243}
127a5825 1244
22289738 1245//-----------------------------------------------------------------------
1246AliFlowTrack* AliFlowTrackCuts::MakeFlowTrackV0() const
1247{
1248 //make a flow track from V0
1249 AliFlowTrack* flowtrack=NULL;
1250 TParticle *tmpTParticle=NULL;
1251 AliMCParticle* tmpAliMCParticle=NULL;
1252 switch (fParamMix)
1253 {
1254 case kPure:
1255 flowtrack = new AliFlowTrack();
1256 flowtrack->SetPhi(fTrackPhi);
1257 flowtrack->SetEta(fTrackEta);
1258 flowtrack->SetWeight(fTrackWeight);
1259 break;
1260 case kTrackWithMCkine:
1261 if (!fMCparticle) return NULL;
1262 flowtrack = new AliFlowTrack();
1263 flowtrack->SetPhi( fMCparticle->Phi() );
1264 flowtrack->SetEta( fMCparticle->Eta() );
1265 flowtrack->SetWeight(fTrackWeight);
1266 flowtrack->SetPt( fMCparticle->Pt() );
1267 break;
1268 case kTrackWithMCpt:
1269 if (!fMCparticle) return NULL;
1270 flowtrack = new AliFlowTrack();
1271 flowtrack->SetPhi(fTrackPhi);
1272 flowtrack->SetEta(fTrackEta);
1273 flowtrack->SetWeight(fTrackWeight);
1274 flowtrack->SetPt(fMCparticle->Pt());
1275 break;
1276 case kTrackWithPtFromFirstMother:
1277 if (!fMCparticle) return NULL;
1278 flowtrack = new AliFlowTrack();
1279 flowtrack->SetPhi(fTrackPhi);
1280 flowtrack->SetEta(fTrackEta);
1281 flowtrack->SetWeight(fTrackWeight);
1282 tmpTParticle = fMCparticle->Particle();
1283 tmpAliMCParticle = static_cast<AliMCParticle*>(fMCevent->GetTrack(tmpTParticle->GetFirstMother()));
1284 flowtrack->SetPt(tmpAliMCParticle->Pt());
1285 break;
1286 default:
1287 flowtrack = new AliFlowTrack();
1288 flowtrack->SetPhi(fTrackPhi);
1289 flowtrack->SetEta(fTrackEta);
1290 flowtrack->SetWeight(fTrackWeight);
1291 break;
1292 }
1293
1294 flowtrack->SetSource(AliFlowTrack::kFromV0);
1295 return flowtrack;
1296}
1297
d148af7e 1298//-----------------------------------------------------------------------
1299AliFlowTrack* AliFlowTrackCuts::MakeFlowTrack() const
1300{
1301 //get a flow track constructed from whatever we applied cuts on
1302 //caller is resposible for deletion
1303 //if construction fails return NULL
22289738 1304 //TODO: for tracklets, PMD and V0 we probably need just one method,
1305 //something like MakeFlowTrackGeneric(), wait with this until
1306 //requirements quirks are known.
d148af7e 1307 switch (fParamType)
1308 {
1a80f9f6 1309 case kSPDtracklet:
d148af7e 1310 return MakeFlowTrackSPDtracklet();
1311 case kPMD:
1312 return MakeFlowTrackPMDtrack();
22289738 1313 case kV0:
1314 return MakeFlowTrackV0();
d148af7e 1315 default:
1316 return MakeFlowTrackVParticle();
1317 }
1318}
1319
127a5825 1320//-----------------------------------------------------------------------
1321Bool_t AliFlowTrackCuts::IsPhysicalPrimary() const
1322{
1323 //check if current particle is a physical primary
9a0783cc 1324 if (!fMCevent) return kFALSE;
1325 if (fTrackLabel<0) return kFALSE;
441ea1cf 1326 return IsPhysicalPrimary(fMCevent, fTrackLabel, fRequireTransportBitForPrimaries);
9a0783cc 1327}
1328
1329//-----------------------------------------------------------------------
441ea1cf 1330Bool_t AliFlowTrackCuts::IsPhysicalPrimary(AliMCEvent* mcEvent, Int_t label, Bool_t requiretransported)
9a0783cc 1331{
1332 //check if current particle is a physical primary
1333 Bool_t physprim=mcEvent->IsPhysicalPrimary(label);
9a0783cc 1334 AliMCParticle* track = static_cast<AliMCParticle*>(mcEvent->GetTrack(label));
1335 if (!track) return kFALSE;
1336 TParticle* particle = track->Particle();
1337 Bool_t transported = particle->TestBit(kTransportBit);
441ea1cf 1338 //printf("label: %i prim: %s, transp: %s, pass: %s\n",label, (physprim)?"YES":"NO ",(transported)?"YES":"NO ",
1339 //(physprim && (transported || !requiretransported))?"YES":"NO" );
1340 return (physprim && (transported || !requiretransported));
127a5825 1341}
12b2b8bc 1342
924b02b0 1343//-----------------------------------------------------------------------
1344void AliFlowTrackCuts::DefineHistograms()
1345{
2a745a5f 1346 //define qa histograms
1a80f9f6 1347 if (fQA) return;
1348
cd62a2a8 1349 const Int_t kNbinsP=60;
499fe731 1350 Double_t binsP[kNbinsP+1];
1351 binsP[0]=0.0;
6a043318 1352 for(int i=1; i<kNbinsP+1; i++)
1a80f9f6 1353 {
499fe731 1354 if(binsP[i-1]+0.05<1.01)
1355 binsP[i]=binsP[i-1]+0.05;
1a80f9f6 1356 else
499fe731 1357 binsP[i]=binsP[i-1]+0.1;
1a80f9f6 1358 }
1359
cd62a2a8 1360 const Int_t nBinsDCA=1000;
1361 Double_t binsDCA[nBinsDCA+1];
b9cf8f8e 1362 for(int i=0; i<nBinsDCA+1; i++) {binsDCA[i]=0.01*i-5.;}
cd62a2a8 1363 //for(int i=1; i<41; i++) {binsDCA[i+100]=0.1*i+1.0;}
1364
499fe731 1365 Bool_t adddirstatus = TH1::AddDirectoryStatus();
1366 TH1::AddDirectory(kFALSE);
a14b8f3c 1367 fQA=new TList(); fQA->SetOwner();
499fe731 1368 fQA->SetName(Form("%s QA",GetName()));
a14b8f3c 1369 TList* before = new TList(); before->SetOwner();
499fe731 1370 before->SetName("before");
a14b8f3c 1371 TList* after = new TList(); after->SetOwner();
499fe731 1372 after->SetName("after");
1373 fQA->Add(before);
1374 fQA->Add(after);
f21bdf48 1375 before->Add(new TH2F("TOFbeta",";p [GeV/c];#beta",kNbinsP,binsP,1000,0.4,1.1)); //0
1376 after->Add(new TH2F("TOFbeta",";p [GeV/c];#beta",kNbinsP,binsP,1000,0.4,1.1)); //0
1377 before->Add(new TH2F("TPCdedx",";p [GeV/c];dEdx",kNbinsP,binsP,500,0,500)); //1
1378 after->Add(new TH2F("TPCdedx",";p [GeV/c];dEdx",kNbinsP,binsP,500,0,500)); //1
1379 before->Add(new TH2F("MC pid",";p[GeV/c];species",kNbinsP,binsP,10,-5, 5)); //2
1380 after->Add(new TH2F("MC pid",";p[GeV/c];species",kNbinsP,binsP,10,-5, 5)); //2
1381 before->Add(new TH2F("MC primary",";p[GeV/c];primary",kNbinsP,binsP,2,-1,1)); //3
1382 after->Add(new TH2F("MC primary",";p[GeV/c];primary",kNbinsP,binsP,2,-1,1)); //3
875ee12a 1383 //production process
1384 TH2F* hb = new TH2F("MC production process",";p[GeV/c];",kNbinsP,binsP,kMaxMCProcess,
1385 -0.5, kMaxMCProcess-0.5);
1386 TH2F* ha = new TH2F("MC production process",";p[GeV/c];",kNbinsP,binsP,kMaxMCProcess,
1387 -0.5, kMaxMCProcess-0.5);
1388 TAxis* axis = hb->GetYaxis();
1389 for (Int_t i=0; i<kMaxMCProcess; i++)
1390 {
1391 axis->SetBinLabel(i+1,TMCProcessName[i]);
1392 }
644f1368 1393 axis = ha->GetYaxis();
875ee12a 1394 for (Int_t i=0; i<kMaxMCProcess; i++)
1395 {
1396 axis->SetBinLabel(i+1,TMCProcessName[i]);
1397 }
1398 before->Add(hb); //4
1399 after->Add(ha); //4
cd62a2a8 1400 //DCA
1401 before->Add(new TH2F("DCAxy",";p_{t}[GeV/c];DCAxy[cm]", 100, 0., 10., nBinsDCA, binsDCA));//5
1402 after->Add(new TH2F("DCAxy",";p_{t}[GeV/c];DCAxy[cm]", 100, 0., 10., nBinsDCA, binsDCA));//5
1403 before->Add(new TH2F("DCAz",";p_{t}[GeV/c];DCAz[cm]", 100, 0., 10., nBinsDCA, binsDCA));//6
1404 after->Add(new TH2F("DCAz",";p_{t}[GeV/c];DCAz[cm]", 100, 0., 10., nBinsDCA, binsDCA));//6
1405
499fe731 1406 TH1::AddDirectory(adddirstatus);
924b02b0 1407}
9a0783cc 1408
1409//-----------------------------------------------------------------------
1410Int_t AliFlowTrackCuts::GetNumberOfInputObjects() const
1411{
1412 //get the number of tracks in the input event according source
1413 //selection (ESD tracks, tracklets, MC particles etc.)
1414 AliESDEvent* esd=NULL;
1415 switch (fParamType)
1416 {
1a80f9f6 1417 case kSPDtracklet:
9a0783cc 1418 esd = dynamic_cast<AliESDEvent*>(fEvent);
1419 if (!esd) return 0;
1420 return esd->GetMultiplicity()->GetNumberOfTracklets();
1421 case kMC:
1422 if (!fMCevent) return 0;
1423 return fMCevent->GetNumberOfTracks();
d148af7e 1424 case kPMD:
1425 esd = dynamic_cast<AliESDEvent*>(fEvent);
1426 if (!esd) return 0;
1427 return esd->GetNumberOfPmdTracks();
22289738 1428 case kV0:
1429 return fgkNumberOfV0tracks;
9a0783cc 1430 default:
1431 if (!fEvent) return 0;
1432 return fEvent->GetNumberOfTracks();
1433 }
1434 return 0;
1435}
1436
1437//-----------------------------------------------------------------------
1438TObject* AliFlowTrackCuts::GetInputObject(Int_t i)
1439{
1440 //get the input object according the data source selection:
1441 //(esd tracks, traclets, mc particles,etc...)
1442 AliESDEvent* esd=NULL;
1443 switch (fParamType)
1444 {
1a80f9f6 1445 case kSPDtracklet:
9a0783cc 1446 esd = dynamic_cast<AliESDEvent*>(fEvent);
1447 if (!esd) return NULL;
1448 return const_cast<AliMultiplicity*>(esd->GetMultiplicity());
1449 case kMC:
1450 if (!fMCevent) return NULL;
1451 return fMCevent->GetTrack(i);
d148af7e 1452 case kPMD:
1453 esd = dynamic_cast<AliESDEvent*>(fEvent);
1454 if (!esd) return NULL;
1455 return esd->GetPmdTrack(i);
22289738 1456 case kV0:
1457 esd = dynamic_cast<AliESDEvent*>(fEvent);
a14b8f3c 1458 if (!esd) return NULL;
22289738 1459 return esd->GetVZEROData();
9a0783cc 1460 default:
1461 if (!fEvent) return NULL;
1462 return fEvent->GetTrack(i);
1463 }
1464}
a1c43d26 1465
1466//-----------------------------------------------------------------------
1467void AliFlowTrackCuts::Clear(Option_t*)
1468{
1469 //clean up
1470 fTrack=NULL;
1471 fMCevent=NULL;
1472 fMCparticle=NULL;
22289738 1473 fTrackLabel=-1;
a1c43d26 1474 fTrackWeight=0.0;
1475 fTrackEta=0.0;
1476 fTrackPhi=0.0;
1477}
32b846cd 1478
1479//-----------------------------------------------------------------------
1a80f9f6 1480Bool_t AliFlowTrackCuts::PassesTOFbetaSimpleCut(const AliESDtrack* track )
32b846cd 1481{
1482 //check if passes PID cut using timing in TOF
a14b8f3c 1483 Bool_t goodtrack = (track->GetStatus() & AliESDtrack::kTOFpid) &&
b092f828 1484 (track->GetTOFsignal() > 12000) &&
1485 (track->GetTOFsignal() < 100000) &&
499fe731 1486 (track->GetIntegratedLength() > 365);
1487
875ee12a 1488 if (!fAllowTOFmismatchFlag) {if ((track->GetStatus() & AliESDtrack::kTOFmismatch)) return kFALSE;}
1489
1490 Bool_t statusMatchingHard = TPCTOFagree(track);
1491 if (fRequireStrictTOFTPCagreement && (!statusMatchingHard))
1492 return kFALSE;
aab6527a 1493
1494 if (!goodtrack) return kFALSE;
1495
a0241c3a 1496 const Float_t c = 2.99792457999999984e-02;
b092f828 1497 Float_t p = track->GetP();
1a80f9f6 1498 Float_t l = track->GetIntegratedLength();
aab6527a 1499 Float_t trackT0 = fESDpid.GetTOFResponse().GetStartTime(p);
b092f828 1500 Float_t timeTOF = track->GetTOFsignal()- trackT0;
1a80f9f6 1501 Float_t beta = l/timeTOF/c;
1502 Double_t integratedTimes[5] = {-1.0,-1.0,-1.0,-1.0,-1.0};
1503 track->GetIntegratedTimes(integratedTimes);
1504 Float_t betaHypothesis[5] = {0.0,0.0,0.0,0.0,0.0};
1505 Float_t s[5] = {0.0,0.0,0.0,0.0,0.0};
1506 for (Int_t i=0;i<5;i++)
1507 {
1508 betaHypothesis[i] = l/integratedTimes[i]/c;
1509 s[i] = beta-betaHypothesis[i];
1510 }
1511
1512 switch (fParticleID)
1513 {
1514 case AliPID::kPion:
1515 return ( (s[2]<0.015) && (s[2]>-0.015) &&
7288f660 1516 (s[3]>0.025) &&
1517 (s[4]>0.03) );
1a80f9f6 1518 case AliPID::kKaon:
1519 return ( (s[3]<0.015) && (s[3]>-0.015) &&
7288f660 1520 (s[2]<-0.03) &&
1521 (s[4]>0.03) );
1a80f9f6 1522 case AliPID::kProton:
499fe731 1523 return ( (s[4]<0.015) && (s[4]>-0.015) &&
7288f660 1524 (s[3]<-0.025) &&
1525 (s[2]<-0.025) );
1a80f9f6 1526 default:
1527 return kFALSE;
1528 }
1529 return kFALSE;
1530}
1531
499fe731 1532//-----------------------------------------------------------------------
1533Float_t AliFlowTrackCuts::GetBeta(const AliESDtrack* track)
1534{
1535 //get beta
1536 const Float_t c = 2.99792457999999984e-02;
1537 Float_t p = track->GetP();
1538 Float_t l = track->GetIntegratedLength();
1539 Float_t trackT0 = fESDpid.GetTOFResponse().GetStartTime(p);
1540 Float_t timeTOF = track->GetTOFsignal()- trackT0;
1541 return l/timeTOF/c;
1542}
1543
1a80f9f6 1544//-----------------------------------------------------------------------
1545Bool_t AliFlowTrackCuts::PassesTOFbetaCut(const AliESDtrack* track )
1546{
9b692328 1547 if (!fTOFpidCuts)
1548 {
1549 //printf("no TOFpidCuts\n");
1550 return kFALSE;
1551 }
1552
1a80f9f6 1553 //check if passes PID cut using timing in TOF
a14b8f3c 1554 Bool_t goodtrack = (track->GetStatus() & AliESDtrack::kTOFpid) &&
1a80f9f6 1555 (track->GetTOFsignal() > 12000) &&
1556 (track->GetTOFsignal() < 100000) &&
499fe731 1557 (track->GetIntegratedLength() > 365);
1558
875ee12a 1559 if (!fAllowTOFmismatchFlag) {if ((track->GetStatus() & AliESDtrack::kTOFmismatch)) return kFALSE;}
1560
1561 Bool_t statusMatchingHard = TPCTOFagree(track);
1562 if (fRequireStrictTOFTPCagreement && (!statusMatchingHard))
1563 return kFALSE;
1a80f9f6 1564
1565 if (!goodtrack) return kFALSE;
1566
499fe731 1567 Float_t beta = GetBeta(track);
1568
a0241c3a 1569 Double_t integratedTimes[5] = {-1.0,-1.0,-1.0,-1.0,-1.0};
1570 track->GetIntegratedTimes(integratedTimes);
1571
1572 //construct the pid index because it's not AliPID::EParticleType
32b846cd 1573 Int_t pid = 0;
2b1eaa10 1574 switch (fParticleID)
32b846cd 1575 {
1576 case AliPID::kPion:
1577 pid=2;
1578 break;
1579 case AliPID::kKaon:
1580 pid=3;
1581 break;
1582 case AliPID::kProton:
1583 pid=4;
1584 break;
1585 default:
1586 return kFALSE;
1587 }
a0241c3a 1588
1589 //signal to cut on
499fe731 1590 const Float_t c = 2.99792457999999984e-02;
1591 Float_t l = track->GetIntegratedLength();
1592 Float_t p = track->GetP();
1a80f9f6 1593 Float_t betahypothesis = l/integratedTimes[pid]/c;
1594 Float_t betadiff = beta-betahypothesis;
32b846cd 1595
1596 Float_t* arr = fTOFpidCuts->GetMatrixArray();
a0241c3a 1597 Int_t col = TMath::BinarySearch(fTOFpidCuts->GetNcols(),arr,static_cast<Float_t>(p));
32b846cd 1598 if (col<0) return kFALSE;
1599 Float_t min = (*fTOFpidCuts)(1,col);
1600 Float_t max = (*fTOFpidCuts)(2,col);
1601
1a80f9f6 1602 Bool_t pass = (betadiff>min && betadiff<max);
1603
1a80f9f6 1604 return pass;
32b846cd 1605}
1606
2b1eaa10 1607//-----------------------------------------------------------------------
7d27a354 1608Bool_t AliFlowTrackCuts::PassesTOFpidCut(const AliESDtrack* track) const
2b1eaa10 1609{
1610 //check if passes PID cut using default TOF pid
7d27a354 1611 Double_t pidTOF[AliPID::kSPECIES];
1612 track->GetTOFpid(pidTOF);
1613 if (pidTOF[fParticleID]>=fParticleProbability) return kTRUE;
2b1eaa10 1614 return kFALSE;
1615}
1616
32b846cd 1617//-----------------------------------------------------------------------
1a80f9f6 1618Bool_t AliFlowTrackCuts::PassesTPCpidCut(const AliESDtrack* track) const
2b1eaa10 1619{
1620 //check if passes PID cut using default TPC pid
1621 Double_t pidTPC[AliPID::kSPECIES];
1622 track->GetTPCpid(pidTPC);
1623 Double_t probablity = 0.;
1624 switch (fParticleID)
1625 {
1626 case AliPID::kPion:
1627 probablity = pidTPC[AliPID::kPion] + pidTPC[AliPID::kMuon];
1628 break;
1629 default:
1630 probablity = pidTPC[fParticleID];
1631 }
1632 if (probablity >= fParticleProbability) return kTRUE;
1633 return kFALSE;
1634}
1635
499fe731 1636//-----------------------------------------------------------------------
1637Float_t AliFlowTrackCuts::Getdedx(const AliESDtrack* track)
1638{
1639 //get TPC dedx
1640 return track->GetTPCsignal();
1641}
1642
2b1eaa10 1643//-----------------------------------------------------------------------
1a80f9f6 1644Bool_t AliFlowTrackCuts::PassesTPCdedxCut(const AliESDtrack* track)
32b846cd 1645{
1646 //check if passes PID cut using dedx signal in the TPC
32b846cd 1647 if (!fTPCpidCuts)
1648 {
9b692328 1649 //printf("no TPCpidCuts\n");
32b846cd 1650 return kFALSE;
1651 }
1652
3c75bbd5 1653 const AliExternalTrackParam* tpcparam = track->GetInnerParam(); //tpc only params at the inner wall
1654 if (!tpcparam) return kFALSE;
d79d61fb 1655 Double_t p = tpcparam->GetP();
1656 Float_t sigExp = fESDpid.GetTPCResponse().GetExpectedSignal(p, fParticleID);
32b846cd 1657 Float_t sigTPC = track->GetTPCsignal();
1658 Float_t s = (sigTPC-sigExp)/sigExp;
32b846cd 1659
1660 Float_t* arr = fTPCpidCuts->GetMatrixArray();
1a80f9f6 1661 Int_t arrSize = fTPCpidCuts->GetNcols();
1662 Int_t col = TMath::BinarySearch( arrSize, arr, static_cast<Float_t>(p));
32b846cd 1663 if (col<0) return kFALSE;
1664 Float_t min = (*fTPCpidCuts)(1,col);
1665 Float_t max = (*fTPCpidCuts)(2,col);
1666
1667 //printf("------------TPC pid cut %s\n",(s>min && s<max)?"PASS":"FAIL");
1668 return (s>min && s<max);
1669}
1670
1671//-----------------------------------------------------------------------
1672void AliFlowTrackCuts::InitPIDcuts()
1673{
1674 //init matrices with PID cuts
1675 TMatrixF* t = NULL;
1676 if (!fTPCpidCuts)
1677 {
2b1eaa10 1678 if (fParticleID==AliPID::kPion)
32b846cd 1679 {
d79d61fb 1680 t = new TMatrixF(3,15);
1681 (*t)(0,0) = 0.20; (*t)(1,0) = -0.4; (*t)(2,0) = 0.0;
1682 (*t)(0,1) = 0.25; (*t)(1,1) = -0.4; (*t)(2,1) = 0.1;
1683 (*t)(0,2) = 0.30; (*t)(1,2) = -0.4; (*t)(2,2) = 0.2;
1684 (*t)(0,3) = 0.35; (*t)(1,3) = -0.4; (*t)(2,3) = 0.2;
32b846cd 1685 (*t)(0,4) = 0.40; (*t)(1,4) = -0.4; (*t)(2,4) = 0.3;
1686 (*t)(0,5) = 0.45; (*t)(1,5) = -0.4; (*t)(2,5) = 0.3;
1687 (*t)(0,6) = 0.50; (*t)(1,6) = -0.4; (*t)(2,6) = 0.25;
1688 (*t)(0,7) = 0.55; (*t)(1,7) = -0.4; (*t)(2,7) = 0.15;
1689 (*t)(0,8) = 0.60; (*t)(1,8) = -0.4; (*t)(2,8) = 0.1;
d79d61fb 1690 (*t)(0,9) = 0.65; (*t)(1,9) = -0.4; (*t)(2,9) = 0.05;
1691 (*t)(0,10) = 0.70; (*t)(1,10) = -0.4; (*t)(2,10) = 0;
1692 (*t)(0,11) = 0.75; (*t)(1,11) = -0.4; (*t)(2,11) = 0;
1693 (*t)(0,12) = 0.80; (*t)(1,12) = -0.4; (*t)(2,12) = -0.05;
1694 (*t)(0,13) = 0.85; (*t)(1,13) = -0.4; (*t)(2,13) = -0.1;
1695 (*t)(0,14) = 0.90; (*t)(1,14) = 0; (*t)(2,14) = 0;
32b846cd 1696 }
1697 else
2b1eaa10 1698 if (fParticleID==AliPID::kKaon)
3ca4688a 1699 {
d79d61fb 1700 t = new TMatrixF(3,12);
1701 (*t)(0,0) = 0.20; (*t)(1,0) = -0.2; (*t)(2,0) = 0.2;
1702 (*t)(0,1) = 0.25; (*t)(1,1) = -0.2; (*t)(2,1) = 0.2;
1703 (*t)(0,2) = 0.30; (*t)(1,2) = -0.2; (*t)(2,2) = 0.2;
1704 (*t)(0,3) = 0.35; (*t)(1,3) = -0.2; (*t)(2,3) = 0.2;
1705 (*t)(0,4) = 0.40; (*t)(1,4) = -0.1; (*t)(2,4) = 0.2;
1706 (*t)(0,5) = 0.45; (*t)(1,5) = -0.1; (*t)(2,5) = 0.2;
1707 (*t)(0,6) = 0.50; (*t)(1,6) =-0.05; (*t)(2,6) = 0.2;
1708 (*t)(0,7) = 0.55; (*t)(1,7) = -0.1; (*t)(2,7) = 0.1;
1709 (*t)(0,8) = 0.60; (*t)(1,8) =-0.05; (*t)(2,8) = 0.1;
1710 (*t)(0,9) = 0.65; (*t)(1,9) = 0; (*t)(2,9) = 0.15;
1711 (*t)(0,10) = 0.70; (*t)(1,10) = 0.05; (*t)(2,10) = 0.2;
1a80f9f6 1712 (*t)(0,11) = 0.75; (*t)(1,11) = 0; (*t)(2,11) = 0;
3ca4688a 1713 }
1714 else
2b1eaa10 1715 if (fParticleID==AliPID::kProton)
32b846cd 1716 {
d79d61fb 1717 t = new TMatrixF(3,9);
1718 (*t)(0,0) = 0.20; (*t)(1,0) = -0.1; (*t)(2,0) = 0.1;
1719 (*t)(0,1) = 0.25; (*t)(1,1) = -0.2; (*t)(2,1) = 0.2;
1720 (*t)(0,2) = 0.80; (*t)(1,2) = -0.1; (*t)(2,2) = 0.2;
1721 (*t)(0,3) = 0.85; (*t)(1,3) =-0.05; (*t)(2,3) = 0.2;
1722 (*t)(0,4) = 0.90; (*t)(1,4) =-0.05; (*t)(2,4) = 0.25;
1723 (*t)(0,5) = 0.95; (*t)(1,5) =-0.05; (*t)(2,5) = 0.25;
1724 (*t)(0,6) = 1.00; (*t)(1,6) = -0.1; (*t)(2,6) = 0.25;
1725 (*t)(0,7) = 1.10; (*t)(1,7) =-0.05; (*t)(2,7) = 0.3;
1726 (*t)(0,8) = 1.20; (*t)(1,8) = 0; (*t)(2,8) = 0;
32b846cd 1727 }
d79d61fb 1728 delete fTPCpidCuts;
32b846cd 1729 fTPCpidCuts=t;
1730 }
7d9ab4fb 1731 t = NULL;
32b846cd 1732 if (!fTOFpidCuts)
1733 {
2b1eaa10 1734 if (fParticleID==AliPID::kPion)
32b846cd 1735 {
a0241c3a 1736 //TOF pions, 0.9 purity
1737 t = new TMatrixF(3,61);
d79d61fb 1738 (*t)(0,0) = 0.000; (*t)(1,0) = 0.000; (*t)(2,0) = 0.000;
1739 (*t)(0,1) = 0.050; (*t)(1,1) = 0.000; (*t)(2,1) = 0.000;
1740 (*t)(0,2) = 0.100; (*t)(1,2) = 0.000; (*t)(2,2) = 0.000;
1741 (*t)(0,3) = 0.150; (*t)(1,3) = 0.000; (*t)(2,3) = 0.000;
1a80f9f6 1742 (*t)(0,4) = 0.200; (*t)(1,4) = -0.030; (*t)(2,4) = 0.030;
d79d61fb 1743 (*t)(0,5) = 0.250; (*t)(1,5) = -0.036; (*t)(2,5) = 0.032;
1744 (*t)(0,6) = 0.300; (*t)(1,6) = -0.038; (*t)(2,6) = 0.032;
1745 (*t)(0,7) = 0.350; (*t)(1,7) = -0.034; (*t)(2,7) = 0.032;
1746 (*t)(0,8) = 0.400; (*t)(1,8) = -0.032; (*t)(2,8) = 0.020;
1747 (*t)(0,9) = 0.450; (*t)(1,9) = -0.030; (*t)(2,9) = 0.020;
1748 (*t)(0,10) = 0.500; (*t)(1,10) = -0.030; (*t)(2,10) = 0.020;
1749 (*t)(0,11) = 0.550; (*t)(1,11) = -0.030; (*t)(2,11) = 0.020;
1750 (*t)(0,12) = 0.600; (*t)(1,12) = -0.030; (*t)(2,12) = 0.020;
1751 (*t)(0,13) = 0.650; (*t)(1,13) = -0.030; (*t)(2,13) = 0.020;
1752 (*t)(0,14) = 0.700; (*t)(1,14) = -0.030; (*t)(2,14) = 0.020;
1753 (*t)(0,15) = 0.750; (*t)(1,15) = -0.030; (*t)(2,15) = 0.020;
1754 (*t)(0,16) = 0.800; (*t)(1,16) = -0.030; (*t)(2,16) = 0.020;
1755 (*t)(0,17) = 0.850; (*t)(1,17) = -0.030; (*t)(2,17) = 0.020;
1756 (*t)(0,18) = 0.900; (*t)(1,18) = -0.030; (*t)(2,18) = 0.020;
1757 (*t)(0,19) = 0.950; (*t)(1,19) = -0.028; (*t)(2,19) = 0.028;
1758 (*t)(0,20) = 1.000; (*t)(1,20) = -0.028; (*t)(2,20) = 0.028;
1759 (*t)(0,21) = 1.100; (*t)(1,21) = -0.028; (*t)(2,21) = 0.028;
1760 (*t)(0,22) = 1.200; (*t)(1,22) = -0.026; (*t)(2,22) = 0.028;
1761 (*t)(0,23) = 1.300; (*t)(1,23) = -0.024; (*t)(2,23) = 0.028;
1762 (*t)(0,24) = 1.400; (*t)(1,24) = -0.020; (*t)(2,24) = 0.028;
1763 (*t)(0,25) = 1.500; (*t)(1,25) = -0.018; (*t)(2,25) = 0.028;
1764 (*t)(0,26) = 1.600; (*t)(1,26) = -0.016; (*t)(2,26) = 0.028;
1765 (*t)(0,27) = 1.700; (*t)(1,27) = -0.014; (*t)(2,27) = 0.028;
1766 (*t)(0,28) = 1.800; (*t)(1,28) = -0.012; (*t)(2,28) = 0.026;
1767 (*t)(0,29) = 1.900; (*t)(1,29) = -0.010; (*t)(2,29) = 0.026;
1768 (*t)(0,30) = 2.000; (*t)(1,30) = -0.008; (*t)(2,30) = 0.026;
1769 (*t)(0,31) = 2.100; (*t)(1,31) = -0.008; (*t)(2,31) = 0.024;
1770 (*t)(0,32) = 2.200; (*t)(1,32) = -0.006; (*t)(2,32) = 0.024;
1771 (*t)(0,33) = 2.300; (*t)(1,33) = -0.004; (*t)(2,33) = 0.024;
1772 (*t)(0,34) = 2.400; (*t)(1,34) = -0.004; (*t)(2,34) = 0.024;
1773 (*t)(0,35) = 2.500; (*t)(1,35) = -0.002; (*t)(2,35) = 0.024;
1774 (*t)(0,36) = 2.600; (*t)(1,36) = -0.002; (*t)(2,36) = 0.024;
1775 (*t)(0,37) = 2.700; (*t)(1,37) = 0.000; (*t)(2,37) = 0.024;
1776 (*t)(0,38) = 2.800; (*t)(1,38) = 0.000; (*t)(2,38) = 0.026;
1777 (*t)(0,39) = 2.900; (*t)(1,39) = 0.000; (*t)(2,39) = 0.024;
1778 (*t)(0,40) = 3.000; (*t)(1,40) = 0.002; (*t)(2,40) = 0.026;
1779 (*t)(0,41) = 3.100; (*t)(1,41) = 0.002; (*t)(2,41) = 0.026;
1780 (*t)(0,42) = 3.200; (*t)(1,42) = 0.002; (*t)(2,42) = 0.026;
1781 (*t)(0,43) = 3.300; (*t)(1,43) = 0.002; (*t)(2,43) = 0.026;
1782 (*t)(0,44) = 3.400; (*t)(1,44) = 0.002; (*t)(2,44) = 0.026;
1783 (*t)(0,45) = 3.500; (*t)(1,45) = 0.002; (*t)(2,45) = 0.026;
1784 (*t)(0,46) = 3.600; (*t)(1,46) = 0.002; (*t)(2,46) = 0.026;
1785 (*t)(0,47) = 3.700; (*t)(1,47) = 0.002; (*t)(2,47) = 0.026;
1786 (*t)(0,48) = 3.800; (*t)(1,48) = 0.002; (*t)(2,48) = 0.026;
1787 (*t)(0,49) = 3.900; (*t)(1,49) = 0.004; (*t)(2,49) = 0.024;
1788 (*t)(0,50) = 4.000; (*t)(1,50) = 0.004; (*t)(2,50) = 0.026;
1789 (*t)(0,51) = 4.100; (*t)(1,51) = 0.004; (*t)(2,51) = 0.026;
1790 (*t)(0,52) = 4.200; (*t)(1,52) = 0.004; (*t)(2,52) = 0.024;
1791 (*t)(0,53) = 4.300; (*t)(1,53) = 0.006; (*t)(2,53) = 0.024;
1792 (*t)(0,54) = 4.400; (*t)(1,54) = 0.000; (*t)(2,54) = 0.000;
1793 (*t)(0,55) = 4.500; (*t)(1,55) = 0.000; (*t)(2,55) = 0.000;
1794 (*t)(0,56) = 4.600; (*t)(1,56) = 0.000; (*t)(2,56) = 0.000;
1795 (*t)(0,57) = 4.700; (*t)(1,57) = 0.000; (*t)(2,57) = 0.000;
1796 (*t)(0,58) = 4.800; (*t)(1,58) = 0.000; (*t)(2,58) = 0.000;
1797 (*t)(0,59) = 4.900; (*t)(1,59) = 0.000; (*t)(2,59) = 0.000;
1798 (*t)(0,60) = 5.900; (*t)(1,60) = 0.000; (*t)(2,60) = 0.000;
32b846cd 1799 }
1800 else
2b1eaa10 1801 if (fParticleID==AliPID::kProton)
32b846cd 1802 {
a0241c3a 1803 //TOF protons, 0.9 purity
1804 t = new TMatrixF(3,61);
d79d61fb 1805 (*t)(0,0) = 0.000; (*t)(1,0) = 0.000; (*t)(2,0) = 0.000;
1806 (*t)(0,1) = 0.050; (*t)(1,1) = 0.000; (*t)(2,1) = 0.000;
1807 (*t)(0,2) = 0.100; (*t)(1,2) = 0.000; (*t)(2,2) = 0.000;
1808 (*t)(0,3) = 0.150; (*t)(1,3) = 0.000; (*t)(2,3) = 0.000;
1a80f9f6 1809 (*t)(0,4) = 0.200; (*t)(1,4) = -0.07; (*t)(2,4) = 0.07;
1810 (*t)(0,5) = 0.200; (*t)(1,5) = -0.07; (*t)(2,5) = 0.07;
1811 (*t)(0,6) = 0.200; (*t)(1,6) = -0.07; (*t)(2,6) = 0.07;
1812 (*t)(0,7) = 0.200; (*t)(1,7) = -0.07; (*t)(2,7) = 0.07;
1813 (*t)(0,8) = 0.200; (*t)(1,8) = -0.07; (*t)(2,8) = 0.07;
1814 (*t)(0,9) = 0.200; (*t)(1,9) = -0.07; (*t)(2,9) = 0.07;
1815 (*t)(0,10) = 0.200; (*t)(1,10) = -0.07; (*t)(2,10) = 0.07;
1816 (*t)(0,11) = 0.200; (*t)(1,11) = -0.07; (*t)(2,11) = 0.07;
1817 (*t)(0,12) = 0.200; (*t)(1,12) = -0.07; (*t)(2,12) = 0.07;
1818 (*t)(0,13) = 0.200; (*t)(1,13) = -0.07; (*t)(2,13) = 0.07;
1819 (*t)(0,14) = 0.200; (*t)(1,14) = -0.07; (*t)(2,14) = 0.07;
1820 (*t)(0,15) = 0.200; (*t)(1,15) = -0.07; (*t)(2,15) = 0.07;
1821 (*t)(0,16) = 0.200; (*t)(1,16) = -0.07; (*t)(2,16) = 0.07;
d79d61fb 1822 (*t)(0,17) = 0.850; (*t)(1,17) = -0.070; (*t)(2,17) = 0.070;
1823 (*t)(0,18) = 0.900; (*t)(1,18) = -0.072; (*t)(2,18) = 0.072;
1824 (*t)(0,19) = 0.950; (*t)(1,19) = -0.072; (*t)(2,19) = 0.072;
1825 (*t)(0,20) = 1.000; (*t)(1,20) = -0.074; (*t)(2,20) = 0.074;
1826 (*t)(0,21) = 1.100; (*t)(1,21) = -0.032; (*t)(2,21) = 0.032;
1827 (*t)(0,22) = 1.200; (*t)(1,22) = -0.026; (*t)(2,22) = 0.026;
1828 (*t)(0,23) = 1.300; (*t)(1,23) = -0.026; (*t)(2,23) = 0.026;
1829 (*t)(0,24) = 1.400; (*t)(1,24) = -0.024; (*t)(2,24) = 0.024;
1830 (*t)(0,25) = 1.500; (*t)(1,25) = -0.024; (*t)(2,25) = 0.024;
1831 (*t)(0,26) = 1.600; (*t)(1,26) = -0.026; (*t)(2,26) = 0.026;
1832 (*t)(0,27) = 1.700; (*t)(1,27) = -0.026; (*t)(2,27) = 0.026;
1833 (*t)(0,28) = 1.800; (*t)(1,28) = -0.026; (*t)(2,28) = 0.026;
1834 (*t)(0,29) = 1.900; (*t)(1,29) = -0.026; (*t)(2,29) = 0.026;
1835 (*t)(0,30) = 2.000; (*t)(1,30) = -0.026; (*t)(2,30) = 0.026;
1836 (*t)(0,31) = 2.100; (*t)(1,31) = -0.026; (*t)(2,31) = 0.026;
1837 (*t)(0,32) = 2.200; (*t)(1,32) = -0.026; (*t)(2,32) = 0.024;
1838 (*t)(0,33) = 2.300; (*t)(1,33) = -0.028; (*t)(2,33) = 0.022;
1839 (*t)(0,34) = 2.400; (*t)(1,34) = -0.028; (*t)(2,34) = 0.020;
1840 (*t)(0,35) = 2.500; (*t)(1,35) = -0.028; (*t)(2,35) = 0.018;
1841 (*t)(0,36) = 2.600; (*t)(1,36) = -0.028; (*t)(2,36) = 0.016;
1842 (*t)(0,37) = 2.700; (*t)(1,37) = -0.028; (*t)(2,37) = 0.016;
1843 (*t)(0,38) = 2.800; (*t)(1,38) = -0.030; (*t)(2,38) = 0.014;
1844 (*t)(0,39) = 2.900; (*t)(1,39) = -0.030; (*t)(2,39) = 0.012;
1845 (*t)(0,40) = 3.000; (*t)(1,40) = -0.030; (*t)(2,40) = 0.012;
1846 (*t)(0,41) = 3.100; (*t)(1,41) = -0.030; (*t)(2,41) = 0.010;
1847 (*t)(0,42) = 3.200; (*t)(1,42) = -0.030; (*t)(2,42) = 0.010;
1848 (*t)(0,43) = 3.300; (*t)(1,43) = -0.030; (*t)(2,43) = 0.010;
1849 (*t)(0,44) = 3.400; (*t)(1,44) = -0.030; (*t)(2,44) = 0.008;
1850 (*t)(0,45) = 3.500; (*t)(1,45) = -0.030; (*t)(2,45) = 0.008;
1851 (*t)(0,46) = 3.600; (*t)(1,46) = -0.030; (*t)(2,46) = 0.008;
1852 (*t)(0,47) = 3.700; (*t)(1,47) = -0.030; (*t)(2,47) = 0.006;
1853 (*t)(0,48) = 3.800; (*t)(1,48) = -0.030; (*t)(2,48) = 0.006;
1854 (*t)(0,49) = 3.900; (*t)(1,49) = -0.030; (*t)(2,49) = 0.006;
1855 (*t)(0,50) = 4.000; (*t)(1,50) = -0.028; (*t)(2,50) = 0.004;
1856 (*t)(0,51) = 4.100; (*t)(1,51) = -0.030; (*t)(2,51) = 0.004;
1857 (*t)(0,52) = 4.200; (*t)(1,52) = -0.030; (*t)(2,52) = 0.004;
1858 (*t)(0,53) = 4.300; (*t)(1,53) = -0.028; (*t)(2,53) = 0.002;
1859 (*t)(0,54) = 4.400; (*t)(1,54) = -0.030; (*t)(2,54) = 0.002;
1860 (*t)(0,55) = 4.500; (*t)(1,55) = -0.028; (*t)(2,55) = 0.002;
1861 (*t)(0,56) = 4.600; (*t)(1,56) = -0.028; (*t)(2,56) = 0.002;
1862 (*t)(0,57) = 4.700; (*t)(1,57) = -0.028; (*t)(2,57) = 0.000;
1863 (*t)(0,58) = 4.800; (*t)(1,58) = -0.028; (*t)(2,58) = 0.002;
1864 (*t)(0,59) = 4.900; (*t)(1,59) = 0.000; (*t)(2,59) = 0.000;
1865 (*t)(0,60) = 5.900; (*t)(1,60) = 0.000; (*t)(2,60) = 0.000;
32b846cd 1866 }
1867 else
2b1eaa10 1868 if (fParticleID==AliPID::kKaon)
32b846cd 1869 {
a0241c3a 1870 //TOF kaons, 0.9 purity
1871 t = new TMatrixF(3,61);
d79d61fb 1872 (*t)(0,0) = 0.000; (*t)(1,0) = 0.000; (*t)(2,0) = 0.000;
1873 (*t)(0,1) = 0.050; (*t)(1,1) = 0.000; (*t)(2,1) = 0.000;
1874 (*t)(0,2) = 0.100; (*t)(1,2) = 0.000; (*t)(2,2) = 0.000;
1875 (*t)(0,3) = 0.150; (*t)(1,3) = 0.000; (*t)(2,3) = 0.000;
1a80f9f6 1876 (*t)(0,4) = 0.200; (*t)(1,4) = -0.05; (*t)(2,4) = 0.05;
1877 (*t)(0,5) = 0.200; (*t)(1,5) = -0.05; (*t)(2,5) = 0.05;
1878 (*t)(0,6) = 0.200; (*t)(1,6) = -0.05; (*t)(2,6) = 0.05;
1879 (*t)(0,7) = 0.200; (*t)(1,7) = -0.05; (*t)(2,7) = 0.05;
1880 (*t)(0,8) = 0.200; (*t)(1,8) = -0.05; (*t)(2,8) = 0.05;
1881 (*t)(0,9) = 0.200; (*t)(1,9) = -0.05; (*t)(2,9) = 0.05;
1882 (*t)(0,10) = 0.200; (*t)(1,10) = -0.05; (*t)(2,10) = 0.05;
d79d61fb 1883 (*t)(0,11) = 0.550; (*t)(1,11) = -0.026; (*t)(2,11) = 0.026;
1884 (*t)(0,12) = 0.600; (*t)(1,12) = -0.026; (*t)(2,12) = 0.026;
1885 (*t)(0,13) = 0.650; (*t)(1,13) = -0.026; (*t)(2,13) = 0.026;
1886 (*t)(0,14) = 0.700; (*t)(1,14) = -0.026; (*t)(2,14) = 0.026;
1887 (*t)(0,15) = 0.750; (*t)(1,15) = -0.026; (*t)(2,15) = 0.026;
1888 (*t)(0,16) = 0.800; (*t)(1,16) = -0.026; (*t)(2,16) = 0.026;
1889 (*t)(0,17) = 0.850; (*t)(1,17) = -0.024; (*t)(2,17) = 0.024;
1890 (*t)(0,18) = 0.900; (*t)(1,18) = -0.024; (*t)(2,18) = 0.024;
1891 (*t)(0,19) = 0.950; (*t)(1,19) = -0.024; (*t)(2,19) = 0.024;
1892 (*t)(0,20) = 1.000; (*t)(1,20) = -0.024; (*t)(2,20) = 0.024;
1893 (*t)(0,21) = 1.100; (*t)(1,21) = -0.024; (*t)(2,21) = 0.024;
1894 (*t)(0,22) = 1.200; (*t)(1,22) = -0.024; (*t)(2,22) = 0.022;
1895 (*t)(0,23) = 1.300; (*t)(1,23) = -0.024; (*t)(2,23) = 0.020;
1896 (*t)(0,24) = 1.400; (*t)(1,24) = -0.026; (*t)(2,24) = 0.016;
1897 (*t)(0,25) = 1.500; (*t)(1,25) = -0.028; (*t)(2,25) = 0.014;
1898 (*t)(0,26) = 1.600; (*t)(1,26) = -0.028; (*t)(2,26) = 0.012;
1899 (*t)(0,27) = 1.700; (*t)(1,27) = -0.028; (*t)(2,27) = 0.010;
1900 (*t)(0,28) = 1.800; (*t)(1,28) = -0.028; (*t)(2,28) = 0.010;
1901 (*t)(0,29) = 1.900; (*t)(1,29) = -0.028; (*t)(2,29) = 0.008;
1902 (*t)(0,30) = 2.000; (*t)(1,30) = -0.028; (*t)(2,30) = 0.006;
1903 (*t)(0,31) = 2.100; (*t)(1,31) = -0.026; (*t)(2,31) = 0.006;
1904 (*t)(0,32) = 2.200; (*t)(1,32) = -0.024; (*t)(2,32) = 0.004;
1905 (*t)(0,33) = 2.300; (*t)(1,33) = -0.020; (*t)(2,33) = 0.002;
1906 (*t)(0,34) = 2.400; (*t)(1,34) = -0.020; (*t)(2,34) = 0.002;
1907 (*t)(0,35) = 2.500; (*t)(1,35) = -0.018; (*t)(2,35) = 0.000;
1908 (*t)(0,36) = 2.600; (*t)(1,36) = -0.016; (*t)(2,36) = 0.000;
1909 (*t)(0,37) = 2.700; (*t)(1,37) = -0.014; (*t)(2,37) = -0.002;
1910 (*t)(0,38) = 2.800; (*t)(1,38) = -0.014; (*t)(2,38) = -0.004;
1911 (*t)(0,39) = 2.900; (*t)(1,39) = -0.012; (*t)(2,39) = -0.004;
1912 (*t)(0,40) = 3.000; (*t)(1,40) = -0.010; (*t)(2,40) = -0.006;
1913 (*t)(0,41) = 3.100; (*t)(1,41) = 0.000; (*t)(2,41) = 0.000;
1914 (*t)(0,42) = 3.200; (*t)(1,42) = 0.000; (*t)(2,42) = 0.000;
1915 (*t)(0,43) = 3.300; (*t)(1,43) = 0.000; (*t)(2,43) = 0.000;
1916 (*t)(0,44) = 3.400; (*t)(1,44) = 0.000; (*t)(2,44) = 0.000;
1917 (*t)(0,45) = 3.500; (*t)(1,45) = 0.000; (*t)(2,45) = 0.000;
1918 (*t)(0,46) = 3.600; (*t)(1,46) = 0.000; (*t)(2,46) = 0.000;
1919 (*t)(0,47) = 3.700; (*t)(1,47) = 0.000; (*t)(2,47) = 0.000;
1920 (*t)(0,48) = 3.800; (*t)(1,48) = 0.000; (*t)(2,48) = 0.000;
1921 (*t)(0,49) = 3.900; (*t)(1,49) = 0.000; (*t)(2,49) = 0.000;
1922 (*t)(0,50) = 4.000; (*t)(1,50) = 0.000; (*t)(2,50) = 0.000;
1923 (*t)(0,51) = 4.100; (*t)(1,51) = 0.000; (*t)(2,51) = 0.000;
1924 (*t)(0,52) = 4.200; (*t)(1,52) = 0.000; (*t)(2,52) = 0.000;
1925 (*t)(0,53) = 4.300; (*t)(1,53) = 0.000; (*t)(2,53) = 0.000;
1926 (*t)(0,54) = 4.400; (*t)(1,54) = 0.000; (*t)(2,54) = 0.000;
1927 (*t)(0,55) = 4.500; (*t)(1,55) = 0.000; (*t)(2,55) = 0.000;
1928 (*t)(0,56) = 4.600; (*t)(1,56) = 0.000; (*t)(2,56) = 0.000;
1929 (*t)(0,57) = 4.700; (*t)(1,57) = 0.000; (*t)(2,57) = 0.000;
1930 (*t)(0,58) = 4.800; (*t)(1,58) = 0.000; (*t)(2,58) = 0.000;
1931 (*t)(0,59) = 4.900; (*t)(1,59) = 0.000; (*t)(2,59) = 0.000;
1932 (*t)(0,60) = 5.900; (*t)(1,60) = 0.000; (*t)(2,60) = 0.000;
32b846cd 1933 }
d79d61fb 1934 delete fTOFpidCuts;
32b846cd 1935 fTOFpidCuts=t;
1936 }
1937}
3abf7ecc 1938
cd62a2a8 1939//-----------------------------------------------------------------------
1940Bool_t AliFlowTrackCuts::PassesTPCbayesianCut(const AliESDtrack* track)
1941{
1942 //cut on TPC bayesian pid
1943 //TODO: maybe join all bayesian methods, make GetESDPdg aware of pid mode selected
1944 //if (! fAllowTOFmismatchFlag) {if (track->GetStatus() & AliESDtrack::kTOFmismatch) return kFALSE;}
1945
1946 //Bool_t statusMatchingHard = TPCTOFagree(track);
1947 //if (fRequireStrictTOFTPCagreement && (!statusMatchingHard))
1948 // return kFALSE;
1949
1950 Int_t pdg = GetESDPdg(track,"bayesianTPC");
1951 // printf("pdg set to %i\n",pdg);
1952
1953 Int_t pid = 0;
1954 Float_t prob = 0;
1955 switch (fParticleID)
1956 {
1957 case AliPID::kPion:
1958 pid=211;
1959 prob = fProbBayes[2];
1960 break;
1961 case AliPID::kKaon:
1962 pid=321;
1963 prob = fProbBayes[3];
1964 break;
1965 case AliPID::kProton:
1966 pid=2212;
1967 prob = fProbBayes[4];
1968 break;
1969 case AliPID::kElectron:
1970 pid=-11;
1971 prob = fProbBayes[0];
1972 break;
1973 default:
1974 return kFALSE;
1975 }
1976
1977 if(TMath::Abs(pdg) == TMath::Abs(pid) && prob > fParticleProbability)
1978 {
1979 if(!fCutCharge)
1980 return kTRUE;
1981 else if (fCutCharge && fCharge * track->GetSign() > 0)
1982 return kTRUE;
1983 }
1984 return kFALSE;
1985}
1986
3abf7ecc 1987//-----------------------------------------------------------------------
1988// part added by F. Noferini (some methods)
cd62a2a8 1989Bool_t AliFlowTrackCuts::PassesTOFbayesianCut(const AliESDtrack* track)
875ee12a 1990{
1991
6a043318 1992 Bool_t goodtrack = (track->GetStatus() & AliESDtrack::kTOFpid) &&
875ee12a 1993 (track->GetTOFsignal() > 12000) &&
1994 (track->GetTOFsignal() < 100000) &&
1995 (track->GetIntegratedLength() > 365);
3abf7ecc 1996
3abf7ecc 1997 if (! goodtrack)
1998 return kFALSE;
1999
6a043318 2000 if (! fAllowTOFmismatchFlag) {if (track->GetStatus() & AliESDtrack::kTOFmismatch) return kFALSE;}
2001
875ee12a 2002 Bool_t statusMatchingHard = TPCTOFagree(track);
2003 if (fRequireStrictTOFTPCagreement && (!statusMatchingHard))
2004 return kFALSE;
2005
3abf7ecc 2006 Int_t pdg = GetESDPdg(track,"bayesianALL");
2007 // printf("pdg set to %i\n",pdg);
2008
2009 Int_t pid = 0;
2010 Float_t prob = 0;
2b1eaa10 2011 switch (fParticleID)
3abf7ecc 2012 {
2013 case AliPID::kPion:
2014 pid=211;
2015 prob = fProbBayes[2];
2016 break;
2017 case AliPID::kKaon:
2018 pid=321;
2019 prob = fProbBayes[3];
2020 break;
2021 case AliPID::kProton:
2022 pid=2212;
2023 prob = fProbBayes[4];
2024 break;
2025 case AliPID::kElectron:
2026 pid=-11;
2027 prob = fProbBayes[0];
2028 break;
2029 default:
2030 return kFALSE;
2031 }
2032
2033 // 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);
875ee12a 2034 if(TMath::Abs(pdg) == TMath::Abs(pid) && prob > fParticleProbability){
3abf7ecc 2035 if(!fCutCharge)
2036 return kTRUE;
2037 else if (fCutCharge && fCharge * track->GetSign() > 0)
2038 return kTRUE;
2039 }
2040 return kFALSE;
2041}
875ee12a 2042
3abf7ecc 2043//-----------------------------------------------------------------------
cd62a2a8 2044Int_t AliFlowTrackCuts::GetESDPdg(const AliESDtrack *track,Option_t *option,Int_t ipart,Float_t cPi,Float_t cKa,Float_t cPr)
1a80f9f6 2045{
2046 //Get ESD Pdg
3abf7ecc 2047 Int_t pdg = 0;
2048 Int_t pdgvalues[5] = {-11,-13,211,321,2212};
2049 Float_t mass[5] = {5.10998909999999971e-04,1.05658000000000002e-01,1.39570000000000000e-01,4.93676999999999977e-01,9.38271999999999995e-01};
2050
2051 if(strstr(option,"bayesianTOF")){ // Bayesian TOF PID
2052 Double_t c[5]={0.01, 0.01, 0.85, 0.1, 0.05};
2053 Double_t rcc=0.;
2054
2055 Float_t pt = track->Pt();
2056
2057 Int_t iptesd = 0;
1a80f9f6 2058 while(pt > fBinLimitPID[iptesd] && iptesd < fgkPIDptBin-1) iptesd++;
3abf7ecc 2059
2060 if(cPi < 0){
2061 c[0] = fC[iptesd][0];
2062 c[1] = fC[iptesd][1];
2063 c[2] = fC[iptesd][2];
2064 c[3] = fC[iptesd][3];
2065 c[4] = fC[iptesd][4];
2066 }
2067 else{
2068 c[0] = 0.0;
2069 c[1] = 0.0;
2070 c[2] = cPi;
2071 c[3] = cKa;
2072 c[4] = cPr;
2073 }
2074
2075 Double_t r1[10]; track->GetTOFpid(r1);
2076
2077 Int_t i;
2078 for (i=0; i<5; i++) rcc+=(c[i]*r1[i]);
2079
2080 Double_t w[10];
2081 for (i=0; i<5; i++){
2082 w[i]=c[i]*r1[i]/rcc;
2083 fProbBayes[i] = w[i];
2084 }
2085 if (w[2]>=w[3] && w[2]>=w[4] && w[2]>=w[1] && w[2]>=w[0]) {//pion
2086 pdg = 211*Int_t(track->GetSign());
2087 }
2088 else if (w[4]>=w[3] && w[4]>=w[1] && w[4]>=w[0]) {//proton
2089 pdg = 2212*Int_t(track->GetSign());
2090 }
2091 else if (w[3]>=w[1] && w[3]>=w[0]){//kaon
2092 pdg = 321*Int_t(track->GetSign());
2093 }
2094 else if (w[0]>=w[1]) { //electrons
2095 pdg = -11*Int_t(track->GetSign());
2096 }
2097 else{ // muon
2098 pdg = -13*Int_t(track->GetSign());
2099 }
2100 }
2101
2102 else if(strstr(option,"bayesianTPC")){ // Bayesian TPC PID
2103 Double_t c[5]={0.01, 0.01, 0.85, 0.1, 0.05};
2104 Double_t rcc=0.;
2105
2106 Float_t pt = track->Pt();
2107
2108 Int_t iptesd = 0;
1a80f9f6 2109 while(pt > fBinLimitPID[iptesd] && iptesd < fgkPIDptBin-1) iptesd++;
3abf7ecc 2110
2111 if(cPi < 0){
2112 c[0] = fC[iptesd][0];
2113 c[1] = fC[iptesd][1];
2114 c[2] = fC[iptesd][2];
2115 c[3] = fC[iptesd][3];
2116 c[4] = fC[iptesd][4];
2117 }
2118 else{
2119 c[0] = 0.0;
2120 c[1] = 0.0;
2121 c[2] = cPi;
2122 c[3] = cKa;
2123 c[4] = cPr;
2124 }
2125
2126 Double_t r1[10]; track->GetTPCpid(r1);
2127
2128 Int_t i;
2129 for (i=0; i<5; i++) rcc+=(c[i]*r1[i]);
2130
2131 Double_t w[10];
2132 for (i=0; i<5; i++){
2133 w[i]=c[i]*r1[i]/rcc;
2134 fProbBayes[i] = w[i];
2135 }
2136 if (w[2]>=w[3] && w[2]>=w[4] && w[2]>=w[1] && w[2]>=w[0]) {//pion
2137 pdg = 211*Int_t(track->GetSign());
2138 }
2139 else if (w[4]>=w[3] && w[4]>=w[1] && w[4]>=w[0]) {//proton
2140 pdg = 2212*Int_t(track->GetSign());
2141 }
2142 else if (w[3]>=w[1] && w[3]>=w[0]){//kaon
2143 pdg = 321*Int_t(track->GetSign());
2144 }
2145 else if (w[0]>=w[1]) { //electrons
2146 pdg = -11*Int_t(track->GetSign());
2147 }
2148 else{ // muon
2149 pdg = -13*Int_t(track->GetSign());
2150 }
2151 }
2152
2153 else if(strstr(option,"bayesianALL")){
2154 Double_t c[5]={0.01, 0.01, 0.85, 0.1, 0.05};
2155 Double_t rcc=0.;
2156
2157 Float_t pt = track->Pt();
2158
2159 Int_t iptesd = 0;
1a80f9f6 2160 while(pt > fBinLimitPID[iptesd] && iptesd < fgkPIDptBin-1) iptesd++;
3abf7ecc 2161
2162 if(cPi < 0){
2163 c[0] = fC[iptesd][0];
2164 c[1] = fC[iptesd][1];
2165 c[2] = fC[iptesd][2];
2166 c[3] = fC[iptesd][3];
2167 c[4] = fC[iptesd][4];
2168 }
2169 else{
2170 c[0] = 0.0;
2171 c[1] = 0.0;
2172 c[2] = cPi;
2173 c[3] = cKa;
2174 c[4] = cPr;
2175 }
2176
2177 Double_t r1[10]; track->GetTOFpid(r1);
2178 Double_t r2[10]; track->GetTPCpid(r2);
2179
875ee12a 2180 r1[0] = TMath::Min(r1[2],r1[0]);
2181 r1[1] = TMath::Min(r1[2],r1[1]);
2182
3abf7ecc 2183 Int_t i;
2184 for (i=0; i<5; i++) rcc+=(c[i]*r1[i]*r2[i]);
2185
2186
2187 Double_t w[10];
2188 for (i=0; i<5; i++){
2189 w[i]=c[i]*r1[i]*r2[i]/rcc;
2190 fProbBayes[i] = w[i];
2191 }
2192
2193 if (w[2]>=w[3] && w[2]>=w[4] && w[2]>=w[1] && w[2]>=w[0]) {//pion
2194 pdg = 211*Int_t(track->GetSign());
2195 }
2196 else if (w[4]>=w[3] && w[4]>=w[1] && w[4]>=w[0]) {//proton
2197 pdg = 2212*Int_t(track->GetSign());
2198 }
2199 else if (w[3]>=w[1] && w[3]>=w[0]){//kaon
2200 pdg = 321*Int_t(track->GetSign());
2201 }
2202 else if (w[0]>=w[1]) { //electrons
2203 pdg = -11*Int_t(track->GetSign());
2204 }
2205 else{ // muon
2206 pdg = -13*Int_t(track->GetSign());
2207 }
2208 }
2209
2210 else if(strstr(option,"sigmacutTOF")){
2211 printf("PID not implemented yet: %s\nNO PID!!!!\n",option);
2212 Float_t p = track->P();
2213
2214 // Take expected times
2215 Double_t exptimes[5];
2216 track->GetIntegratedTimes(exptimes);
2217
2218 // Take resolution for TOF response
aab6527a 2219 // like fESDpid.GetTOFResponse().GetExpectedSigma(p, exptimes[ipart], mass[ipart]);
2220 Float_t resolution = fESDpid.GetTOFResponse().GetExpectedSigma(p, exptimes[ipart], mass[ipart]);
3abf7ecc 2221
2222 if(TMath::Abs(exptimes[ipart] - track->GetTOFsignal()) < 3 * resolution){
2223 pdg = pdgvalues[ipart] * Int_t(track->GetSign());
2224 }
2225 }
2226
2227 else{
2228 printf("Invalid PID option: %s\nNO PID!!!!\n",option);
2229 }
2230
2231 return pdg;
2232}
875ee12a 2233
3abf7ecc 2234//-----------------------------------------------------------------------
875ee12a 2235void AliFlowTrackCuts::SetPriors(Float_t centrCur){
2236 fBinLimitPID[0] = 0.300000;
2237 fBinLimitPID[1] = 0.400000;
2238 fBinLimitPID[2] = 0.500000;
2239 fBinLimitPID[3] = 0.600000;
2240 fBinLimitPID[4] = 0.700000;
2241 fBinLimitPID[5] = 0.800000;
2242 fBinLimitPID[6] = 0.900000;
2243 fBinLimitPID[7] = 1.000000;
2244 fBinLimitPID[8] = 1.200000;
2245 fBinLimitPID[9] = 1.400000;
2246 fBinLimitPID[10] = 1.600000;
2247 fBinLimitPID[11] = 1.800000;
2248 fBinLimitPID[12] = 2.000000;
2249 fBinLimitPID[13] = 2.200000;
2250 fBinLimitPID[14] = 2.400000;
2251 fBinLimitPID[15] = 2.600000;
2252 fBinLimitPID[16] = 2.800000;
2253 fBinLimitPID[17] = 3.000000;
2254
2255 // 0-10%
2256 if(centrCur < 10){
2257 fC[0][0] = 0.005;
2258 fC[0][1] = 0.005;
2259 fC[0][2] = 1.0000;
2260 fC[0][3] = 0.0010;
2261 fC[0][4] = 0.0010;
2262
2263 fC[1][0] = 0.005;
2264 fC[1][1] = 0.005;
2265 fC[1][2] = 1.0000;
2266 fC[1][3] = 0.0168;
2267 fC[1][4] = 0.0122;
2268
2269 fC[2][0] = 0.005;
2270 fC[2][1] = 0.005;
2271 fC[2][2] = 1.0000;
2272 fC[2][3] = 0.0272;
2273 fC[2][4] = 0.0070;
2274
2275 fC[3][0] = 0.005;
2276 fC[3][1] = 0.005;
2277 fC[3][2] = 1.0000;
2278 fC[3][3] = 0.0562;
2279 fC[3][4] = 0.0258;
2280
2281 fC[4][0] = 0.005;
2282 fC[4][1] = 0.005;
2283 fC[4][2] = 1.0000;
2284 fC[4][3] = 0.0861;
2285 fC[4][4] = 0.0496;
2286
2287 fC[5][0] = 0.005;
2288 fC[5][1] = 0.005;
2289 fC[5][2] = 1.0000;
2290 fC[5][3] = 0.1168;
2291 fC[5][4] = 0.0740;
2292
2293 fC[6][0] = 0.005;
2294 fC[6][1] = 0.005;
2295 fC[6][2] = 1.0000;
2296 fC[6][3] = 0.1476;
2297 fC[6][4] = 0.0998;
2298
2299 fC[7][0] = 0.005;
2300 fC[7][1] = 0.005;
2301 fC[7][2] = 1.0000;
2302 fC[7][3] = 0.1810;
2303 fC[7][4] = 0.1296;
2304
2305 fC[8][0] = 0.005;
2306 fC[8][1] = 0.005;
2307 fC[8][2] = 1.0000;
2308 fC[8][3] = 0.2240;
2309 fC[8][4] = 0.1827;
2310
2311 fC[9][0] = 0.005;
2312 fC[9][1] = 0.005;
2313 fC[9][2] = 1.0000;
2314 fC[9][3] = 0.2812;
2315 fC[9][4] = 0.2699;
2316
2317 fC[10][0] = 0.005;
2318 fC[10][1] = 0.005;
2319 fC[10][2] = 1.0000;
2320 fC[10][3] = 0.3328;
2321 fC[10][4] = 0.3714;
2322
2323 fC[11][0] = 0.005;
2324 fC[11][1] = 0.005;
2325 fC[11][2] = 1.0000;
2326 fC[11][3] = 0.3780;
2327 fC[11][4] = 0.4810;
2328
2329 fC[12][0] = 0.005;
2330 fC[12][1] = 0.005;
2331 fC[12][2] = 1.0000;
2332 fC[12][3] = 0.4125;
2333 fC[12][4] = 0.5771;
2334
2335 fC[13][0] = 0.005;
2336 fC[13][1] = 0.005;
2337 fC[13][2] = 1.0000;
2338 fC[13][3] = 0.4486;
2339 fC[13][4] = 0.6799;
2340
2341 fC[14][0] = 0.005;
2342 fC[14][1] = 0.005;
2343 fC[14][2] = 1.0000;
2344 fC[14][3] = 0.4840;
2345 fC[14][4] = 0.7668;
2346
2347 fC[15][0] = 0.005;
2348 fC[15][1] = 0.005;
2349 fC[15][2] = 1.0000;
2350 fC[15][3] = 0.4971;
2351 fC[15][4] = 0.8288;
2352
2353 fC[16][0] = 0.005;
2354 fC[16][1] = 0.005;
2355 fC[16][2] = 1.0000;
2356 fC[16][3] = 0.4956;
2357 fC[16][4] = 0.8653;
2358
2359 fC[17][0] = 0.005;
2360 fC[17][1] = 0.005;
2361 fC[17][2] = 1.0000;
2362 fC[17][3] = 0.5173;
2363 fC[17][4] = 0.9059;
2364 }
2365 // 10-20%
2366 else if(centrCur < 20){
2367 fC[0][0] = 0.005;
2368 fC[0][1] = 0.005;
2369 fC[0][2] = 1.0000;
2370 fC[0][3] = 0.0010;
2371 fC[0][4] = 0.0010;
2372
2373 fC[1][0] = 0.005;
2374 fC[1][1] = 0.005;
2375 fC[1][2] = 1.0000;
2376 fC[1][3] = 0.0132;
2377 fC[1][4] = 0.0088;
2378
2379 fC[2][0] = 0.005;
2380 fC[2][1] = 0.005;
2381 fC[2][2] = 1.0000;
2382 fC[2][3] = 0.0283;
2383 fC[2][4] = 0.0068;
2384
2385 fC[3][0] = 0.005;
2386 fC[3][1] = 0.005;
2387 fC[3][2] = 1.0000;
2388 fC[3][3] = 0.0577;
2389 fC[3][4] = 0.0279;
2390
2391 fC[4][0] = 0.005;
2392 fC[4][1] = 0.005;
2393 fC[4][2] = 1.0000;
2394 fC[4][3] = 0.0884;
2395 fC[4][4] = 0.0534;
2396
2397 fC[5][0] = 0.005;
2398 fC[5][1] = 0.005;
2399 fC[5][2] = 1.0000;
2400 fC[5][3] = 0.1179;
2401 fC[5][4] = 0.0794;
2402
2403 fC[6][0] = 0.005;
2404 fC[6][1] = 0.005;
2405 fC[6][2] = 1.0000;
2406 fC[6][3] = 0.1480;
2407 fC[6][4] = 0.1058;
2408
2409 fC[7][0] = 0.005;
2410 fC[7][1] = 0.005;
2411 fC[7][2] = 1.0000;
2412 fC[7][3] = 0.1807;
2413 fC[7][4] = 0.1366;
2414
2415 fC[8][0] = 0.005;
2416 fC[8][1] = 0.005;
2417 fC[8][2] = 1.0000;
2418 fC[8][3] = 0.2219;
2419 fC[8][4] = 0.1891;
2420
2421 fC[9][0] = 0.005;
2422 fC[9][1] = 0.005;
2423 fC[9][2] = 1.0000;
2424 fC[9][3] = 0.2804;
2425 fC[9][4] = 0.2730;
2426
2427 fC[10][0] = 0.005;
2428 fC[10][1] = 0.005;
2429 fC[10][2] = 1.0000;
2430 fC[10][3] = 0.3283;
2431 fC[10][4] = 0.3660;
2432
2433 fC[11][0] = 0.005;
2434 fC[11][1] = 0.005;
2435 fC[11][2] = 1.0000;
2436 fC[11][3] = 0.3710;
2437 fC[11][4] = 0.4647;
2438
2439 fC[12][0] = 0.005;
2440 fC[12][1] = 0.005;
2441 fC[12][2] = 1.0000;
2442 fC[12][3] = 0.4093;
2443 fC[12][4] = 0.5566;
2444
2445 fC[13][0] = 0.005;
2446 fC[13][1] = 0.005;
2447 fC[13][2] = 1.0000;
2448 fC[13][3] = 0.4302;
2449 fC[13][4] = 0.6410;
2450
2451 fC[14][0] = 0.005;
2452 fC[14][1] = 0.005;
2453 fC[14][2] = 1.0000;
2454 fC[14][3] = 0.4649;
2455 fC[14][4] = 0.7055;
2456
2457 fC[15][0] = 0.005;
2458 fC[15][1] = 0.005;
2459 fC[15][2] = 1.0000;
2460 fC[15][3] = 0.4523;
2461 fC[15][4] = 0.7440;
2462
2463 fC[16][0] = 0.005;
2464 fC[16][1] = 0.005;
2465 fC[16][2] = 1.0000;
2466 fC[16][3] = 0.4591;
2467 fC[16][4] = 0.7799;
2468
2469 fC[17][0] = 0.005;
2470 fC[17][1] = 0.005;
2471 fC[17][2] = 1.0000;
2472 fC[17][3] = 0.4804;
2473 fC[17][4] = 0.8218;
2474 }
2475 // 20-30%
2476 else if(centrCur < 30){
2477 fC[0][0] = 0.005;
2478 fC[0][1] = 0.005;
2479 fC[0][2] = 1.0000;
2480 fC[0][3] = 0.0010;
2481 fC[0][4] = 0.0010;
2482
2483 fC[1][0] = 0.005;
2484 fC[1][1] = 0.005;
2485 fC[1][2] = 1.0000;
2486 fC[1][3] = 0.0102;
2487 fC[1][4] = 0.0064;
2488
2489 fC[2][0] = 0.005;
2490 fC[2][1] = 0.005;
2491 fC[2][2] = 1.0000;
2492 fC[2][3] = 0.0292;
2493 fC[2][4] = 0.0066;
2494
2495 fC[3][0] = 0.005;
2496 fC[3][1] = 0.005;
2497 fC[3][2] = 1.0000;
2498 fC[3][3] = 0.0597;
2499 fC[3][4] = 0.0296;
2500
2501 fC[4][0] = 0.005;
2502 fC[4][1] = 0.005;
2503 fC[4][2] = 1.0000;
2504 fC[4][3] = 0.0900;
2505 fC[4][4] = 0.0589;
2506
2507 fC[5][0] = 0.005;
2508 fC[5][1] = 0.005;
2509 fC[5][2] = 1.0000;
2510 fC[5][3] = 0.1199;
2511 fC[5][4] = 0.0859;
2512
2513 fC[6][0] = 0.005;
2514 fC[6][1] = 0.005;
2515 fC[6][2] = 1.0000;
2516 fC[6][3] = 0.1505;
2517 fC[6][4] = 0.1141;
2518
2519 fC[7][0] = 0.005;
2520 fC[7][1] = 0.005;
2521 fC[7][2] = 1.0000;
2522 fC[7][3] = 0.1805;
2523 fC[7][4] = 0.1454;
2524
2525 fC[8][0] = 0.005;
2526 fC[8][1] = 0.005;
2527 fC[8][2] = 1.0000;
2528 fC[8][3] = 0.2221;
2529 fC[8][4] = 0.2004;
2530
2531 fC[9][0] = 0.005;
2532 fC[9][1] = 0.005;
2533 fC[9][2] = 1.0000;
2534 fC[9][3] = 0.2796;
2535 fC[9][4] = 0.2838;
2536
2537 fC[10][0] = 0.005;
2538 fC[10][1] = 0.005;
2539 fC[10][2] = 1.0000;
2540 fC[10][3] = 0.3271;
2541 fC[10][4] = 0.3682;
2542
2543 fC[11][0] = 0.005;
2544 fC[11][1] = 0.005;
2545 fC[11][2] = 1.0000;
2546 fC[11][3] = 0.3648;
2547 fC[11][4] = 0.4509;
2548
2549 fC[12][0] = 0.005;
2550 fC[12][1] = 0.005;
2551 fC[12][2] = 1.0000;
2552 fC[12][3] = 0.3988;
2553 fC[12][4] = 0.5339;
2554
2555 fC[13][0] = 0.005;
2556 fC[13][1] = 0.005;
2557 fC[13][2] = 1.0000;
2558 fC[13][3] = 0.4315;
2559 fC[13][4] = 0.5995;
2560
2561 fC[14][0] = 0.005;
2562 fC[14][1] = 0.005;
2563 fC[14][2] = 1.0000;
2564 fC[14][3] = 0.4548;
2565 fC[14][4] = 0.6612;
2566
2567 fC[15][0] = 0.005;
2568 fC[15][1] = 0.005;
2569 fC[15][2] = 1.0000;
2570 fC[15][3] = 0.4744;
2571 fC[15][4] = 0.7060;
2572
2573 fC[16][0] = 0.005;
2574 fC[16][1] = 0.005;
2575 fC[16][2] = 1.0000;
2576 fC[16][3] = 0.4899;
2577 fC[16][4] = 0.7388;
2578
2579 fC[17][0] = 0.005;
2580 fC[17][1] = 0.005;
2581 fC[17][2] = 1.0000;
2582 fC[17][3] = 0.4411;
2583 fC[17][4] = 0.7293;
2584 }
2585 // 30-40%
2586 else if(centrCur < 40){
2587 fC[0][0] = 0.005;
2588 fC[0][1] = 0.005;
2589 fC[0][2] = 1.0000;
2590 fC[0][3] = 0.0010;
2591 fC[0][4] = 0.0010;
2592
2593 fC[1][0] = 0.005;
2594 fC[1][1] = 0.005;
2595 fC[1][2] = 1.0000;
2596 fC[1][3] = 0.0102;
2597 fC[1][4] = 0.0048;
2598
2599 fC[2][0] = 0.005;
2600 fC[2][1] = 0.005;
2601 fC[2][2] = 1.0000;
2602 fC[2][3] = 0.0306;
2603 fC[2][4] = 0.0079;
2604
2605 fC[3][0] = 0.005;
2606 fC[3][1] = 0.005;
2607 fC[3][2] = 1.0000;
2608 fC[3][3] = 0.0617;
2609 fC[3][4] = 0.0338;
2610
2611 fC[4][0] = 0.005;
2612 fC[4][1] = 0.005;
2613 fC[4][2] = 1.0000;
2614 fC[4][3] = 0.0920;
2615 fC[4][4] = 0.0652;
2616
2617 fC[5][0] = 0.005;
2618 fC[5][1] = 0.005;
2619 fC[5][2] = 1.0000;
2620 fC[5][3] = 0.1211;
2621 fC[5][4] = 0.0955;
2622
2623 fC[6][0] = 0.005;
2624 fC[6][1] = 0.005;
2625 fC[6][2] = 1.0000;
2626 fC[6][3] = 0.1496;
2627 fC[6][4] = 0.1242;
2628
2629 fC[7][0] = 0.005;
2630 fC[7][1] = 0.005;
2631 fC[7][2] = 1.0000;
2632 fC[7][3] = 0.1807;
2633 fC[7][4] = 0.1576;
2634
2635 fC[8][0] = 0.005;
2636 fC[8][1] = 0.005;
2637 fC[8][2] = 1.0000;
2638 fC[8][3] = 0.2195;
2639 fC[8][4] = 0.2097;
2640
2641 fC[9][0] = 0.005;
2642 fC[9][1] = 0.005;
2643 fC[9][2] = 1.0000;
2644 fC[9][3] = 0.2732;
2645 fC[9][4] = 0.2884;
2646
2647 fC[10][0] = 0.005;
2648 fC[10][1] = 0.005;
2649 fC[10][2] = 1.0000;
2650 fC[10][3] = 0.3204;
2651 fC[10][4] = 0.3679;
2652
2653 fC[11][0] = 0.005;
2654 fC[11][1] = 0.005;
2655 fC[11][2] = 1.0000;
2656 fC[11][3] = 0.3564;
2657 fC[11][4] = 0.4449;
2658
2659 fC[12][0] = 0.005;
2660 fC[12][1] = 0.005;
2661 fC[12][2] = 1.0000;
2662 fC[12][3] = 0.3791;
2663 fC[12][4] = 0.5052;
2664
2665 fC[13][0] = 0.005;
2666 fC[13][1] = 0.005;
2667 fC[13][2] = 1.0000;
2668 fC[13][3] = 0.4062;
2669 fC[13][4] = 0.5647;
2670
2671 fC[14][0] = 0.005;
2672 fC[14][1] = 0.005;
2673 fC[14][2] = 1.0000;
2674 fC[14][3] = 0.4234;
2675 fC[14][4] = 0.6203;
2676
2677 fC[15][0] = 0.005;
2678 fC[15][1] = 0.005;
2679 fC[15][2] = 1.0000;
2680 fC[15][3] = 0.4441;
2681 fC[15][4] = 0.6381;
2682
2683 fC[16][0] = 0.005;
2684 fC[16][1] = 0.005;
2685 fC[16][2] = 1.0000;
2686 fC[16][3] = 0.4629;
2687 fC[16][4] = 0.6496;
2688
2689 fC[17][0] = 0.005;
2690 fC[17][1] = 0.005;
2691 fC[17][2] = 1.0000;
2692 fC[17][3] = 0.4293;
2693 fC[17][4] = 0.6491;
2694 }
2695 // 40-50%
2696 else if(centrCur < 50){
2697 fC[0][0] = 0.005;
2698 fC[0][1] = 0.005;
2699 fC[0][2] = 1.0000;
2700 fC[0][3] = 0.0010;
2701 fC[0][4] = 0.0010;
2702
2703 fC[1][0] = 0.005;
2704 fC[1][1] = 0.005;
2705 fC[1][2] = 1.0000;
2706 fC[1][3] = 0.0093;
2707 fC[1][4] = 0.0057;
2708
2709 fC[2][0] = 0.005;
2710 fC[2][1] = 0.005;
2711 fC[2][2] = 1.0000;
2712 fC[2][3] = 0.0319;
2713 fC[2][4] = 0.0075;
2714
2715 fC[3][0] = 0.005;
2716 fC[3][1] = 0.005;
2717 fC[3][2] = 1.0000;
2718 fC[3][3] = 0.0639;
2719 fC[3][4] = 0.0371;
2720
2721 fC[4][0] = 0.005;
2722 fC[4][1] = 0.005;
2723 fC[4][2] = 1.0000;
2724 fC[4][3] = 0.0939;
2725 fC[4][4] = 0.0725;
2726
2727 fC[5][0] = 0.005;
2728 fC[5][1] = 0.005;
2729 fC[5][2] = 1.0000;
2730 fC[5][3] = 0.1224;
2731 fC[5][4] = 0.1045;
2732
2733 fC[6][0] = 0.005;
2734 fC[6][1] = 0.005;
2735 fC[6][2] = 1.0000;
2736 fC[6][3] = 0.1520;
2737 fC[6][4] = 0.1387;
2738
2739 fC[7][0] = 0.005;
2740 fC[7][1] = 0.005;
2741 fC[7][2] = 1.0000;
2742 fC[7][3] = 0.1783;
2743 fC[7][4] = 0.1711;
2744
2745 fC[8][0] = 0.005;
2746 fC[8][1] = 0.005;
2747 fC[8][2] = 1.0000;
2748 fC[8][3] = 0.2202;
2749 fC[8][4] = 0.2269;
2750
2751 fC[9][0] = 0.005;
2752 fC[9][1] = 0.005;
2753 fC[9][2] = 1.0000;
2754 fC[9][3] = 0.2672;
2755 fC[9][4] = 0.2955;
2756
2757 fC[10][0] = 0.005;
2758 fC[10][1] = 0.005;
2759 fC[10][2] = 1.0000;
2760 fC[10][3] = 0.3191;
2761 fC[10][4] = 0.3676;
2762
2763 fC[11][0] = 0.005;
2764 fC[11][1] = 0.005;
2765 fC[11][2] = 1.0000;
2766 fC[11][3] = 0.3434;
2767 fC[11][4] = 0.4321;
2768
2769 fC[12][0] = 0.005;
2770 fC[12][1] = 0.005;
2771 fC[12][2] = 1.0000;
2772 fC[12][3] = 0.3692;
2773 fC[12][4] = 0.4879;
2774
2775 fC[13][0] = 0.005;
2776 fC[13][1] = 0.005;
2777 fC[13][2] = 1.0000;
2778 fC[13][3] = 0.3993;
2779 fC[13][4] = 0.5377;
2780
2781 fC[14][0] = 0.005;
2782 fC[14][1] = 0.005;
2783 fC[14][2] = 1.0000;
2784 fC[14][3] = 0.3818;
2785 fC[14][4] = 0.5547;
2786
2787 fC[15][0] = 0.005;
2788 fC[15][1] = 0.005;
2789 fC[15][2] = 1.0000;
2790 fC[15][3] = 0.4003;
2791 fC[15][4] = 0.5484;
2792
2793 fC[16][0] = 0.005;
2794 fC[16][1] = 0.005;
2795 fC[16][2] = 1.0000;
2796 fC[16][3] = 0.4281;
2797 fC[16][4] = 0.5383;
2798
2799 fC[17][0] = 0.005;
2800 fC[17][1] = 0.005;
2801 fC[17][2] = 1.0000;
2802 fC[17][3] = 0.3960;
2803 fC[17][4] = 0.5374;
2804 }
2805 // 50-60%
2806 else if(centrCur < 60){
2807 fC[0][0] = 0.005;
2808 fC[0][1] = 0.005;
2809 fC[0][2] = 1.0000;
2810 fC[0][3] = 0.0010;
2811 fC[0][4] = 0.0010;
2812
2813 fC[1][0] = 0.005;
2814 fC[1][1] = 0.005;
2815 fC[1][2] = 1.0000;
2816 fC[1][3] = 0.0076;
2817 fC[1][4] = 0.0032;
2818
2819 fC[2][0] = 0.005;
2820 fC[2][1] = 0.005;
2821 fC[2][2] = 1.0000;
2822 fC[2][3] = 0.0329;
2823 fC[2][4] = 0.0085;
2824
2825 fC[3][0] = 0.005;
2826 fC[3][1] = 0.005;
2827 fC[3][2] = 1.0000;
2828 fC[3][3] = 0.0653;
2829 fC[3][4] = 0.0423;
2830
2831 fC[4][0] = 0.005;
2832 fC[4][1] = 0.005;
2833 fC[4][2] = 1.0000;
2834 fC[4][3] = 0.0923;
2835 fC[4][4] = 0.0813;
2836
2837 fC[5][0] = 0.005;
2838 fC[5][1] = 0.005;
2839 fC[5][2] = 1.0000;
2840 fC[5][3] = 0.1219;
2841 fC[5][4] = 0.1161;
2842
2843 fC[6][0] = 0.005;
2844 fC[6][1] = 0.005;
2845 fC[6][2] = 1.0000;
2846 fC[6][3] = 0.1519;
2847 fC[6][4] = 0.1520;
2848
2849 fC[7][0] = 0.005;
2850 fC[7][1] = 0.005;
2851 fC[7][2] = 1.0000;
2852 fC[7][3] = 0.1763;
2853 fC[7][4] = 0.1858;
2854
2855 fC[8][0] = 0.005;
2856 fC[8][1] = 0.005;
2857 fC[8][2] = 1.0000;
2858 fC[8][3] = 0.2178;
2859 fC[8][4] = 0.2385;
2860
2861 fC[9][0] = 0.005;
2862 fC[9][1] = 0.005;
2863 fC[9][2] = 1.0000;
2864 fC[9][3] = 0.2618;
2865 fC[9][4] = 0.3070;
2866
2867 fC[10][0] = 0.005;
2868 fC[10][1] = 0.005;
2869 fC[10][2] = 1.0000;
2870 fC[10][3] = 0.3067;
2871 fC[10][4] = 0.3625;
2872
2873 fC[11][0] = 0.005;
2874 fC[11][1] = 0.005;
2875 fC[11][2] = 1.0000;
2876 fC[11][3] = 0.3336;
2877 fC[11][4] = 0.4188;
2878
2879 fC[12][0] = 0.005;
2880 fC[12][1] = 0.005;
2881 fC[12][2] = 1.0000;
2882 fC[12][3] = 0.3706;
2883 fC[12][4] = 0.4511;
2884
2885 fC[13][0] = 0.005;
2886 fC[13][1] = 0.005;
2887 fC[13][2] = 1.0000;
2888 fC[13][3] = 0.3765;
2889 fC[13][4] = 0.4729;
2890
2891 fC[14][0] = 0.005;
2892 fC[14][1] = 0.005;
2893 fC[14][2] = 1.0000;
2894 fC[14][3] = 0.3942;
2895 fC[14][4] = 0.4855;
2896
2897 fC[15][0] = 0.005;
2898 fC[15][1] = 0.005;
2899 fC[15][2] = 1.0000;
2900 fC[15][3] = 0.4051;
2901 fC[15][4] = 0.4762;
2902
2903 fC[16][0] = 0.005;
2904 fC[16][1] = 0.005;
2905 fC[16][2] = 1.0000;
2906 fC[16][3] = 0.3843;
2907 fC[16][4] = 0.4763;
2908
2909 fC[17][0] = 0.005;
2910 fC[17][1] = 0.005;
2911 fC[17][2] = 1.0000;
2912 fC[17][3] = 0.4237;
2913 fC[17][4] = 0.4773;
2914 }
2915 // 60-70%
2916 else if(centrCur < 70){
2917 fC[0][0] = 0.005;
2918 fC[0][1] = 0.005;
2919 fC[0][2] = 1.0000;
2920 fC[0][3] = 0.0010;
2921 fC[0][4] = 0.0010;
2922
2923 fC[1][0] = 0.005;
2924 fC[1][1] = 0.005;
2925 fC[1][2] = 1.0000;
2926 fC[1][3] = 0.0071;
2927 fC[1][4] = 0.0012;
2928
2929 fC[2][0] = 0.005;
2930 fC[2][1] = 0.005;
2931 fC[2][2] = 1.0000;
2932 fC[2][3] = 0.0336;
2933 fC[2][4] = 0.0097;
2934
2935 fC[3][0] = 0.005;
2936 fC[3][1] = 0.005;
2937 fC[3][2] = 1.0000;
2938 fC[3][3] = 0.0662;
2939 fC[3][4] = 0.0460;
2940
2941 fC[4][0] = 0.005;
2942 fC[4][1] = 0.005;
2943 fC[4][2] = 1.0000;
2944 fC[4][3] = 0.0954;
2945 fC[4][4] = 0.0902;
2946
2947 fC[5][0] = 0.005;
2948 fC[5][1] = 0.005;
2949 fC[5][2] = 1.0000;
2950 fC[5][3] = 0.1181;
2951 fC[5][4] = 0.1306;
2952
2953 fC[6][0] = 0.005;
2954 fC[6][1] = 0.005;
2955 fC[6][2] = 1.0000;
2956 fC[6][3] = 0.1481;
2957 fC[6][4] = 0.1662;
2958
2959 fC[7][0] = 0.005;
2960 fC[7][1] = 0.005;
2961 fC[7][2] = 1.0000;
2962 fC[7][3] = 0.1765;
2963 fC[7][4] = 0.1963;
2964
2965 fC[8][0] = 0.005;
2966 fC[8][1] = 0.005;
2967 fC[8][2] = 1.0000;
2968 fC[8][3] = 0.2155;
2969 fC[8][4] = 0.2433;
2970
2971 fC[9][0] = 0.005;
2972 fC[9][1] = 0.005;
2973 fC[9][2] = 1.0000;
2974 fC[9][3] = 0.2580;
2975 fC[9][4] = 0.3022;
2976
2977 fC[10][0] = 0.005;
2978 fC[10][1] = 0.005;
2979 fC[10][2] = 1.0000;
2980 fC[10][3] = 0.2872;
2981 fC[10][4] = 0.3481;
2982
2983 fC[11][0] = 0.005;
2984 fC[11][1] = 0.005;
2985 fC[11][2] = 1.0000;
2986 fC[11][3] = 0.3170;
2987 fC[11][4] = 0.3847;
2988
2989 fC[12][0] = 0.005;
2990 fC[12][1] = 0.005;
2991 fC[12][2] = 1.0000;
2992 fC[12][3] = 0.3454;
2993 fC[12][4] = 0.4258;
2994
2995 fC[13][0] = 0.005;
2996 fC[13][1] = 0.005;
2997 fC[13][2] = 1.0000;
2998 fC[13][3] = 0.3580;
2999 fC[13][4] = 0.4299;
3000
3001 fC[14][0] = 0.005;
3002 fC[14][1] = 0.005;
3003 fC[14][2] = 1.0000;
3004 fC[14][3] = 0.3903;
3005 fC[14][4] = 0.4326;
3006
3007 fC[15][0] = 0.005;
3008 fC[15][1] = 0.005;
3009 fC[15][2] = 1.0000;
3010 fC[15][3] = 0.3690;
3011 fC[15][4] = 0.4491;
3012
3013 fC[16][0] = 0.005;
3014 fC[16][1] = 0.005;
3015 fC[16][2] = 1.0000;
3016 fC[16][3] = 0.4716;
3017 fC[16][4] = 0.4298;
3018
3019 fC[17][0] = 0.005;
3020 fC[17][1] = 0.005;
3021 fC[17][2] = 1.0000;
3022 fC[17][3] = 0.3875;
3023 fC[17][4] = 0.4083;
3024 }
3025 // 70-80%
3026 else if(centrCur < 80){
3027 fC[0][0] = 0.005;
3028 fC[0][1] = 0.005;
3029 fC[0][2] = 1.0000;
3030 fC[0][3] = 0.0010;
3031 fC[0][4] = 0.0010;
3032
3033 fC[1][0] = 0.005;
3034 fC[1][1] = 0.005;
3035 fC[1][2] = 1.0000;
3036 fC[1][3] = 0.0075;
3037 fC[1][4] = 0.0007;
3038
3039 fC[2][0] = 0.005;
3040 fC[2][1] = 0.005;
3041 fC[2][2] = 1.0000;
3042 fC[2][3] = 0.0313;
3043 fC[2][4] = 0.0124;
3044
3045 fC[3][0] = 0.005;
3046 fC[3][1] = 0.005;
3047 fC[3][2] = 1.0000;
3048 fC[3][3] = 0.0640;
3049 fC[3][4] = 0.0539;
3050
3051 fC[4][0] = 0.005;
3052 fC[4][1] = 0.005;
3053 fC[4][2] = 1.0000;
3054 fC[4][3] = 0.0923;
3055 fC[4][4] = 0.0992;
3056
3057 fC[5][0] = 0.005;
3058 fC[5][1] = 0.005;
3059 fC[5][2] = 1.0000;
3060 fC[5][3] = 0.1202;
3061 fC[5][4] = 0.1417;
3062
3063 fC[6][0] = 0.005;
3064 fC[6][1] = 0.005;
3065 fC[6][2] = 1.0000;
3066 fC[6][3] = 0.1413;
3067 fC[6][4] = 0.1729;
3068
3069 fC[7][0] = 0.005;
3070 fC[7][1] = 0.005;
3071 fC[7][2] = 1.0000;
3072 fC[7][3] = 0.1705;
3073 fC[7][4] = 0.1999;
3074
3075 fC[8][0] = 0.005;
3076 fC[8][1] = 0.005;
3077 fC[8][2] = 1.0000;
3078 fC[8][3] = 0.2103;
3079 fC[8][4] = 0.2472;
3080
3081 fC[9][0] = 0.005;
3082 fC[9][1] = 0.005;
3083 fC[9][2] = 1.0000;
3084 fC[9][3] = 0.2373;
3085 fC[9][4] = 0.2916;
3086
3087 fC[10][0] = 0.005;
3088 fC[10][1] = 0.005;
3089 fC[10][2] = 1.0000;
3090 fC[10][3] = 0.2824;
3091 fC[10][4] = 0.3323;
3092
3093 fC[11][0] = 0.005;
3094 fC[11][1] = 0.005;
3095 fC[11][2] = 1.0000;
3096 fC[11][3] = 0.3046;
3097 fC[11][4] = 0.3576;
3098
3099 fC[12][0] = 0.005;
3100 fC[12][1] = 0.005;
3101 fC[12][2] = 1.0000;
3102 fC[12][3] = 0.3585;
3103 fC[12][4] = 0.4003;
3104
3105 fC[13][0] = 0.005;
3106 fC[13][1] = 0.005;
3107 fC[13][2] = 1.0000;
3108 fC[13][3] = 0.3461;
3109 fC[13][4] = 0.3982;
3110
3111 fC[14][0] = 0.005;
3112 fC[14][1] = 0.005;
3113 fC[14][2] = 1.0000;
3114 fC[14][3] = 0.3362;
3115 fC[14][4] = 0.3776;
3116
3117 fC[15][0] = 0.005;
3118 fC[15][1] = 0.005;
3119 fC[15][2] = 1.0000;
3120 fC[15][3] = 0.3071;
3121 fC[15][4] = 0.3500;
3122
3123 fC[16][0] = 0.005;
3124 fC[16][1] = 0.005;
3125 fC[16][2] = 1.0000;
3126 fC[16][3] = 0.2914;
3127 fC[16][4] = 0.3937;
3128
3129 fC[17][0] = 0.005;
3130 fC[17][1] = 0.005;
3131 fC[17][2] = 1.0000;
3132 fC[17][3] = 0.3727;
3133 fC[17][4] = 0.3877;
3134 }
3135 // 80-100%
3136 else{
3137 fC[0][0] = 0.005;
3138 fC[0][1] = 0.005;
3139 fC[0][2] = 1.0000;
3140 fC[0][3] = 0.0010;
3141 fC[0][4] = 0.0010;
3142
3143 fC[1][0] = 0.005;
3144 fC[1][1] = 0.005;
3145 fC[1][2] = 1.0000;
3146 fC[1][3] = 0.0060;
3147 fC[1][4] = 0.0035;
3148
3149 fC[2][0] = 0.005;
3150 fC[2][1] = 0.005;
3151 fC[2][2] = 1.0000;
3152 fC[2][3] = 0.0323;
3153 fC[2][4] = 0.0113;
3154
3155 fC[3][0] = 0.005;
3156 fC[3][1] = 0.005;
3157 fC[3][2] = 1.0000;
3158 fC[3][3] = 0.0609;
3159 fC[3][4] = 0.0653;
3160
3161 fC[4][0] = 0.005;
3162 fC[4][1] = 0.005;
3163 fC[4][2] = 1.0000;
3164 fC[4][3] = 0.0922;
3165 fC[4][4] = 0.1076;
3166
3167 fC[5][0] = 0.005;
3168 fC[5][1] = 0.005;
3169 fC[5][2] = 1.0000;
3170 fC[5][3] = 0.1096;
3171 fC[5][4] = 0.1328;
3172
3173 fC[6][0] = 0.005;
3174 fC[6][1] = 0.005;
3175 fC[6][2] = 1.0000;
3176 fC[6][3] = 0.1495;
3177 fC[6][4] = 0.1779;
3178
3179 fC[7][0] = 0.005;
3180 fC[7][1] = 0.005;
3181 fC[7][2] = 1.0000;
3182 fC[7][3] = 0.1519;
3183 fC[7][4] = 0.1989;
3184
3185 fC[8][0] = 0.005;
3186 fC[8][1] = 0.005;
3187 fC[8][2] = 1.0000;
3188 fC[8][3] = 0.1817;
3189 fC[8][4] = 0.2472;
3190
3191 fC[9][0] = 0.005;
3192 fC[9][1] = 0.005;
3193 fC[9][2] = 1.0000;
3194 fC[9][3] = 0.2429;
3195 fC[9][4] = 0.2684;
3196
3197 fC[10][0] = 0.005;
3198 fC[10][1] = 0.005;
3199 fC[10][2] = 1.0000;
3200 fC[10][3] = 0.2760;
3201 fC[10][4] = 0.3098;
3202
3203 fC[11][0] = 0.005;
3204 fC[11][1] = 0.005;
3205 fC[11][2] = 1.0000;
3206 fC[11][3] = 0.2673;
3207 fC[11][4] = 0.3198;
3208
3209 fC[12][0] = 0.005;
3210 fC[12][1] = 0.005;
3211 fC[12][2] = 1.0000;
3212 fC[12][3] = 0.3165;
3213 fC[12][4] = 0.3564;
3214
3215 fC[13][0] = 0.005;
3216 fC[13][1] = 0.005;
3217 fC[13][2] = 1.0000;
3218 fC[13][3] = 0.3526;
3219 fC[13][4] = 0.3011;
3220
3221 fC[14][0] = 0.005;
3222 fC[14][1] = 0.005;
3223 fC[14][2] = 1.0000;
3224 fC[14][3] = 0.3788;
3225 fC[14][4] = 0.3011;
3226
3227 fC[15][0] = 0.005;
3228 fC[15][1] = 0.005;
3229 fC[15][2] = 1.0000;
3230 fC[15][3] = 0.3788;
3231 fC[15][4] = 0.3011;
3232
3233 fC[16][0] = 0.005;
3234 fC[16][1] = 0.005;
3235 fC[16][2] = 1.0000;
3236 fC[16][3] = 0.3788;
3237 fC[16][4] = 0.3011;
3238
3239 fC[17][0] = 0.005;
3240 fC[17][1] = 0.005;
3241 fC[17][2] = 1.0000;
3242 fC[17][3] = 0.3788;
3243 fC[17][4] = 0.3011;
3244 }
3245
3246 for(Int_t i=18;i<fgkPIDptBin;i++){
3247 fBinLimitPID[i] = 3.0 + 0.2 * (i-18);
3248 fC[i][0] = fC[17][0];
3249 fC[i][1] = fC[17][1];
3250 fC[i][2] = fC[17][2];
3251 fC[i][3] = fC[17][3];
3252 fC[i][4] = fC[17][4];
3253 }
3254}
3255
3256//---------------------------------------------------------------//
3257Bool_t AliFlowTrackCuts::TPCTOFagree(const AliESDtrack *track)
3258{
3259 Bool_t status = kFALSE;
3260
3261 Float_t mass[5] = {5.10998909999999971e-04,1.05658000000000002e-01,1.39570000000000000e-01,4.93676999999999977e-01,9.38271999999999995e-01};
3262
3263
3264 Double_t exptimes[5];
3265 track->GetIntegratedTimes(exptimes);
3266
3267 Float_t dedx = track->GetTPCsignal();
3268
3269 Float_t p = track->P();
3270 Float_t time = track->GetTOFsignal()- fESDpid.GetTOFResponse().GetStartTime(p);
3271 Float_t tl = track->GetIntegratedLength();
3272
3273 Float_t betagammares = fESDpid.GetTOFResponse().GetExpectedSigma(p, exptimes[4], mass[4]);
3274
3275 Float_t betagamma1 = tl/(time-5 *betagammares) * 33.3564095198152043;
3276
3277// printf("betagamma1 = %f\n",betagamma1);
3278
3279 if(betagamma1 < 0.1) betagamma1 = 0.1;
3280
3281 if(betagamma1 < 0.99999) betagamma1 /= TMath::Sqrt(1-betagamma1*betagamma1);
3282 else betagamma1 = 100;
3283
3284 Float_t betagamma2 = tl/(time+5 *betagammares) * 33.3564095198152043;
3285// printf("betagamma2 = %f\n",betagamma2);
3286
3287 if(betagamma2 < 0.1) betagamma2 = 0.1;
3288
3289 if(betagamma2 < 0.99999) betagamma2 /= TMath::Sqrt(1-betagamma2*betagamma2);
3290 else betagamma2 = 100;
3291
3292
3293 Double_t ptpc[3];
3294 track->GetInnerPxPyPz(ptpc);
3295 Float_t momtpc=TMath::Sqrt(ptpc[0]*ptpc[0] + ptpc[1]*ptpc[1] + ptpc[2]*ptpc[2]);
3296
3297 for(Int_t i=0;i < 5;i++){
3298 Float_t resolutionTOF = fESDpid.GetTOFResponse().GetExpectedSigma(p, exptimes[i], mass[i]);
3299 if(TMath::Abs(exptimes[i] - time) < 5 * resolutionTOF){
3300 Float_t dedxExp = 0;
3301 if(i==0) dedxExp = fESDpid.GetTPCResponse().GetExpectedSignal(momtpc,AliPID::kElectron);
3302 else if(i==1) dedxExp = fESDpid.GetTPCResponse().GetExpectedSignal(momtpc,AliPID::kMuon);
3303 else if(i==2) dedxExp = fESDpid.GetTPCResponse().GetExpectedSignal(momtpc,AliPID::kPion);
3304 else if(i==3) dedxExp = fESDpid.GetTPCResponse().GetExpectedSignal(momtpc,AliPID::kKaon);
3305 else if(i==4) dedxExp = fESDpid.GetTPCResponse().GetExpectedSignal(momtpc,AliPID::kProton);
3306
3307 Float_t resolutionTPC = 2;
3308 if(i==0) resolutionTPC = fESDpid.GetTPCResponse().GetExpectedSigma(momtpc,track->GetTPCsignalN(),AliPID::kElectron);
3309 else if(i==1) resolutionTPC = fESDpid.GetTPCResponse().GetExpectedSigma(momtpc,track->GetTPCsignalN(),AliPID::kMuon);
3310 else if(i==2) resolutionTPC = fESDpid.GetTPCResponse().GetExpectedSigma(momtpc,track->GetTPCsignalN(),AliPID::kPion);
3311 else if(i==3) resolutionTPC = fESDpid.GetTPCResponse().GetExpectedSigma(momtpc,track->GetTPCsignalN(),AliPID::kKaon);
3312 else if(i==4) resolutionTPC = fESDpid.GetTPCResponse().GetExpectedSigma(momtpc,track->GetTPCsignalN(),AliPID::kProton);
3313
3314 if(TMath::Abs(dedx - dedxExp) < 3 * resolutionTPC){
3315 status = kTRUE;
3316 }
3317 }
3318 }
3319
3320 Float_t bb1 = fESDpid.GetTPCResponse().Bethe(betagamma1);
3321 Float_t bb2 = fESDpid.GetTPCResponse().Bethe(betagamma2);
3322 Float_t bbM = fESDpid.GetTPCResponse().Bethe((betagamma1+betagamma2)*0.5);
3323
3324
3325 // status = kFALSE;
3326 // for nuclei
3327 Float_t resolutionTOFpr = fESDpid.GetTOFResponse().GetExpectedSigma(p, exptimes[4], mass[4]);
3328 Float_t resolutionTPCpr = fESDpid.GetTPCResponse().GetExpectedSigma(momtpc,track->GetTPCsignalN(),AliPID::kProton);
3329 if(TMath::Abs(dedx-bb1) < resolutionTPCpr*3 && exptimes[4] < time-7*resolutionTOFpr){
3330 status = kTRUE;
3331 }
3332 else if(TMath::Abs(dedx-bb2) < resolutionTPCpr*3 && exptimes[4] < time-7*resolutionTOFpr){
3333 status = kTRUE;
3334 }
3335 else if(TMath::Abs(dedx-bbM) < resolutionTPCpr*3 && exptimes[4] < time-7*resolutionTOFpr){
3336 status = kTRUE;
3337 }
3338
3339 return status;
3abf7ecc 3340}
3341// end part added by F. Noferini
3342//-----------------------------------------------------------------------
2b1eaa10 3343
2b1eaa10 3344//-----------------------------------------------------------------------
3345const char* AliFlowTrackCuts::PIDsourceName(PIDsource s)
3346{
3347 //get the name of the particle id source
3348 switch (s)
3349 {
3350 case kTPCdedx:
3351 return "TPCdedx";
b9cf8f8e 3352 case kTPCbayesian:
3353 return "TPCbayesian";
2b1eaa10 3354 case kTOFbeta:
3355 return "TOFbeta";
3356 case kTPCpid:
3357 return "TPCpid";
3358 case kTOFpid:
3359 return "TOFpid";
3360 case kTOFbayesian:
3361 return "TOFbayesianPID";
1a80f9f6 3362 case kTOFbetaSimple:
3363 return "TOFbetaSimple";
2b1eaa10 3364 default:
3365 return "NOPID";
3366 }
3367}
3368
3369//-----------------------------------------------------------------------
3370const char* AliFlowTrackCuts::GetParamTypeName(trackParameterType type)
3371{
3372 //return the name of the selected parameter type
3373 switch (type)
3374 {
3375 case kMC:
3376 return "MC";
3377 case kGlobal:
1a80f9f6 3378 return "Global";
3379 case kTPCstandalone:
3380 return "TPCstandalone";
3381 case kSPDtracklet:
3382 return "SPDtracklets";
d148af7e 3383 case kPMD:
3384 return "PMD";
22289738 3385 case kV0:
3386 return "V0";
2b1eaa10 3387 default:
3388 return "unknown";
3389 }
3390}
3391
d148af7e 3392//-----------------------------------------------------------------------
1a80f9f6 3393Bool_t AliFlowTrackCuts::PassesPMDcuts(AliESDPmdTrack* track )
d148af7e 3394{
3395 //check PMD specific cuts
3396 //clean up from last iteration, and init label
1a80f9f6 3397 Int_t det = track->GetDetector();
3398 //Int_t smn = track->GetSmn();
3399 Float_t clsX = track->GetClusterX();
3400 Float_t clsY = track->GetClusterY();
3401 Float_t clsZ = track->GetClusterZ();
3402 Float_t ncell = track->GetClusterCells();
3403 Float_t adc = track->GetClusterADC();
d148af7e 3404
3405 fTrack = NULL;
3406 fMCparticle=NULL;
3407 fTrackLabel=-1;
3408
1a80f9f6 3409 fTrackEta = GetPmdEta(clsX,clsY,clsZ);
3410 fTrackPhi = GetPmdPhi(clsX,clsY);
d148af7e 3411 fTrackWeight = 1.0;
3412
3413 Bool_t pass=kTRUE;
3414 if (fCutEta) {if ( fTrackEta < fEtaMin || fTrackEta >= fEtaMax ) pass = kFALSE;}
3415 if (fCutPhi) {if ( fTrackPhi < fPhiMin || fTrackPhi >= fPhiMax ) pass = kFALSE;}
1a80f9f6 3416 if (fCutPmdDet) {if(det != fPmdDet) pass = kFALSE;}
3417 if (fCutPmdAdc) {if(adc < fPmdAdc) pass = kFALSE;}
3418 if (fCutPmdNcell) {if(ncell < fPmdNcell) pass = kFALSE;}
d148af7e 3419
1a80f9f6 3420 return pass;
d148af7e 3421}
22289738 3422
3423//-----------------------------------------------------------------------
3424Bool_t AliFlowTrackCuts::PassesV0cuts(AliESDVZERO* vzero, Int_t id)
3425{
3426 //check V0 cuts
3427
3428 //clean up from last iter
3429 fTrack = NULL;
3430 fMCparticle=NULL;
3431 fTrackLabel=-1;
3432
1a80f9f6 3433 fTrackPhi = TMath::PiOver4()*(0.5+id%8);
3434 if(id<32)
3435 fTrackEta = -3.45+0.5*(id/8); // taken from PPR
3436 else
3437 fTrackEta = +4.8-0.5*((id/8)-4); // taken from PPR
3438 fTrackWeight = vzero->GetMultiplicity(id); // not corrected yet: we should use AliESDUtils
22289738 3439
3440 Bool_t pass=kTRUE;
3441 if (fCutEta) {if ( fTrackEta < fEtaMin || fTrackEta >= fEtaMax ) pass = kFALSE;}
3442 if (fCutPhi) {if ( fTrackPhi < fPhiMin || fTrackPhi >= fPhiMax ) pass = kFALSE;}
3443
1a80f9f6 3444 return pass;
22289738 3445}
3446
1a80f9f6 3447//----------------------------------------------------------------------------//
3448Double_t AliFlowTrackCuts::GetPmdEta(Float_t xPos, Float_t yPos, Float_t zPos)
3449{
3450 Float_t rpxpy, theta, eta;
3451 rpxpy = TMath::Sqrt(xPos*xPos + yPos*yPos);
3452 theta = TMath::ATan2(rpxpy,zPos);
3453 eta = -TMath::Log(TMath::Tan(0.5*theta));
3454 return eta;
3455}
3456
3457//--------------------------------------------------------------------------//
3458Double_t AliFlowTrackCuts::GetPmdPhi(Float_t xPos, Float_t yPos)
3459{
3460 Float_t pybypx, phi = 0., phi1;
3461 if(xPos==0)
3462 {
3463 if(yPos>0) phi = 90.;
3464 if(yPos<0) phi = 270.;
3465 }
3466 if(xPos != 0)
3467 {
3468 pybypx = yPos/xPos;
3469 if(pybypx < 0) pybypx = - pybypx;
3470 phi1 = TMath::ATan(pybypx)*180./3.14159;
3471
3472 if(xPos > 0 && yPos > 0) phi = phi1; // 1st Quadrant
3473 if(xPos < 0 && yPos > 0) phi = 180 - phi1; // 2nd Quadrant
3474 if(xPos < 0 && yPos < 0) phi = 180 + phi1; // 3rd Quadrant
3475 if(xPos > 0 && yPos < 0) phi = 360 - phi1; // 4th Quadrant
3476
3477 }
3478 phi = phi*3.14159/180.;
3479 return phi;
3480}
499fe731 3481
3482//---------------------------------------------------------------//
3483void AliFlowTrackCuts::Browse(TBrowser* b)
3484{
3485 //some browsing capabilities
3486 if (fQA) b->Add(fQA);
3487}
3488
1a80f9f6 3489//---------------------------------------------------------------//
499fe731 3490Long64_t AliFlowTrackCuts::Merge(TCollection* list)
3491{
3492 //merge
3493 Int_t number=0;
3494 AliFlowTrackCuts* obj;
3495 if (!list) return 0;
3496 if (list->GetEntries()<1) return 0;
3497 TIter next(list);
3498 while ( (obj = dynamic_cast<AliFlowTrackCuts*>(next())) )
3499 {
3500 if (obj==this) continue;
3501 TList listwrapper;
3502 listwrapper.Add(obj->GetQA());
3503 fQA->Merge(&listwrapper);
3504 number++;
3505 }
3506 return number;
3507}
f21bdf48 3508