//***********************************************************
#include "AliAODPidHF.h"
#include "AliAODPid.h"
-#include "AliAODTrack.h"
#include "AliPID.h"
#include "AliTPCPIDResponse.h"
#include "AliITSPIDResponse.h"
fTOF(kFALSE),
fITS(kFALSE),
fTRD(kFALSE),
- fMatch(kFALSE),
- fCompat(kFALSE)
+ fMatch(0),
+ fCompat(kFALSE),
+ fMC(kFALSE)
{
//
// Default constructor
fITS(pid.fITS),
fTRD(pid.fTRD),
fMatch(pid.fMatch),
- fCompat(pid.fCompat)
+ fCompat(pid.fCompat),
+ fMC(kFALSE)
{
for(Int_t i=0;i<5;i++){
if (nsigma>fnSigma[0]) {
pid=-1;
}else{
- pid=1;
+ pid=specie;
}
}
AliAODPid *pidObj = track->GetDetPid();
Double_t dedx=pidObj->GetITSsignal();
+ UChar_t clumap=track->GetITSClusterMap();
+ Int_t nPointsForPid=0;
+ for(Int_t i=2; i<6; i++){
+ if(clumap&(1<<i)) ++nPointsForPid;
+ }
+
+ Bool_t isSA=kTRUE;
+ if(track->GetStatus() & AliESDtrack::kTPCin) isSA = kFALSE;
+
AliITSPIDResponse itsResponse;
Int_t pid=-1;
if(specie<0){ // from RawSignalPID : should return the particle specie to wich the de/dx is closer to the bethe-block curve -> performance to be checked
Double_t nsigmaMax=fnSigma[4];
for(Int_t ipart=0;ipart<5;ipart++){
AliPID::EParticleType type=AliPID::EParticleType(ipart);
- Double_t nsigma = TMath::Abs(itsResponse.GetNumberOfSigmas(mom,dedx,type));
+ Double_t nsigma = TMath::Abs(itsResponse.GetNumberOfSigmas(mom,dedx,type,nPointsForPid,isSA));
if((nsigma<nsigmaMax) && (nsigma<fnSigma[4])) {
pid=ipart;
nsigmaMax=nsigma;
if (nsigma>fnSigma[4]) {
pid=-1;
}else{
- pid=1;
+ pid=specie;
}
}
return pid;
if (nsigma>fnSigma[3]*fTOFSigma) {
pid=-1;
}else{
- pid=1;
+ pid=specie;
}
}
return pid;
Double_t itspid[AliPID::kSPECIES];
pid.MakeITSPID(track,itspid);
for(Int_t ind=0;ind<AliPID::kSPECIES;ind++){
- prob[ind]=itspid[ind]*fPriors[ind]/(itspid[0]*fPriors[0]+itspid[1]*fPriors[1]+itspid[2]*fPriors[2]+itspid[3]*fPriors[3]+itspid[4]*fPriors[4]);
+ if(fTOF || fTPC || fTRD){
+ prob[ind]=itspid[ind];
+ }else{
+ prob[ind]=itspid[ind]*fPriors[ind]/(itspid[0]*fPriors[0]+itspid[1]*fPriors[1]+itspid[2]*fPriors[2]+itspid[3]*fPriors[3]+itspid[4]*fPriors[4]);
+ }
}
return;
Double_t tpcpid[AliPID::kSPECIES];
pid.MakeTPCPID(track,tpcpid);
for(Int_t ind=0;ind<AliPID::kSPECIES;ind++){
- if(tpcpid[ind]>0.) {
- prob[ind]=tpcpid[ind]*fPriors[ind]/(tpcpid[0]*fPriors[0]+tpcpid[1]*fPriors[1]+tpcpid[2]*fPriors[2]+tpcpid[3]*fPriors[3]+tpcpid[4]*fPriors[4]);
+ if(fTOF || fITS || fTRD){
+ prob[ind]=tpcpid[ind];
}else{
- prob[ind]=0.;
- }
+ prob[ind]=tpcpid[ind]*fPriors[ind]/(tpcpid[0]*fPriors[0]+tpcpid[1]*fPriors[1]+tpcpid[2]*fPriors[2]+tpcpid[3]*fPriors[3]+tpcpid[4]*fPriors[4]);
}
+}
return;
}
Double_t tofpid[AliPID::kSPECIES];
pid.MakeTOFPID(track,tofpid);
for(Int_t ind=0;ind<AliPID::kSPECIES;ind++){
+ if(fTPC || fITS || fTRD){
+ prob[ind]=tofpid[ind];
+ }else{
prob[ind]=tofpid[ind]*fPriors[ind]/(tofpid[0]*fPriors[0]+tofpid[1]*fPriors[1]+tofpid[2]*fPriors[2]+tofpid[3]*fPriors[3]+tofpid[4]*fPriors[4]);
}
+}
return;
}
Double_t trdpid[AliPID::kSPECIES];
pid.MakeTRDPID(track,trdpid);
for(Int_t ind=0;ind<AliPID::kSPECIES;ind++){
- if(trdpid[ind]>0.) {
- prob[ind]=trdpid[ind]*fPriors[ind]/(trdpid[0]*fPriors[0]+trdpid[1]*fPriors[1]+trdpid[2]*fPriors[2]+trdpid[3]*fPriors[3]+trdpid[4]*fPriors[4]);
+ if(fTPC || fITS || fTOF){
+ prob[ind]=trdpid[ind];
}else{
- prob[ind]=0.;
- }
+ prob[ind]=trdpid[ind]*fPriors[ind]/(trdpid[0]*fPriors[0]+trdpid[1]*fPriors[1]+trdpid[2]*fPriors[2]+trdpid[3]*fPriors[3]+trdpid[4]*fPriors[4]);
}
+}
return;
}
for(Int_t i=2; i<6; i++){
if(clumap&(1<<i)) ++nPointsForPid;
}
- if(nPointsForPid<3) return kFALSE;// track not to be used for PID purposes
+ if(nPointsForPid<3) return kFALSE;
}
if(detectors.Contains("TPC")){
// convention:
// for the single detectors: -1 = kFALSE, 1 = kTRUE, 0 = compatible
// the method returns the sum of the response of the 2 detectors
- if(fTPC && fTOF) if(!CheckStatus(track,"TPC") && !CheckStatus(track,"TOF")) return 0;
+ if(fTPC && fTOF) {if(!CheckStatus(track,"TPC") && !CheckStatus(track,"TOF")) return 0;}
- Int_t TPCinfo=0;
+ Int_t tTPCinfo=0;
if(fTPC){
if(CheckStatus(track,"TPC")) {
if(fAsym) {
if(TPCRawAsym(track,specie)) {
- TPCinfo=1;
+ tTPCinfo=1;
}else{
- TPCinfo=-1;
+ tTPCinfo=-1;
}
}else{
if(specie==2 && IsPionRaw(track,"TPC")) {
- TPCinfo=1;
+ tTPCinfo=1;
}else{
- TPCinfo=-1;
+ tTPCinfo=-1;
}
if(specie==3 && IsKaonRaw(track,"TPC")) {
- TPCinfo=1;
+ tTPCinfo=1;
}else{
- TPCinfo=-1;
+ tTPCinfo=-1;
}
if(specie==4 && IsProtonRaw(track,"TPC")) {
- TPCinfo=1;
+ tTPCinfo=1;
}else{
- TPCinfo=-1;
+ tTPCinfo=-1;
}
}
- if(compat && TPCinfo<0){
+ if(compat && tTPCinfo<0){
Double_t sig0tmp=fnSigma[0];
SetSigma(0,3.);
- if(specie==2 && IsPionRaw(track,"TPC")) TPCinfo=0;
- if(specie==3 && IsKaonRaw(track,"TPC")) TPCinfo=0;
- if(specie==4 && IsProtonRaw(track,"TPC")) TPCinfo=0;
+ if(specie==2 && IsPionRaw(track,"TPC")) tTPCinfo=0;
+ if(specie==3 && IsKaonRaw(track,"TPC")) tTPCinfo=0;
+ if(specie==4 && IsProtonRaw(track,"TPC")) tTPCinfo=0;
SetSigma(0,sig0tmp);
}
}
}
- Int_t TOFinfo=0;
+ Int_t tTOFinfo=0;
if(fTOF){
- if(!CheckStatus(track,"TOF") && fTPC) return TPCinfo;
+ if(!CheckStatus(track,"TOF") && fTPC) return tTPCinfo;
- TOFinfo=-1;
+ tTOFinfo=-1;
- if(specie==2 && IsPionRaw(track,"TOF")) TOFinfo=1;
- if(specie==3 && IsKaonRaw(track,"TOF")) TOFinfo=1;
- if(specie==4 && IsProtonRaw(track,"TOF")) TOFinfo=1;
+ if(specie==2 && IsPionRaw(track,"TOF")) tTOFinfo=1;
+ if(specie==3 && IsKaonRaw(track,"TOF")) tTOFinfo=1;
+ if(specie==4 && IsProtonRaw(track,"TOF")) tTOFinfo=1;
- if(compat && TOFinfo>0){
+ if(compat && tTOFinfo>0){
Double_t ptrack=track->P();
- if(ptrack>1.5) TOFinfo=0;
+ if(ptrack>1.5) tTOFinfo=0;
}
-}
- return TPCinfo+TOFinfo;
+ }
+
+ if(tTPCinfo+tTOFinfo==0 && fITS){
+ if(!CheckStatus(track,"ITS")) return tTPCinfo+tTOFinfo;
+ Int_t tITSinfo = -1;
+ if(specie==2 && IsPionRaw(track,"TOF")) tITSinfo=1;
+ if(specie==3 && IsKaonRaw(track,"TOF")) tITSinfo=1;
+ if(specie==4 && IsProtonRaw(track,"TOF")) tITSinfo=1;
+ return tITSinfo;
+ }
+
+ return tTPCinfo+tTOFinfo;
}
if(mode==2){
//TPC & TOF (a la' Yifei)
// convention: -1 = kFALSE, 1 = kTRUE, 0 = not identified
- Int_t TPCinfo=0;
+ Int_t tTPCinfo=0;
if(fTPC && CheckStatus(track,"TPC")) {
- TPCinfo=1;
+ tTPCinfo=1;
if(fAsym){
- if(!TPCRawAsym(track,specie)) TPCinfo=-1;
+ if(!TPCRawAsym(track,specie)) tTPCinfo=-1;
}else{
- if(specie==2 && !IsPionRaw(track,"TPC")) TPCinfo=-1;
- if(specie==3 && !IsKaonRaw(track,"TPC")) TPCinfo=-1;
- if(specie==4 && !IsProtonRaw(track,"TPC")) TPCinfo=-1;
+ if(specie==2 && !IsPionRaw(track,"TPC")) tTPCinfo=-1;
+ if(specie==3 && !IsKaonRaw(track,"TPC")) tTPCinfo=-1;
+ if(specie==4 && !IsProtonRaw(track,"TPC")) tTPCinfo=-1;
}
}
- Int_t TOFinfo=0;
+ Int_t tTOFinfo=1;
if(fTOF){
- if(fTPC && !CheckStatus(track,"TOF")) return TPCinfo;
- TOFinfo=1;
+ if(fTPC && !CheckStatus(track,"TOF")) return tTPCinfo;
- if(specie==2 && !IsPionRaw(track,"TOF")) TOFinfo=-1;
- if(specie==3 && !IsKaonRaw(track,"TOF")) TOFinfo=-1;
- if(specie==4 && !IsProtonRaw(track,"TOF")) TOFinfo=-1;
+ if(specie==2 && !IsPionRaw(track,"TOF")) tTOFinfo=-1;
+ if(specie==3 && !IsKaonRaw(track,"TOF")) tTOFinfo=-1;
+ if(specie==4 && !IsProtonRaw(track,"TOF")) tTOFinfo=-1;
}
- if(TOFinfo+TPCinfo>=2) return 1;
+
+ if(tTOFinfo==1 && tTPCinfo==1) return 1;
+
+ if(tTPCinfo+tTOFinfo==0 && fITS){
+ if(!CheckStatus(track,"ITS")) return tTPCinfo+tTOFinfo;
+ Int_t tITSinfo = -1;
+ if(specie==2 && IsPionRaw(track,"TOF")) tITSinfo=1;
+ if(specie==3 && IsKaonRaw(track,"TOF")) tITSinfo=1;
+ if(specie==4 && IsProtonRaw(track,"TOF")) tITSinfo=1;
+ return tITSinfo;
+ }
return -1;
Double_t ptrack=track->P();
- Int_t TPCinfo=-1;
+ Int_t tTPCinfo=-1;
- if(ptrack<fPLimit[0] && fTPC) {
+ if(ptrack>=fPLimit[0] && ptrack<fPLimit[1] && fTPC) {
if(!CheckStatus(track,"TPC")) return 0;
if(fAsym) {
- if(TPCRawAsym(track,specie)) TPCinfo=1;
+ if(TPCRawAsym(track,specie)) tTPCinfo=1;
}else{
- if(specie==2 && IsPionRaw(track,"TPC")) TPCinfo=1;
- if(specie==3 && IsKaonRaw(track,"TPC")) TPCinfo=1;
- if(specie==4 && IsProtonRaw(track,"TPC")) TPCinfo=1;
+ if(specie==2 && IsPionRaw(track,"TPC")) tTPCinfo=1;
+ if(specie==3 && IsKaonRaw(track,"TPC")) tTPCinfo=1;
+ if(specie==4 && IsProtonRaw(track,"TPC")) tTPCinfo=1;
}
- return TPCinfo;
+ return tTPCinfo;
}
- Int_t TOFinfo=-1;
- if(ptrack>=fPLimit[0] && fTOF){
+ Int_t tTOFinfo=-1;
+ if(ptrack>=fPLimit[1] && fTOF){
if(!CheckStatus(track,"TOF")) return 0;
- if(specie==2 && IsPionRaw(track,"TOF")) TOFinfo=1;
- if(specie==3 && IsKaonRaw(track,"TOF")) TOFinfo=1;
- if(specie==4 && IsProtonRaw(track,"TOF")) TOFinfo=1;
- return TOFinfo;
+ if(specie==2 && IsPionRaw(track,"TOF")) tTOFinfo=1;
+ if(specie==3 && IsKaonRaw(track,"TOF")) tTOFinfo=1;
+ if(specie==4 && IsProtonRaw(track,"TOF")) tTOFinfo=1;
+ return tTOFinfo;
+ }
+
+ Int_t tITSinfo=-1;
+ if(ptrack<fPLimit[0] && fITS){
+ if(!CheckStatus(track,"ITS")) return 0;
+ if(specie==2 && IsPionRaw(track,"ITS")) tITSinfo=1;
+ if(specie==3 && IsKaonRaw(track,"ITS")) tITSinfo=1;
+ if(specie==4 && IsProtonRaw(track,"ITS")) tITSinfo=1;
+ return tITSinfo;
}
}
}
//----------------------------------
Int_t AliAODPidHF::MakeRawPid(AliAODTrack *track, Int_t specie){
+// general method to compute PID
if(fMatch>0){
- return MatchTPCTOF(track,fMatch,specie,fCompat); //clarify
+ return MatchTPCTOF(track,fMatch,specie,fCompat);
}else{
if(fTPC && !fTOF && !fITS) {
- return ApplyPidTPCRaw(track,specie);
+ Int_t tTPCres=ApplyPidTPCRaw(track,specie);
+ if(tTPCres==specie){return 1;}else{return tTPCres;};
}else{
AliError("You should enable just one detector if you don't want to match");
return 0;
}
if(fTOF && !fTPC && !fITS) {
- return ApplyPidTOFRaw(track,specie);
+ Int_t tTOFres=ApplyPidTOFRaw(track,specie);
+ if(tTOFres==specie){return 1;}else{return tTOFres;};
}else{
AliError("You should enable just one detector if you don't want to match");
return 0;
}
if(fITS && !fTPC && !fTOF) {
- return ApplyPidITSRaw(track,specie);
+ Int_t tITSres=ApplyPidITSRaw(track,specie);
+ if(tITSres==specie){return 1;}else{return tITSres;};
}else{
AliError("You should enable just one detector if you don't want to match");
return 0;