#include <TClass.h>
#include <TList.h>
#include <TObjArray.h>
#include <TString.h>
#include "AliCFAcceptanceCuts.h"
#include "AliCFCutBase.h"
#include "AliCFEventGenCuts.h"
#include "AliCFManager.h"
#include "AliCFParticleGenCuts.h"
#include "AliCFTrackIsPrimaryCuts.h"
#include "AliCFTrackKineCuts.h"
#include "AliCFTrackQualityCuts.h"
#include "AliESDtrack.h"
#include "AliHFEextraEventCuts.h"
#include "AliMCEvent.h"
#include "AliVEvent.h"
#include "AliHFEcuts.h"
ClassImp(AliHFEcuts)
const Char_t *AliHFEcuts::fgkMCCutName[AliHFEcuts::kNcutStepsMCTrack] = {
"MCGenerated",
"MCGeneratedZOutNoPileUpCentralityFine",
"MCGeneratedEventCut",
"MCInAcceptance"
};
const Char_t * AliHFEcuts::fgkRecoCutName[AliHFEcuts::kNcutStepsRecTrack] = {
"NoCuts",
"RecKineITSTPC",
"Primary",
"HFEITS",
"HFETOF",
"HFETPC",
"HFETRD"
};
const Char_t * AliHFEcuts::fgkDECutName[AliHFEcuts::kNcutStepsDETrack] = {
"HFEDCA"
};
const Char_t * AliHFEcuts::fgkSecvtxCutName[AliHFEcuts::kNcutStepsSecvtxTrack] = {
"HFESecvtx"
};
const Char_t * AliHFEcuts::fgkEventCutName[AliHFEcuts::kNcutStepsEvent] = {
"EventStepGenerated",
"EventStepRecNoCut",
"EventStepRecNoPileUp",
"EventStepRecCentralityOK",
"EventStepZRange",
"EventStepReconstructed"
};
const Char_t * AliHFEcuts::fgkUndefined = "Undefined";
AliHFEcuts::AliHFEcuts():
TNamed(),
fRequirements(0),
fTPCclusterDef(0),
fTPCratioDef(0),
fMinClustersTPC(0),
fMinClustersTPCPID(0),
fMinClustersITS(0),
fMinTrackletsTRD(0),
fMaxChi2TRD(-1.),
fCutITSPixel(0),
fCheckITSLayerStatus(kTRUE),
fCutITSDrift(0),
fMaxChi2clusterITS(-1.),
fMaxChi2clusterTPC(0.),
fMinClusterRatioTPC(0.),
fVertexRangeZ(20.),
fTRDtrackletsExact(kFALSE),
fTOFPIDStep(kFALSE),
fMatchTOFLabel(kFALSE),
fTOFMISMATCHStep(kFALSE),
fTPCPIDCLEANUPStep(kFALSE),
fITSpatternCut(kFALSE),
fUseMixedVertex(kTRUE),
fUseSPDVertex(kFALSE),
fUseCorrelationVertex(kFALSE),
fSPDVtxResolution(kFALSE),
fPApileupCut(kFALSE),
fIsIPSigmacut(kFALSE),
fIsIPcharge(kFALSE),
fIsIPOpp(kFALSE),
fFractionOfSharedTPCClusters(-1.0),
fMaxImpactParameterRpar(kFALSE),
fAdditionalStatusRequirement(0),
fTOFsignaldx(-1.0),
fTOFsignaldz(-1.0),
fAODFilterBit(-1),
fRejectKinkDaughters(kTRUE),
fRejectKinkMothers(kTRUE),
fHistQA(0x0),
fCutList(0x0),
fDebugLevel(0)
{
memset(fProdVtx, 0, sizeof(Double_t) * 4);
memset(fProdVtxZ, 0, sizeof(Double_t) * 2);
memset(fDCAtoVtx, 0, sizeof(Double_t) * 2);
memset(fPtRange, 0, sizeof(Double_t) * 2);
memset(fIPCutParams, 0, sizeof(Float_t) * 4);
memset(fSigmaToVtx, 0, sizeof(Double_t) * 3);
fEtaRange[0] = -0.8; fEtaRange[1] = 0.8;
fPhiRange[0] = -1.; fPhiRange[1] = -1.;
}
AliHFEcuts::AliHFEcuts(const Char_t *name, const Char_t *title):
TNamed(name, title),
fRequirements(0),
fTPCclusterDef(0),
fTPCratioDef(0),
fMinClustersTPC(0),
fMinClustersTPCPID(0),
fMinClustersITS(0),
fMinTrackletsTRD(0),
fMaxChi2TRD(-1.),
fCutITSPixel(0),
fCheckITSLayerStatus(kTRUE),
fCutITSDrift(0),
fMaxChi2clusterITS(-1.),
fMaxChi2clusterTPC(0.),
fMinClusterRatioTPC(0.),
fVertexRangeZ(20.),
fTRDtrackletsExact(kFALSE),
fTOFPIDStep(kFALSE),
fMatchTOFLabel(kFALSE),
fTOFMISMATCHStep(kFALSE),
fTPCPIDCLEANUPStep(kFALSE),
fITSpatternCut(kFALSE),
fUseMixedVertex(kTRUE),
fUseSPDVertex(kFALSE),
fUseCorrelationVertex(kFALSE),
fSPDVtxResolution(kFALSE),
fPApileupCut(kFALSE),
fIsIPSigmacut(kFALSE),
fIsIPcharge(kFALSE),
fIsIPOpp(kFALSE),
fFractionOfSharedTPCClusters(-1.0),
fMaxImpactParameterRpar(kFALSE),
fAdditionalStatusRequirement(0),
fTOFsignaldx(-1.0),
fTOFsignaldz(-1.0),
fAODFilterBit(-1),
fRejectKinkDaughters(kTRUE),
fRejectKinkMothers(kTRUE),
fHistQA(0x0),
fCutList(0x0),
fDebugLevel(0)
{
memset(fProdVtx, 0, sizeof(Double_t) * 4);
memset(fProdVtxZ, 0, sizeof(Double_t) * 2);
memset(fDCAtoVtx, 0, sizeof(Double_t) * 2);
memset(fPtRange, 0, sizeof(Double_t) * 2);
memset(fIPCutParams, 0, sizeof(Float_t) * 4);
memset(fSigmaToVtx, 0, sizeof(Double_t) * 3);
fEtaRange[0] = -0.8; fEtaRange[1] = 0.8;
fPhiRange[0] = -1.; fPhiRange[1] = -1.;
}
AliHFEcuts::AliHFEcuts(const AliHFEcuts &c):
TNamed(c),
fRequirements(c.fRequirements),
fTPCclusterDef(c.fTPCclusterDef),
fTPCratioDef(c.fTPCratioDef),
fMinClustersTPC(0),
fMinClustersTPCPID(0),
fMinClustersITS(0),
fMinTrackletsTRD(0),
fMaxChi2TRD(-1.),
fCutITSPixel(0),
fCheckITSLayerStatus(0),
fCutITSDrift(0),
fMaxChi2clusterITS(-1.),
fMaxChi2clusterTPC(0),
fMinClusterRatioTPC(0),
fVertexRangeZ(20.),
fTRDtrackletsExact(kFALSE),
fTOFPIDStep(kFALSE),
fMatchTOFLabel(kFALSE),
fTOFMISMATCHStep(kFALSE),
fTPCPIDCLEANUPStep(kFALSE),
fITSpatternCut(c.fITSpatternCut),
fUseMixedVertex(kTRUE),
fUseSPDVertex(kFALSE),
fUseCorrelationVertex(c.fUseCorrelationVertex),
fSPDVtxResolution(c.fSPDVtxResolution),
fPApileupCut(c.fPApileupCut),
fIsIPSigmacut(kFALSE),
fIsIPcharge(kFALSE),
fIsIPOpp(kFALSE),
fFractionOfSharedTPCClusters(-1.0),
fMaxImpactParameterRpar(kFALSE),
fAdditionalStatusRequirement(0),
fTOFsignaldx(-1.0),
fTOFsignaldz(-1.0),
fAODFilterBit(-1),
fRejectKinkDaughters(c.fRejectKinkDaughters),
fRejectKinkMothers(c.fRejectKinkMothers),
fHistQA(0x0),
fCutList(0x0),
fDebugLevel(0)
{
c.Copy(*this);
}
AliHFEcuts &AliHFEcuts::operator=(const AliHFEcuts &c){
if(&c != this) c.Copy(*this);
return *this;
}
void AliHFEcuts::Copy(TObject &c) const {
AliHFEcuts &target = dynamic_cast<AliHFEcuts &>(c);
target.fRequirements = fRequirements;
target.fTPCclusterDef = fTPCclusterDef;
target.fTPCratioDef = fTPCratioDef;
target.fMinClustersTPC = fMinClustersTPC;
target.fMinClustersTPCPID = fMinClustersTPCPID;
target.fMinClustersITS = fMinClustersITS;
target.fMinTrackletsTRD = fMinTrackletsTRD;
target.fMaxChi2TRD = fMaxChi2TRD;
target.fCutITSPixel = fCutITSPixel;
target.fCheckITSLayerStatus = fCheckITSLayerStatus;
target.fCutITSDrift = fCutITSDrift;
target.fMaxChi2clusterITS = fMaxChi2clusterITS;
target.fMaxChi2clusterTPC = fMaxChi2clusterTPC;
target.fMinClusterRatioTPC = fMinClusterRatioTPC;
target.fVertexRangeZ = fVertexRangeZ;
target.fTRDtrackletsExact = fTRDtrackletsExact;
target.fTOFPIDStep = fTOFPIDStep;
target.fMatchTOFLabel = fMatchTOFLabel;
target.fTOFMISMATCHStep = fTOFMISMATCHStep;
target.fTPCPIDCLEANUPStep = fTPCPIDCLEANUPStep;
target.fUseMixedVertex = fUseMixedVertex;
target.fUseSPDVertex = fUseSPDVertex;
target.fUseCorrelationVertex = fUseCorrelationVertex;
target.fSPDVtxResolution = fSPDVtxResolution;
target.fPApileupCut = fPApileupCut;
target.fIsIPSigmacut = fIsIPSigmacut;
target.fIsIPcharge = fIsIPcharge;
target.fIsIPOpp = fIsIPOpp;
target.fFractionOfSharedTPCClusters = fFractionOfSharedTPCClusters;
target.fMaxImpactParameterRpar = fMaxImpactParameterRpar;
target.fAdditionalStatusRequirement = fAdditionalStatusRequirement;
target.fTOFsignaldx = fTOFsignaldx;
target.fTOFsignaldz = fTOFsignaldz;
target.fAODFilterBit = fAODFilterBit;
target.fRejectKinkDaughters = fRejectKinkDaughters;
target.fRejectKinkMothers = fRejectKinkMothers;
target.fDebugLevel = 0;
memcpy(target.fProdVtx, fProdVtx, sizeof(Double_t) * 4);
memcpy(target.fProdVtxZ, fProdVtxZ, sizeof(Double_t) * 2);
memcpy(target.fDCAtoVtx, fDCAtoVtx, sizeof(Double_t) * 2);
memcpy(target.fPtRange, fPtRange, sizeof(Double_t) *2);
memcpy(target.fIPCutParams, fIPCutParams, sizeof(Float_t) * 4);
memcpy(target.fSigmaToVtx, fSigmaToVtx, sizeof(Double_t) * 3);
memcpy(target.fEtaRange, fEtaRange, sizeof(Double_t) * 2);
memcpy(target.fPhiRange, fPhiRange, sizeof(Double_t) * 2);
if(target.fCutList){
target.fCutList->Clear();
delete target.fCutList;
}
if(fCutList){
target.fCutList = dynamic_cast<TObjArray *>(fCutList->Clone());
if(target.fCutList) target.fCutList->SetOwner();
}
if(target.fHistQA){
delete target.fHistQA;
}
if(fHistQA){
target.fHistQA = new TList;
target.fHistQA->SetName(Form("%s_CutQAhistograms", GetName()));
fHistQA->SetOwner(kTRUE);
TIter cit(target.fCutList);
TObjArray *clist = NULL;
AliCFCutBase *co = NULL;
while((clist = dynamic_cast<TObjArray *>(cit()))){
TIter cit1(clist);
while((co = dynamic_cast<AliCFCutBase *>(cit1()))) co->SetQAOn(target.fHistQA);
}
}
}
AliHFEcuts::~AliHFEcuts(){
if(fCutList){
fCutList->Delete();
delete fCutList;
}
fCutList = 0x0;
if(fHistQA) delete fHistQA;
}
Long64_t AliHFEcuts::Merge(const TCollection *list){
if(!list) return 0;
if(list->IsEmpty()) return 1;
Long64_t counts = 0;
TIter iter(list);
while(iter()){ counts++; }
return counts+1;
}
void AliHFEcuts::Initialize(AliCFManager *cfm){
AliDebug(2, "Called");
const Int_t kMCOffset = kNcutStepsMCTrack;
const Int_t kRecOffset = kNcutStepsRecTrack;
if(fCutList)
fCutList->Delete();
else{
fCutList = new TObjArray;
fCutList->SetOwner();
}
if(IsQAOn()){
fHistQA = new TList;
fHistQA->SetName(Form("%s_CutQAhistograms", GetName()));
fHistQA->SetOwner(kTRUE);
}
SetParticleGenCutList();
SetAcceptanceCutList();
SetRecKineITSTPCCutList();
SetRecPrimaryCutList();
SetHFElectronITSCuts();
SetHFElectronTOFCuts();
SetHFElectronTPCCuts();
SetHFElectronTRDCuts();
SetHFElectronDcaCuts();
if(IsAOD()){
AliInfo("Setting AOD Analysis");
TObjArray *genCuts = dynamic_cast<TObjArray *>(fCutList->FindObject("fPartGenCuts"));
if(genCuts){
AliCFParticleGenCuts *myGenCut = dynamic_cast<AliCFParticleGenCuts *>(genCuts->FindObject("fCutsGenMC"));
if(myGenCut) {
myGenCut->SetAODMC(kTRUE);
}
}
}
SetEventCutList(kEventStepGenerated);
SetEventCutList(kEventStepReconstructed);
cfm->SetEventCutsList(kEventStepGenerated, dynamic_cast<TObjArray *>(fCutList->FindObject("fEvGenCuts")));
cfm->SetEventCutsList(kEventStepReconstructed, dynamic_cast<TObjArray *>(fCutList->FindObject("fEvRecCuts")));
cfm->SetParticleCutsList(kStepMCGenerated, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartGenCuts")));
cfm->SetParticleCutsList(kStepMCInAcceptance, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartAccCuts")));
cfm->SetParticleCutsList(kStepRecKineITSTPC + kMCOffset, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartRecKineITSTPCCuts")));
cfm->SetParticleCutsList(kStepRecPrim + kMCOffset, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartPrimCuts")));
cfm->SetParticleCutsList(kStepHFEcutsITS + kMCOffset, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartHFECutsITS")));
cfm->SetParticleCutsList(kStepHFEcutsTOF+ kMCOffset, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartHFECutsTOF")));
cfm->SetParticleCutsList(kStepHFEcutsTPC+ kMCOffset, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartHFECutsTPC")));
cfm->SetParticleCutsList(kStepHFEcutsTRD + kMCOffset, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartHFECutsTRD")));
cfm->SetParticleCutsList(kStepHFEcutsDca + kRecOffset + kMCOffset, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartHFECutsDca")));
}
void AliHFEcuts::Initialize(){
AliDebug(2, "Called\n");
if(fCutList)
fCutList->Delete();
else{
fCutList = new TObjArray;
fCutList->SetOwner();
}
if(IsQAOn()){
fHistQA = new TList;
fHistQA->SetName(Form("%s_CutQAhistograms", GetName()));
fHistQA->SetOwner(kFALSE);
}
SetParticleGenCutList();
SetAcceptanceCutList();
SetRecKineITSTPCCutList();
SetRecPrimaryCutList();
SetHFElectronITSCuts();
SetHFElectronTOFCuts();
SetHFElectronTPCCuts();
SetHFElectronTRDCuts();
SetHFElectronDcaCuts();
if(IsAOD()){
TObjArray *genCuts = dynamic_cast<TObjArray *>(fCutList->FindObject("fPartGenCuts"));
if(genCuts){
AliCFParticleGenCuts *myGenCut = dynamic_cast<AliCFParticleGenCuts *>(genCuts->FindObject("fCutsGenMC"));
if(myGenCut) {
myGenCut->SetAODMC(kTRUE);
}
}
}
SetEventCutList(kEventStepGenerated);
SetEventCutList(kEventStepReconstructed);
}
void AliHFEcuts::SetEventCutList(Int_t istep){
AliDebug(2, "Called\n");
TObjArray *arr = new TObjArray;
if(istep == kEventStepGenerated){
AliCFEventGenCuts *evGenCuts = new AliCFEventGenCuts((Char_t *)"fCutsEvGen", (Char_t *)"Event Generated cuts");
evGenCuts->SetRequireVtxCuts(kTRUE);
evGenCuts->SetVertexZCut(-fVertexRangeZ, fVertexRangeZ);
if(IsQAOn()) evGenCuts->SetQAOn(fHistQA);
arr->SetName("fEvGenCuts");
arr->AddLast(evGenCuts);
} else {
AliHFEextraEventCuts *evRecCuts = new AliHFEextraEventCuts((Char_t *)"fCutsEvRec", (Char_t *)"Event Reconstructed cuts");
evRecCuts->SetRequireVtxCuts(kTRUE);
if(fUseSPDVertex) evRecCuts->SetUseSPDVertex();
if(fUseMixedVertex) evRecCuts->SetUseMixedVertex();
if(fUseCorrelationVertex) evRecCuts->SetCheckCorrelationSPDVtx();
if(fSPDVtxResolution) evRecCuts->SetCheckSPDResolution();
if(fPApileupCut) evRecCuts->SetpAPileupCut();
evRecCuts->SetVertexZCut(-fVertexRangeZ, fVertexRangeZ);
if(IsQAOn()) evRecCuts->SetQAOn(fHistQA);
arr->SetName("fEvRecCuts");
arr->AddLast(evRecCuts);
}
fCutList->AddLast(arr);
}
void AliHFEcuts::SetParticleGenCutList(){
TObjArray *mcCuts = new TObjArray;
mcCuts->SetName("fPartGenCuts");
AliDebug(2, "Called\n");
AliCFParticleGenCuts *genCuts = new AliCFParticleGenCuts("fCutsGenMC", "Particle Generation Cuts");
genCuts->SetRequireIsCharged();
if(IsRequirePrimary()) {
genCuts->SetRequireIsPrimary();
}
if(IsRequireProdVertex()){
AliDebug(3, Form("Vertex Range: fProdVtx[0] %f, fProdVtx[1] %f, fProdVtx[2] %f, fProdVtx[3] %f, fProdVtxZ[0] %f, fProdVtx[1] %f", fProdVtx[0], fProdVtx[1], fProdVtx[2], fProdVtx[3], fProdVtxZ[0], fProdVtxZ[1]));
genCuts->SetProdVtxRangeX(fProdVtx[0], fProdVtx[1]);
genCuts->SetProdVtxRangeY(fProdVtx[2], fProdVtx[3]);
genCuts->SetProdVtxRangeZ(fProdVtxZ[0], fProdVtxZ[1]);
genCuts->SetProdVtxRange2D(kTRUE);
}
genCuts->SetRequirePdgCode(11, kTRUE);
if(IsQAOn()) genCuts->SetQAOn(fHistQA);
mcCuts->AddLast(genCuts);
if(IsRequireKineMCCuts()) {
AliCFTrackKineCuts *kineMCcuts = new AliCFTrackKineCuts((Char_t *)"fCutsKineMC", (Char_t *)"MC Kine Cuts");
kineMCcuts->SetPtRange(fPtRange[0], fPtRange[1]);
kineMCcuts->SetEtaRange(fEtaRange[0],fEtaRange[1]);
if(fPhiRange[0] >= 0. && fPhiRange[1] >= 0.) kineMCcuts->SetPhiRange(fPhiRange[0], fPhiRange[1]);
if(IsQAOn()) kineMCcuts->SetQAOn(fHistQA);
mcCuts->AddLast(kineMCcuts);
}
fCutList->AddLast(mcCuts);
}
void AliHFEcuts::SetAcceptanceCutList(){
AliDebug(2, "Called\n");
AliCFAcceptanceCuts *accCuts = new AliCFAcceptanceCuts("fCutsAccMC", "MC Acceptance Cuts");
accCuts->SetMinNHitITS(3);
accCuts->SetMinNHitTPC(2);
accCuts->SetMinNHitTRD(2*fMinTrackletsTRD);
if(IsQAOn()) accCuts->SetQAOn(fHistQA);
TObjArray *partAccCuts = new TObjArray();
partAccCuts->SetName("fPartAccCuts");
partAccCuts->AddLast(accCuts);
fCutList->AddLast(partAccCuts);
}
void AliHFEcuts::SetRecKineITSTPCCutList(){
const Long_t kStatusSelectionDefault(AliESDtrack::kTPCrefit | AliESDtrack::kITSrefit);
AliDebug(2, "Called\n");
AliCFTrackQualityCuts *trackQuality = new AliCFTrackQualityCuts((Char_t *)"fCutsQualityRec", (Char_t *)"REC Track Quality Cuts");
trackQuality->SetMaxChi2PerClusterTPC(fMaxChi2clusterTPC);
if(fMaxChi2clusterITS >= 0.) trackQuality->SetMaxChi2PerClusterITS(fMaxChi2clusterITS);
Long_t statusRequirement;
if(fAdditionalStatusRequirement)
statusRequirement = kStatusSelectionDefault | fAdditionalStatusRequirement;
else
statusRequirement = kStatusSelectionDefault;
trackQuality->SetStatus(statusRequirement);
AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroupTPCRec","Extra cuts from the HFE group");
hfecuts->SetDebugLevel(fDebugLevel);
hfecuts->SetMinNbITScls(fMinClustersITS);
hfecuts->SetMinNClustersTPC(fMinClustersTPC,AliHFEextraCuts::ETPCclusterDef_t(fTPCclusterDef));
hfecuts->SetMinNClustersTPCPID(fMinClustersTPCPID);
hfecuts->SetClusterRatioTPC(fMinClusterRatioTPC,AliHFEextraCuts::ETPCclrDef_t(fTPCratioDef));
if(fFractionOfSharedTPCClusters > 0.0) hfecuts->SetFractionOfTPCSharedClusters(fFractionOfSharedTPCClusters);
if(fITSpatternCut) hfecuts->SetITSpatternCut();
if(fAODFilterBit > -1) hfecuts->SetAODFilterBit(fAODFilterBit);
AliCFTrackKineCuts *kineCuts = new AliCFTrackKineCuts((Char_t *)"fCutsKineRec", (Char_t *)"REC Kine Cuts");
kineCuts->SetPtRange(fPtRange[0], fPtRange[1]);
kineCuts->SetEtaRange(fEtaRange[0],fEtaRange[1]);
if(fPhiRange[0] >= 0. && fPhiRange[1] >= 0.) kineCuts->SetPhiRange(fPhiRange[0], fPhiRange[1]);
if(IsQAOn()){
trackQuality->SetQAOn(fHistQA);
hfecuts->SetQAOn(fHistQA);
kineCuts->SetQAOn(fHistQA);
}
TObjArray *recCuts = new TObjArray;
recCuts->SetName("fPartRecKineITSTPCCuts");
recCuts->AddLast(trackQuality);
recCuts->AddLast(hfecuts);
recCuts->AddLast(kineCuts);
fCutList->AddLast(recCuts);
}
void AliHFEcuts::SetRecPrimaryCutList(){
AliDebug(2, "Called\n");
AliCFTrackIsPrimaryCuts *primaryCut = new AliCFTrackIsPrimaryCuts((Char_t *)"fCutsPrimaryCuts", (Char_t *)"REC Primary Cuts");
if(IsRequireSigmaToVertex()){
primaryCut->SetRequireSigmaToVertex(kTRUE);
if(fSigmaToVtx[0]) primaryCut->SetMaxNSigmaToVertex(fSigmaToVtx[0]);
if(fSigmaToVtx[1]) primaryCut->SetMaxSigmaDCAxy(fSigmaToVtx[1]);
if(fSigmaToVtx[2]) primaryCut->SetMaxSigmaDCAz(fSigmaToVtx[2]);
}
if(IsQAOn()) primaryCut->SetQAOn(fHistQA);
AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsPrimaryCutsextra","Extra cuts from the HFE group");
hfecuts->SetMaxImpactParameterRpar(fMaxImpactParameterRpar);
if(fRejectKinkDaughters) hfecuts->SetRejectKinkDaughter();
if(fRejectKinkMothers) hfecuts->SetRejectKinkMother();
if(IsRequireDCAToVertex()){
hfecuts->SetMaxImpactParamR(fDCAtoVtx[0]);
hfecuts->SetMaxImpactParamZ(fDCAtoVtx[1]);
}
TObjArray *primCuts = new TObjArray;
primCuts->SetName("fPartPrimCuts");
if(IsRequireSigmaToVertex()) primCuts->AddLast(primaryCut);
primCuts->AddLast(hfecuts);
fCutList->AddLast(primCuts);
}
void AliHFEcuts::SetHFElectronITSCuts(){
AliDebug(2, "Called\n");
AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroupPixels","Extra cuts from the HFE group");
if(IsRequireITSpixel()){
hfecuts->SetRequireITSpixel(AliHFEextraCuts::ITSPixel_t(fCutITSPixel));
hfecuts->SetCheckITSstatus(fCheckITSLayerStatus);
}
if(IsRequireITSdrift()){
hfecuts->SetRequireITSdrift(AliHFEextraCuts::ITSDrift_t(fCutITSDrift));
}
if(IsQAOn()) hfecuts->SetQAOn(fHistQA);
hfecuts->SetDebugLevel(fDebugLevel);
TObjArray *hfeCuts = new TObjArray;
hfeCuts->SetName("fPartHFECutsITS");
hfeCuts->AddLast(hfecuts);
fCutList->AddLast(hfeCuts);
}
void AliHFEcuts::SetHFElectronTOFCuts(){
AliDebug(2, "Called\n");
AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroupTOF","Extra cuts from the HFE group on TOF PID");
if(fTOFPIDStep) hfecuts->SetTOFPID(kTRUE);
if(fTOFMISMATCHStep) hfecuts->SetTOFMISMATCH(kTRUE);
if(fMatchTOFLabel) hfecuts->SetMatchTOFLabel(kTRUE);
if((fTOFsignaldx > 0.0) && (fTOFsignaldz > 0.0)) hfecuts->SetTOFsignalDxz(fTOFsignaldx,fTOFsignaldz);
if(IsQAOn()) hfecuts->SetQAOn(fHistQA);
hfecuts->SetDebugLevel(fDebugLevel);
TObjArray *hfeCuts = new TObjArray;
hfeCuts->SetName("fPartHFECutsTOF");
hfeCuts->AddLast(hfecuts);
fCutList->AddLast(hfeCuts);
}
void AliHFEcuts::SetHFElectronTPCCuts(){
AliDebug(2, "Called\n");
AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroupTPCPID","Extra cuts from the HFE group on TPC PID");
if(fTPCPIDCLEANUPStep) hfecuts->SetTPCPIDCleanUp(kTRUE);
if(IsQAOn()) hfecuts->SetQAOn(fHistQA);
hfecuts->SetDebugLevel(fDebugLevel);
TObjArray *hfeCuts = new TObjArray;
hfeCuts->SetName("fPartHFECutsTPC");
hfeCuts->AddLast(hfecuts);
fCutList->AddLast(hfeCuts);
}
void AliHFEcuts::SetHFElectronTRDCuts(){
AliDebug(2, "Called\n");
AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroupTRD","Extra cuts from the HFE group on TRD PID");
if(fMinTrackletsTRD > 0.) hfecuts->SetMinTrackletsTRD(fMinTrackletsTRD, fTRDtrackletsExact);
if(fMaxChi2TRD >= 0)
hfecuts->SetMaxChi2TRD(fMaxChi2TRD);
if(IsQAOn()) hfecuts->SetQAOn(fHistQA);
hfecuts->SetDebugLevel(fDebugLevel);
TObjArray *hfeCuts = new TObjArray;
hfeCuts->SetName("fPartHFECutsTRD");
hfeCuts->AddLast(hfecuts);
fCutList->AddLast(hfeCuts);
}
void AliHFEcuts::SetHFElectronDcaCuts(){
AliDebug(2, "Called\n");
AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroupDCA","Extra cuts from the HFE group");
hfecuts->SetMinHFEImpactParamR(fIPCutParams,fIsIPSigmacut,fIsIPcharge,fIsIPOpp);
if(IsQAOn()) hfecuts->SetQAOn(fHistQA);
hfecuts->SetDebugLevel(fDebugLevel);
TObjArray *hfeCuts = new TObjArray;
hfeCuts->SetName("fPartHFECutsDca");
hfeCuts->AddLast(hfecuts);
fCutList->AddLast(hfeCuts);
}
Bool_t AliHFEcuts::CheckParticleCuts(UInt_t step, TObject *o){
AliDebug(2, "Called\n");
TString stepnames[kNcutStepsMCTrack + kNcutStepsRecTrack + kNcutStepsDETrack + kNcutStepsSecvtxTrack + 1] = {"fPartGenCuts","fPartEvCutPileupZ","fPartEvCut","fPartAccCuts","fPartRecNoCuts","fPartRecKineITSTPCCuts", "fPartPrimCuts", "fPartHFECutsITS","fPartHFECutsTOF","fPartHFECutsTPC","fPartHFECutsTRD","fPartHFECutsDca", "fPartHFECutsSecvtx"};
AliDebug(2, Form("Doing cut %s", stepnames[step].Data()));
TObjArray *cuts = dynamic_cast<TObjArray *>(fCutList->FindObject(stepnames[step].Data()));
if(!cuts) return kTRUE;
TIter it(cuts);
AliCFCutBase *mycut;
Bool_t status = kTRUE;
while((mycut = dynamic_cast<AliCFCutBase *>(it()))){
status &= mycut->IsSelected(o);
}
return status;
}
Bool_t AliHFEcuts::CheckEventCuts(const char*namestep, TObject *o){
AliDebug(2, "Called\n");
TObjArray *cuts = dynamic_cast<TObjArray *>(fCutList->FindObject(namestep));
if(!cuts) return kTRUE;
TIter it(cuts);
AliCFCutBase *mycut;
Bool_t status = kTRUE;
while((mycut = dynamic_cast<AliCFCutBase *>(it()))){
status &= mycut->IsSelected(o);
}
return status;
}
void AliHFEcuts::SetRecEvent(const AliVEvent *ev){
TIter cutsteps(fCutList);
TObjArray *cutstep;
AliCFCutBase *cut;
while((cutstep = dynamic_cast<TObjArray *>(cutsteps()))){
TIter cutIter(cutstep);
while((cut = dynamic_cast<AliCFCutBase *>(cutIter()))){
cut->SetRecEventInfo(ev);
}
}
}
void AliHFEcuts::SetMCEvent(const AliVEvent *ev){
TIter cutsteps(fCutList);
TObjArray *cutstep;
AliCFCutBase *cut;
while((cutstep = dynamic_cast<TObjArray *>(cutsteps()))){
TIter cutIter(cutstep);
while((cut = dynamic_cast<AliCFCutBase *>(cutIter()))){
cut->SetMCEventInfo(ev);
}
}
}