ROOT logo
//
//  Class for handling of ESD v0 cuts.
//
//

#ifndef ALIESDV0CUTS_H
#define ALIESDV0CUTS_H

#include <TF1.h>
#include <TH2.h>
#include "AliAnalysisCuts.h"

class AliESD;
class AliESDEvent;
class AliESDVertex;
class AliESDtrack;
class AliESDv0;
class AliLog;
class TTree;

class AliESDv0Cuts : public AliAnalysisCuts
{
public:
  AliESDv0Cuts(const Char_t* name = "AliESDv0Cuts", const Char_t* title = "");
  virtual ~AliESDv0Cuts();

  Bool_t IsSelected(TObject* /*obj*/) {return kTRUE;}
  Bool_t IsSelected(TList* listObj);
  Bool_t IsSelected(TObject* const obj1, TObject* const obj2, TObject* const obj3, TObject* const obj4)
  {return AcceptV0((AliESDv0*) obj1, (AliESDtrack*) obj2, (AliESDtrack*) obj3, (const AliESDVertex*) obj4);}
  Bool_t AcceptV0(AliESDv0* const esdV0, AliESDtrack* const trackPos, AliESDtrack* const trackNeg, const AliESDVertex*  esdVertex);
  TObjArray* GetAcceptedV0s(const AliESD* esd);
  Int_t CountAcceptedV0s(const AliESD* esd);
  TObjArray* GetAcceptedV0s(const AliESDEvent* esd);
  Int_t CountAcceptedV0s(const AliESDEvent* esd);

  virtual Long64_t Merge(TCollection* list);
  virtual void Copy(TObject &c) const;
  AliESDv0Cuts(const AliESDv0Cuts& pd);  // Copy Constructor
  AliESDv0Cuts &operator=(const AliESDv0Cuts &c);

  //######################################################
  // v0 quality cut setters  
  void SetMinDcaPosToVertex(Float_t min=-1)          {fCutMinDcaPosToVertex=min;}
  void SetMinDcaNegToVertex(Float_t min=-1)          {fCutMinDcaNegToVertex=min;}
  void SetMaxChi2(Float_t max=1e10)                  {fCutMaxChi2=max;}
  void SetMaxDcaV0Daughters(Float_t max=1e10)        {fCutMaxDcaV0Daughters=max;}
  void SetMinRadius(Float_t min=-1)                  {fCutMinRadius=min;}
  void SetMaxRadius(Float_t max=1e10)                {fCutMaxRadius=max;}
  void SetMinCosinePointingAngle(Float_t min=-1)     {fCutMinCosinePointingAngle=min;}
  void SetRequireOnFlyStatus(Bool_t b=kFALSE)        {fCutRequireOnFlyStatus=b;}
  void SetMaxDcaV0ToVertex(Float_t max=1e10)         {fCutMaxDcaV0ToVertex=max;}

  // v0 kinematic cut setters
  void SetPRange(Float_t r1=0, Float_t r2=1e10)      {fPMin=r1;   fPMax=r2;}
  void SetPtRange(Float_t r1=0, Float_t r2=1e10)     {fPtMin=r1;  fPtMax=r2;}
  void SetPxRange(Float_t r1=-1e10, Float_t r2=1e10) {fPxMin=r1;  fPxMax=r2;}
  void SetPyRange(Float_t r1=-1e10, Float_t r2=1e10) {fPyMin=r1;  fPyMax=r2;}
  void SetPzRange(Float_t r1=-1e10, Float_t r2=1e10) {fPzMin=r1;  fPzMax=r2;}

  //######################################################
  void SetHistogramsOn(Bool_t b=kFALSE) {fHistogramsOn = b;}
  void DefineHistograms(Int_t color=1);
  virtual Bool_t LoadHistograms(const Char_t* dir = 0);
  void SaveHistograms(const Char_t* dir = 0);
  void DrawHistograms();

  static void EnableNeededBranches(TTree* tree);

  // void SaveQualityCuts(Char_t* file)
  // void LoadQualityCuts(Char_t* file)

protected:
  void Init(); // sets everything to 0

  enum { kNCuts = 14 };

  //######################################################
  // esd v0 quality cuts
  static const Char_t* fgkCutNames[kNCuts]; //! names of cuts (for internal use)

  Float_t fCutMinDcaPosToVertex;      // min dca of the positive daughter to the primary vertex
  Float_t fCutMinDcaNegToVertex;      // min dca of the negative daughter to the primary vertex
  Float_t fCutMaxChi2;                // max chi2
  Float_t fCutMaxDcaV0Daughters;      // max dca between the two v0 daughters
  Float_t fCutMinRadius;              // min reconstruction radius (fiducial volume)
  Float_t fCutMaxRadius;              // max reconstruction radius (fiducial volume)
  Float_t fCutMinCosinePointingAngle; // min cosine of pointing angle
  Bool_t  fCutRequireOnFlyStatus;     // require on fly status
  Float_t fCutMaxDcaV0ToVertex;       // max dca of the v0 to the primary vertex

  // v0 kinematics cuts
  Float_t fPMin,   fPMax;             // definition of the range of the P
  Float_t fPtMin,  fPtMax;            // definition of the range of the Pt
  Float_t fPxMin,  fPxMax;            // definition of the range of the Px
  Float_t fPyMin,  fPyMax;            // definition of the range of the Py
  Float_t fPzMin,  fPzMax;            // definition of the range of the Pz

  //######################################################
  // diagnostics histograms
  Bool_t fHistogramsOn;               // histograms on/off

