#include "AliCFTrackKineCuts.h"
#include "AliCFTrackQualityCuts.h"
#include "AliESDtrack.h"
+#include "AliHFEextraEventCuts.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",
+ "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",
+ "EventStepZRange",
+ "EventStepReconstructed"
+};
+
+const Char_t * AliHFEcuts::fgkUndefined = "Undefined";
+
//__________________________________________________________________
AliHFEcuts::AliHFEcuts():
TNamed(),
fRequirements(0),
+ fTPCclusterDef(AliHFEextraCuts::kFound),
+ fTPCratioDef(AliHFEextraCuts::kFoundOverFindable),
fMinClustersTPC(0),
+ fMinClustersITS(0),
fMinTrackletsTRD(0),
fCutITSPixel(0),
fCheckITSLayerStatus(kTRUE),
fMaxChi2clusterTPC(0.),
fMinClusterRatioTPC(0.),
fSigmaToVtx(0.),
+ fVertexRangeZ(20.),
+ fTOFPIDStep(kFALSE),
+ fTOFMISMATCHStep(kFALSE),
+ fUseMixedVertex(kTRUE),
+ fIsIPSigmacut(kFALSE),
+ fFractionOfSharedTPCClusters(-1.0),
+ fMaxImpactParameterRpar(kFALSE),
fHistQA(0x0),
fCutList(0x0),
fDebugLevel(0)
AliHFEcuts::AliHFEcuts(const Char_t *name, const Char_t *title):
TNamed(name, title),
fRequirements(0),
+ fTPCclusterDef(AliHFEextraCuts::kFound),
+ fTPCratioDef(AliHFEextraCuts::kFoundOverFindable),
fMinClustersTPC(0),
+ fMinClustersITS(0),
fMinTrackletsTRD(0),
fCutITSPixel(0),
fCheckITSLayerStatus(kTRUE),
fMaxChi2clusterTPC(0.),
fMinClusterRatioTPC(0.),
fSigmaToVtx(0.),
+ fVertexRangeZ(20.),
+ fTOFPIDStep(kFALSE),
+ fTOFMISMATCHStep(kFALSE),
+ fUseMixedVertex(kTRUE),
+ fIsIPSigmacut(kFALSE),
+ fFractionOfSharedTPCClusters(-1.0),
+ fMaxImpactParameterRpar(kFALSE),
fHistQA(0x0),
fCutList(0x0),
fDebugLevel(0)
memset(fProdVtx, 0, sizeof(Double_t) * 4);
memset(fDCAtoVtx, 0, sizeof(Double_t) * 2);
memset(fPtRange, 0, sizeof(Double_t) * 2);
+ memset(fIPCutParams, 0, sizeof(Float_t) * 4);
}
//__________________________________________________________________
AliHFEcuts::AliHFEcuts(const AliHFEcuts &c):
TNamed(c),
fRequirements(c.fRequirements),
+ fTPCclusterDef(c.fTPCclusterDef),
+ fTPCratioDef(c.fTPCratioDef),
fMinClustersTPC(0),
+ fMinClustersITS(0),
fMinTrackletsTRD(0),
fCutITSPixel(0),
fCheckITSLayerStatus(0),
fMaxChi2clusterTPC(0),
fMinClusterRatioTPC(0),
fSigmaToVtx(0),
+ fVertexRangeZ(20.),
+ fTOFPIDStep(kFALSE),
+ fTOFMISMATCHStep(kFALSE),
+ fUseMixedVertex(kTRUE),
+ fIsIPSigmacut(kFALSE),
+ fFractionOfSharedTPCClusters(-1.0),
+ fMaxImpactParameterRpar(kFALSE),
fHistQA(0x0),
fCutList(0x0),
fDebugLevel(0)
AliHFEcuts &target = dynamic_cast<AliHFEcuts &>(c);
target.fRequirements = fRequirements;
+ target.fTPCclusterDef = fTPCclusterDef;
+ target.fTPCratioDef = fTPCratioDef;
target.fMinClustersTPC = fMinClustersTPC;
+ target.fMinClustersITS = fMinClustersITS;
target.fMinTrackletsTRD = fMinTrackletsTRD;
target.fCutITSPixel = fCutITSPixel;
target.fCheckITSLayerStatus = fCheckITSLayerStatus;
target.fMaxChi2clusterTPC = fMaxChi2clusterTPC;
target.fMinClusterRatioTPC = fMinClusterRatioTPC;
target.fSigmaToVtx = fSigmaToVtx;
+ target.fVertexRangeZ = fVertexRangeZ;
+ target.fTOFPIDStep = fTOFPIDStep;
+ target.fTOFMISMATCHStep = fTOFMISMATCHStep;
+ target.fUseMixedVertex = fUseMixedVertex;
+ target.fIsIPSigmacut = fIsIPSigmacut;
+ target.fFractionOfSharedTPCClusters = fFractionOfSharedTPCClusters;
+ target.fMaxImpactParameterRpar = fMaxImpactParameterRpar;
target.fDebugLevel = 0;
memcpy(target.fProdVtx, fProdVtx, sizeof(Double_t) * 4);
memcpy(target.fDCAtoVtx, fDCAtoVtx, sizeof(Double_t) * 2);
memcpy(target.fPtRange, fPtRange, sizeof(Double_t) *2);
+ memcpy(target.fIPCutParams, fIPCutParams, sizeof(Float_t) * 4);
// Copy cut List
if(target.fCutList){
}
if(fCutList){
target.fCutList = dynamic_cast<TObjArray *>(fCutList->Clone());
- target.fCutList->SetOwner();
+ if(target.fCutList) target.fCutList->SetOwner(); // Coverity
}
if(target.fHistQA){
- target.fHistQA->Clear();
delete target.fHistQA;
- target.fHistQA = NULL;
}
if(fHistQA){
// If the QA list was already produced, then we create it new, loop over the cuts and connect all the histos with this list
target.fHistQA = new TList;
target.fHistQA->SetName(Form("%s_CutQAhistograms", GetName()));
- fHistQA->SetOwner(kFALSE);
+ fHistQA->SetOwner(kTRUE);
TIter cit(target.fCutList);
TObjArray *clist = NULL;
AliCFCutBase *co = NULL;
delete fCutList;
}
fCutList = 0x0;
- if(fHistQA) fHistQA->Clear();
- delete fHistQA;
+ if(fHistQA) delete fHistQA;
}
//__________________________________________________________________
// Publishes the cuts to the correction framework manager
//
AliDebug(2, "Called");
+ const Int_t kMCOffset = kNcutStepsMCTrack;
+ const Int_t kRecOffset = kNcutStepsRecTrack;
if(fCutList)
fCutList->Delete();
else{
if(IsQAOn()){
fHistQA = new TList;
fHistQA->SetName(Form("%s_CutQAhistograms", GetName()));
- fHistQA->SetOwner(kFALSE);
+ fHistQA->SetOwner(kTRUE);
}
// Call all the setters for the cuts
SetRecKineITSTPCCutList();
SetRecPrimaryCutList();
SetHFElectronITSCuts();
+ SetHFElectronTOFCuts();
SetHFElectronTRDCuts();
+ SetHFElectronDcaCuts();
// Publish to the cuts which analysis type they are (ESD Analysis by default)
if(IsAOD()){
cfm->SetEventCutsList(kEventStepReconstructed, dynamic_cast<TObjArray *>(fCutList->FindObject("fEvRecCuts")));
// Connect the particle cuts
+ // 1st MC
cfm->SetParticleCutsList(kStepMCGenerated, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartGenCuts")));
cfm->SetParticleCutsList(kStepMCInAcceptance, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartAccCuts")));
- cfm->SetParticleCutsList(kStepRecKineITSTPC, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartRecKineITSTPCCuts")));
- cfm->SetParticleCutsList(kStepRecPrim, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartPrimCuts")));
- cfm->SetParticleCutsList(kStepHFEcutsITS, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartHFECutsITS")));
- cfm->SetParticleCutsList(kStepHFEcutsTRD, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartHFECutsTRD")));
+ // 2nd Reco
+ 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(kStepHFEcutsTRD + kMCOffset, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartHFECutsTRD")));
+ cfm->SetParticleCutsList(kStepHFEcutsDca + kRecOffset + kMCOffset, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartHFECutsDca")));
}
SetRecKineITSTPCCutList();
SetRecPrimaryCutList();
SetHFElectronITSCuts();
+ SetHFElectronTOFCuts();
SetHFElectronTRDCuts();
+ SetHFElectronDcaCuts();
+
+ // Connect the event cuts
+ SetEventCutList(kEventStepGenerated);
+ SetEventCutList(kEventStepReconstructed);
+
}
TObjArray *arr = new TObjArray;
if(istep == kEventStepGenerated){
AliCFEventGenCuts *evGenCuts = new AliCFEventGenCuts((Char_t *)"fCutsEvGen", (Char_t *)"Event Generated cuts");
- evGenCuts->SetNTracksCut(1);
+ //evGenCuts->SetNTracksCut(1);
evGenCuts->SetRequireVtxCuts(kTRUE);
- evGenCuts->SetVertexXCut(-1, 1);
- evGenCuts->SetVertexYCut(-1, 1);
- evGenCuts->SetVertexZCut(-10, 10);
+ //evGenCuts->SetVertexXCut(-1, 1);
+ //evGenCuts->SetVertexYCut(-1, 1);
+ evGenCuts->SetVertexZCut(-fVertexRangeZ, fVertexRangeZ);
+ if(IsQAOn()) evGenCuts->SetQAOn(fHistQA);
arr->SetName("fEvGenCuts");
arr->AddLast(evGenCuts);
} else {
- AliCFEventRecCuts *evRecCuts = new AliCFEventRecCuts((Char_t *)"fCutsEvRec", (Char_t *)"Event Reconstructed cuts");
- evRecCuts->SetNTracksCut(1);
- evRecCuts->SetRequireVtxCuts(kTRUE);
- evRecCuts->SetVertexXCut(-1, 1);
- evRecCuts->SetVertexYCut(-1, 1);
- evRecCuts->SetVertexZCut(-30, 30);
-
- arr->SetName("fEvRecCuts");
- arr->AddLast(evRecCuts);
+ if(!fUseMixedVertex) {
+ AliCFEventRecCuts *evRecCuts = new AliCFEventRecCuts((Char_t *)"fCutsEvRec", (Char_t *)"Event Reconstructed cuts");
+ //evRecCuts->SetNTracksCut(1);
+ evRecCuts->SetRequireVtxCuts(kTRUE);
+ //evRecCuts->SetVertexXCut(-1, 1);
+ //evRecCuts->SetVertexYCut(-1, 1);
+ //evRecCuts->SetVertexZCut(-30, 30);
+ evRecCuts->SetVertexZCut(-fVertexRangeZ, fVertexRangeZ);
+ evRecCuts->SetVertexNContributors(1,(Int_t)1.e9);
+ if(IsQAOn()) evRecCuts->SetQAOn(fHistQA);
+ arr->SetName("fEvRecCuts");
+ arr->AddLast(evRecCuts);
+ } else {
+ AliHFEextraEventCuts *evRecCuts = new AliHFEextraEventCuts((Char_t *)"fCutsEvRec", (Char_t *)"Event Reconstructed cuts");
+ evRecCuts->SetRequireVtxCuts(kTRUE);
+ evRecCuts->SetUseMixedVertex();
+ evRecCuts->SetVertexZCut(-fVertexRangeZ, fVertexRangeZ);
+ //evRecCuts->SetVertexNContributors(1,(Int_t)1.e9);
+ if(IsQAOn()) evRecCuts->SetQAOn(fHistQA);
+ arr->SetName("fEvRecCuts");
+ arr->AddLast(evRecCuts);
+ }
}
fCutList->AddLast(arr);
}
void AliHFEcuts::SetParticleGenCutList(){
//
// Initialize Particle Cuts for Monte Carlo Tracks
- // Production Vertex: < 1cm (Beampipe)
+ // Production Vertex Radius: < 3cm
// Particle Species: Electrons
- // Eta: < 0.9 (TRD-TOF acceptance)
+ // Eta: < 0.8
//
TObjArray *mcCuts = new TObjArray;
//
AliDebug(2, "Called\n");
AliCFTrackQualityCuts *trackQuality = new AliCFTrackQualityCuts((Char_t *)"fCutsQualityRec", (Char_t *)"REC Track Quality Cuts");
- trackQuality->SetMinNClusterITS(4);
- trackQuality->SetMinNClusterTPC(fMinClustersTPC);
+ trackQuality->SetMinNClusterITS(fMinClustersITS);
trackQuality->SetMaxChi2PerClusterTPC(fMaxChi2clusterTPC);
trackQuality->SetStatus(AliESDtrack::kTPCrefit | AliESDtrack::kITSrefit);
- trackQuality->SetMaxCovDiagonalElements(2., 2., 0.5, 0.5, 2);
+ //trackQuality->SetMaxCovDiagonalElements(2., 2., 0.5, 0.5, 2);
AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroupTPC","Extra cuts from the HFE group");
- if(fMinClusterRatioTPC > 0.) hfecuts->SetClusterRatioTPC(fMinClusterRatioTPC);
hfecuts->SetDebugLevel(fDebugLevel);
+
+ // Set the cut in the TPC number of clusters
+ hfecuts->SetMinNClustersTPC(fMinClustersTPC, fTPCclusterDef);
+ hfecuts->SetClusterRatioTPC(fMinClusterRatioTPC, fTPCratioDef);
+ if(fFractionOfSharedTPCClusters > 0.0) hfecuts->SetFractionOfTPCSharedClusters(fFractionOfSharedTPCClusters);
AliCFTrackKineCuts *kineCuts = new AliCFTrackKineCuts((Char_t *)"fCutsKineRec", (Char_t *)"REC Kine Cuts");
kineCuts->SetPtRange(fPtRange[0], fPtRange[1]);
primaryCut->SetAcceptKinkDaughters(kFALSE);
if(IsQAOn()) primaryCut->SetQAOn(fHistQA);
+ AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsPrimaryCutsextra","Extra cuts from the HFE group");
+ hfecuts->SetMaxImpactParameterRpar(fMaxImpactParameterRpar);
+
TObjArray *primCuts = new TObjArray;
primCuts->SetName("fPartPrimCuts");
primCuts->AddLast(primaryCut);
+ if(fMaxImpactParameterRpar){
+ primCuts->AddLast(hfecuts);
+ }
fCutList->AddLast(primCuts);
}
fCutList->AddLast(hfeCuts);
}
+//__________________________________________________________________
+void AliHFEcuts::SetHFElectronTOFCuts(){
+ //
+ // Special Cuts introduced by the HFElectron Group: TRD
+ //
+ 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(IsQAOn()) hfecuts->SetQAOn(fHistQA);
+ hfecuts->SetDebugLevel(fDebugLevel);
+
+ TObjArray *hfeCuts = new TObjArray;
+ hfeCuts->SetName("fPartHFECutsTOF");
+ hfeCuts->AddLast(hfecuts);
+ fCutList->AddLast(hfeCuts);
+}
+
//__________________________________________________________________
void AliHFEcuts::SetHFElectronTRDCuts(){
//
// Special Cuts introduced by the HFElectron Group: TRD
//
AliDebug(2, "Called\n");
- AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroupTRD","Extra cuts from the HFE group");
+ AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroupTRD","Extra cuts from the HFE group on TRD PID");
if(fMinTrackletsTRD > 0.) hfecuts->SetMinTrackletsTRD(fMinTrackletsTRD);
if(IsQAOn()) hfecuts->SetQAOn(fHistQA);
hfecuts->SetDebugLevel(fDebugLevel);
}
//__________________________________________________________________
-Bool_t AliHFEcuts::CheckParticleCuts(CutStep_t step, TObject *o){
+void AliHFEcuts::SetHFElectronDcaCuts(){
+ //
+ // Special Cuts introduced by the HFElectron Group: minimum of impact parameter
+ //
+ AliDebug(2, "Called\n");
+ AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroupDCA","Extra cuts from the HFE group");
+ hfecuts->SetMinHFEImpactParamR(fIPCutParams,fIsIPSigmacut);
+ 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){
//
// Checks the cuts without using the correction framework manager
//
AliDebug(2, "Called\n");
- TString stepnames[kNcutStepsTrack] = {"fPartGenCuts","fPartSignal","fPartAccCuts","fPartRecNoCuts","fPartRecKineITSTPCCuts", "fPartPrimCuts", "fPartHFECutsITS","fPartHFECutsTRD","fPartHFEPid"};
+ TString stepnames[kNcutStepsMCTrack + kNcutStepsRecTrack + kNcutStepsDETrack + kNcutStepsSecvtxTrack + 1] = {"fPartGenCuts","fPartEvCutPileupZ","fPartEvCut","fPartAccCuts","fPartRecNoCuts","fPartRecKineITSTPCCuts", "fPartPrimCuts", "fPartHFECutsITS","fPartHFECutsTOF","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;
- TIterator *it = cuts->MakeIterator();
+ 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){
+ //
+ // Checks the cuts without using the correction framework manager
+ //
+ 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->Next()))){
+ while((mycut = dynamic_cast<AliCFCutBase *>(it()))){
status &= mycut->IsSelected(o);
}
- delete it;
return status;
}