#include <TMath.h>
#include <TF1.h>
#include <TGraph.h>
#include <THnBase.h>
#include <AliVTrack.h>
#include <AliVCluster.h>
#include <AliLog.h>
#include <AliExternalTrackParam.h>
#include <AliPIDResponse.h>
#include <AliTRDPIDResponse.h>
#include <AliESDtrack.h>
#include <AliAODTrack.h>
#include <AliAODPid.h>
#include "AliDielectronVarManager.h"
#include "AliDielectronVarCuts.h"
#include "AliDielectronPID.h"
ClassImp(AliDielectronPID)
TGraph *AliDielectronPID::fgFitCorr=0x0;
Double_t AliDielectronPID::fgCorr=0.0;
Double_t AliDielectronPID::fgCorrdEdx=1.0;
TF1 *AliDielectronPID::fgFunEtaCorr=0x0;
TH1 *AliDielectronPID::fgFunCntrdCorr=0x0;
TH1 *AliDielectronPID::fgFunWdthCorr=0x0;
TGraph *AliDielectronPID::fgdEdxRunCorr=0x0;
AliDielectronPID::AliDielectronPID() :
AliAnalysisCuts(),
fUsedVars(new TBits(AliDielectronVarManager::kNMaxValues)),
fNcuts(0),
fPIDResponse(0x0)
{
for (Int_t icut=0; icut<kNmaxPID; ++icut){
fDetType[icut]=kTPC;
fPartType[icut]=AliPID::kPion;
fNsigmaLow[icut]=0;
fNsigmaUp[icut]=0;
fmin[icut]=0;
fmax[icut]=0;
fExclude[icut]=kFALSE;
fFunUpperCut[icut]=0x0;
fFunLowerCut[icut]=0x0;
fRequirePIDbit[icut]=0;
fActiveCuts[icut]=-1;
fSigmaFunLow[icut]=0;
fSigmaFunUp[icut]=0;
fFunSigma[icut]=0x0;
fVarCuts[icut]=0x0;
fMapElectronCutLow[icut]=0x0;
}
}
AliDielectronPID::AliDielectronPID(const char* name, const char* title) :
AliAnalysisCuts(name, title),
fUsedVars(new TBits(AliDielectronVarManager::kNMaxValues)),
fNcuts(0),
fPIDResponse(0x0)
{
for (Int_t icut=0; icut<kNmaxPID; ++icut){
fDetType[icut]=kTPC;
fPartType[icut]=AliPID::kPion;
fNsigmaLow[icut]=0;
fNsigmaUp[icut]=0;
fmin[icut]=0;
fmax[icut]=0;
fExclude[icut]=kFALSE;
fFunUpperCut[icut]=0x0;
fFunLowerCut[icut]=0x0;
fRequirePIDbit[icut]=0;
fActiveCuts[icut]=0;
fSigmaFunLow[icut]=0;
fSigmaFunUp[icut]=0;
fFunSigma[icut]=0x0;
fVarCuts[icut]=0x0;
fMapElectronCutLow[icut]=0x0;
}
}
AliDielectronPID::~AliDielectronPID()
{
if (fUsedVars) delete fUsedVars;
}
void AliDielectronPID::AddCut(DetType det, AliPID::EParticleType type, Double_t nSigmaLow, Double_t nSigmaUp,
Double_t min, Double_t max, Bool_t exclude,
UInt_t pidBitType, Int_t var)
{
if (fNcuts>=kNmaxPID){
AliError(Form("only %d pid cut ranges allowed",kNmaxPID));
return;
}
if (TMath::Abs(nSigmaUp+99999.)<1e-20){
nSigmaUp=TMath::Abs(nSigmaLow);
nSigmaLow=-1.*nSigmaUp;
}
fDetType[fNcuts]=det;
fPartType[fNcuts]=type;
fNsigmaLow[fNcuts]=nSigmaLow;
fNsigmaUp[fNcuts]=nSigmaUp;
fmin[fNcuts]=min;
fmax[fNcuts]=max;
fExclude[fNcuts]=exclude;
fRequirePIDbit[fNcuts]=pidBitType;
if(var==-1) var=AliDielectronVarManager::kP;
fActiveCuts[fNcuts]=var;
fUsedVars->SetBitNumber(var,kTRUE);
AliDebug(1,Form("Add PID cut %d: sigma [% .1f,% .1f] \t cut [% .1f,% .f] \t var %d->%s \n",
fNcuts,nSigmaLow,nSigmaUp,min,max,fActiveCuts[fNcuts],AliDielectronVarManager::GetValueName(fActiveCuts[fNcuts])));
++fNcuts;
}
void AliDielectronPID::AddCut(DetType det, AliPID::EParticleType type, Double_t nSigmaLow, TF1 * const funUp,
Double_t min, Double_t max, Bool_t exclude,
UInt_t pidBitType, Int_t var)
{
if (funUp==0x0){
AliError("A valid function is required for the upper cut. Not adding the cut!");
return;
}
fFunUpperCut[fNcuts]=funUp;
AddCut(det,type,nSigmaLow,0.,min,max,exclude,pidBitType,var);
}
void AliDielectronPID::AddCut(DetType det, AliPID::EParticleType type, TF1 * const funLow, Double_t nSigmaUp,
Double_t min, Double_t max, Bool_t exclude,
UInt_t pidBitType, Int_t var)
{
if (funLow==0x0){
AliError("A valid function is required for the lower cut. Not adding the cut!");
return;
}
fFunLowerCut[fNcuts]=funLow;
AddCut(det,type,0.,nSigmaUp,min,max,exclude,pidBitType,var);
}
void AliDielectronPID::AddCut(DetType det, AliPID::EParticleType type, TF1 * const funLow, TF1 * const funUp,
Double_t min, Double_t max, Bool_t exclude,
UInt_t pidBitType, Int_t var)
{
if ( (funUp==0x0) || (funLow==0x0) ){
AliError("A valid function is required for upper and lower cut. Not adding the cut!");
return;
}
fFunUpperCut[fNcuts]=funUp;
fFunLowerCut[fNcuts]=funLow;
AddCut(det,type,0.,0.,min,max,exclude,pidBitType,var);
}
void AliDielectronPID::AddCut(DetType det, AliPID::EParticleType type, Double_t nSigmaLow, Double_t nSigmaUp,
Double_t min, Double_t max, Bool_t exclude,
UInt_t pidBitType, TF1 * const funSigma)
{
if (funSigma==0x0){
AliError("A valid function is required for the sigma cut. Not adding the cut!");
return;
}
fFunSigma[fNcuts]=funSigma;
fSigmaFunLow[fNcuts]=min;
fSigmaFunUp[fNcuts]=max;
AddCut(det,type,nSigmaLow,nSigmaUp,0,0,exclude,pidBitType,-1);
}
void AliDielectronPID::AddCut(DetType det, AliPID::EParticleType type, THnBase * const histLow, Double_t nSigmaUp,
Double_t min, Double_t max, Bool_t exclude,
UInt_t pidBitType, Int_t var)
{
if(histLow==0x0){
AliError("A valid histogram is required for the lower cut. Not adding the cut!");
return;
}
fMapElectronCutLow[fNcuts]=histLow;
for(Int_t idim=0; idim<fMapElectronCutLow[fNcuts]->GetNdimensions(); idim++) {
TString vari(fMapElectronCutLow[fNcuts]->GetAxis(idim)->GetName());
fUsedVars->SetBitNumber(AliDielectronVarManager::GetValueType(vari.Data()), kTRUE);
}
AddCut(det,type,0.,nSigmaUp,min,max,exclude,pidBitType,var);
}
void AliDielectronPID::AddCut(DetType det, AliPID::EParticleType type, Double_t nSigmaLow, Double_t nSigmaUp,
AliDielectronVarCuts *var, Bool_t exclude,
UInt_t pidBitType)
{
if(!var) return;
if (fNcuts>=kNmaxPID){
AliError(Form("only %d pid cut ranges allowed",kNmaxPID));
return;
}
if (TMath::Abs(nSigmaUp+99999.)<1e-20){
nSigmaUp=TMath::Abs(nSigmaLow);
nSigmaLow=-1.*nSigmaUp;
}
fDetType[fNcuts]=det;
fPartType[fNcuts]=type;
fNsigmaLow[fNcuts]=nSigmaLow;
fNsigmaUp[fNcuts]=nSigmaUp;
fExclude[fNcuts]=exclude;
fRequirePIDbit[fNcuts]=pidBitType;
fVarCuts[fNcuts]=var;
AliDebug(1,Form("Add PID cut %d: sigma [% .1f,% .1f] \n",
fNcuts,nSigmaLow,nSigmaUp));
++fNcuts;
}
Bool_t AliDielectronPID::IsSelected(TObject* track)
{
AliVTrack *part=static_cast<AliVTrack*>(track);
AliESDtrack *esdTrack=0x0;
AliAODTrack *aodTrack=0x0;
Double_t origdEdx=-1;
if( (part->IsA() == AliESDtrack::Class()) ){
esdTrack=static_cast<AliESDtrack*>(part);
origdEdx=esdTrack->GetTPCsignal();
esdTrack->SetTPCsignal(origdEdx/GetEtaCorr(esdTrack)/fgCorrdEdx,esdTrack->GetTPCsignalSigma(),esdTrack->GetTPCsignalN());
} else if ( (part->IsA() == AliAODTrack::Class()) ){
aodTrack=static_cast<AliAODTrack*>(track);
AliAODPid *pid=const_cast<AliAODPid*>(aodTrack->GetDetPid());
if (pid){
origdEdx=pid->GetTPCsignal();
pid->SetTPCsignal(origdEdx/GetEtaCorr(aodTrack)/fgCorrdEdx);
}
}
if(fgFunCntrdCorr) {
fUsedVars->SetBitNumber(fgFunCntrdCorr->GetXaxis()->GetUniqueID(), kTRUE);
fUsedVars->SetBitNumber(fgFunCntrdCorr->GetYaxis()->GetUniqueID(), kTRUE);
fUsedVars->SetBitNumber(fgFunCntrdCorr->GetZaxis()->GetUniqueID(), kTRUE);
}
if(fgFunWdthCorr) {
fUsedVars->SetBitNumber(fgFunWdthCorr->GetXaxis()->GetUniqueID(), kTRUE);
fUsedVars->SetBitNumber(fgFunWdthCorr->GetYaxis()->GetUniqueID(), kTRUE);
fUsedVars->SetBitNumber(fgFunWdthCorr->GetZaxis()->GetUniqueID(), kTRUE);
}
Double_t values[AliDielectronVarManager::kNMaxValues];
AliDielectronVarManager::SetFillMap(fUsedVars);
AliDielectronVarManager::Fill(track,values);
Bool_t selected=kFALSE;
fPIDResponse=AliDielectronVarManager::GetPIDResponse();
for (UChar_t icut=0; icut<fNcuts; ++icut){
Double_t min=fmin[icut];
Double_t max=fmax[icut];
Double_t val=values[fActiveCuts[icut]];
if ( fVarCuts[icut] ) {
if ( !fVarCuts[icut]->IsSelected(part) ) continue;
}
else if ( ( (TMath::Abs(min-max)>1e-20) && (val<min || val>=max) ) ) {
continue;
}
if(fFunSigma[icut]){
val= fPIDResponse->NumberOfSigmasTPC(part, fPartType[icut]);
if (fPartType[icut]==AliPID::kElectron){
val-=fgCorr;
}
min= fFunSigma[icut]->Eval(part->GetTPCmomentum())+fSigmaFunLow[icut];
max= fFunSigma[icut]->Eval(part->GetTPCmomentum())+fSigmaFunUp[icut];
if(val<min || val>=max) continue;
}
switch (fDetType[icut]){
case kITS:
selected = IsSelectedITS(part,icut);
break;
case kTPC:
selected = IsSelectedTPC(part,icut,values);
break;
case kTRD:
selected = IsSelectedTRD(part,icut);
break;
case kTRDeleEff:
selected = IsSelectedTRDeleEff(part,icut);
break;
case kTRDeleEff2D:
selected = IsSelectedTRDeleEff(part,icut,AliTRDPIDResponse::kLQ2D);
break;
case kTOF:
selected = IsSelectedTOF(part,icut);
break;
case kEMCAL:
selected = IsSelectedEMCAL(part,icut);
break;
}
if (!selected) {
if (esdTrack) esdTrack->SetTPCsignal(origdEdx,esdTrack->GetTPCsignalSigma(),esdTrack->GetTPCsignalN());
else if (aodTrack){
AliAODPid *pid=const_cast<AliAODPid*>(aodTrack->GetDetPid());
if (pid) pid->SetTPCsignal(origdEdx);
}
return kFALSE;
}
}
if (esdTrack) esdTrack->SetTPCsignal(origdEdx,esdTrack->GetTPCsignalSigma(),esdTrack->GetTPCsignalN());
else if (aodTrack){
AliAODPid *pid=const_cast<AliAODPid*>(aodTrack->GetDetPid());
if (pid) pid->SetTPCsignal(origdEdx);
}
return selected;
}
Bool_t AliDielectronPID::IsSelectedITS(AliVTrack * const part, Int_t icut)
{
AliPIDResponse::EDetPidStatus pidStatus = fPIDResponse->CheckPIDStatus(AliPIDResponse::kITS,part);
if (fRequirePIDbit[icut]==AliDielectronPID::kRequire&&(pidStatus!=AliPIDResponse::kDetPidOk)) return kFALSE;
if (fRequirePIDbit[icut]==AliDielectronPID::kIfAvailable&&(pidStatus!=AliPIDResponse::kDetPidOk)) return kTRUE;
Double_t mom=part->P();
Float_t numberOfSigmas=fPIDResponse->NumberOfSigmasITS(part, fPartType[icut]);
if (fFunUpperCut[icut]) fNsigmaUp[icut] =fFunUpperCut[icut]->Eval(mom);
if (fFunLowerCut[icut]) fNsigmaLow[icut]=fFunLowerCut[icut]->Eval(mom);
Bool_t selected=((numberOfSigmas>=fNsigmaLow[icut])&&(numberOfSigmas<=fNsigmaUp[icut]))^fExclude[icut];
return selected;
}
Bool_t AliDielectronPID::IsSelectedTPC(AliVTrack * const part, Int_t icut, Double_t *values)
{
AliPIDResponse::EDetPidStatus pidStatus = fPIDResponse->CheckPIDStatus(AliPIDResponse::kTPC,part);
if (fRequirePIDbit[icut]==AliDielectronPID::kRequire&&(pidStatus!=AliPIDResponse::kDetPidOk)) return kFALSE;
if (fRequirePIDbit[icut]==AliDielectronPID::kIfAvailable&&(pidStatus!=AliPIDResponse::kDetPidOk)) return kTRUE;
Float_t numberOfSigmas=fPIDResponse->NumberOfSigmasTPC(part, fPartType[icut]);
if (fPartType[icut]==AliPID::kElectron){
numberOfSigmas-=fgCorr;
numberOfSigmas-=GetCntrdCorr(part);
numberOfSigmas/=GetWdthCorr(part);
}
if (fFunUpperCut[icut]) fNsigmaUp[icut] =fFunUpperCut[icut]->Eval(values[AliDielectronVarManager::kPIn]);
if (fFunLowerCut[icut]) fNsigmaLow[icut]=fFunLowerCut[icut]->Eval(values[AliDielectronVarManager::kPIn]);
Double_t lowElectronCut = fNsigmaLow[icut];
Double_t upElectronCut = fNsigmaUp[icut];
if((fPartType[icut]==AliPID::kElectron) && (fMapElectronCutLow[icut] )) {
Double_t *vals = new Double_t[fMapElectronCutLow[icut]->GetNdimensions()];
for(Int_t idim=0; idim<fMapElectronCutLow[icut]->GetNdimensions(); idim++) {
vals[idim] = values[AliDielectronVarManager::GetValueType(fMapElectronCutLow[icut]->GetAxis(idim)->GetName())];
}
Long_t bin = fMapElectronCutLow[icut]->GetBin(vals,kFALSE);
if(bin>0) lowElectronCut=fMapElectronCutLow[icut]->GetBinContent(bin);
else lowElectronCut=100;
delete [] vals;
}
Bool_t selected=((numberOfSigmas>=lowElectronCut)&&(numberOfSigmas<=upElectronCut))^fExclude[icut];
return selected;
}
Bool_t AliDielectronPID::IsSelectedTRD(AliVTrack * const part, Int_t icut)
{
AliPIDResponse::EDetPidStatus pidStatus = fPIDResponse->CheckPIDStatus(AliPIDResponse::kTRD,part);
if (fRequirePIDbit[icut]==AliDielectronPID::kRequire&&(pidStatus!=AliPIDResponse::kDetPidOk)) return kFALSE;
if (fRequirePIDbit[icut]==AliDielectronPID::kIfAvailable&&(pidStatus!=AliPIDResponse::kDetPidOk)) return kTRUE;
if (fRequirePIDbit[icut]==AliDielectronPID::kIfAvailable && (part->GetTRDntrackletsPID()<4)) return kTRUE;
Double_t p[AliPID::kSPECIES]={0.};
fPIDResponse->ComputeTRDProbability(part,AliPID::kSPECIES,p);
Float_t particleProb=p[fPartType[icut]];
Bool_t selected=((particleProb>=fNsigmaLow[icut])&&(particleProb<=fNsigmaUp[icut]))^fExclude[icut];
return selected;
}
Bool_t AliDielectronPID::IsSelectedTRDeleEff(AliVTrack * const part, Int_t icut, AliTRDPIDResponse::ETRDPIDMethod PIDmethod)
{
AliPIDResponse::EDetPidStatus pidStatus = fPIDResponse->CheckPIDStatus(AliPIDResponse::kTRD,part);
if (fRequirePIDbit[icut]==AliDielectronPID::kRequire&&(pidStatus!=AliPIDResponse::kDetPidOk)) return kFALSE;
if (fRequirePIDbit[icut]==AliDielectronPID::kIfAvailable&&(pidStatus!=AliPIDResponse::kDetPidOk)) return kTRUE;
Double_t centrality = -1.;
if(part->IsA() == AliESDtrack::Class())
centrality=(const_cast<AliESDEvent*>( (static_cast<const AliESDtrack*>(part))->GetESDEvent()) )->GetCentrality()->GetCentralityPercentile("V0M");
if(part->IsA() == AliAODTrack::Class())
centrality=(const_cast<AliAODEvent*>( (static_cast<const AliAODTrack*>(part))->GetAODEvent()) )->GetCentrality()->GetCentralityPercentile("V0M");
Bool_t selected=fPIDResponse->IdentifiedAsElectronTRD(part,fNsigmaLow[icut], centrality, PIDmethod)^fExclude[icut];
return selected;
}
Bool_t AliDielectronPID::IsSelectedTOF(AliVTrack * const part, Int_t icut)
{
AliPIDResponse::EDetPidStatus pidStatus = fPIDResponse->CheckPIDStatus(AliPIDResponse::kTOF,part);
if (fRequirePIDbit[icut]==AliDielectronPID::kRequire&&(pidStatus!=AliPIDResponse::kDetPidOk)) return kFALSE;
if (fRequirePIDbit[icut]==AliDielectronPID::kIfAvailable&&(pidStatus!=AliPIDResponse::kDetPidOk)) return kTRUE;
Float_t numberOfSigmas=fPIDResponse->NumberOfSigmasTOF(part, fPartType[icut]);
Bool_t selected=((numberOfSigmas>=fNsigmaLow[icut])&&(numberOfSigmas<=fNsigmaUp[icut]))^fExclude[icut];
return selected;
}
Bool_t AliDielectronPID::IsSelectedEMCAL(AliVTrack * const part, Int_t icut)
{
Float_t numberOfSigmas=fPIDResponse->NumberOfSigmasEMCAL(part, fPartType[icut]);
Bool_t hasPID=numberOfSigmas>-998.;
if (fRequirePIDbit[icut]==AliDielectronPID::kRequire&&!hasPID) return kFALSE;
if (fRequirePIDbit[icut]==AliDielectronPID::kIfAvailable&&!hasPID) return kTRUE;
Bool_t selected=((numberOfSigmas>=fNsigmaLow[icut])&&(numberOfSigmas<=fNsigmaUp[icut]))^fExclude[icut];
return selected;
}
void AliDielectronPID::SetDefaults(Int_t def){
if (def==0){
AddCut(kTPC,AliPID::kElectron,2);
AddCut(kTPC,AliPID::kMuon,-2.,2.,0.,0.,kTRUE);
AddCut(kTPC,AliPID::kPion,-2.,2.,0.,0.,kTRUE);
AddCut(kTPC,AliPID::kKaon,-2.,2.,0.,0.,kTRUE);
AddCut(kTPC,AliPID::kProton,-2.,2.,0.,0.,kTRUE);
} else if (def==1) {
AddCut(kTPC,AliPID::kElectron,2.);
AddCut(kTPC,AliPID::kMuon,-2.,2.,0.,2.,kTRUE);
AddCut(kTPC,AliPID::kPion,-2.,2.,0.,2.,kTRUE);
AddCut(kTPC,AliPID::kKaon,-2.,2.,0.,2.,kTRUE);
AddCut(kTPC,AliPID::kProton,-2.,2.,0.,2.,kTRUE);
} else if (def==2) {
AddCut(kTPC,AliPID::kElectron,-3.,3.);
AddCut(kTPC,AliPID::kPion,-3.,3.,0.,0.,kTRUE);
AddCut(kTPC,AliPID::kProton,-3.,3.,0.,0.,kTRUE);
} else if (def==3 || def==4) {
AddCut(kTPC,AliPID::kElectron,2);
AddCut(kTOF,AliPID::kKaon,-3.,3.,0.,1.,kTRUE);
AddCut(kTOF,AliPID::kProton,-6.,6.,0.,1.,kTRUE);
AddCut(kTOF,AliPID::kProton,-3.,3.,1.,2.,kTRUE);
} else if (def==5) {
AddCut(kTPC,AliPID::kElectron,-0.5,3);
AddCut(kTOF,AliPID::kElectron,-3,3,0,1.5);
} else if (def==6) {
TF1 *lowerCut=new TF1("lowerCut", "[0] * TMath::Exp([1]*x)", 0, 100);
lowerCut->SetParameters(-2.7,-0.4357);
AddCut(kTPC,AliPID::kElectron,lowerCut,3.);
AddCut(kTOF,AliPID::kElectron,-3,3,0,1.5);
} else if (def==7) {
AddCut(kTPC,AliPID::kElectron,10.);
AddCut(kTOF,AliPID::kElectron,-3,3,0,1.5);
} else if (def==8) {
AddCut(kTOF,AliPID::kElectron,-5,5,0,200,kFALSE,AliDielectronPID::kIfAvailable);
} else if (def==9) {
TF1 *lowerCut=new TF1("lowerCut", "[0] * TMath::Exp([1]*x)", 0, 100);
lowerCut->SetParameters(-2.65,-0.6757);
AddCut(kTPC,AliPID::kElectron,lowerCut,4.);
AddCut(kTOF,AliPID::kElectron,-5,5,0,200,kFALSE,AliDielectronPID::kIfAvailable);
} else if (def==10) {
AddCut(kTOF,AliPID::kElectron,-5,5,0,200,kFALSE,AliDielectronPID::kIfAvailable);
AddCut(kTPC,AliPID::kElectron,3.);
AddCut(kTPC,AliPID::kPion,-3.,3.,0.,0.,kTRUE);
AddCut(kTPC,AliPID::kProton,-3.,3.,0.,0.,kTRUE);
} else if (def==11) {
TF1 *lowerCut=new TF1("lowerCut", "[0] * TMath::Exp([1]*x)+[2]", 0, 100);
lowerCut->SetParameters(-3.718,-0.4,0.27);
AddCut(kTPC,AliPID::kElectron,lowerCut,3.);
AddCut(kTOF,AliPID::kElectron,-3,3,0,2.);
} else if (def==12) {
TF1 *lowerCut=new TF1("lowerCut", "[0] * TMath::Exp([1]*x)+[2]", 0, 100);
lowerCut->SetParameters(-3.718,-0.4,0.27);
AddCut(kTPC,AliPID::kElectron,lowerCut,4.);
AddCut(kTOF,AliPID::kElectron,-5,5,0,200,kFALSE,AliDielectronPID::kIfAvailable);
}
else if (def==13) {
AddCut(kTOF,AliPID::kElectron,-3.,3.,0,200,kFALSE,AliDielectronPID::kIfAvailable);
AddCut(kTPC,AliPID::kElectron,10.);
}
else if (def==14) {
AddCut(AliDielectronPID::kTRDeleEff,AliPID::kElectron,.9,1.,3.5,6.,kFALSE,
AliDielectronPID::kIfAvailable,AliDielectronVarManager::kTRDpidQuality);
AddCut(kTOF,AliPID::kElectron,-3.,3.,0,200,kFALSE,AliDielectronPID::kIfAvailable);
AddCut(kTPC,AliPID::kElectron,10.);
}
else if (def==15) {
AddCut(AliDielectronPID::kTRDeleEff,AliPID::kElectron,.9,1.,3.5,6.,kFALSE,
AliDielectronPID::kIfAvailable,AliDielectronVarManager::kTRDpidQuality);
AddCut(AliDielectronPID::kTRDeleEff,AliPID::kElectron,.9,1.,0.,2.,kFALSE,
AliDielectronPID::kIfAvailable,AliDielectronVarManager::kTRDchi2);
AddCut(kTOF,AliPID::kElectron,-3.,3.,0,200,kFALSE,AliDielectronPID::kIfAvailable);
AddCut(kTPC,AliPID::kElectron,10.);
}
else if (def==16) {
AddCut(kTOF,AliPID::kElectron,-3.,3.,0,200,kFALSE,AliDielectronPID::kIfAvailable);
AddCut(kTPC,AliPID::kElectron,-3.5,+3.5);
}
}
void AliDielectronPID::SetCorrVal(Double_t run)
{
fgCorr=0.;
fgCorrdEdx=1.;
if (fgFitCorr){
fgCorr=fgFitCorr->Eval(run);
if (run<fgFitCorr->GetX()[0]) fgCorr=fgFitCorr->GetY()[0];
if (run>fgFitCorr->GetX()[fgFitCorr->GetN()-1]) fgCorr=fgFitCorr->GetY()[fgFitCorr->GetN()-1];
}
if (fgdEdxRunCorr){
fgCorrdEdx=fgdEdxRunCorr->Eval(run);
if (run<fgdEdxRunCorr->GetX()[0]) fgCorrdEdx=fgdEdxRunCorr->GetY()[0];
if (run>fgdEdxRunCorr->GetX()[fgdEdxRunCorr->GetN()-1]) fgCorrdEdx=fgdEdxRunCorr->GetY()[fgdEdxRunCorr->GetN()-1];
}
}
Double_t AliDielectronPID::GetEtaCorr(const AliVTrack *track)
{
if (!fgFunEtaCorr) return 1;
return fgFunEtaCorr->Eval(track->Eta());
}
Double_t AliDielectronPID::GetPIDCorr(const AliVTrack *track, TH1 *hist)
{
Double_t values[AliDielectronVarManager::kNMaxValues];
AliDielectronVarManager::FillVarVParticle(track,values);
TF1 *fun = (TF1*)hist->GetListOfFunctions()->At(0);
Int_t dim=(fun?fun->GetNdim():hist->GetDimension());
Double_t var[3] = {0.,0.,0.};
if(dim>0) var[0] = values[hist->GetXaxis()->GetUniqueID()];
if(dim>1) var[1] = values[hist->GetYaxis()->GetUniqueID()];
if(dim>2) var[2] = values[hist->GetZaxis()->GetUniqueID()];
Double_t corr = 0.0;
if(fun) corr = fun->Eval(var[0],var[1],var[2]);
else corr = hist->GetBinContent( hist->FindFixBin(var[0],var[1],var[2]) );
return corr;
}