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 ALIESDV0KINECUTS_H
#define ALIESDV0KINECUTS_H

#include <TObject.h>

class AliESDv0;
class AliESDEvent;
class AliVEvent;
class AliESDtrack;
class AliVTrack;
class AliKFParticle;
class AliKFVertex;

class AliESDv0KineCuts : 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 !!!
      };
  
  AliESDv0KineCuts();
  virtual ~AliESDv0KineCuts();

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

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

  // must be called by the user
  void SetEvent(AliESDEvent* 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   SetTPCchi2perCls(Float_t chi2) { fTPCchi2perCls = chi2; };
  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(AliESDv0* const v0) const;

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

  Bool_t V0CutsCommon(const AliESDv0 * const v0) const;
  Bool_t SingleTrackCuts(AliESDv0 * const v0) const;
  void   Armenteros(AliESDv0* const v0, Float_t val[2]) const;
  Bool_t CheckSigns(AliESDv0* const v0) const;

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

 protected:
  void Copy(TObject &ref) const;

 private:
  Bool_t    GammaEffCuts(AliESDv0 * const v0);  // set of cuts optimized for high gamma efficiency

 private:
  AliESDEvent           *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               fTPCchi2perCls;    // max. chi2 per TPC cluster
  Float_t               fTPCclsRatio;      // min. TPC cluster ratio
  Bool_t                fNoKinks;          // kinks - no [kTRUE] or do not care [kFalse]

  // 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(AliESDv0KineCuts, 0);

};

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