ROOT logo
#ifndef ALISINGLETRACKEFFICUTS_H
#define ALISINGLETRACKEFFICUTS_H

#include <TString.h>
#include "TObject.h"

#include "AliVEvent.h"
#include "AliMCEvent.h"
#include "AliAnalysisCuts.h"
#include "AliPID.h"
#include "AliAODTrack.h"



class AliSingleTrackEffCuts : public AliAnalysisCuts 
{
 public:

  AliSingleTrackEffCuts();
  AliSingleTrackEffCuts(const char* name, const char* title);

  AliSingleTrackEffCuts(const AliSingleTrackEffCuts& source);
  AliSingleTrackEffCuts& operator=(const AliSingleTrackEffCuts& source);

  virtual ~AliSingleTrackEffCuts();

  Bool_t IsSelected(TList* list) { 
    AliWarning(Form(" Function not implemented, list having %d entries",list->GetEntries())); 
    return kFALSE; 
  } // not implemented

  //
  // Event and track selections
  //
  // Event selection at MC level (z-vtx)
  Bool_t IsMCEventSelected(TObject *obj);
  // Event selection at reconstructed level (trigger, zvtx)
  Bool_t IsRecoEventSelected(TObject *obj);
  //
  // Check generated particles (primary, charged, pdgcode)
  Bool_t IsMCParticleGenerated(TObject *obj);
  // Check generated particles (eta, pt)
  Bool_t IsMCParticleInKineAcceptance(TObject *obj);
  // Check if particle has left enough hits in the detectors (only at ESD level)
  Bool_t IsMCParticleInReconstructable(TObject *obj);
  // Check if reconstructed particle is in the acceptance (eta, pt)
  Bool_t IsRecoParticleKineAcceptance(TObject *obj);
  // Check if reconstructed particle passes the PID selections
  //  (only at AOD level for now) if TPC or TOF accept
  Bool_t IsRecoParticlePID(TObject *obj);

  //
  // Setters
  //
  // Set eta range for acceptance cut (both MC and reco level)
  void SetEtaRange(Float_t etamin, Float_t etamax){ fEtaMin=etamin; fEtaMax=etamax; }
  // Set rapidity range for acceptance cut (both MC and reco level)
  void SetYRange(Float_t ymin, Float_t ymax){ fYMin=ymin; fYMax=ymax; }
  // Set pt range for acceptance cut (both MC and reco level)
  void SetPtRange(Float_t ptmin, Float_t ptmax){ fPtMin=ptmin; fPtMax=ptmax; }
  // Set PDG code to be checked (by default =0, no check)
  void SetPdgCode(Int_t pdgCode){ fPdgCode = pdgCode; fIsPdgCode=kTRUE; }
  Int_t GetPdgCode() { return fPdgCode; }
  // Set if check for charged particle
  void SetIsCharged(Bool_t charge){ fIsCharged=charge; }

  // Set/get for AOD/ESD analysis
  void SetIsAOD(Bool_t flag){ fisAOD = flag; }
  Bool_t IsAOD(){ return fisAOD; }

  // Set for vertex type (0: not cut; 1: SPDZ; 2: SPD3D; 3: Tracks)
  void SetMinVtxType(Int_t type=3) { fMinVtxType=type; }
  void SetUseEventsWithOnlySPDVertex(Bool_t flag=kTRUE){ 
    if(flag) fMinVtxType=1;
    else fMinVtxType=3;
  }
  // Set minimum vertex contributors
  void SetMinVtxContr(Int_t contr=1) { fMinVtxContr=contr; }
  // Set maximum z-vtx cut
  void SetMaxVtxZ(Float_t z=1e6) { fMaxVtxZ=z; }
  // Appky or not cut on difference SPD-TPC vtx (0: no cut, 1: |zvtx-SPD - zvtx-TPC|<0.5cm)
  void SetCutOnZVertexSPD(Int_t cut) { fCutOnZVertexSPD=cut; }

  // Select event trigger mask
  void SetTriggerMask(ULong64_t mask=0) { fTriggerMask=mask; }
  UInt_t GetTriggerMask(){ return fTriggerMask; }

  // Set minimum number of ITS, TPC, TOF or MUON clusters
  void SetNumberOfClusters(Int_t nITS, Int_t nTPC, Int_t nTOF, Int_t nMUON){
    fnClusITS = nITS; fnClusTPC = nTPC; fnClusTOF = nTOF; fnClusMUON = nMUON;
  }

