ROOT logo
#ifndef ALIITSDEDXANALYZER_H
#define ALIITSDEDXANALYZER_H
/* Copyright(c) 2007-2009, ALICE Experiment at CERN, All rights reserved. *
 * See cxx source for full Copyright notice                               */

/* $Id$ */

///////////////////////////////////////////////////////////////////
//                                                               //
// Class for:                                                    //
// - building histograms of dE/dx in bins of pt/layer/particle   //
// - comparing dEdx signal with Bethe-Bloch expected value       //
// Origin: F.Prino, Torino, prino@to.infn.it                     //
//                                                               //
///////////////////////////////////////////////////////////////////

#include <TObject.h>
#include <TParticle.h>
#include <TH1F.h>
#include <TH2F.h>
#include <TGraph.h>

class AliESDEvent;
class AliStack;
class AliLog;

class AliITSdEdxAnalyzer : public TObject {

 public:
  AliITSdEdxAnalyzer();
  AliITSdEdxAnalyzer(const Int_t npbins, const Float_t pmin, const Float_t pmax);
  virtual ~AliITSdEdxAnalyzer();

  void SetMaterial(Float_t dens, Float_t thick){
    fDensity=dens;
    fThickness=thick;
  }
  void SetMomentumBins(const Int_t npbins, const Float_t pmin, const Float_t pmax);
  void SetUseBBFromAliExternalTrackParam() {fBBmodel=0;}
  void SetUseBBFromAliITSpidESD() {fBBmodel=1;}
  void SetMIPdEdx(Float_t val){fMIP=val;}
  void SetTPCMinimumPIDProb(Float_t min){fTPCpidCut=min;}

  void ReadEvent(const AliESDEvent* ev, AliStack* stack=0);


  Double_t BetheBloch(TParticle* part) const{
    return BetheBloch(part->P(),part->GetMass());
  }
  Double_t BetheBloch(const Float_t p, const Float_t m) const;


  TH1F* GetSingleLayerdEdxHisto(const Int_t lay, const Int_t pdgcode, const Int_t pbin) const {
    if(lay<3 || lay>6) AliFatal("Wrong LayerNumber");
    return fHistodEdx[GetIndex(GetSpecieBin(pdgcode),pbin,lay-3)];
  }
  TH1F* GetTruncatedMeandEdxHisto(const Int_t pdgcode, const Int_t pbin) const {
    return fHistodEdx[GetIndex(GetSpecieBin(pdgcode),pbin,4)];
  }

  TH1F* GetSingleLayerDeltadEdxHisto(const Int_t lay, const Int_t pdgcode, const Int_t pbin) const {
    if(lay<3 || lay>6) AliFatal("Wrong LayerNumber");
    return fHistoDeltadEdx[GetIndex(GetSpecieBin(pdgcode),pbin,lay-3)];
  }
  TH1F* GetTruncatedMeanDeltadEdxHisto(const Int_t pdgcode, const Int_t pbin) const {
    return fHistoDeltadEdx[GetIndex(GetSpecieBin(pdgcode),pbin,4)];
  }

  TH2F* GetSingleLayerdEdxVsPHisto(const Int_t lay, const Int_t pdgcode) const {
    if(lay<3 || lay>6) AliFatal("Wrong LayerNumber");
    return fHistodEdxVsP[GetIndex2(GetSpecieBin(pdgcode),lay-3)];
  }
  TH2F* GetTruncatedMeandEdxVsPHisto(const Int_t pdgcode) const {
    return fHistodEdxVsP[GetIndex2(GetSpecieBin(pdgcode),4)];
  }

  TGraph* GetBetheBlochGraph(const Int_t pdgcode) const;

  void WriteHistos(TString filename="ITS.dEdx.root") const;

 protected:

  Int_t GetNHistos() const {return kNParticles*kNValuesdEdx*fNPBins;}
  Int_t GetNHistos2() const {return kNParticles*kNValuesdEdx;}
  Int_t GetIndex(const Int_t iSp, const Int_t iP, const Int_t iVal) const {
    return iVal+kNValuesdEdx*iP+fNPBins*kNValuesdEdx*iSp;
  }
  Int_t GetIndex2(const Int_t iSp, const Int_t iVal) const {
    return iVal+kNValuesdEdx*iSp;
  }
  Int_t GetMomentumBin(Float_t p) const{
    Int_t iBin=(Int_t)((p-fPMin)/(fPMax-fPMin)*fNPBins);
    if(iBin>=0 && iBin<fNPBins)return iBin; 
    return -1;
  }
  Int_t GetSpecieBin(Int_t absPdgCode) const {
    for(Int_t iS=0; iS<kNParticles; iS++) if(absPdgCode==fgkPdgCode[iS]) return iS;
    return -1;
  }

  Int_t GetPaticleIdFromTPC(const AliESDtrack* track) const;
  void BookHistos();
  void DeleteHistos();
  
 private:

  AliITSdEdxAnalyzer(const AliITSdEdxAnalyzer& dum);
  AliITSdEdxAnalyzer& operator=(const AliITSdEdxAnalyzer& dum);

  enum {kNParticles=3};  
  enum {kNValuesdEdx=5};

  static const Int_t fgkPdgCode[kNParticles]; // initialized in the cxx
  static const Int_t fgkLayerCode[kNValuesdEdx]; // initialized in the cxx
  

  Int_t   fNPBins;         // Number of Momentum bins
  Float_t fPMin;           // Minimum P
  Float_t fPMax;           // Maximum P
  TH1F**  fHistodEdx;      // Array of histograms of dEdx_meas in bins of pt
  TH1F**  fHistoDeltadEdx; // Array of histograms of dEdx_meas-dEdx_expected in bins of pt
  TH2F**  fHistodEdxVsP;   // Array of histograms of dEdx_meas vs. pt
  Float_t fThickness;      // detector thickness (cm)
  Float_t fDensity;        // detector density (g/cm3)
  Int_t   fBBmodel;        // is there MC truth info?
  Float_t fMIP;            // normalization for MIP
  Float_t fTPCpidCut;      // minimum probability for PID in TPC   

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