ROOT logo
#ifndef ALIANALYSISTASKPIDV0BASE_H
#define ALIANALYSISTASKPIDV0BASE_H

/*
This class is a base class for all other
analysis tasks that use V0's.
It provides basics for V0 identification.
In addition, some further basic functions are provided.

Class written by Benjamin Hess.
Contact: bhess@cern.ch
*/

class TF1;
class TRandom3;
class TObjArray;
class AliVEvent;
class AliESDEvent;
class AliMCEvent;
class AliPIDResponse;
class AliESDv0KineCuts;
class AliPID;
class AliAnalysisFilter;
class AliVTrack;

#include <TTreeStream.h>
#include "AliInputEventHandler.h"
#include "AliTOFPIDResponse.h"
#include "AliAnalysisTaskSE.h"
#include "AliAnalysisUtils.h"

class AliAnalysisTaskPIDV0base : public AliAnalysisTaskSE {
 public:
  enum PileUpRejectionType { kPileUpRejectionOff = 0, kPileUpRejectionSPD = 1, kPileUpRejectionMV = 2 };
  enum TPCcutType { kNoCut = 0, kTPCCutMIGeo = 1, kTPCnclCut = 2 };
  AliAnalysisTaskPIDV0base();
  AliAnalysisTaskPIDV0base(const char *name);
  virtual ~AliAnalysisTaskPIDV0base();
  
  virtual void   UserCreateOutputObjects();
  virtual void   UserExec(Option_t *option);
  virtual void   Terminate(const Option_t*);
  
  virtual Bool_t GetVertexIsOk(AliVEvent* event, Bool_t doVtxZcut = kTRUE) const;
 
  virtual Bool_t GetIsPileUp(AliVEvent* event, PileUpRejectionType pileUpRejectionType) const;
  
  virtual Bool_t GetIsPbpOrpPb() const { return fIsPbpOrpPb; };
  virtual void SetIsPbpOrpPb(Bool_t newValue) { fIsPbpOrpPb = newValue; };
  
  virtual Double_t GetZvtxCutEvent() const { return fZvtxCutEvent; };
  virtual void SetZvtxCutEvent(Double_t newValue) { fZvtxCutEvent = newValue; if (fAnaUtils) fAnaUtils->SetMaxVtxZ(fZvtxCutEvent);};
  
  virtual Bool_t GetUsePhiCut() const { return fUsePhiCut; };
  virtual void SetUsePhiCut(Bool_t newValue) { fUsePhiCut = newValue; };
  
  virtual TPCcutType GetTPCcutType() const { return fTPCcutType; };
  virtual Bool_t GetUseTPCCutMIGeo() const { return (fTPCcutType == kTPCCutMIGeo); };
  virtual Bool_t GetUseTPCnclCut() const { return (fTPCcutType == kTPCnclCut); };
  
  virtual void SetTPCcutType(TPCcutType newType) { fTPCcutType = newType; };
  
  virtual Double_t GetEtaCut() const { return fEtaCut; };     
  virtual void  SetEtaCut(Double_t etaCut){ fEtaCut = etaCut; };
  
  virtual const AliAnalysisFilter* GetTrackFilter() const { return fTrackFilter; };
  virtual void  SetTrackFilter(AliAnalysisFilter* trackF) {fTrackFilter = trackF;}
  
  virtual Char_t GetV0tag(Int_t trackIndex) const;
  
  virtual Bool_t GetStoreMotherIndex() const { return fStoreMotherIndex; };
  virtual void SetStoreMotherIndex(Bool_t newValue) { fStoreMotherIndex = newValue; };
  
  virtual Int_t GetV0motherIndex(Int_t trackIndex) const;
  
  virtual Double_t GetPhiPrime(Double_t phi, Double_t magField, Int_t charge) const;
  virtual Bool_t PhiPrimeCut(const AliVTrack* track, Double_t magField) const;
  virtual Bool_t PhiPrimeCut(Double_t trackPt, Double_t trackPhi, Short_t trackCharge, Double_t magField) const;
  virtual Float_t GetDeltaTOF(const AliVTrack *track, const AliTOFPIDResponse* tofPIDresponse, const Double_t* times, 
                              AliPID::EParticleType type) const;
  
