ROOT logo
#ifndef ALIINTSPOTESTIMATOR_H
#define ALIINTSPOTESTIMATOR_H

#include <TNamed.h>
#include <TObjArray.h>
#include <TMath.h>
#include <TH2F.h>
#include <TAxis.h>

class TH1;
class TNtuple;
class TCanvas;
class AliESDEvent;
class AliESDtrack;
class AliESDVertex;
class AliVertexerTracks;

class AliIntSpotEstimator : public TNamed {
  //
 public:
  //
  AliIntSpotEstimator(Bool_t initDef=kFALSE);
  AliIntSpotEstimator(const char* name, Double_t outcut=1e-4,Int_t ntrIP=2,
		      Int_t nPhiBins=12,Int_t nestb=500,
		      Double_t estmin=-2e-2,Double_t estmax=6e-2,
		      Int_t ntrBins=10,Int_t ntMn=2,Int_t ntMx=32,
		      Int_t nPBins=14,Double_t pmn=0.2,Double_t pmx=3., Bool_t ntuple=kFALSE);
  ~AliIntSpotEstimator();
  AliIntSpotEstimator &operator += (const AliIntSpotEstimator &src);  
  //
  void          InitEstimators(Int_t nPhiBins=12,Int_t nestb=500,
			       Double_t estmin=-2e-2,Double_t estmax=6e-2,
			       Int_t ntrBins=10,Int_t ntMn=2,Int_t ntMx=32,
			       Int_t nPBins=14,Double_t pmn=0.2,Double_t pmx=3.,Bool_t ntuple=kFALSE);
  //
  Bool_t        ProcessEvent(const AliESDEvent* esd, const AliESDVertex* vtx=0);
  Bool_t        ProcessEvent(const TObjArray* tracks);
  //
  Double_t      GetIPCenter(Int_t id,Double_t *err=0)              const;
  Double_t      GetIPCenIni(Int_t id)                              const  {return fIPCenIni[id];}
  Double_t      GetIPSigma(Int_t phibin=0,Double_t *err=0)         const;
  Double_t      GetVtxSigma(int ntr, Double_t *err=0)              const;
  Double_t      GetDCASigma(double p, Double_t *err=0)             const;
  //
  Int_t         GetEventsAccepted()                                const  {return fIPCenterStat;} 
  Int_t         GetEventsProcessed()                               const  {return fEvProc;} 
  Int_t         GetMinTracksForIP()                                const  {return fMinTracksForIP;}
  //
  void          SetOutlierCut(Double_t v=1e-4)                            {fOutlierCut = v;}
  void          SetIPCenIni(Double_t *xyz)                                {for (int i=3;i--;) fIPCenIni[i] = xyz[i];}
  void          SetMinTracksForIP(Int_t ntr=2)                            {fMinTracksForIP = ntr>2 ? ntr : 2;}
  //
  TH2F*         GetHistoIP()                                       const  {return fEstimIP;}
  TH2F*         GetHistoVtx()                                      const  {return fEstimVtx;}
  TH2F*         GetHistoTrc()                                      const  {return fEstimTrc;}
  TH2F*         GetHistoVtxXY()                                    const  {return fHVtxXY;}
  TNtuple*      GetNtuple()                                        const  {return (TNtuple*)fNtuple;}
  AliVertexerTracks* GetVertexer()                                 const  {return fVertexer;}
  //
  Int_t         GetNPhiBins()    const {return !IsValid() ? 0:fEstimIP->GetXaxis()->GetNbins();}
  Int_t         GetNTrackBins()  const {return !IsValid() ? 0:fEstimVtx->GetXaxis()->GetNbins();}
  Int_t         GetMinTracks()   const {return !IsValid() ? 0:TMath::Nint(fEstimVtx->GetXaxis()->GetXmin());}
  Int_t         GetMaxTracks()   const {return !IsValid() ? 0:TMath::Nint(fEstimVtx->GetXaxis()->GetXmax());}
  Int_t         GetNPBins()      const {return !IsValid() ? 0:fEstimTrc->GetXaxis()->GetNbins();}
  Double_t      GetTrackMinP()   const {return !IsValid() ? 0:1./fEstimTrc->GetXaxis()->GetXmax();}
  Double_t      GetTrackMaxP()   const {return !IsValid() ? 0:1./fEstimTrc->GetXaxis()->GetXmin();}
  //
  TCanvas*      CreateReport(const char* outname = 0);
  virtual void  Print(Option_t *opt="")               const;
  virtual void  Clear(Option_t *opt="");
  virtual Long64_t Merge(TCollection *coll);
  static Double_t CalcMean(TH1* histo, Double_t ctfact,Double_t *err=0);
  //
 protected:
  Bool_t        IsValid()       const {return fEstimIP!=0;}
  Bool_t        IsZero(Double_t v,Double_t thresh=1e-15) const {return TMath::Abs(v)<thresh;}
  Bool_t        ProcessTracks();
  Bool_t        ProcessIPCenter(const AliESDVertex* vtx);
  Bool_t        ProcessEstimators(const AliESDEvent* esd);
  void          UpdateEstimators(double rvD, double rtD, double nTracks, double pTrack, double phiTrack);
  //
 private :
  AliIntSpotEstimator(const AliIntSpotEstimator &src);
  AliIntSpotEstimator &operator=(const AliIntSpotEstimator &src);  
  //
 protected:
  //
  Int_t         fEvProc;                         // number of events processed
  Int_t         fIPCenterStat;                   // number of events used for fIPCenter
  Int_t         fMinTracksForIP;                 // account IP estimator only for vertices with >= tracks
  Double_t      fOutlierCut;                     // cut on outliers
  Double_t      fIPCenIni[3];                    // mean IP position XYZ (initial)
  Double_t      fIPCenter[3];                    // IP position XYZ
  Double_t      fIPCen2[3];                      // IP position XYZ^2
  //
  TH2F         *fEstimIP;                        // distribution of IP estimator
  TH2F         *fEstimVtx;                       // distribution of VTRes estimator
  TH2F         *fEstimTrc;                       // distribution of DCA res estimator
  TH2F         *fHVtxXY;                         // XY histo
  TNtuple      *fNtuple;                         //! optional ntuple with dca's
  //
  AliVertexerTracks* fVertexer;                  //! vertex fitter
  TObjArray    *fTracks;                         //! storage for processed tracks
  //
 ClassDef(AliIntSpotEstimator,1)
};


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