* about the suitability of this software for any purpose. It is *
* provided "as is" without express or implied warranty. *
**************************************************************************/
-/************************************************************************
- * *
- * Cut menagement class implemented by the *
- * ALICE Heavy Flavour Electron Group *
- * *
- * Authors: *
- * Markus Fasel <M.Fasel@gsi.de> *
- * Markus Heide <mheide@uni-muenster.de> *
- * Matus Kalisky <m.kalisky@uni-muenster.de> *
- * *
- ************************************************************************/
+//
+// Cut menagement class implemented by the
+// ALICE Heavy Flavour Electron Group
+// Interface to the correction framework
+// Provides a set of standard cuts
+//
+// Authors:
+// Raphaelle Bailhache <R.Bailhache@gsi.de>
+// Markus Fasel <M.Fasel@gsi.de>
+// Markus Heide <mheide@uni-muenster.de>
+// Matus Kalisky <m.kalisky@uni-muenster.de>
+//
+// Overview over the 18 steps in the correction Framework
+// 0. Generated Electrons
+// 1. Signal Electrons
+// 2. Electron in Acceptance
+// ------------------------------------------------------------
+// 3. Rec without cuts (MC information)
+// 4. Rec Kine ITS/TPC (MC Information)
+// 5. Rec Primary (MC Information)
+// 6. HFE ITS (MC Information)
+// 7. HFE TRD (MC Information)
+// 8. PID (MC Information)
+// ............................................................
+// 9. Rec without cuts(MC Information for tracks which are already registered)
+// 10. Rec Kine ITS/TPC (MC Information for tracks which are already registered)
+// 11. RecPrimary (MC Information for tracks which are already registered)
+// 12. HFE ITS (MC Information for tracks which are already registered)
+// 13. HFE TPC (MC Information for tracks which are already registered)
+// 14. PID (MC Information for tracks which are already registered)
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+// 15. Rec without cuts
+// 16. Rec Kine ITS/TPC
+// 17. Rec Primary
+// 18. HFE ITS
+// 19. HFE TRD
+// 20. PID
+//
#include <TClass.h>
#include <TList.h>
#include <TObjArray.h>
#include "AliCFAcceptanceCuts.h"
#include "AliCFCutBase.h"
+#include "AliCFEventGenCuts.h"
+#include "AliCFEventRecCuts.h"
#include "AliCFManager.h"
#include "AliCFParticleGenCuts.h"
#include "AliCFTrackIsPrimaryCuts.h"
#include "AliCFTrackKineCuts.h"
#include "AliCFTrackQualityCuts.h"
#include "AliESDtrack.h"
-#include "AliMCParticle.h"
#include "AliHFEcuts.h"
ClassImp(AliHFEcuts)
-const Int_t AliHFEcuts::kNcutSteps = 5;
-
//__________________________________________________________________
AliHFEcuts::AliHFEcuts():
fRequirements(0),
fMinClustersTPC(0),
fMinTrackletsTRD(0),
fCutITSPixel(0),
+ fCheckITSLayerStatus(kTRUE),
fMaxChi2clusterTPC(0.),
fMinClusterRatioTPC(0.),
fSigmaToVtx(0.),
- fMaxImpactParamR(0.),
- fMaxImpactParamZ(0.),
fHistQA(0x0),
- fCutList(0x0)
+ fCutList(0x0),
+ fDebugLevel(0)
{
//
// Default Constructor
fMinClustersTPC(c.fMinClustersTPC),
fMinTrackletsTRD(c.fMinTrackletsTRD),
fCutITSPixel(c.fCutITSPixel),
+ fCheckITSLayerStatus(c.fCheckITSLayerStatus),
fMaxChi2clusterTPC(c.fMaxChi2clusterTPC),
fMinClusterRatioTPC(c.fMinClusterRatioTPC),
fSigmaToVtx(c.fSigmaToVtx),
- fMaxImpactParamR(c.fMaxImpactParamR),
- fMaxImpactParamZ(c.fMaxImpactParamZ),
fHistQA(0x0),
- fCutList(0x0)
+ fCutList(0x0),
+ fDebugLevel(0)
{
//
// Copy Constructor
//__________________________________________________________________
void AliHFEcuts::Initialize(AliCFManager *cfm){
+ //
+ // Initializes the cut objects from the correction framework
+ // Publishes the cuts to the correction framework manager
+ //
+ if(IsInDebugMode()){
+ fHistQA = new TList;
+ fHistQA->SetName("CutQAhistograms");
+ fHistQA->SetOwner(kFALSE);
+ }
+
// Call all the setters for the cuts
SetParticleGenCutList();
SetAcceptanceCutList();
- SetRecKineCutList();
+ SetRecKineITSTPCCutList();
SetRecPrimaryCutList();
- SetHFElectronCuts();
+ SetHFElectronITSCuts();
+ SetHFElectronTRDCuts();
+
+ // Publish to the cuts which analysis type they are (ESD Analysis by default)
+ 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);
+ }
+ }
+
+ // Connect the event cuts
+ SetEventCutList(kEventStepGenerated);
+ SetEventCutList(kEventStepReconstructed);
+ cfm->SetEventCutsList(kEventStepGenerated, dynamic_cast<TObjArray *>(fCutList->FindObject("fEvGenCuts")));
+ cfm->SetEventCutsList(kEventStepReconstructed, dynamic_cast<TObjArray *>(fCutList->FindObject("fEvRecCuts")));
- // Connect the cuts
+ // Connect the particle cuts
cfm->SetParticleCutsList(kStepMCGenerated, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartGenCuts")));
cfm->SetParticleCutsList(kStepMCInAcceptance, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartAccCuts")));
- cfm->SetParticleCutsList(kStepRecKine, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartRecCuts")));
+ cfm->SetParticleCutsList(kStepRecKineITSTPC, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartRecKineITSTPCCuts")));
cfm->SetParticleCutsList(kStepRecPrim, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartPrimCuts")));
- cfm->SetParticleCutsList(kStepHFEcuts, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartHFECuts")));
+ cfm->SetParticleCutsList(kStepHFEcutsITS, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartHFECutsITS")));
+ cfm->SetParticleCutsList(kStepHFEcutsTRD, dynamic_cast<TObjArray *>(fCutList->FindObject("fPartHFECutsTRD")));
+
}
//__________________________________________________________________
// Call all the setters for the cuts
SetParticleGenCutList();
SetAcceptanceCutList();
- SetRecKineCutList();
+ SetRecKineITSTPCCutList();
SetRecPrimaryCutList();
- SetHFElectronCuts();
+ SetHFElectronITSCuts();
+ SetHFElectronTRDCuts();
+
+}
+
+//__________________________________________________________________
+void AliHFEcuts::SetEventCutList(Int_t istep){
+ //
+ // Cuts for Event Selection
+ //
+ TObjArray *arr = new TObjArray;
+ if(istep == kEventStepGenerated){
+ AliCFEventGenCuts *evGenCuts = new AliCFEventGenCuts("fCutsEvGen", "Event Generated cuts");
+ evGenCuts->SetNTracksCut(1);
+ evGenCuts->SetRequireVtxCuts(kTRUE);
+ evGenCuts->SetVertexXCut(-1, 1);
+ evGenCuts->SetVertexYCut(-1, 1);
+ evGenCuts->SetVertexZCut(-30, 30);
+
+ arr->SetName("fEvGenCuts");
+ arr->AddLast(evGenCuts);
+ } else {
+ AliCFEventRecCuts *evRecCuts = new AliCFEventRecCuts("fCutsEvRec", "Event Reconstructed cuts");
+ evRecCuts->SetUseSPDVertex();
+ evRecCuts->SetNTracksCut(1);
+ evRecCuts->SetRequireVtxCuts(kTRUE);
+ evRecCuts->SetVertexXCut(-1, 1);
+ evRecCuts->SetVertexYCut(-1, 1);
+ evRecCuts->SetVertexZCut(-30, 30);
+
+
+ arr->SetName("fEvRecCuts");
+ arr->AddLast(evRecCuts);
+ }
+ fCutList->AddLast(arr);
}
//__________________________________________________________________
if(IsRequireProdVertex()){
genCuts->SetProdVtxRangeX(fProdVtx[0], fProdVtx[1]);
genCuts->SetProdVtxRangeY(fProdVtx[2], fProdVtx[3]);
+ genCuts->SetProdVtxRange2D(kTRUE); // Use ellipse
}
- genCuts->SetRequirePdgCode(11/*, kTRUE*/);
+ genCuts->SetRequirePdgCode(11, kTRUE);
AliCFTrackKineCuts *kineMCcuts = new AliCFTrackKineCuts("fCutsKineMC","MC Kine Cuts");
kineMCcuts->SetPtRange(fPtRange[0], fPtRange[1]);
- kineMCcuts->SetEtaRange(-0.9, 0.9);
+ kineMCcuts->SetEtaRange(-0.8, 0.8);
if(IsInDebugMode()){
genCuts->SetQAOn(fHistQA);
// Min. Required Hist for Detectors:
// ITS [3]
// TPC [2]
- // TRD [12]
+ // TRD [2*nTracklets]
// TOF [0]
//
AliCFAcceptanceCuts *accCuts = new AliCFAcceptanceCuts("fCutsAccMC", "MC Acceptance Cuts");
accCuts->SetMinNHitITS(3);
accCuts->SetMinNHitTPC(2);
- accCuts->SetMinNHitTRD(12);
+ accCuts->SetMinNHitTRD(2*fMinTrackletsTRD);
if(IsInDebugMode()) accCuts->SetQAOn(fHistQA);
- TObjArray *PartAccCuts = new TObjArray();
- PartAccCuts->SetName("fPartAccCuts");
- PartAccCuts->AddLast(accCuts);
- fCutList->AddLast(PartAccCuts);
+ TObjArray *partAccCuts = new TObjArray();
+ partAccCuts->SetName("fPartAccCuts");
+ partAccCuts->AddLast(accCuts);
+ fCutList->AddLast(partAccCuts);
}
//__________________________________________________________________
-void AliHFEcuts::SetRecKineCutList(){
+void AliHFEcuts::SetRecKineITSTPCCutList(){
//
// Track Kinematics and Quality cuts (Based on the Standard cuts from PWG0)
//
+ // ITS refit
// Variances:
// y: 2
// z: 2
// Min. Number of Clusters:
// TPC: 50
// RefitRequired:
- // ITS
// TPC
// Chi2 per TPC cluster: 3.5
//
AliCFTrackQualityCuts *trackQuality = new AliCFTrackQualityCuts("fCutsQualityRec","REC Track Quality Cuts");
trackQuality->SetMinNClusterTPC(fMinClustersTPC);
trackQuality->SetMaxChi2PerClusterTPC(fMaxChi2clusterTPC);
- trackQuality->SetStatus(AliESDtrack::kTPCrefit & AliESDtrack::kITSrefit);
+ trackQuality->SetStatus(AliESDtrack::kTPCrefit | AliESDtrack::kITSrefit);
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);
+
AliCFTrackKineCuts *kineCuts = new AliCFTrackKineCuts("fCutsKineRec", "REC Kine Cuts");
kineCuts->SetPtRange(fPtRange[0], fPtRange[1]);
- kineCuts->SetEtaRange(-0.9, 0.9);
+ kineCuts->SetEtaRange(-0.8, 0.8);
if(IsInDebugMode()){
trackQuality->SetQAOn(fHistQA);
+ hfecuts->SetQAOn(fHistQA);
kineCuts->SetQAOn(fHistQA);
}
TObjArray *recCuts = new TObjArray;
- recCuts->SetName("fPartRecCuts");
+ recCuts->SetName("fPartRecKineITSTPCCuts");
recCuts->AddLast(trackQuality);
+ recCuts->AddLast(hfecuts);
recCuts->AddLast(kineCuts);
fCutList->AddLast(recCuts);
}
//
AliCFTrackIsPrimaryCuts *primaryCut = new AliCFTrackIsPrimaryCuts("fCutsPrimaryCuts", "REC Primary Cuts");
if(IsRequireDCAToVertex()){
- primaryCut->SetDCAToVertex2D(kTRUE);
+ //primaryCut->SetDCAToVertex2D(kTRUE);
primaryCut->SetMaxDCAToVertexXY(fDCAtoVtx[0]);
primaryCut->SetMaxDCAToVertexZ(fDCAtoVtx[1]);
}
}
//__________________________________________________________________
-void AliHFEcuts::SetHFElectronCuts(){
+void AliHFEcuts::SetHFElectronITSCuts(){
//
- // Special Cuts introduced by the HFElectron Group
+ // Special Cuts introduced by the HFElectron Group: ITS
//
- AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroup","Extra cuts from the HFE group");
+ AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroupPixels","Extra cuts from the HFE group");
if(IsRequireITSpixel()){
hfecuts->SetRequireITSpixel(AliHFEextraCuts::ITSPixel_t(fCutITSPixel));
+ hfecuts->SetCheckITSstatus(fCheckITSLayerStatus);
}
- if(IsRequireMaxImpactParam()){
- hfecuts->SetMaxImpactParamR(fMaxImpactParamR);
- hfecuts->SetMaxImpactParamZ(fMaxImpactParamZ);
- }
- if(fMinTrackletsTRD) hfecuts->SetMinTrackletsTRD(fMinTrackletsTRD);
- if(fMinClusterRatioTPC > 0.) hfecuts->SetClusterRatioTPC(fMinClusterRatioTPC);
+
+ if(IsInDebugMode()) hfecuts->SetQAOn(fHistQA);
+ hfecuts->SetDebugLevel(fDebugLevel);
+
+ TObjArray *hfeCuts = new TObjArray;
+ hfeCuts->SetName("fPartHFECutsITS");
+ hfeCuts->AddLast(hfecuts);
+ fCutList->AddLast(hfeCuts);
+}
+
+//__________________________________________________________________
+void AliHFEcuts::SetHFElectronTRDCuts(){
+ //
+ // Special Cuts introduced by the HFElectron Group: TRD
+ //
+ AliHFEextraCuts *hfecuts = new AliHFEextraCuts("fCutsHFElectronGroupTRD","Extra cuts from the HFE group");
+ if(fMinTrackletsTRD > 0.) hfecuts->SetMinTrackletsTRD(fMinTrackletsTRD);
if(IsInDebugMode()) hfecuts->SetQAOn(fHistQA);
+ hfecuts->SetDebugLevel(fDebugLevel);
TObjArray *hfeCuts = new TObjArray;
- hfeCuts->SetName("fPartHFECuts");
+ hfeCuts->SetName("fPartHFECutsTRD");
hfeCuts->AddLast(hfecuts);
fCutList->AddLast(hfeCuts);
}
// Switch on QA
//
SetBit(kDebugMode, kTRUE);
- fHistQA = new TList;
- fHistQA->SetName("CutQAhistograms");
- fHistQA->SetOwner(kFALSE);
}
//__________________________________________________________________
//
// Checks the cuts without using the correction framework manager
//
- TString stepnames[kNcutSteps] = {"fPartGenCuts", "fPartAccCuts", "fPartRecCuts", "fPartPrimCuts", "fPartHFECuts"};
+ TString stepnames[kNcutStepsTrack] = {"fPartGenCuts", "fPartAccCuts", "fPartRecCuts", "fPartPrimCuts", "fPartHFECuts"};
TObjArray *cuts = dynamic_cast<TObjArray *>(fCutList->FindObject(stepnames[step].Data()));
if(!cuts) return kTRUE;
TIterator *it = cuts->MakeIterator();