#include <TF1.h>
#include <TMath.h>
#include "AliAODPid.h"
#include "AliAODTrack.h"
#include "AliAODMCParticle.h"
#include "AliESDtrack.h"
#include "AliExternalTrackParam.h"
#include "AliLog.h"
#include "AliMCParticle.h"
#include "AliPID.h"
#include "AliPIDResponse.h"
#include "AliPIDCombined.h"
#include "AliHFEpidTPC.h"
#include "AliHFEpidTOF.h"
#include "AliHFEpidTRD.h"
#include "AliHFEpidBayes.h"
#include "AliHFEpidQAmanager.h"
ClassImp(AliHFEpidBayes)
AliHFEpidBayes::AliHFEpidBayes() :
AliHFEpidBase()
, fPIDCombined(NULL)
, fDetMask(10)
, fDetMaskDefault(10)
, fDetMaskDefaultandTRD(14)
, fpidthres(0.9)
{
}
AliHFEpidBayes::AliHFEpidBayes(const char* name) :
AliHFEpidBase(name)
, fPIDCombined(NULL)
, fDetMask(10)
, fDetMaskDefault(10)
, fDetMaskDefaultandTRD(14)
, fpidthres(0.9)
{
}
AliHFEpidBayes::AliHFEpidBayes(const AliHFEpidBayes &ref):
AliHFEpidBase("")
, fPIDCombined(NULL)
, fDetMask(10)
, fDetMaskDefault(10)
, fDetMaskDefaultandTRD(14)
, fpidthres(0.9)
{
ref.Copy(*this);
}
AliHFEpidBayes &AliHFEpidBayes::operator=(const AliHFEpidBayes &ref){
if(this != &ref){
ref.Copy(*this);
}
return *this;
}
AliHFEpidBayes::~AliHFEpidBayes(){
}
void AliHFEpidBayes::Copy(TObject &ref) const {
AliHFEpidBayes &target = dynamic_cast<AliHFEpidBayes &>(ref);
target.fPIDCombined = fPIDCombined;
target.fDetMask = fDetMask;
target.fDetMaskDefault = fDetMaskDefault;
target.fDetMaskDefaultandTRD = fDetMaskDefaultandTRD;
target.fpidthres = fpidthres;
AliHFEpidBase::Copy(ref);
}
Bool_t AliHFEpidBayes::InitializePID(Int_t ){
fPIDCombined=new AliPIDCombined;
fDetMaskDefault=AliPIDResponse::kDetTPC+AliPIDResponse::kDetTOF;
fDetMaskDefaultandTRD=AliPIDResponse::kDetTPC+AliPIDResponse::kDetTOF+AliPIDResponse::kDetTRD;
return kTRUE;
}
Int_t AliHFEpidBayes::IsSelected(const AliHFEpidObject *track, AliHFEpidQAmanager *pidqa) const
{
if(pidqa) pidqa->ProcessTrack(track, AliHFEpid::kBAYESpid, AliHFEdetPIDqa::kBeforePID);
AliDebug(1, "Doing Bayes PID based");
if (!fkPIDResponse)
{
AliFatal("This Task needs the PID response attached to the inputHandler");
return 0;
}
Bool_t used=kFALSE;
Bool_t usedTOF=kFALSE;
Bool_t usedTPC=kFALSE;
Bool_t usedTRD=kFALSE;
if((fDetMask==fDetMaskDefault)||(fDetMask==fDetMaskDefaultandTRD))
{
Double_t probTPC[AliPID::kSPECIES]={0.};
usedTPC = fkPIDResponse->ComputePIDProbability(AliPIDResponse::kDetTPC,(AliVTrack*)track->GetRecTrack(),AliPID::kSPECIES,probTPC) == AliPIDResponse::kDetPidOk;
Double_t probTOF[AliPID::kSPECIES]={0.};
usedTOF = fkPIDResponse->ComputePIDProbability(AliPIDResponse::kDetTOF,(AliVTrack*)track->GetRecTrack(),AliPID::kSPECIES,probTOF) == AliPIDResponse::kDetPidOk;
if((usedTOF==1)&&(usedTPC==1)) used=1;
else used=0;
if(fDetMask==fDetMaskDefaultandTRD)
{
Double_t probTRD[AliPID::kSPECIES]={0.};
usedTRD = fkPIDResponse->ComputePIDProbability(AliPIDResponse::kDetTRD,(AliVTrack*)track->GetRecTrack(),AliPID::kSPECIES,probTRD) == AliPIDResponse::kDetPidOk;
if((usedTOF==1)&&(usedTPC==1)&&(usedTRD==1)) used=1;
else used=0;
}
}
Double_t fprobComb[AliPID::kSPECIES]={0.};
CalcCombProb(track,fkPIDResponse, fprobComb);
Int_t pdg=0;
if(fprobComb[AliPID::kElectron]>fpidthres) pdg=11;
if((pidqa) && (pdg==11) && (used==1)) pidqa->ProcessTrack(track, AliHFEpid::kBAYESpid, AliHFEdetPIDqa::kAfterPID);
return pdg;
}
void AliHFEpidBayes::CalcCombProb(const AliHFEpidObject *track,const AliPIDResponse *fPIDResponse, Double_t* fprobTPCTOF) const
{
for(Int_t i=0;i<AliPID::kSPECIES;i++)
{
fprobTPCTOF[i]=0.;
}
fPIDCombined->SetEnablePriors(kFALSE);
fPIDCombined->SetDetectorMask(fDetMask);
fPIDCombined->ComputeProbabilities((AliVTrack*)track->GetRecTrack(), fPIDResponse, fprobTPCTOF);
}