ROOT logo
/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 * See cxx source for full Copyright notice                               */
/*
 * plesae see source file for more details
 */
#ifndef ALIAODV0KINECUTS_H
#define ALIAODV0KINECUTS_H

#include <TObject.h>
#include <TArrayI.h>

class AliAODv0;
class AliAODEvent;
class AliVEvent;
class AliAODTrack;
class AliVTrack;
class AliKFParticle;
class AliKFVertex;

class AliAODv0KineCuts : public TObject{
 public:
  enum{ // Reconstructed V0
    kUndef = -1,
      kGamma = 0,
      kK0 = 1,
      kLambda = 2,
      kALambda = 3
      };
  enum{ // data types
      kPP = 0,
      kPbPb = 1,  // not yet implemented
      };
  enum{ // operation modes
      kPurity = 0, // purely kinematical selection
      kEffGamma = 1  // !!! involves TPC dEdx or nSimga cuts !!!
      };
  
  AliAODv0KineCuts();
  virtual ~AliAODv0KineCuts();

  AliAODv0KineCuts(const AliAODv0KineCuts &ref);
  AliAODv0KineCuts &operator=(const AliAODv0KineCuts &ref);

  // main selection function - called once per V0 candidate
  Bool_t ProcessV0(AliAODv0* const v0, Int_t &pdgV0, Int_t &pdgP, Int_t &pdgN) const;
  Bool_t ProcessV0(AliAODv0* const v0, Int_t &pdgP, Int_t &pdgN) const;

  // must be called by the user
  void SetEvent(AliAODEvent* const event);
  void SetEvent(AliVEvent* const event);
  void SetPrimaryVertex(AliKFVertex* const v);

  // user can select an operation modes [see .cxx for details]
  void   SetMode(Int_t mode, Int_t type);
  void   SetMode(Int_t mode, const char* type);
  void	 UseExternalVertex(Bool_t use_external=kTRUE);
  AliKFParticle *CreateMotherParticle(const AliVTrack* const pdaughter, const AliVTrack* const ndaughter, Int_t pspec, Int_t nspec) const;
  void      SetCuts();                          // setup cuts for selected fMode and fType, see source file for details
  //
  // setter functions for V0 cut values
  // for default values see the constructor
  // see the default contructor for comments
  //

  // single track cuts
  void   SetNTPCclusters(Int_t n) { fTPCNcls = n; };
  void   SetTPCrefit(Bool_t r = kTRUE) { fTPCrefit = r; };
  void   SetTPCclusterratio(Float_t r) { fTPCclsRatio = r; };
  void   SetNoKinks(Bool_t k = kTRUE) { fNoKinks = k; };

  // gamma cuts
  void   SetGammaCutChi2NDF(Float_t val)  { fGcutChi2NDF = val; };
  void   SetGammaCutCosPoint(Float_t * const val) { 
    fGcutCosPoint[0] = val[0];
    fGcutCosPoint[1] = val[1];
  };
  void   SetGammaCutDCA(Float_t * const val){
    fGcutDCA[0] = val[0];
    fGcutDCA[1] = val[1];
  };
  void   SetGammaCutVertexR(Float_t * const val){
    fGcutVertexR[0] = val[0];
    fGcutVertexR[1] = val[1];
  };
  void   SetGammaCutPsiPair(Float_t * const val){
    fGcutPsiPair[0] = val[0];
    fGcutPsiPair[1] = val[1];
  };
  void   SetGammaCutInvMass(Float_t val){
    fGcutInvMass = val;
  };
  // K0 cuts
  void   SetK0CutChi2NDF(Float_t val)  { fK0cutChi2NDF = val; };
  void   SetK0CutCosPoint(Float_t * const val) { 
    fK0cutCosPoint[0] = val[0];
    fK0cutCosPoint[1] = val[1];
  };
  void   SetK0CutDCA(Float_t * const val){
    fK0cutDCA[0] = val[0];
    fK0cutDCA[1] = val[1];
  };
  void   SetK0CutVertexR(Float_t * const val){
    fK0cutVertexR[0] = val[0];
    fK0cutVertexR[1] = val[1];
  };
  void   SetK0CutInvMass(Float_t * const val){
    fK0cutInvMass[0] = val[0];
    fK0cutInvMass[1] = val[1];
  };
  // lambda & anti-lambda cuts
  void   SetLambdaCutChi2NDF(Float_t val)  { fLcutChi2NDF = val; };
  void   SetLambdaCutCosPoint(Float_t * const val) { 
    fLcutCosPoint[0] = val[0];
    fLcutCosPoint[1] = val[1];
  };
  void   SetLambdaCutDCA(Float_t * const val){
    fLcutDCA[0] = val[0];
    fLcutDCA[1] = val[1];
  };
  void   SetLambdaCutVertexR(Float_t * const val){
    fLcutVertexR[0] = val[0];
    fLcutVertexR[1] = val[1];
  };
  void   SetLambdaCutInvMass(Float_t * const val){
    fLcutInvMass[0] = val[0];
    fLcutInvMass[1] = val[1];
  };
  