  static Double_t GetCutGeo() { return fgCutGeo; };
  static Double_t GetCutNcr() { return fgCutNcr; };
  static Double_t GetCutNcl() { return fgCutNcl; };
  
  static void SetCutGeo(Double_t value) { fgCutGeo = value; };
  static void SetCutNcr(Double_t value) { fgCutNcr = value; };
  static void SetCutNcl(Double_t value) { fgCutNcl = value; };
  
  static Bool_t TPCCutMIGeo(const AliVTrack* track, const AliVEvent* evt, TTreeStream* streamer = 0x0);
  static Bool_t TPCCutMIGeo(const AliVTrack* track, const AliInputEventHandler* evtHandler, TTreeStream* streamer = 0x0)
    { if (!evtHandler) return kFALSE; return TPCCutMIGeo(track, evtHandler->GetEvent(), streamer); };
  
  static UShort_t GetCutPureNcl() { return fgCutPureNcl; };
  static void SetCutPureNcl(UShort_t value) { fgCutPureNcl = value; };
  
  static Bool_t TPCnclCut(const AliVTrack* track);
  
 protected:
  void FillV0PIDlist(AliESDEvent* esdEvent = 0x0);
  void ClearV0PIDlist();
  
  static Double_t fgCutGeo;   // Cut variable for TPCCutMIGeo concerning geometry
  static Double_t fgCutNcr; // Cut variable for TPCCutMIGeo concerning num crossed rows
  static Double_t fgCutNcl;  // Cut variable for TPCCutMIGeo concerning num clusters
  
  static UShort_t fgCutPureNcl; // Cut variable for TPCnclCut
  
  AliVEvent   *fEvent;    //! VEvent object
  AliESDEvent *fESD;      //! ESDEvent object, if ESD
  AliMCEvent  *fMC;       //! MC object

  AliPIDResponse *fPIDResponse;    //! PID response Handler
  AliESDv0KineCuts *fV0KineCuts;       //! ESD V0 kine cuts
  
  AliAnalysisUtils *fAnaUtils; //! Object to use analysis utils like pile-up rejection
  
  Bool_t fIsPbpOrpPb;       // Pbp/pPb collision or something else?
  Bool_t fUsePhiCut;        // Use cut on phi (useful for TPC)
  TPCcutType fTPCcutType;   // Type of TPC cut to be used
  Double_t fZvtxCutEvent;   // Vertex z cut for the event (cm)
  Double_t fEtaCut;         // Eta cut
  
  TF1* fPhiCutLow;          // phi prime cut, low
  TF1* fPhiCutHigh;         // phi prime cut, high
  
  TRandom3* fRandom;        //! Can be used to statistically determine the shape in the pt bins e.g.
  
  AliAnalysisFilter* fTrackFilter; // Track Filter
  

  Int_t fNumTagsStored;     // Number of entries of fV0tags
  Char_t* fV0tags;         //! Pointer to array with tags for identified particles from V0 decays
  
  Bool_t fStoreMotherIndex; // Switch on/off storing the mother indices of V0 daughters
  Int_t* fV0motherIndex; //! Pointer to array with index of the mother V0
  
 private:
  AliAnalysisTaskPIDV0base(const AliAnalysisTaskPIDV0base&); // not implemented
  AliAnalysisTaskPIDV0base& operator=(const AliAnalysisTaskPIDV0base&); // not implemented
  
  ClassDef(AliAnalysisTaskPIDV0base, 3);
};



inline Float_t AliAnalysisTaskPIDV0base::GetDeltaTOF(const AliVTrack *track, const AliTOFPIDResponse* tofPIDresponse,
                                                     const Double_t* times, AliPID::EParticleType type) const
{
  return (track->GetTOFsignal() - tofPIDresponse->GetStartTime(track->P()) - times[type]);
}

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