#ifndef ALITPCPIDRESPONSE_H
#define ALITPCPIDRESPONSE_H
#include <Rtypes.h>
#include <TNamed.h>
#include <TVectorF.h>
#include <TObjArray.h>
#include <TF1.h>
#include "AliPID.h"
#include "AliVTrack.h"
class TH2D;
class TSpline3;
class AliTPCPIDResponse: public TNamed {
public:
AliTPCPIDResponse();
AliTPCPIDResponse(const AliTPCPIDResponse&);
AliTPCPIDResponse& operator=(const AliTPCPIDResponse&);
virtual ~AliTPCPIDResponse();
enum EChamberStatus {
kChamberOff=0,
kChamberHighGain=1,
kChamberLowGain=2,
kChamberInvalid=3
};
enum ETPCgainScenario {
kDefault= 0,
kALLhigh = 1,
kOROChigh = 2,
kGainScenarioInvalid = 3
};
static const Int_t fgkNumberOfParticleSpecies=AliPID::kSPECIESC;
static const Int_t fgkNumberOfGainScenarios=3;
static const Int_t fgkNumberOfdEdxSourceScenarios=3;
enum ETPCdEdxSource {
kdEdxDefault=0,
kdEdxOROC=1,
kdEdxHybrid=2,
kdEdxInvalid=3
};
void SetSigma(Float_t res0, Float_t resN2);
void SetBetheBlochParameters(Double_t kp1,
Double_t kp2,
Double_t kp3,
Double_t kp4,
Double_t kp5
);
void SetMip(Float_t mip) { fMIP = mip; }
Double_t Bethe(Double_t bg) const;
void SetUseDatabase(Bool_t useDatabase) { fUseDatabase = useDatabase;}
Bool_t GetUseDatabase() const { return fUseDatabase;}
void SetResponseFunction(AliPID::EParticleType type, TObject * const o) { fResponseFunctions.AddAt(o,(Int_t)type); }
const TObject * GetResponseFunction(AliPID::EParticleType type) { return fResponseFunctions.At((Int_t)type); }
void SetVoltage(Int_t n, Float_t v) {fVoltageMap[n]=v;}
void SetVoltageMap(const TVectorF& a) {fVoltageMap=a;}
Float_t GetVoltage(Int_t n) const {return fVoltageMap[n];}
void SetLowGainIROCthreshold(Float_t v) {fLowGainIROCthreshold=v;}
void SetBadIROCthreshold(Float_t v) {fBadIROCthreshhold=v;}
void SetLowGainOROCthreshold(Float_t v) {fLowGainOROCthreshold=v;}
void SetBadOROCthreshold(Float_t v) {fBadOROCthreshhold=v;}
void SetMaxBadLengthFraction(Float_t f) {fMaxBadLengthFraction=f;}
void SetMagField(Double_t mf) { fMagField=mf; }
const TH2D* GetEtaCorrMap() const { return fhEtaCorr; };
Bool_t SetEtaCorrMap(TH2D* hMap);
Double_t GetTrackTanTheta(const AliVTrack *track) const;
Double_t GetEtaCorrection(const AliVTrack *track, AliPID::EParticleType species, ETPCdEdxSource dedxSource = kdEdxDefault) const;
Double_t GetEtaCorrectedTrackdEdx(const AliVTrack *track, AliPID::EParticleType species, ETPCdEdxSource dedxSource = kdEdxDefault) const;
const TH2D* GetSigmaPar1Map() const { return fhEtaSigmaPar1; };
Double_t GetSigmaPar0() const { return fSigmaPar0; };
Bool_t SetSigmaParams(TH2D* hSigmaPar1Map, Double_t sigmaPar0);
Double_t GetSigmaPar1(const AliVTrack *track, AliPID::EParticleType species, ETPCdEdxSource dedxSource = kdEdxDefault) const;
const TF1* GetMultiplicityCorrectionFunction() const { return fCorrFuncMultiplicity; };
void SetParameterMultiplicityCorrection(Int_t parIndex, Double_t parValue)
{ if (fCorrFuncMultiplicity) fCorrFuncMultiplicity->SetParameter(parIndex, parValue); };
const TF1* GetMultiplicityCorrectionFunctionTanTheta() const { return fCorrFuncMultiplicityTanTheta; };
void SetParameterMultiplicityCorrectionTanTheta(Int_t parIndex, Double_t parValue)
{ if (fCorrFuncMultiplicityTanTheta) fCorrFuncMultiplicityTanTheta->SetParameter(parIndex, parValue); };
const TF1* GetMultiplicitySigmaCorrectionFunction() const { return fCorrFuncSigmaMultiplicity; };
void SetParameterMultiplicitySigmaCorrection(Int_t parIndex, Double_t parValue)
{ if (fCorrFuncSigmaMultiplicity) fCorrFuncSigmaMultiplicity->SetParameter(parIndex, parValue); };
void ResetMultiplicityCorrectionFunctions();
void SetCurrentEventMultiplicity(Int_t value) { fCurrentEventMultiplicity = value; };
Int_t GetCurrentEventMultiplicity() const { return fCurrentEventMultiplicity; };
Double_t GetMultiplicityCorrection(const AliVTrack *track, AliPID::EParticleType species, ETPCdEdxSource dedxSource = kdEdxDefault) const;
Double_t GetMultiplicitySigmaCorrection(const AliVTrack *track, AliPID::EParticleType species, ETPCdEdxSource dedxSource = kdEdxDefault) const;
Double_t GetMultiplicityCorrectedTrackdEdx(const AliVTrack *track, AliPID::EParticleType species, ETPCdEdxSource dedxSource = kdEdxDefault) const;
Double_t GetEtaAndMultiplicityCorrectedTrackdEdx(const AliVTrack *track, AliPID::EParticleType species,
ETPCdEdxSource dedxSource = kdEdxDefault) const;
Double_t GetEtaCorrectionFast(const AliVTrack *track, Double_t dEdxSplines) const;
Double_t GetMultiplicityCorrectionFast(const AliVTrack *track, Double_t dEdxExpected, Int_t multiplicity) const;
Double_t GetMultiplicitySigmaCorrectionFast(Double_t dEdxExpected, Int_t multiplicity) const;
Double_t GetSigmaPar1Fast(const AliVTrack *track, AliPID::EParticleType species,
Double_t dEdx, const TSpline3* responseFunction) const;
void SetSigma(Float_t res0, Float_t resN2, ETPCgainScenario gainScenario );
Double_t GetExpectedSignal( const AliVTrack* track,
AliPID::EParticleType species,
ETPCdEdxSource dedxSource = kdEdxDefault,
Bool_t correctEta = kFALSE,
Bool_t correctMultiplicity = kFALSE) const;
Double_t GetExpectedSigma( const AliVTrack* track,
AliPID::EParticleType species,
ETPCdEdxSource dedxSource = kdEdxDefault,
Bool_t correctEta = kFALSE,
Bool_t correctMultiplicity = kFALSE) const;
Float_t GetNumberOfSigmas( const AliVTrack* track,
AliPID::EParticleType species,
ETPCdEdxSource dedxSource = kdEdxDefault,
Bool_t correctEta = kFALSE,
Bool_t correctMultiplicity = kFALSE) const;
Float_t GetSignalDelta( const AliVTrack* track,
AliPID::EParticleType species,
ETPCdEdxSource dedxSource = kdEdxDefault,
Bool_t correctEta = kFALSE,
Bool_t correctMultiplicity = kFALSE,
Bool_t ratio = kFALSE) const;
void SetResponseFunction(TObject* o,
AliPID::EParticleType type,
ETPCgainScenario gainScenario);
void Print(Option_t* option="") const;
TSpline3* GetResponseFunction( AliPID::EParticleType species,
ETPCgainScenario gainScenario ) const;
TSpline3* GetResponseFunction( const AliVTrack* track,
AliPID::EParticleType species,
ETPCdEdxSource dedxSource = kdEdxDefault) const;
Bool_t ResponseFunctiondEdxN(const AliVTrack* track,
AliPID::EParticleType species,
ETPCdEdxSource dedxSource,
Double_t& dEdx, Int_t& nPoints, ETPCgainScenario& gainScenario, TSpline3** responseFunction) const;
Bool_t sectorNumbersInOut(Double_t* trackPositionInner,
Double_t* trackPositionOuter,
Float_t& phiIn, Float_t& phiOut,
Int_t& in, Int_t& out ) const;
AliTPCPIDResponse::EChamberStatus TrackStatus(const AliVTrack* track, Int_t layer) const;
Float_t MaxClusterRadius(const AliVTrack* track) const;
Bool_t TrackApex(const AliVTrack* track, Float_t magField, Double_t position[3]) const;
static const char* GainScenarioName(Int_t n) {return fgkGainScenarioName[(n>fgkNumberOfGainScenarios)?fgkNumberOfGainScenarios:n];}
Int_t ResponseFunctionIndex( AliPID::EParticleType species,
ETPCgainScenario gainScenario ) const;
void ResetSplines();
Double_t GetExpectedSignal(Float_t mom,
AliPID::EParticleType n=AliPID::kKaon) const;
Double_t GetExpectedSigma(Float_t mom, Int_t nPoints,
AliPID::EParticleType n=AliPID::kKaon) const;
Float_t GetNumberOfSigmas(Float_t mom,
Float_t dEdx,
Int_t nPoints,
AliPID::EParticleType n=AliPID::kKaon) const {
Double_t bethe=GetExpectedSignal(mom,n);
Double_t sigma=GetExpectedSigma(mom,nPoints,n);
return (dEdx-bethe)/sigma;
}
Double_t GetMIP() const { return fMIP;}
Float_t GetRes0() const { return fRes0[0]; }
Float_t GetResN2() const { return fResN2[0]; }
Float_t GetRes0(ETPCgainScenario s) const { return fRes0[s]; }
Float_t GetResN2(ETPCgainScenario s) const { return fResN2[s]; }
Bool_t RegisterSpline(const char * name, Int_t index);
Double_t EvaldEdxSpline(Double_t bg,Int_t entry);
static Double_t SEvaldEdx(Double_t bg,Int_t entry){ return (fgInstance!=0)? fgInstance->EvaldEdxSpline(bg,entry):0;};
protected:
Double_t GetExpectedSignal(const AliVTrack* track,
AliPID::EParticleType species,
Double_t dEdx,
const TSpline3* responseFunction,
Bool_t correctEta,
Bool_t correctMultiplicity) const;
Double_t GetExpectedSigma(const AliVTrack* track,
AliPID::EParticleType species,
ETPCgainScenario gainScenario,
Double_t dEdx,
Int_t nPoints,
const TSpline3* responseFunction,
Bool_t correctEta,
Bool_t correctMultiplicity) const;
private:
Float_t fMIP;
Float_t fRes0[fgkNumberOfGainScenarios];
Float_t fResN2[fgkNumberOfGainScenarios];
Double_t fKp1;
Double_t fKp2;
Double_t fKp3;
Double_t fKp4;
Double_t fKp5;
Bool_t fUseDatabase;
TObjArray fResponseFunctions;
TVectorF fVoltageMap;
Float_t fLowGainIROCthreshold;
Float_t fBadIROCthreshhold;
Float_t fLowGainOROCthreshold;
Float_t fBadOROCthreshhold;
Float_t fMaxBadLengthFraction;
Int_t sectorNumber(Double_t phi) const;
Double_t fMagField;
static const char* fgkGainScenarioName[fgkNumberOfGainScenarios+1];
TH2D* fhEtaCorr;
TH2D* fhEtaSigmaPar1;
Double_t fSigmaPar0;
Int_t fCurrentEventMultiplicity;
TF1* fCorrFuncMultiplicity;
TF1* fCorrFuncMultiplicityTanTheta;
TF1* fCorrFuncSigmaMultiplicity;
static AliTPCPIDResponse* fgInstance;
TObjArray fSplineArray;
ClassDef(AliTPCPIDResponse,6)
};
#endif