  Int_t  PreselectV0(AliAODv0* const v0) const;

  Bool_t CaseGamma(AliAODv0* const v0, Int_t &pdgV0, Int_t &pdgP, Int_t &pdgN) const;
  Bool_t CaseK0(AliAODv0* const v0, Int_t &pdgV0, Int_t &pdgP, Int_t &pdgN) const;
  Bool_t CaseLambda(AliAODv0* const v0, Int_t &pdgV0, Int_t &pdgP, Int_t &pdgN, Int_t id) const;

  Bool_t V0CutsCommon(const AliAODv0 * const v0) const;
  Bool_t SingleTrackCuts(AliAODv0 * const v0) const;
  Bool_t CheckSigns(AliAODv0* const v0) const;

  Double_t PsiPair(AliAODv0* const v0) const;
  Bool_t   GetConvPosXY(AliAODTrack * const ptrack, AliAODTrack * const ntrack, Double_t convpos[2]) const;
  Bool_t   GetHelixCenter(AliAODTrack * const track, Double_t b, Int_t charge, Double_t center[2]) const;

 protected:
  void Copy(TObject &ref) const;

 private:
  Bool_t    GammaEffCuts(AliAODv0 * const v0);  // set of cuts optimized for high gamma efficiency
  Bool_t    IsKinkMother(const AliAODTrack * const track) const;
  Bool_t    IsKinkDaughter(const AliAODTrack * const track) const;

 private:
  AliAODEvent           *fEvent;          // current event
  AliKFVertex           *fPrimaryVertex;  // primary vertex

  Int_t                 fType;            // data type: p-p or Pb-Pb
  Int_t                 fMode;            // current operation mode

  // single track cuts
  Int_t                 fTPCNcls;          // number of TPC clusters
  Bool_t                fTPCrefit;         // TPC refit - yes [kTRUE] or do not care [kFALSE]
  Float_t               fTPCclsRatio;      // min. TPC cluster ratio
  Bool_t                fNoKinks;          // kinks - no [kTRUE] or do not care [kFalse]
  TArrayI               fKinkMotherList;   // Kink mothers
  Int_t                 fNumberKinkMothers; // Number of kink mothers

  // gamma cut values
  Float_t               fGcutChi2NDF;      // Chi2NF cut value for the AliKFparticle gamma
  Float_t               fGcutCosPoint[2];  // cos of the pointing angle [min, max]
  Float_t               fGcutDCA[2];       // DCA between the daughter tracks [min, max]
  Float_t               fGcutVertexR[2];   // radius of the conversion point [min, max]
  Float_t               fGcutPsiPair[2];   // value of the psi pair cut [min, max]
  Float_t               fGcutInvMass;      // upper value on the gamma invariant mass
  // K0 cut values
  Float_t               fK0cutChi2NDF;     // Chi2NF cut value for the AliKFparticle K0
  Float_t               fK0cutCosPoint[2]; // cos of the pointing angle [min, max]
  Float_t               fK0cutDCA[2];      // DCA between the daughter tracks [min, max]
  Float_t               fK0cutVertexR[2];  // radius of the decay point [min, max]
  Float_t               fK0cutInvMass[2];  // invariant mass window
  // Lambda & anti-Lambda cut values
  Float_t               fLcutChi2NDF;      // Chi2NF cut value for the AliKFparticle K0
  Float_t               fLcutCosPoint[2];  // cos of the pointing angle [min, max]
  Float_t               fLcutDCA[2];       // DCA between the daughter tracks [min, max]
  Float_t               fLcutVertexR[2];   // radius of the decay point [min, max]
  Float_t               fLcutInvMass[2];   // invariant mass window
  Bool_t		fUseExternalVertex; // Is kTRUE if Vertex is set via SetPrimaryVertex()
  Bool_t		fDeleteVertex;	    // Is kTRUE if Vertex has been created in SetEvent() function
  