  // PID setters (flag, particle specie, detector, limits)
  void SetUsePid(Bool_t flag=kTRUE) { fusePid=flag; }
  void SetParticleSpecie(AliPID::EParticleType type=AliPID::kPion) { fParticlePid=type; }
  void SetUseTPCPid(Bool_t flag=kTRUE) { fuseTPCPid=flag; }
  void SetUseTOFPid(Bool_t flag=kTRUE) { fuseTOFPid=flag; }
  // set given number of sigma cut per P bin
  void SetTPCSigmaPtBins(Int_t nPtBins, Float_t *pBinLimits, Float_t *sigmaBin);
  void SetTOFSigmaPtBins(Int_t nPtBins, Float_t *pBinLimits, Float_t *sigmaBin);
  // maximum momentum to use PID
  void SetMaximumPTPC(Float_t p) { fPmaxTPC=p; }
  void SetMaximumPTOF(Float_t p) { fPmaxTOF=p; }
  

  //
  // Getters
  //
  Bool_t GetUsePid() const{ return fusePid; }
  Int_t  GetParticleSpecie() const { return fParticlePid; }
  Float_t *GetPTPCBinLimits() const { return fPTPCBinLimits; }
  Int_t  GetNPTPCBins() const {return fnPTPCBins; }
  Float_t *GetPTOFBinLimits() const { return fPTOFBinLimits; }
  Int_t  GetNPTOFBins() const { return fnPTOFBins; }


 protected:

  Bool_t IsVertexSelected(AliVEvent *event);
  Bool_t CheckTPCPIDStatus(AliAODTrack *track) const;
  Bool_t CheckTOFPIDStatus(AliAODTrack *track) const;

  Bool_t fisAOD;  // flag wether it is AOD:1 or ESD:0 analysis

  Bool_t fIsPdgCode; // flag to check pdg code
  Int_t fPdgCode;    // particle pdg code

  Float_t fEtaMin;   // minimum eta cut
  Float_t fEtaMax;   // maximum eta cut
  Float_t fYMin;     // minimum Y cut
  Float_t fYMax;     // maximum Y cut
  Float_t fPtMin;    // minimum Pt cut
  Float_t fPtMax;    // maximum Pt cut
  Bool_t  fIsCharged; // check if particle is charged (MC level)

  UInt_t  fTriggerMask;   // event trigger mask
  Int_t   fMinVtxType;    // 0: not cut; 1: SPDZ; 2: SPD3D; 3: Tracks
  Int_t   fMinVtxContr;   // minimum vertex contributors
  Float_t fMaxVtxZ;       // maximum |z| of primary vertex
  Int_t fCutOnZVertexSPD; // 0: no cut, 1: |zvtx-SPD - zvtx-TPC|<0.5cm

  Int_t fnClusITS;   // minimum number of ITS clusters
  Int_t fnClusTPC;   // minimum number of TPC clusters
  Int_t fnClusTOF;   // minimum number of TOF clusters
  Int_t fnClusMUON;  // minimum number of MUON clusters

  Bool_t    fusePid;          // flag to use or not Pid
  Int_t     fParticlePid;     // integer to define the particle specie to check
  //
  Bool_t    fuseTPCPid;       // flag to use TPC Pid
  Int_t     fnPTPCBins;       // "number of limits", that is fnPBins+1
  Int_t     fnPTPCBinLimits;  // "number of limits", that is fnPBins+1
  Float_t*  fPTPCBinLimits;   //[fnPTPCBinLimits]  p bins
  Float_t*  fnSigmaTPC;       //[fnPTPCBins]
  Float_t   fPmaxTPC;         // maximum TPC P to use Pid
  //
  Bool_t    fuseTOFPid;       // flag to use TOF Pid
  Int_t     fnPTOFBins;       // "number of limits", that is fnPBins+1
  Int_t     fnPTOFBinLimits;  // "number of limits", that is fnPBins+1
  Float_t*  fPTOFBinLimits;   //[fnPTOFBinLimits]  p bins
  Float_t*  fnSigmaTOF;       //[fnPTOFBins]
  Float_t   fPmaxTOF;         // maximum TOF P to use Pid
  

  ClassDef(AliSingleTrackEffCuts,1)  // base class for cuts on AOD reconstructed heavy-flavour decays
 };

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