AliAnalysisCuts(name, title)
, fTPCpid(NULL)
, fTOFpid(NULL)
+ , fTPCsigmaCutRequired(0)
+ , fTOFsigmaCutRequired(0)
, fCutTPCclusterRatio(0.)
, fMinMomentumTOF(0.5)
, fHcutStatistics(NULL)
fTPCpid = new AliTPCpidESD;
fTOFpid = new AliTOFpidESD;
- for(Int_t ispec = 0; ispec < AliPID::kSPECIES; ispec++){
- fCutTPCnSigma[ispec] = -1;
- fCutTOFnSigma[ispec] = -1;
- }
- //memset(fCutTPCnSigma, -1, sizeof(Float_t) * AliPID::kSPECIES);
- //memset(fCutTOFnSigma, -1, sizeof(Float_t) * AliPID::kSPECIES);
+ memset(fCutTPCnSigma, 0, sizeof(Float_t) * 2);
+ memset(fCutTOFnSigma, 0, sizeof(Float_t) * 2);
memset(fHclusterRatio, 0, sizeof(TH1F *) * 2);
memset(fHnSigmaTPC, 0, sizeof(TH1F *) * AliPID::kSPECIES * 2);
AliAnalysisCuts(ref)
, fTPCpid(NULL)
, fTOFpid(NULL)
+ , fTPCsigmaCutRequired(ref.fTPCsigmaCutRequired)
+ , fTOFsigmaCutRequired(ref.fTOFsigmaCutRequired)
, fCutTPCclusterRatio(ref.fCutTPCclusterRatio)
, fMinMomentumTOF(ref.fMinMomentumTOF)
, fHcutStatistics(NULL)
//
fTPCpid = new AliTPCpidESD(*ref.fTPCpid);
fTOFpid = new AliTOFpidESD(*ref.fTOFpid);
- memcpy(fCutTPCnSigma, ref.fCutTPCnSigma, sizeof(Float_t) * AliPID::kSPECIES);
- memcpy(fCutTOFnSigma, ref.fCutTOFnSigma, sizeof(Float_t) * AliPID::kSPECIES);
+ memcpy(fCutTPCnSigma, ref.fCutTPCnSigma, sizeof(Float_t) * AliPID::kSPECIES * 2);
+ memcpy(fCutTOFnSigma, ref.fCutTOFnSigma, sizeof(Float_t) * AliPID::kSPECIES * 2);
if(ref.fHcutStatistics) fHcutStatistics = dynamic_cast<TH1I *>(ref.fHcutStatistics->Clone());
if(ref.fHcutCorrelation) fHcutCorrelation = dynamic_cast<TH2I *>(ref.fHcutCorrelation->Clone());
target.fCutTPCclusterRatio = fCutTPCclusterRatio;
target.fMinMomentumTOF = fMinMomentumTOF;
+
+ target.fTPCsigmaCutRequired = fTPCsigmaCutRequired;
+ target.fTOFsigmaCutRequired = fTOFsigmaCutRequired;
if(fHcutStatistics) target.fHcutStatistics = dynamic_cast<TH1I *>(fHcutStatistics->Clone());
if(fHcutCorrelation) target.fHcutCorrelation = dynamic_cast<TH2I *>(fHcutCorrelation->Clone());
}
}
- memcpy(target.fCutTPCnSigma, fCutTPCnSigma, sizeof(Float_t) * AliPID::kSPECIES);
+ memcpy(target.fCutTPCnSigma, fCutTPCnSigma, sizeof(Float_t) * AliPID::kSPECIES * 2);
memcpy(target.fCutTOFnSigma, fCutTOFnSigma, sizeof(Float_t) * AliPID::kSPECIES);
AliESDpidCuts::Copy(c);
SETBIT(cutFullfiled, kCutClusterRatioTPC);
}
// check TPC nSigma cut
- Float_t nsigmaTPC[AliPID::kSPECIES]; // need all sigmas for QA plotting
+ Float_t nsigmaTPC[AliPID::kSPECIES], nsigma; // need all sigmas for QA plotting
for(Int_t ispec = 0; ispec < AliPID::kSPECIES; ispec++){
- nsigmaTPC[ispec] = fTPCpid->GetNumberOfSigmas(track, static_cast<AliPID::EParticleType>(ispec));
- if(fCutTPCnSigma[ispec] < 0) continue;
+ nsigmaTPC[ispec] = nsigma = fTPCpid->GetNumberOfSigmas(track, static_cast<AliPID::EParticleType>(ispec));
+ if(!(fTPCsigmaCutRequired & 1 << ispec)) continue;
SETBIT(cutRequired, kCutNsigmaTPC); // We found at least one species where the n-Sigma Cut is required
- if(TMath::Abs(nsigmaTPC[ispec]) <= fCutTPCnSigma[ispec]) SETBIT(cutFullfiled, kCutNsigmaTPC); // Fullfiled for at least one species
+ if(nsigma >= fCutTPCnSigma[2*ispec] && nsigma <= fCutTPCnSigma[2*ispec+1]) SETBIT(cutFullfiled, kCutNsigmaTPC); // Fullfiled for at least one species
}
// check TOF nSigma cut
Float_t nsigmaTOF[AliPID::kSPECIES]; // see above
Bool_t hasTOFpid = track->GetStatus() & AliESDtrack::kTOFpid; // only apply TOF n-sigma cut when PID Status Bit is set
for(Int_t ispec = 0; ispec < AliPID::kSPECIES; ispec++){
- if(hasTOFpid) nsigmaTOF[ispec] = fTOFpid->GetNumberOfSigmas(track, static_cast<AliPID::EParticleType>(ispec));
- if(fCutTOFnSigma[ispec] < 0) continue;
+ if(hasTOFpid) nsigmaTOF[ispec] = nsigma = fTOFpid->GetNumberOfSigmas(track, static_cast<AliPID::EParticleType>(ispec));
+ if(!(fTOFsigmaCutRequired && 1 << ispec)) continue;
SETBIT(cutRequired, kCutNsigmaTOF);
if(track->GetOuterParam()->P() >= fMinMomentumTOF){
- if(hasTOFpid && (TMath::Abs(nsigmaTOF[ispec]) <= fCutTOFnSigma[ispec])) SETBIT(cutFullfiled, kCutNsigmaTOF);
+ if(hasTOFpid && nsigma <= fCutTOFnSigma[2*ispec] && nsigma >= fCutTOFnSigma[2*ispec+1]) SETBIT(cutFullfiled, kCutNsigmaTOF);
}
}
virtual Bool_t AcceptTrack(const AliESDtrack *track);
void SetTPCclusterRatioCut(Float_t clr) { fCutTPCclusterRatio = clr; }
- void SetTPCnSigmaCut(AliPID::EParticleType itype, Float_t nSigma){ fCutTPCnSigma[itype] = nSigma; }
- void SetTOFnSigmaCut(AliPID::EParticleType itype, Float_t nSigma){ fCutTOFnSigma[itype] = nSigma; }
+ inline void SetTPCnSigmaCut(AliPID::EParticleType itype, Float_t nSigma);
+ inline void SetTPCnSigmaCut(AliPID::EParticleType itype, Float_t negSigma, Float_t posSigma);
+ inline void SetTOFnSigmaCut(AliPID::EParticleType itype, Float_t nSigma);
+ inline void SetTOFnSigmaCut(AliPID::EParticleType itype, Float_t negSigma, Float_t posSigma);
void SetMinMomentumTOF(Float_t mom) { fMinMomentumTOF = mom; }
protected:
static const Int_t kNcuts; // Number of Cuts
AliTPCpidESD *fTPCpid; //! TPC PID (n-sigma cut)
AliTOFpidESD *fTOFpid; //! TOF PID (n-sigma-cut)
- Float_t fCutTPCnSigma[AliPID::kSPECIES]; // Species dependent cut on the distance to the TPC dE/dx line
+ Char_t fTPCsigmaCutRequired; // Sigma cut Requirement for TPC and Particle Species
+ Char_t fTOFsigmaCutRequired; // Sigma cut Requirement for TOF and Particle Species
+ Float_t fCutTPCnSigma[AliPID::kSPECIES * 2]; // Species dependent cut on the distance to the TPC dE/dx line
Float_t fCutTOFnSigma[AliPID::kSPECIES]; // Species dependent cut on the distance to the TOF calculated time of flight line
Float_t fCutTPCclusterRatio; // Cut on Ratio of found clusters with repect to findable clusters in the TPC
Float_t fMinMomentumTOF; // Apply TOF PID only above a certain momentum
ClassDef(AliESDpidCuts, 1)
};
+
+//_____________________________________________________________________
+void AliESDpidCuts::SetTPCnSigmaCut(AliPID::EParticleType itype, Float_t nSigma){
+ //
+ // symmetric sigma cut for TPC PID
+ //
+ fCutTPCnSigma[itype * 2] = -nSigma;
+ fCutTPCnSigma[itype * 2 + 1] = nSigma;
+ fTPCsigmaCutRequired |= 1 << static_cast<Int_t >(itype);
+}
+
+//_____________________________________________________________________
+void AliESDpidCuts::SetTPCnSigmaCut(AliPID::EParticleType itype, Float_t negSigma, Float_t posSigma){
+ //
+ // assymetric sigma cut for TPC PID
+ //
+ fCutTPCnSigma[itype * 2] = negSigma;
+ fCutTPCnSigma[itype * 2 + 1] = posSigma;
+ fTPCsigmaCutRequired |= 1 << static_cast<Int_t >(itype);
+}
+
+//_____________________________________________________________________
+void AliESDpidCuts::SetTOFnSigmaCut(AliPID::EParticleType itype, Float_t nSigma){
+ //
+ // symmetric sigma cut for TOF PID
+ //
+ fCutTOFnSigma[itype * 2] = -nSigma;
+ fCutTOFnSigma[itype * 2 + 1] = nSigma;
+ fTOFsigmaCutRequired |= 1 << static_cast<Int_t >(itype);
+}
+
+//_____________________________________________________________________
+void AliESDpidCuts::SetTOFnSigmaCut(AliPID::EParticleType itype, Float_t negSigma, Float_t posSigma){
+ //
+ // assymetric sigma cut for TOF PID
+ //
+ fCutTOFnSigma[itype * 2] = negSigma;
+ fCutTOFnSigma[itype * 2 + 1] = posSigma;
+ fTOFsigmaCutRequired |= 1 << static_cast<Int_t >(itype);
+}
#endif