  ClassDef(AliAODv0KineCuts, 0);

};

#endif
 AliAODv0KineCuts.h:1
 AliAODv0KineCuts.h:2
 AliAODv0KineCuts.h:3
 AliAODv0KineCuts.h:4
 AliAODv0KineCuts.h:5
 AliAODv0KineCuts.h:6
 AliAODv0KineCuts.h:7
 AliAODv0KineCuts.h:8
 AliAODv0KineCuts.h:9
 AliAODv0KineCuts.h:10
 AliAODv0KineCuts.h:11
 AliAODv0KineCuts.h:12
 AliAODv0KineCuts.h:13
 AliAODv0KineCuts.h:14
 AliAODv0KineCuts.h:15
 AliAODv0KineCuts.h:16
 AliAODv0KineCuts.h:17
 AliAODv0KineCuts.h:18
 AliAODv0KineCuts.h:19
 AliAODv0KineCuts.h:20
 AliAODv0KineCuts.h:21
 AliAODv0KineCuts.h:22
 AliAODv0KineCuts.h:23
 AliAODv0KineCuts.h:24
 AliAODv0KineCuts.h:25
 AliAODv0KineCuts.h:26
 AliAODv0KineCuts.h:27
 AliAODv0KineCuts.h:28
 AliAODv0KineCuts.h:29
 AliAODv0KineCuts.h:30
 AliAODv0KineCuts.h:31
 AliAODv0KineCuts.h:32
 AliAODv0KineCuts.h:33
 AliAODv0KineCuts.h:34
 AliAODv0KineCuts.h:35
 AliAODv0KineCuts.h:36
 AliAODv0KineCuts.h:37
 AliAODv0KineCuts.h:38
 AliAODv0KineCuts.h:39
 AliAODv0KineCuts.h:40
 AliAODv0KineCuts.h:41
 AliAODv0KineCuts.h:42
 AliAODv0KineCuts.h:43
 AliAODv0KineCuts.h:44
 AliAODv0KineCuts.h:45
 AliAODv0KineCuts.h:46
 AliAODv0KineCuts.h:47
 AliAODv0KineCuts.h:48
 AliAODv0KineCuts.h:49
 AliAODv0KineCuts.h:50
 AliAODv0KineCuts.h:51
 AliAODv0KineCuts.h:52
 AliAODv0KineCuts.h:53
 AliAODv0KineCuts.h:54
 AliAODv0KineCuts.h:55
 AliAODv0KineCuts.h:56
 AliAODv0KineCuts.h:57
 AliAODv0KineCuts.h:58
 AliAODv0KineCuts.h:59
 AliAODv0KineCuts.h:60
 AliAODv0KineCuts.h:61
 AliAODv0KineCuts.h:62
 AliAODv0KineCuts.h:63
 AliAODv0KineCuts.h:64
 AliAODv0KineCuts.h:65
 AliAODv0KineCuts.h:66
 AliAODv0KineCuts.h:67
 AliAODv0KineCuts.h:68
 AliAODv0KineCuts.h:69
 AliAODv0KineCuts.h:70
 AliAODv0KineCuts.h:71
 AliAODv0KineCuts.h:72
 AliAODv0KineCuts.h:73
 AliAODv0KineCuts.h:74
 AliAODv0KineCuts.h:75
 AliAODv0KineCuts.h:76
 AliAODv0KineCuts.h:77
 AliAODv0KineCuts.h:78
 AliAODv0KineCuts.h:79
 AliAODv0KineCuts.h:80
 AliAODv0KineCuts.h:81
 AliAODv0KineCuts.h:82
 AliAODv0KineCuts.h:83
 AliAODv0KineCuts.h:84
 AliAODv0KineCuts.h:85
 AliAODv0KineCuts.h:86
 AliAODv0KineCuts.h:87
 AliAODv0KineCuts.h:88
 AliAODv0KineCuts.h:89
 AliAODv0KineCuts.h:90
 AliAODv0KineCuts.h:91
 AliAODv0KineCuts.h:92
 AliAODv0KineCuts.h:93
 AliAODv0KineCuts.h:94
 AliAODv0KineCuts.h:95
 AliAODv0KineCuts.h:96
 AliAODv0KineCuts.h:97
 AliAODv0KineCuts.h:98
 AliAODv0KineCuts.h:99
 AliAODv0KineCuts.h:100
 AliAODv0KineCuts.h:101
 AliAODv0KineCuts.h:102
 AliAODv0KineCuts.h:103
 AliAODv0KineCuts.h:104
 AliAODv0KineCuts.h:105
 AliAODv0KineCuts.h:106
 AliAODv0KineCuts.h:107
 AliAODv0KineCuts.h:108
 AliAODv0KineCuts.h:109
 AliAODv0KineCuts.h:110
 AliAODv0KineCuts.h:111
 AliAODv0KineCuts.h:112
 AliAODv0KineCuts.h:113
 AliAODv0KineCuts.h:114
 AliAODv0KineCuts.h:115
 AliAODv0KineCuts.h:116
 AliAODv0KineCuts.h:117
 AliAODv0KineCuts.h:118
 AliAODv0KineCuts.h:119
 AliAODv0KineCuts.h:120
 AliAODv0KineCuts.h:121
 AliAODv0KineCuts.h:122
 AliAODv0KineCuts.h:123
 AliAODv0KineCuts.h:124
 AliAODv0KineCuts.h:125
 AliAODv0KineCuts.h:126
 AliAODv0KineCuts.h:127
 AliAODv0KineCuts.h:128
 AliAODv0KineCuts.h:129
 AliAODv0KineCuts.h:130
 AliAODv0KineCuts.h:131
 AliAODv0KineCuts.h:132
 AliAODv0KineCuts.h:133
 AliAODv0KineCuts.h:134
 AliAODv0KineCuts.h:135
 AliAODv0KineCuts.h:136
 AliAODv0KineCuts.h:137
 AliAODv0KineCuts.h:138
 AliAODv0KineCuts.h:139
 AliAODv0KineCuts.h:140
 AliAODv0KineCuts.h:141
 AliAODv0KineCuts.h:142
 AliAODv0KineCuts.h:143
 AliAODv0KineCuts.h:144
 AliAODv0KineCuts.h:145
 AliAODv0KineCuts.h:146
 AliAODv0KineCuts.h:147
 AliAODv0KineCuts.h:148
 AliAODv0KineCuts.h:149
 AliAODv0KineCuts.h:150
 AliAODv0KineCuts.h:151
 AliAODv0KineCuts.h:152
 AliAODv0KineCuts.h:153
 AliAODv0KineCuts.h:154
 AliAODv0KineCuts.h:155
 AliAODv0KineCuts.h:156
 AliAODv0KineCuts.h:157
 AliAODv0KineCuts.h:158
 AliAODv0KineCuts.h:159
 AliAODv0KineCuts.h:160
 AliAODv0KineCuts.h:161
 AliAODv0KineCuts.h:162
 AliAODv0KineCuts.h:163
 AliAODv0KineCuts.h:164
 AliAODv0KineCuts.h:165
 AliAODv0KineCuts.h:166
 AliAODv0KineCuts.h:167
 AliAODv0KineCuts.h:168
 AliAODv0KineCuts.h:169
 AliAODv0KineCuts.h:170
 AliAODv0KineCuts.h:171
 AliAODv0KineCuts.h:172
 AliAODv0KineCuts.h:173
 AliAODv0KineCuts.h:174
 AliAODv0KineCuts.h:175
 AliAODv0KineCuts.h:176
 AliAODv0KineCuts.h:177
 AliAODv0KineCuts.h:178
 AliAODv0KineCuts.h:179
 AliAODv0KineCuts.h:180
 AliAODv0KineCuts.h:181
 AliAODv0KineCuts.h:182
 AliAODv0KineCuts.h:183
 AliAODv0KineCuts.h:184
 AliAODv0KineCuts.h:185
 AliAODv0KineCuts.h:186
 AliAODv0KineCuts.h:187
 AliAODv0KineCuts.h:188
 AliAODv0KineCuts.h:189
 AliAODv0KineCuts.h:190
 AliAODv0KineCuts.h:191
 AliAODv0KineCuts.h:192
 AliAODv0KineCuts.h:193