  TH1F* fhDcaPosToVertex[2];          //->
  TH1F* fhDcaNegToVertex[2];          //->
  TH1F* fhChi2[2];                    //->
  TH1F* fhDcaV0Daughters[2];          //->
  TH1F* fhRadius[2];                  //->
  TH1F* fhCosinePointingAngle[2];     //->
  TH1F* fhOnFlyStatus[2];             //->
  TH1F* fhDcaV0ToVertex[2];           //->
  
  TH1F* fhPt[2];                      //-> pt of esd v0s

  TH1F* fhCutStatistics;              //-> statistics of what cuts the v0s did not survive
  TH2F* fhCutCorrelation;             //-> 2d statistics plot

  ClassDef(AliESDv0Cuts, 1)
};


#endif
 AliESDv0Cuts.h:1
 AliESDv0Cuts.h:2
 AliESDv0Cuts.h:3
 AliESDv0Cuts.h:4
 AliESDv0Cuts.h:5
 AliESDv0Cuts.h:6
 AliESDv0Cuts.h:7
 AliESDv0Cuts.h:8
 AliESDv0Cuts.h:9
 AliESDv0Cuts.h:10
 AliESDv0Cuts.h:11
 AliESDv0Cuts.h:12
 AliESDv0Cuts.h:13
 AliESDv0Cuts.h:14
 AliESDv0Cuts.h:15
 AliESDv0Cuts.h:16
 AliESDv0Cuts.h:17
 AliESDv0Cuts.h:18
 AliESDv0Cuts.h:19
 AliESDv0Cuts.h:20
 AliESDv0Cuts.h:21
 AliESDv0Cuts.h:22
 AliESDv0Cuts.h:23
 AliESDv0Cuts.h:24
 AliESDv0Cuts.h:25
 AliESDv0Cuts.h:26
 AliESDv0Cuts.h:27
 AliESDv0Cuts.h:28
 AliESDv0Cuts.h:29
 AliESDv0Cuts.h:30
 AliESDv0Cuts.h:31
 AliESDv0Cuts.h:32
 AliESDv0Cuts.h:33
 AliESDv0Cuts.h:34
 AliESDv0Cuts.h:35
 AliESDv0Cuts.h:36
 AliESDv0Cuts.h:37
 AliESDv0Cuts.h:38
 AliESDv0Cuts.h:39
 AliESDv0Cuts.h:40
 AliESDv0Cuts.h:41
 AliESDv0Cuts.h:42
 AliESDv0Cuts.h:43
 AliESDv0Cuts.h:44
 AliESDv0Cuts.h:45
 AliESDv0Cuts.h:46
 AliESDv0Cuts.h:47
 AliESDv0Cuts.h:48
 AliESDv0Cuts.h:49
 AliESDv0Cuts.h:50
 AliESDv0Cuts.h:51
 AliESDv0Cuts.h:52
 AliESDv0Cuts.h:53
 AliESDv0Cuts.h:54
 AliESDv0Cuts.h:55
 AliESDv0Cuts.h:56
 AliESDv0Cuts.h:57
 AliESDv0Cuts.h:58
 AliESDv0Cuts.h:59
 AliESDv0Cuts.h:60
 AliESDv0Cuts.h:61
 AliESDv0Cuts.h:62
 AliESDv0Cuts.h:63
 AliESDv0Cuts.h:64
 AliESDv0Cuts.h:65
 AliESDv0Cuts.h:66
 AliESDv0Cuts.h:67
 AliESDv0Cuts.h:68
 AliESDv0Cuts.h:69
 AliESDv0Cuts.h:70
 AliESDv0Cuts.h:71
 AliESDv0Cuts.h:72
 AliESDv0Cuts.h:73
 AliESDv0Cuts.h:74
 AliESDv0Cuts.h:75
 AliESDv0Cuts.h:76
 AliESDv0Cuts.h:77
 AliESDv0Cuts.h:78
 AliESDv0Cuts.h:79
 AliESDv0Cuts.h:80
 AliESDv0Cuts.h:81
 AliESDv0Cuts.h:82
 AliESDv0Cuts.h:83
 AliESDv0Cuts.h:84
 AliESDv0Cuts.h:85
 AliESDv0Cuts.h:86
 AliESDv0Cuts.h:87
 AliESDv0Cuts.h:88
 AliESDv0Cuts.h:89
 AliESDv0Cuts.h:90
 AliESDv0Cuts.h:91
 AliESDv0Cuts.h:92
 AliESDv0Cuts.h:93
 AliESDv0Cuts.h:94
 AliESDv0Cuts.h:95
 AliESDv0Cuts.h:96
 AliESDv0Cuts.h:97
 AliESDv0Cuts.h:98
 AliESDv0Cuts.h:99
 AliESDv0Cuts.h:100
 AliESDv0Cuts.h:101
 AliESDv0Cuts.h:102
 AliESDv0Cuts.h:103
 AliESDv0Cuts.h:104
 AliESDv0Cuts.h:105
 AliESDv0Cuts.h:106
 AliESDv0Cuts.h:107
 AliESDv0Cuts.h:108
 AliESDv0Cuts.h:109
 AliESDv0Cuts.h:110
 AliESDv0Cuts.h:111
 AliESDv0Cuts.h:112
 AliESDv0Cuts.h:113
 AliESDv0Cuts.h:114
 AliESDv0Cuts.h:115
 AliESDv0Cuts.h:116
 AliESDv0Cuts.h:117
 AliESDv0Cuts.h:118
 AliESDv0Cuts.h:119
 AliESDv0Cuts.h:120
 AliESDv0Cuts.h:121