}
}
//________________________________________________________________________
+AliFlowBayesianPID::~AliFlowBayesianPID(){
+ if(fMism) delete fMism;
+ if(fTofGeo) delete fTofGeo;
+ if(fTOFResponse) delete fTOFResponse;
+ if(fTPCResponse) delete fTPCResponse;
+ if(fTOFmaker) delete fTOFmaker;
+ if(fBBdata) delete fBBdata;
+ for(Int_t i=0;i < 5;i++) if(hPriors[i]) delete (hPriors[i]);
+}
+//________________________________________________________________________
void AliFlowBayesianPID::SetDetResponse(AliESDEvent *esd,Float_t centrality,EStartTimeType_t flagStart,Bool_t recomputeT0TOF){
if(!esd){
printf("AliFlowBayesianPID::SetDetResponse -> Error -> No valid esd event");
fPIDesd->MakePID(esd,kFALSE);
}
//________________________________________________________________________
-void AliFlowBayesianPID::ComputeWeights(AliESDtrack *t,Float_t centr){
+void AliFlowBayesianPID::ComputeWeights(const AliESDtrack *t,Float_t centr){
Float_t pt = t->Pt();
Float_t p = t->P();
Double_t ptpc[3];
fWeights[0][iS] = fTPCResponse->Eval((dedx - dedxExp)/resolutionTPC)/resolutionTPC;
}
-
+ fMaskCurrent[0] = kTRUE;
}
else{
for(Int_t iS=0;iS<5;iS++) fWeights[0][iS] = 1;
+ fMaskCurrent[0] = kFALSE;
}
// TOF
} else
fWeights[1][iS] = fTOFResponse->Eval(delta/expsigma)/expsigma + mismfrac*mismweight;
}
+ fMaskCurrent[1] = kTRUE;
}
else{
for(Int_t iS=0;iS<5;iS++) fWeights[1][iS] = 1;
+ fMaskCurrent[1] = kFALSE;
}
for(Int_t j=0;j < 2;j++){
}
}
//________________________________________________________________________
-void AliFlowBayesianPID::ComputeProb(AliESDtrack *t,Float_t centr){
+void AliFlowBayesianPID::ComputeProb(const AliESDtrack *t,Float_t centr){
ComputeWeights(t,centr);
Float_t priors[5];
fProbTofMism = 0;
return sp;
}
+
ClassImp(AliFlowTrackCuts)
+AliFlowBayesianPID *gBayesianPID;
+
//-----------------------------------------------------------------------
AliFlowTrackCuts::AliFlowTrackCuts():
AliFlowTrackSimpleCuts(),
fTPCtrack(),
fFlowTagType(AliFlowTrackSimple::kInvalid),
fESDpid(),
+ fBayesianResponse(NULL),
fPIDsource(kTOFpid),
fTPCpidCuts(NULL),
fTOFpidCuts(NULL),
fParticleProbability(.9),
fAllowTOFmismatchFlag(kFALSE),
fRequireStrictTOFTPCagreement(kFALSE),
- fCutRejectElectronsWithTPCpid(kFALSE)
+ fCutRejectElectronsWithTPCpid(kFALSE),
+ fCurrCentr(0.0)
{
//io constructor
for ( Int_t i=0; i<5; i++ ) { fProbBayes[i]=0.0; }
SetPriors(); //init arrays
+
+ // New PID procedure (Bayesian Combined PID)
+ if(! gBayesianPID){
+ gBayesianPID = new AliFlowBayesianPID();
+ gBayesianPID->SetNewTrackParam();
+ }
+ fBayesianResponse = gBayesianPID;
}
//-----------------------------------------------------------------------
fTPCtrack(),
fFlowTagType(AliFlowTrackSimple::kInvalid),
fESDpid(),
+ fBayesianResponse(NULL),
fPIDsource(kTOFpid),
fTPCpidCuts(NULL),
fTOFpidCuts(NULL),
fParticleProbability(.9),
fAllowTOFmismatchFlag(kFALSE),
fRequireStrictTOFTPCagreement(kFALSE),
- fCutRejectElectronsWithTPCpid(kFALSE)
+ fCutRejectElectronsWithTPCpid(kFALSE),
+ fCurrCentr(0.0)
{
//constructor
SetName(name);
for ( Int_t i=0; i<5; i++ ) { fProbBayes[i]=0.0; }
SetPriors(); //init arrays
+ // New PID procedure (Bayesian Combined PID)
+ if(! gBayesianPID){
+ gBayesianPID = new AliFlowBayesianPID();
+ gBayesianPID->SetNewTrackParam();
+ }
+ fBayesianResponse = gBayesianPID;
}
//-----------------------------------------------------------------------
fTPCtrack(),
fFlowTagType(that.fFlowTagType),
fESDpid(that.fESDpid),
+ fBayesianResponse(NULL),
fPIDsource(that.fPIDsource),
fTPCpidCuts(NULL),
fTOFpidCuts(NULL),
fParticleProbability(that.fParticleProbability),
fAllowTOFmismatchFlag(that.fAllowTOFmismatchFlag),
fRequireStrictTOFTPCagreement(that.fRequireStrictTOFTPCagreement),
- fCutRejectElectronsWithTPCpid(that.fCutRejectElectronsWithTPCpid)
+ fCutRejectElectronsWithTPCpid(that.fCutRejectElectronsWithTPCpid),
+ fCurrCentr(0.0)
{
//copy constructor
if (that.fTPCpidCuts) fTPCpidCuts = new TMatrixF(*(that.fTPCpidCuts));
memcpy(fProbBayes,that.fProbBayes,sizeof(fProbBayes));
SetPriors(); //init arrays
if (that.fQA) DefineHistograms();
+
+ // New PID procedure (Bayesian Combined PID)
+ if(! gBayesianPID){
+ gBayesianPID = new AliFlowBayesianPID();
+ gBayesianPID->SetNewTrackParam();
+ }
+ fBayesianResponse = gBayesianPID;
}
//-----------------------------------------------------------------------
fCutRejectElectronsWithTPCpid=that.fCutRejectElectronsWithTPCpid;
memcpy(fProbBayes,that.fProbBayes,sizeof(fProbBayes));
+ fCurrCentr = that.fCurrCentr;
+
+ // New PID procedure (Bayesian Combined PID)
+ if(! gBayesianPID){
+ gBayesianPID = new AliFlowBayesianPID();
+ gBayesianPID->SetNewTrackParam();
+ }
+ fBayesianResponse = gBayesianPID;
+
return *this;
}
{
//TODO: maybe call it only for the TOF options?
// Added by F. Noferini for TOF PID
+ // old procedure now implemented inside fBayesianResponse
+ // fESDpid.MakePID(myESD,kFALSE);
+ // new procedure
+ fBayesianResponse->SetDetResponse(myESD, fCurrCentr,AliESDpid::kTOF_T0,kTRUE); // centrality = PbPb centrality class (0-100%) or -1 for pp collisions
fESDpid.SetTOFResponse(myESD,AliESDpid::kTOF_T0);
- fESDpid.MakePID(myESD,kFALSE);
// End F. Noferini added part
}
//Bool_t statusMatchingHard = TPCTOFagree(track);
//if (fRequireStrictTOFTPCagreement && (!statusMatchingHard))
// return kFALSE;
+ Int_t kTPC = fBayesianResponse->GetCurrentMask(0); // is TPC on
+ Int_t kTOF = fBayesianResponse->GetCurrentMask(1); // is TOF on
- Int_t pdg = GetESDPdg(track,"bayesianTPC");
- // printf("pdg set to %i\n",pdg);
+ if(! kTPC) return kFALSE;
+
+ Bool_t statusMatchingHard = 1;
+ Float_t mismProb = 0;
+ if(kTOF){
+ statusMatchingHard = TPCTOFagree(track);
+ mismProb = fBayesianResponse->GetTOFMismProb();
+ }
+ if (fRequireStrictTOFTPCagreement && (!statusMatchingHard))
+ return kFALSE;
+
+ fBayesianResponse->ComputeProb(track,fCurrCentr); // fCurrCentr is needed for mismatch fraction
+ Float_t *probabilities = fBayesianResponse->GetProb(); // Bayesian Probability (from 0 to 4) (Combined TPC || TOF) including a tuning of priors and TOF mismatch parameterization
+
+ fProbBayes[0] = probabilities[0];
+ fProbBayes[1] = probabilities[1];
+ fProbBayes[2] = probabilities[2];
+ fProbBayes[3] = probabilities[3];
+ fProbBayes[4] = probabilities[4];
- Int_t pid = 0;
Float_t prob = 0;
switch (fParticleID)
{
case AliPID::kPion:
- pid=211;
prob = fProbBayes[2];
break;
case AliPID::kKaon:
- pid=321;
prob = fProbBayes[3];
break;
case AliPID::kProton:
- pid=2212;
prob = fProbBayes[4];
break;
case AliPID::kElectron:
- pid=-11;
prob = fProbBayes[0];
break;
default:
return kFALSE;
}
- if(TMath::Abs(pdg) == TMath::Abs(pid) && prob > fParticleProbability)
- {
- if(!fCutCharge)
- return kTRUE;
- else if (fCutCharge && fCharge * track->GetSign() > 0)
- return kTRUE;
- }
+ if(prob > fParticleProbability && mismProb < 0.5)
+ {
+ if(!fCutCharge)
+ return kTRUE;
+ else if (fCutCharge && fCharge * track->GetSign() > 0)
+ return kTRUE;
+ }
return kFALSE;
}
if (fRequireStrictTOFTPCagreement && (!statusMatchingHard))
return kFALSE;
- Int_t pdg = GetESDPdg(track,"bayesianALL");
- // printf("pdg set to %i\n",pdg);
+ fBayesianResponse->ComputeProb(track,fCurrCentr); // fCurrCentr is needed for mismatch fraction
+ Float_t *probabilities = fBayesianResponse->GetProb(); // Bayesian Probability (from 0 to 4) (Combined TPC || TOF) including a tuning of priors and TOF mismatch parameterization
+
+ fProbBayes[0] = probabilities[0];
+ fProbBayes[1] = probabilities[1];
+ fProbBayes[2] = probabilities[2];
+ fProbBayes[3] = probabilities[3];
+ fProbBayes[4] = probabilities[4];
+ Float_t mismProb = fBayesianResponse->GetTOFMismProb(); // mismatch Bayesian probabilities
- Int_t pid = 0;
Float_t prob = 0;
switch (fParticleID)
{
case AliPID::kPion:
- pid=211;
prob = fProbBayes[2];
break;
case AliPID::kKaon:
- pid=321;
prob = fProbBayes[3];
break;
case AliPID::kProton:
- pid=2212;
prob = fProbBayes[4];
break;
case AliPID::kElectron:
- pid=-11;
prob = fProbBayes[0];
break;
default:
}
// printf("pt = %f -- all prob = [%4.2f,%4.2f,%4.2f,%4.2f,%4.2f] -- prob = %f\n",track->Pt(),fProbBayes[0],fProbBayes[1],fProbBayes[2],fProbBayes[3],fProbBayes[4],prob);
- if(TMath::Abs(pdg) == TMath::Abs(pid) && prob > fParticleProbability){
+ if(prob > fParticleProbability && mismProb < 0.5){
if(!fCutCharge)
return kTRUE;
else if (fCutCharge && fCharge * track->GetSign() > 0)
//-----------------------------------------------------------------------
void AliFlowTrackCuts::SetPriors(Float_t centrCur){
- //set priors for the bayesian pid selection
+ fCurrCentr = centrCur;
+
+ //set priors for the bayesian pid selection
fBinLimitPID[0] = 0.300000;
fBinLimitPID[1] = 0.400000;
fBinLimitPID[2] = 0.500000;
return fQA->Merge(&tmplist);
}
+