class LMEECutLib {
public:
static enum LMMECutSet {
kPbPb2011_pidITS2gevTPCTOFif_trkSPD5orSDD4cls_6_tight,
kPbPb2011_pidITS2gevTPCTOFif_trkSPDfirst5cls_6_tight,
kPbPb2011_pidITS2gevTPCTOFif_trkSPDorSDD_5_tight,
kPbPb2011_pidITS2gevTPCTOFif_trkSPDfirst_5_tight,
kPbPb2011_pidITSTPCTOFif_trkSPD5orSDD4cls_4,
kPbPb2011_pidITSTPCTOFif_trkSPDfirst5cls_4,
kPbPb2011_pidITSTPC_trkSPDfirst_3, // (cutset w/o pairing)
kPbPb2011_pidTPC_trkSPDfirst_3, // (cutset w/o pairing)
kPbPb2011_pidITSTPCTOFif_trkSPDorSDD_2_loose, // (cutset w/o pairing)
kPbPb2011_pidITSTPCTOFif_trkSPDfirst_2_loose, // (cutset w/o pairing)
kPbPb2011_pidTPCTOF_trkSPDorSDD_2_loose, // (cutset w/o pairing)
kPbPb2011_pidTPCTOF_trkSPDfirst_2_loose, // (cutset w/o pairing)
kPbPb2011_pidITSTPCTOFif_trkSPDorSDD_1,
kPbPb2011_pidITSTPCTOFif_trkSPDfirst_1, // Cutset for Technical Preliminaries for QM2014 (no prefilter used!)
kPbPb2011_pidTPCTOF_trkSPDorSDD_1,
kPbPb2011_pidTPCTOF_trkSPDfirst_1,
kPbPb2011PID_ITSTPCTOFif2, // (NO FULL CUTSET)
kPbPb2011PID_TPCTOF3, // (NO FULL CUTSET)
kPbPb2011TRK_SDDfirstSPDnone, // (NO FULL CUTSET) complimentary tracks, strictly without SPD, to be combined with others!
kPbPb2011TRK_SPDfirst, // (NO FULL CUTSET) main track selection, with SPD first
kPbPb2011TRK_SDDfirstSPDnone4cls, // (NO FULL CUTSET) complimentary tracks, strictly without SPD, to be combined with others!
kPbPb2011TRK_SPDfirst5cls, // (NO FULL CUTSET) main track selection, with SPD first
kPbPb2011_TPCITS_TOFif1,
kPbPb2011_TPCTOF_Semi2, // changed PairCutsAna from PhiV to OpeningAngle. prefilter cuts renewed (if applicable)
// following cutsets are not complete anymore!
kPbPb2011_TPCTOF_Semi1, // old prefilter cuts (leg & pair), some are confusing
kPbPb2011NoPID, // pairing disabled in config
kPbPb2011TPCandTOF, // this was the final one activated by Christoph!
kPbPb2011TPCandTOFHPT,
kPbPb2011TPC, //TOF required, more relaxed cut on TPC
kPbPb2011TPCandTOFwide, //TOF required, more relaxed cut on TPC
kPbPb2011TPCorTOF,
kpp2010TPCandTOF,
kpp2010TPCorTOF,
kCUTSETMAX
};
static enum LMMECentSel {
kPbPb2011Central,
kPbPb2011MidCentral,
kPbPb2011SemiCentral,
kPbPb2011Peripheral,
kCENTSELMAX
};
//char* LMEECutNames[kCUTSETMAX] = { "PbPb2011TPCandTOF","PbPb2011TPCorTOF"};
LMEECutLib() {}
AliDielectronEventCuts* GetEventCuts(Int_t cutSet);
AliAnalysisCuts* GetCentralityCuts(Int_t centSel);
AliDielectronTrackRotator* GetTrackRotator(Int_t cutSet);
AliDielectronMixingHandler* GetMixingHandler(Int_t cutSet);
AliAnalysisCuts* GetPairCutsAna(Int_t cutSet, Bool_t tooglePC=kFALSE);
AliAnalysisCuts* GetPairCutsPre(Int_t cutSet);
AliAnalysisCuts* GetPIDCutsAna(Int_t cutSet);
AliAnalysisCuts* GetPIDCutsPre(Int_t cutSet);
AliAnalysisCuts* GetTrackCutsAna(Int_t cutSet);
AliAnalysisCuts* GetTrackCutsPre(Int_t cutSet);
AliAnalysisCuts* GetESDTrackCutsAna(Int_t cutSet);
// Note: event cuts are identical for all analysis 'cutDefinition's that run together!
// the selection is hardcoded in the AddTask, currently to 'kPbPb2011_TPCTOF_Semi1'
AliDielectronEventCuts* GetEventCuts(Int_t cutSet) {
AliDielectronEventCuts* eventCuts = 0x0;
switch (cutSet) {
case kPbPb2011_pidITS2gevTPCTOFif_trkSPD5orSDD4cls_6_tight:
case kPbPb2011_pidITS2gevTPCTOFif_trkSPDfirst5cls_6_tight:
case kPbPb2011_pidITS2gevTPCTOFif_trkSPDorSDD_5_tight:
case kPbPb2011_pidITS2gevTPCTOFif_trkSPDfirst_5_tight:
case kPbPb2011_pidITSTPCTOFif_trkSPD5orSDD4cls_4:
case kPbPb2011_pidITSTPCTOFif_trkSPDfirst5cls_4:
case kPbPb2011_pidITSTPC_trkSPDfirst_3:
case kPbPb2011_pidTPC_trkSPDfirst_3:
case kPbPb2011_pidITSTPCTOFif_trkSPDorSDD_2_loose:
case kPbPb2011_pidITSTPCTOFif_trkSPDfirst_2_loose:
case kPbPb2011_pidTPCTOF_trkSPDorSDD_2_loose:
case kPbPb2011_pidTPCTOF_trkSPDfirst_2_loose:
case kPbPb2011_pidITSTPCTOFif_trkSPDorSDD_1:
case kPbPb2011_pidITSTPCTOFif_trkSPDfirst_1:
case kPbPb2011_pidTPCTOF_trkSPDorSDD_1:
case kPbPb2011_pidTPCTOF_trkSPDfirst_1:
case kPbPb2011_TPCITS_TOFif1:
case kPbPb2011_TPCTOF_Semi2:
case kPbPb2011_TPCTOF_Semi1:
case kPbPb2011NoPID:
case kPbPb2011TPCandTOF :
case kPbPb2011TPCandTOFHPT:
case kPbPb2011TPC :
case kPbPb2011TPCandTOFwide :
case kPbPb2011TPCorTOF :
case kpp2010TPCandTOF :
case kpp2010TPCorTOF :
//Basic Event Cuts for pp and Pb-Pb, additional cuts may be in the AddTask
eventCuts=new AliDielectronEventCuts("eventCuts","Vertex Track && |vtxZ|<10 && ncontrib>0");
eventCuts->SetVertexType(AliDielectronEventCuts::kVtxSPD); // AOD
//eventCuts->SetVertexType(AliDielectronEventCuts::kVtxTPC); // AOD
// eventCuts->SetCentralityRange(0.0,80.0);
eventCuts->SetRequireVertex();
eventCuts->SetMinVtxContributors(1);
eventCuts->SetVertexZ(-10.,10.);
break;
default: cout << "No Event Cut defined" << endl;
}
return eventCuts;
}
//Selection of relatively 'flat' centralities
AliAnalysisCuts* GetCentralityCuts(Int_t centSel) {
AliDielectronVarCuts* centCuts = 0x0;
switch (centSel) {
case kPbPb2011Central:
centCuts = new AliDielectronVarCuts("centCuts","CentralityPbPb2011Central");
centCuts->AddCut(AliDielectronVarManager::kCentrality,0.,10.);
break;
case kPbPb2011MidCentral:
centCuts = new AliDielectronVarCuts("centCuts","CentralityPbPb2011MidCentral");
centCuts->AddCut(AliDielectronVarManager::kCentrality,10.,20.);
break;
case kPbPb2011SemiCentral:
centCuts = new AliDielectronVarCuts("centCuts","CentralityPbPb2011SemiCentral");
centCuts->AddCut(AliDielectronVarManager::kCentrality,20.,50.);
break;
case kPbPb2011Peripheral:
centCuts = new AliDielectronVarCuts("centCuts","CentralityPbPb2011Peripheral");
centCuts->AddCut(AliDielectronVarManager::kCentrality,50.,90.);
break;
default: cout << "No Centrality selected" << endl;
}
return centCuts;
}
//Basic track rotator settings from J/Psi, more investigation needed
AliDielectronTrackRotator* GetTrackRotator(Int_t cutSet) {
AliDielectronTrackRotator* trackRotator = 0x0;
switch (cutSet) {
case kPbPb2011_pidITSTPC_trkSPDfirst_3:
case kPbPb2011_pidTPC_trkSPDfirst_3:
case kPbPb2011_pidITS2gevTPCTOFif_trkSPD5orSDD4cls_6_tight:
case kPbPb2011_pidITS2gevTPCTOFif_trkSPDfirst5cls_6_tight:
case kPbPb2011_pidITS2gevTPCTOFif_trkSPDorSDD_5_tight:
case kPbPb2011_pidITS2gevTPCTOFif_trkSPDfirst_5_tight:
case kPbPb2011_pidITSTPCTOFif_trkSPD5orSDD4cls_4:
case kPbPb2011_pidITSTPCTOFif_trkSPDfirst5cls_4:
case kPbPb2011_pidITSTPCTOFif_trkSPDorSDD_1:
case kPbPb2011_pidITSTPCTOFif_trkSPDfirst_1:
case kPbPb2011_pidTPCTOF_trkSPDorSDD_1:
case kPbPb2011_pidTPCTOF_trkSPDfirst_1:
case kPbPb2011_TPCITS_TOFif1:
case kPbPb2011_TPCTOF_Semi2:
case kPbPb2011_TPCTOF_Semi1:
case kPbPb2011NoPID:
case kPbPb2011TPCandTOF :
case kPbPb2011TPCandTOFHPT:
case kPbPb2011TPC :
case kPbPb2011TPCandTOFwide :
case kPbPb2011TPCorTOF :
case kpp2010TPCandTOF :
case kpp2010TPCorTOF :
trackRotator = new AliDielectronTrackRotator();
trackRotator->SetIterations(20);
trackRotator->SetConeAnglePhi(TMath::Pi()/180*165);
trackRotator->SetStartAnglePhi(TMath::Pi());
break;
default: cout << "No Rotator defined" << endl;
}
return trackRotator;
}
AliDielectronMixingHandler* GetMixingHandler(Int_t cutSet) {
AliDielectronMixingHandler* mixingHandler = 0x0;
switch (cutSet) {
case kPbPb2011_pidITSTPC_trkSPDfirst_3:
case kPbPb2011_pidTPC_trkSPDfirst_3:
case kPbPb2011_pidITS2gevTPCTOFif_trkSPD5orSDD4cls_6_tight:
case kPbPb2011_pidITS2gevTPCTOFif_trkSPDfirst5cls_6_tight:
case kPbPb2011_pidITS2gevTPCTOFif_trkSPDorSDD_5_tight:
case kPbPb2011_pidITS2gevTPCTOFif_trkSPDfirst_5_tight:
case kPbPb2011_pidITSTPCTOFif_trkSPD5orSDD4cls_4:
case kPbPb2011_pidITSTPCTOFif_trkSPDfirst5cls_4:
case kPbPb2011_pidITSTPCTOFif_trkSPDorSDD_1:
case kPbPb2011_pidITSTPCTOFif_trkSPDfirst_1:
case kPbPb2011_pidTPCTOF_trkSPDorSDD_1:
case kPbPb2011_pidTPCTOF_trkSPDfirst_1:
case kPbPb2011_TPCITS_TOFif1:
case kPbPb2011_TPCTOF_Semi2:
case kPbPb2011_TPCTOF_Semi1:
mixingHandler = new AliDielectronMixingHandler;
mixingHandler->AddVariable(AliDielectronVarManager::kZvPrim,"-10,-5,0,5,10");
mixingHandler->AddVariable(AliDielectronVarManager::kCentrality,"0,5,10,20,30,50,80");
// now using TPC event plane, uncorrected. (also, the old phi range was wrong, now same effective binning.)
mixingHandler->AddVariable(AliDielectronVarManager::kTPCrpH2uc, 6, TMath::Pi()/-2., TMath::Pi()/2.);
mixingHandler->SetDepth(15);
mixingHandler->SetMixType(AliDielectronMixingHandler::kAll);
break;
//[...]
default: cout << "No Mixer defined" << endl;
}
return mixingHandler;
}
//Pair Cuts for Analysis step - take care of logic - inverted compared to other PairCuts!!
// cuts = SELECTION!!!
AliAnalysisCuts* GetPairCutsAna(Int_t cutSet, Bool_t togglePC /*=kFALSE*/) {
cout << " >>>>>>>>>>>>>>>>>>>>>> GetPairCutsAna() >>>>>>>>>>>>>>>>>>>>>> " << endl;
AliAnalysisCuts* pairCuts=0x0;
switch (cutSet) {
case kPbPb2011_pidITSTPC_trkSPDfirst_3:
case kPbPb2011_pidTPC_trkSPDfirst_3:
case kPbPb2011_pidITS2gevTPCTOFif_trkSPD5orSDD4cls_6_tight:
case kPbPb2011_pidITS2gevTPCTOFif_trkSPDfirst5cls_6_tight:
case kPbPb2011_pidITS2gevTPCTOFif_trkSPDorSDD_5_tight:
case kPbPb2011_pidITS2gevTPCTOFif_trkSPDfirst_5_tight:
case kPbPb2011_pidITSTPCTOFif_trkSPD5orSDD4cls_4:
case kPbPb2011_pidITSTPCTOFif_trkSPDfirst5cls_4:
case kPbPb2011_pidITSTPCTOFif_trkSPDorSDD_1:
case kPbPb2011_pidITSTPCTOFif_trkSPDfirst_1:
case kPbPb2011_pidTPCTOF_trkSPDorSDD_1:
case kPbPb2011_pidTPCTOF_trkSPDfirst_1:
cout << "No Pair Cuts used - ok " << endl; // since 18.02.2014
break;
case kPbPb2011_TPCITS_TOFif1:
case kPbPb2011_TPCTOF_Semi2:
// AliDielectronVarCuts* pairCutsPhivGood =new AliDielectronVarCuts("pairCutsPhivGood","pairCutsPhivGood");
// pairCutsPhivGood->AddCut(AliDielectronVarManager::kPhivPair, 0.0, 2.0);
AliDielectronVarCuts* pairCutsOpAngGood =new AliDielectronVarCuts("pairCutsOpAngGood","pairCutsOpAngGood");
pairCutsOpAngGood->AddCut(AliDielectronVarManager::kOpeningAngle, 0.05, 999.); // in upgrade: 0.05
AliDielectronVarCuts* pairCutsInvM =new AliDielectronVarCuts("pairCutsInvM","pairCutsInvM");
pairCutsInvM->AddCut(AliDielectronVarManager::kM, 0.0, 0.02); // in upgrade: 0.01
AliDielectronVarCuts* pairCutsInvMgood =new AliDielectronVarCuts("pairCutsInvMgood","pairCutsInvMgood");
pairCutsInvMgood->AddCut(AliDielectronVarManager::kM, 0.02, 99999.);
AliDielectronCutGroup* pairCutsCG =new AliDielectronCutGroup("pairCutsCG","pairCutsCG",AliDielectronCutGroup::kCompAND);
pairCutsCG->AddCut(pairCutsInvM);
pairCutsCG->AddCut(pairCutsOpAngGood);
// pairCutsCG->AddCut(pairCutsPhivGood);
AliDielectronCutGroup* pairCutsCG2 =new AliDielectronCutGroup("pairCutsCG2","pairCutsCG2",AliDielectronCutGroup::kCompOR);
pairCutsCG2->AddCut(pairCutsInvMgood);
pairCutsCG2->AddCut(pairCutsCG);
pairCuts = pairCutsCG2;
break;
case kPbPb2011_TPCTOF_Semi1:
//[...] // PhiV and InvMass
default: cout << "No Pair Cuts defined " << endl;
}
return pairCuts;
}
//Pair Cuts for PREFILTER step
// cuts = REJECTION!!!
AliAnalysisCuts* GetPairCutsPre(Int_t cutSet) {
cout << " >>>>>>>>>>>>>>>>>>>>>> GetPairCutsPre() >>>>>>>>>>>>>>>>>>>>>> " << endl;
AliAnalysisCuts* pairCuts=0x0;
switch (cutSet) {
case kPbPb2011_pidITSTPC_trkSPDfirst_3:
case kPbPb2011_pidTPC_trkSPDfirst_3:
case kPbPb2011_pidITS2gevTPCTOFif_trkSPD5orSDD4cls_6_tight:
case kPbPb2011_pidITS2gevTPCTOFif_trkSPDfirst5cls_6_tight:
case kPbPb2011_pidITS2gevTPCTOFif_trkSPDorSDD_5_tight:
case kPbPb2011_pidITS2gevTPCTOFif_trkSPDfirst_5_tight:
case kPbPb2011_pidITSTPCTOFif_trkSPD5orSDD4cls_4:
case kPbPb2011_pidITSTPCTOFif_trkSPDfirst5cls_4:
case kPbPb2011_pidITSTPCTOFif_trkSPDorSDD_1:
case kPbPb2011_pidITSTPCTOFif_trkSPDfirst_1:
case kPbPb2011_pidTPCTOF_trkSPDorSDD_1:
case kPbPb2011_pidTPCTOF_trkSPDfirst_1:
case kPbPb2011_TPCITS_TOFif1:
case kPbPb2011_TPCTOF_Semi2:
AliDielectronVarCuts* pairCutsInvM =new AliDielectronVarCuts("pairCutsInvM","pairCutsInvM");
pairCutsInvM->AddCut(AliDielectronVarManager::kM, 0.0, 0.02); // in upgrade: 0.01
AliDielectronVarCuts* pairCutsOpAng =new AliDielectronVarCuts("pairCutsOpAng","pairCutsOpAng");
pairCutsOpAng->AddCut(AliDielectronVarManager::kOpeningAngle, 0.0, 0.05); // in upgrade: 0.05
AliDielectronCutGroup* pairCutsCG =new AliDielectronCutGroup("pairCutsCG","pairCutsCG",AliDielectronCutGroup::kCompAND);
pairCutsCG->AddCut(pairCutsInvM);
pairCutsCG->AddCut(pairCutsOpAng);
//pairCutsCG->AddCut(pairCutsPhiv);
pairCuts = pairCutsCG;
break;
case kPbPb2011_TPCTOF_Semi1:
//[...] // PhiV and InvMass
default: cout << "No Prefilter Pair Cuts defined " << endl;
}
return pairCuts;
}
AliAnalysisCuts* GetPIDCutsAna(Int_t cutSet) {
cout << " >>>>>>>>>>>>>>>>>>>>>> GetPIDCutsAna() >>>>>>>>>>>>>>>>>>>>>> " << endl;
AliAnalysisCuts* pidCuts=0x0;
//-----------------------------------------------
// Define different PID Cuts, that are used later
//-----------------------------------------------
// PID cuts depend on TPC_inner_p, if not specified
// PID cut ranges correspond to global momentum P
// check it again!!!
//-----------------------------------------------
//
//
//TPC: electron inclusion asymmetric
// pion exclusion 3sigma
//TOF: electron inclusion 3sigma in region where p,K cross electrons in TPC
AliDielectronPID *pidTPCTOF_Semi1 = new AliDielectronPID("pidTPCTOF_Semi1","pidTPCTOF_Semi1");
pidTPCTOF_Semi1->AddCut(AliDielectronPID::kTPC,AliPID::kElectron, -1.5, 3., 0. ,100., kFALSE);
pidTPCTOF_Semi1->AddCut(AliDielectronPID::kTPC,AliPID::kPion, -3. , 3., 0. ,100., kTRUE);
pidTPCTOF_Semi1->AddCut(AliDielectronPID::kTOF,AliPID::kElectron, -3. , 3., 0. ,1.7 , kFALSE);
//
//
// LOOSE PID TPC+TOF
AliDielectronPID *pidTPCTOF_Semi_LOOSE = new AliDielectronPID("pidTPCTOF_Semi_LOOSE","pidTPCTOF_Semi_LOOSE");
pidTPCTOF_Semi_LOOSE->AddCut(AliDielectronPID::kTPC,AliPID::kElectron,-12. ,20. , 0. ,100., kFALSE);
pidTPCTOF_Semi_LOOSE->AddCut(AliDielectronPID::kTOF,AliPID::kElectron, -3. , 3. , 0. ,1.7 , kFALSE);
//
//
// PID TPC only
AliDielectronPID *pidTPC_3 = new AliDielectronPID("pidTPC_3","pidTPC_3");
pidTPC_3->AddCut(AliDielectronPID::kTPC,AliPID::kElectron, -1.5, 3., 0. ,100., kFALSE);
pidTPC_3->AddCut(AliDielectronPID::kTPC,AliPID::kPion, -3. , 3., 0. ,100., kTRUE);
//TPC: electron inclusion asymmetric
// pion exclusion 3sigma
//ITS: electron inclusion asymmetric in region where p,K cross electrons in TPC
//TOF: electron inclusion 3sigma in similar region - BUT ONLY IF AVAILABLE
AliDielectronPID *pidTPCITS_TOFif1 = new AliDielectronPID("pidTPCITS_TOFif1","pidTPCITS_TOFif1");
pidTPCITS_TOFif1->AddCut(AliDielectronPID::kTPC,AliPID::kElectron, -1.5, 3. , 0. ,100., kFALSE);
pidTPCITS_TOFif1->AddCut(AliDielectronPID::kTPC,AliPID::kPion, -3. , 3. , 0. ,100., kTRUE);
pidTPCITS_TOFif1->AddCut(AliDielectronPID::kITS,AliPID::kElectron, -4. , 1. , 0. ,1.5 , kFALSE);
pidTPCITS_TOFif1->AddCut(AliDielectronPID::kTOF,AliPID::kElectron, -3. , 3. , 0. ,1.7 , kFALSE, AliDielectronPID::kIfAvailable);
//
//
//TPC: electron inclusion asymmetric
// pion exclusion 3sigma
//ITS: electron inclusion asymmetric OVER FULL MOMENTUM RANGE
//TOF: electron inclusion 3sigma - BUT ONLY IF AVAILABLE
AliDielectronPID *pidTPCITS_TOFif2 = new AliDielectronPID("pidTPCITS_TOFif2","pidTPCITS_TOFif2");
pidTPCITS_TOFif2->AddCut(AliDielectronPID::kTPC,AliPID::kElectron, -1.5, 3. , 0. ,100., kFALSE);
pidTPCITS_TOFif2->AddCut(AliDielectronPID::kTPC,AliPID::kPion, -3. , 3. , 0. ,100., kTRUE);
pidTPCITS_TOFif2->AddCut(AliDielectronPID::kITS,AliPID::kElectron, -4. , 1. , 0. ,100., kFALSE);
pidTPCITS_TOFif2->AddCut(AliDielectronPID::kTOF,AliPID::kElectron, -3. , 3. , 0. ,100., kFALSE, AliDielectronPID::kIfAvailable);
//
//
// LOOSE PID ITS+TPC+TOFif
AliDielectronPID *pidTPCITS_TOFif_LOOSE = new AliDielectronPID("pidTPCITS_TOFif_LOOSE","pidTPCITS_TOFif_LOOSE");
pidTPCITS_TOFif_LOOSE->AddCut(AliDielectronPID::kTPC,AliPID::kElectron,-12. ,20. , 0. ,100., kFALSE);
pidTPCITS_TOFif_LOOSE->AddCut(AliDielectronPID::kITS,AliPID::kElectron,-10. ,20. , 0. ,100., kFALSE);
pidTPCITS_TOFif_LOOSE->AddCut(AliDielectronPID::kTOF,AliPID::kElectron, -3. , 3. , 0. ,100., kFALSE, AliDielectronPID::kIfAvailable);
//
//
// PID ITS+TPC
AliDielectronPID *pidTPCITS_3 = new AliDielectronPID("pidTPCITS_3","pidTPCITS_3");
pidTPCITS_3->AddCut(AliDielectronPID::kTPC,AliPID::kElectron, -1.5, 3. , 0. ,100., kFALSE);
pidTPCITS_3->AddCut(AliDielectronPID::kTPC,AliPID::kPion, -3. , 3. , 0. ,100., kTRUE);
pidTPCITS_3->AddCut(AliDielectronPID::kITS,AliPID::kElectron, -4. , 1. , 0. ,100., kFALSE);
//
//
// tighter PID ITS+TPC+TOFif
// ITS only up to momentum where proton contamination is seen in TPC signal
AliDielectronPID *pidTPCITS_TOFif56 = new AliDielectronPID("pidTPCITS_TOFif56","pidTPCITS_TOFif56");
pidTPCITS_TOFif56->AddCut(AliDielectronPID::kTPC,AliPID::kElectron, -1.5, 2.5, 0. ,100., kFALSE);
pidTPCITS_TOFif56->AddCut(AliDielectronPID::kTPC,AliPID::kPion, -3. , 3. , 0. ,100., kTRUE);
pidTPCITS_TOFif56->AddCut(AliDielectronPID::kITS,AliPID::kElectron, -4. , 0.5, 0. , 2., kFALSE);
pidTPCITS_TOFif56->AddCut(AliDielectronPID::kTOF,AliPID::kElectron, -2. , 2. , 0. ,100., kFALSE, AliDielectronPID::kIfAvailable);
//Apply ITS cuts (see Hongyan's talks):
//3 sigma inclusion of electrons in TPC
//3 sigma exclusion of pions in TPC
//3 sigma inclusion of electrons in ITS,TOF for p<1.5GeV, where p,K contamination
//TOF only IF available!
AliDielectronPID *pidTPCandITSTOF = new AliDielectronPID("pidTPCandITSTOF","pidTPCandITSTOF");//"TPC-TOF-ITS"
pidTPCandITSTOF->AddCut(AliDielectronPID::kTPC,AliPID::kElectron, -3.,3., 0.,100., kFALSE);
pidTPCandITSTOF->AddCut(AliDielectronPID::kTPC,AliPID::kPion, -3.,3., 0.,100., kTRUE);
pidTPCandITSTOF->AddCut(AliDielectronPID::kITS,AliPID::kElectron, -6.,3., 0.,1.5, kFALSE );
pidTPCandITSTOF->AddCut(AliDielectronPID::kTOF,AliPID::kElectron, -3.,3., 0.,1.5, kFALSE,AliDielectronPID::kIfAvailable );
// eta range:
AliDielectronVarCuts *etaRange090 = new AliDielectronVarCuts("etaRange090","etaRange090");
etaRange090->AddCut(AliDielectronVarManager::kEta, -0.90, 0.90);
AliDielectronVarCuts *etaRange084 = new AliDielectronVarCuts("etaRange084","etaRange084");
etaRange084->AddCut(AliDielectronVarManager::kEta, -0.84, 0.84);
AliDielectronVarCuts *etaRange076 = new AliDielectronVarCuts("etaRange076","etaRange076");
etaRange076->AddCut(AliDielectronVarManager::kEta, -0.76, 0.76);
// pt range:
AliDielectronVarCuts *ptRange400to3500 = new AliDielectronVarCuts("ptRange400to3500","ptRange400to3500");
ptRange400to3500->AddCut(AliDielectronVarManager::kPt, .4, 3.5);
//-----------------------------------------------
// Now see what Config actually loads and assemble final cuts
//-----------------------------------------------
switch (cutSet) {
case kPbPb2011_pidITS2gevTPCTOFif_trkSPD5orSDD4cls_6_tight: // tighter "ITSTPCTOFif" PID
case kPbPb2011_pidITS2gevTPCTOFif_trkSPDfirst5cls_6_tight:
case kPbPb2011_pidITS2gevTPCTOFif_trkSPDorSDD_5_tight:
case kPbPb2011_pidITS2gevTPCTOFif_trkSPDfirst_5_tight:
AliDielectronCutGroup* cgPIDCutsAna = new AliDielectronCutGroup("cgPIDCutsAna","cgPIDCutsAna",AliDielectronCutGroup::kCompAND);
cgPIDCutsAna->AddCut(etaRange076);
cgPIDCutsAna->AddCut(ptRange400to3500);
cgPIDCutsAna->AddCut(pidTPCITS_TOFif56);
cgPIDCutsAna->AddCut(GetTrackCutsAna(cutSet));
pidCuts = cgPIDCutsAna;
break;
case kPbPb2011_pidITSTPC_trkSPDfirst_3:
AliDielectronCutGroup* cgPIDCutsAna = new AliDielectronCutGroup("cgPIDCutsAna","cgPIDCutsAna",AliDielectronCutGroup::kCompAND);
cgPIDCutsAna->AddCut(etaRange076);
cgPIDCutsAna->AddCut(ptRange400to3500);
cgPIDCutsAna->AddCut(pidTPCITS_3);
cgPIDCutsAna->AddCut(GetTrackCutsAna(cutSet));
pidCuts = cgPIDCutsAna;
break;
case kPbPb2011_pidTPC_trkSPDfirst_3:
AliDielectronCutGroup* cgPIDCutsAna = new AliDielectronCutGroup("cgPIDCutsAna","cgPIDCutsAna",AliDielectronCutGroup::kCompAND);
cgPIDCutsAna->AddCut(etaRange090);
cgPIDCutsAna->AddCut(ptRange400to3500);
cgPIDCutsAna->AddCut(pidTPC_3);
cgPIDCutsAna->AddCut(GetTrackCutsAna(cutSet));
pidCuts = cgPIDCutsAna;
break;
case kPbPb2011_pidITSTPCTOFif_trkSPDorSDD_2_loose: // loose "ITSTPCTOFif" PID - for 2D contamination study
case kPbPb2011_pidITSTPCTOFif_trkSPDfirst_2_loose:
AliDielectronCutGroup* cgPIDCutsAna = new AliDielectronCutGroup("cgPIDCutsAna","cgPIDCutsAna",AliDielectronCutGroup::kCompAND);
cgPIDCutsAna->AddCut(etaRange076);
cgPIDCutsAna->AddCut(ptRange400to3500);
cgPIDCutsAna->AddCut(pidTPCITS_TOFif_LOOSE);
cgPIDCutsAna->AddCut(GetTrackCutsAna(cutSet));
pidCuts = cgPIDCutsAna;
break;
case kPbPb2011_pidTPCTOF_trkSPDorSDD_2_loose:
case kPbPb2011_pidTPCTOF_trkSPDfirst_2_loose:
AliDielectronCutGroup* cgPIDCutsAna = new AliDielectronCutGroup("cgPIDCutsAna","cgPIDCutsAna",AliDielectronCutGroup::kCompAND);
cgPIDCutsAna->AddCut(etaRange090);
cgPIDCutsAna->AddCut(ptRange400to3500);
cgPIDCutsAna->AddCut(pidTPCTOF_Semi_LOOSE);
cgPIDCutsAna->AddCut(GetTrackCutsAna(cutSet));
pidCuts = cgPIDCutsAna;
break;
case kPbPb2011_pidITSTPCTOFif_trkSPD5orSDD4cls_4: // regular "ITSTPCTOFif" PID
case kPbPb2011_pidITSTPCTOFif_trkSPDfirst5cls_4:
case kPbPb2011_pidITSTPCTOFif_trkSPDorSDD_1:
case kPbPb2011_pidITSTPCTOFif_trkSPDfirst_1:
AliDielectronCutGroup* cgPIDCutsAna = new AliDielectronCutGroup("cgPIDCutsAna","cgPIDCutsAna",AliDielectronCutGroup::kCompAND);
cgPIDCutsAna->AddCut(etaRange076);
cgPIDCutsAna->AddCut(ptRange400to3500);
cgPIDCutsAna->AddCut(pidTPCITS_TOFif2);
cgPIDCutsAna->AddCut(GetTrackCutsAna(cutSet));
pidCuts = cgPIDCutsAna;
break;
case kPbPb2011_pidTPCTOF_trkSPDorSDD_1:
case kPbPb2011_pidTPCTOF_trkSPDfirst_1:
AliDielectronCutGroup* cgPIDCutsAna = new AliDielectronCutGroup("cgPIDCutsAna","cgPIDCutsAna",AliDielectronCutGroup::kCompAND);
cgPIDCutsAna->AddCut(etaRange090);
cgPIDCutsAna->AddCut(ptRange400to3500);
cgPIDCutsAna->AddCut(pidTPCTOF_Semi1);
cgPIDCutsAna->AddCut(GetTrackCutsAna(cutSet));
pidCuts = cgPIDCutsAna;
break;
case kPbPb2011_TPCITS_TOFif1:
AliDielectronCutGroup* cgPIDCutsAna = new AliDielectronCutGroup("cgPIDCutsAna","cgPIDCutsAna",AliDielectronCutGroup::kCompAND);
cgPIDCutsAna->AddCut(etaRange084); // was 0.84 -> not ideal
cgPIDCutsAna->AddCut(ptRange400to3500);
cgPIDCutsAna->AddCut(pidTPCITS_TOFif1);
cgPIDCutsAna->AddCut(GetTrackCutsAna(cutSet));
pidCuts = cgPIDCutsAna;
break;
case kPbPb2011_TPCTOF_Semi2:
case kPbPb2011_TPCTOF_Semi1:
AliDielectronCutGroup* cgPIDCutsAna = new AliDielectronCutGroup("cgPIDCutsAna","cgPIDCutsAna",AliDielectronCutGroup::kCompAND);
cgPIDCutsAna->AddCut(etaRange084);
cgPIDCutsAna->AddCut(ptRange400to3500);
cgPIDCutsAna->AddCut(pidTPCTOF_Semi1);
cgPIDCutsAna->AddCut(GetTrackCutsAna(cutSet)); // for 'kPbPb2011_TPCTOF_Semi1', this was called in the Config
pidCuts = cgPIDCutsAna;
break;
//[...]
case kPbPb2011TPCandTOFHPT:
//test Hongyan's cut
AliDielectronCutGroup* cgSecondTrackFilterPIDTPC1 = new AliDielectronCutGroup("cgPIDTPC1","cgPIDTPC1",AliDielectronCutGroup::kCompAND);
cgSecondTrackFilterPIDTPC1->AddCut(etaRange084);
cgSecondTrackFilterPIDTPC1->AddCut(ptRange400to3500);
cgSecondTrackFilterPIDTPC1->AddCut(pidTPCandITSTOF);
pidCuts = cgSecondTrackFilterPIDTPC1;
break;
//[...]
default: cout << "No Analysis PID Cut defined " << endl;
}
return pidCuts;
}
//Make/Tighten track Cuts that are *NOT* already
//done in the AOD production
//**IMPORTANT**: For AODs, select FilterBit
//the method is ignored for ESDs
AliAnalysisCuts* GetTrackCutsAna(Int_t cutSet) {
cout << " >>>>>>>>>>>>>>>>>>>>>> GetTrackCutsAna() >>>>>>>>>>>>>>>>>>>>>> " << endl;
AliDielectronCutGroup* trackCuts=0x0;
switch (cutSet) {
//----------
// these MAIN settings have to combine different track selections:
//----------
case kPbPb2011_pidITS2gevTPCTOFif_trkSPDorSDD_5_tight:
case kPbPb2011_pidITSTPCTOFif_trkSPDorSDD_2_loose:
case kPbPb2011_pidTPCTOF_trkSPDorSDD_2_loose:
case kPbPb2011_pidITSTPCTOFif_trkSPDorSDD_1:
case kPbPb2011_pidTPCTOF_trkSPDorSDD_1:
// combine typical and new trackcuts with "kCompOR" condition:
cgTrackCutsAnaSPDorSDD = new AliDielectronCutGroup("cgTrackCutsAnaSPDorSDD","cgTrackCutsAnaSPDorSDD",AliDielectronCutGroup::kCompOR);
cgTrackCutsAnaSPDorSDD->AddCut(GetTrackCutsAna(kPbPb2011TRK_SPDfirst)); // typical trackcuts with requirement of SPD
cgTrackCutsAnaSPDorSDD->AddCut(GetTrackCutsAna(kPbPb2011TRK_SDDfirstSPDnone)); // new additional trackcuts with SDD instead of SPD
trackCuts = cgTrackCutsAnaSPDorSDD;
break;
//----------
// these MAIN settings just load the main track selection directly below:
//----------
case kPbPb2011_pidITS2gevTPCTOFif_trkSPDfirst_5_tight:
case kPbPb2011_pidITSTPC_trkSPDfirst_3:
case kPbPb2011_pidTPC_trkSPDfirst_3:
case kPbPb2011_pidITSTPCTOFif_trkSPDfirst_2_loose:
case kPbPb2011_pidTPCTOF_trkSPDfirst_2_loose:
case kPbPb2011_pidITSTPCTOFif_trkSPDfirst_1:
case kPbPb2011_pidTPCTOF_trkSPDfirst_1:
//----------
case kPbPb2011TRK_SPDfirst: // main track selection, now closer to what Hongyan does...
AliDielectronVarCuts* trackCutsAOD =new AliDielectronVarCuts("trackCutsAOD","trackCutsAOD");
trackCutsAOD->AddCut(AliDielectronVarManager::kImpactParXY, -1.0, 1.0);
trackCutsAOD->AddCut(AliDielectronVarManager::kImpactParZ, -3.0, 3.0);
trackCutsAOD->AddCut(AliDielectronVarManager::kNclsITS, 4.0, 100.0); // means at least 2 with PID
trackCutsAOD->AddCut(AliDielectronVarManager::kTPCchi2Cl, 0.0, 4.0);
trackCutsAOD->AddCut(AliDielectronVarManager::kNFclsTPCr, 100.0, 160.0);
trackCutsAOD->AddCut(AliDielectronVarManager::kNFclsTPCfCross, 0.8, 1.1); // lower limit 0.8 in most filterbits! // 1.1 since 26.02.2014
AliDielectronTrackCuts *trackCutsDiel = new AliDielectronTrackCuts("trackCutsDiel","trackCutsDiel");
trackCutsDiel->SetAODFilterBit(1<<4); // (=16) filterbit 4! //GetStandardITSTPCTrackCuts2011(kFALSE); loose DCA, 2D cut
trackCutsDiel->SetClusterRequirementITS(AliESDtrackCuts::kSPD,AliESDtrackCuts::kFirst);
cgTrackCutsAnaSPDfirst = new AliDielectronCutGroup("cgTrackCutsAnaSPDfirst","cgTrackCutsAnaSPDfirst",AliDielectronCutGroup::kCompAND);
cgTrackCutsAnaSPDfirst->AddCut(trackCutsDiel);
cgTrackCutsAnaSPDfirst->AddCut(trackCutsAOD);
trackCuts = cgTrackCutsAnaSPDfirst;
break;
case kPbPb2011TRK_SDDfirstSPDnone: // complimentary tracks, strictly without SPD, to be combined with others!
AliDielectronVarCuts* trackCutsAOD =new AliDielectronVarCuts("trackCutsAOD","trackCutsAOD");
trackCutsAOD->AddCut(AliDielectronVarManager::kImpactParXY, -1.0, 1.0);
trackCutsAOD->AddCut(AliDielectronVarManager::kImpactParZ, -3.0, 3.0);
trackCutsAOD->AddCut(AliDielectronVarManager::kNclsITS, 3.0, 100.0); // means at least 3 with PID
trackCutsAOD->AddCut(AliDielectronVarManager::kTPCchi2Cl, 0.0, 4.0);
trackCutsAOD->AddCut(AliDielectronVarManager::kNFclsTPCr, 100.0, 160.0);
trackCutsAOD->AddCut(AliDielectronVarManager::kNFclsTPCfCross, 0.8, 1.1); // lower limit 0.8 in most filterbits! // 1.1 since 26.02.2014
AliDielectronTrackCuts *trackCutsDiel = new AliDielectronTrackCuts("trackCutsDiel","trackCutsDiel");
trackCutsDiel->SetAODFilterBit(1<<6); // GetStandardITSTPCTrackCuts2011(kTRUE), SPD none, SDD first
cgTrackCutsAnaSDDnoSPD = new AliDielectronCutGroup("cgTrackCutsAnaSDDnoSPD","cgTrackCutsAnaSDDnoSPD",AliDielectronCutGroup::kCompAND);
cgTrackCutsAnaSDDnoSPD->AddCut(trackCutsDiel);
cgTrackCutsAnaSDDnoSPD->AddCut(trackCutsAOD);
trackCuts = cgTrackCutsAnaSDDnoSPD;
break;
//----------
// MAIN settings - combined trackset - variation 1
//----------
case kPbPb2011_pidITS2gevTPCTOFif_trkSPD5orSDD4cls_6_tight:
case kPbPb2011_pidITSTPCTOFif_trkSPD5orSDD4cls_4:
// combine typical and new trackcuts with "kCompOR" condition:
cgTrackCutsAnaSPDorSDD = new AliDielectronCutGroup("cgTrackCutsAnaSPDorSDD","cgTrackCutsAnaSPDorSDD",AliDielectronCutGroup::kCompOR);
cgTrackCutsAnaSPDorSDD->AddCut(GetTrackCutsAna(kPbPb2011TRK_SPDfirst5cls)); // typical trackcuts with requirement of SPD
cgTrackCutsAnaSPDorSDD->AddCut(GetTrackCutsAna(kPbPb2011TRK_SDDfirstSPDnone4cls)); // new additional trackcuts with SDD instead of SPD
trackCuts = cgTrackCutsAnaSPDorSDD;
break;
//----------
// MAIN settings - single trackset - variation 1
//----------
case kPbPb2011_pidITS2gevTPCTOFif_trkSPDfirst5cls_6_tight:
case kPbPb2011_pidITSTPCTOFif_trkSPDfirst5cls_4:
//----------
case kPbPb2011TRK_SPDfirst5cls: // main track selection, 5+ ITS clusters
AliDielectronVarCuts* trackCutsAOD =new AliDielectronVarCuts("trackCutsAOD","trackCutsAOD");
trackCutsAOD->AddCut(AliDielectronVarManager::kImpactParXY, -1.0, 1.0);
trackCutsAOD->AddCut(AliDielectronVarManager::kImpactParZ, -3.0, 3.0);
trackCutsAOD->AddCut(AliDielectronVarManager::kNclsITS, 5.0, 100.0); // means at least 3 with PID
trackCutsAOD->AddCut(AliDielectronVarManager::kTPCchi2Cl, 0.0, 4.0);
trackCutsAOD->AddCut(AliDielectronVarManager::kNFclsTPCr, 100.0, 160.0);
trackCutsAOD->AddCut(AliDielectronVarManager::kNFclsTPCfCross, 0.8, 1.1);
AliDielectronTrackCuts *trackCutsDiel = new AliDielectronTrackCuts("trackCutsDiel","trackCutsDiel");
trackCutsDiel->SetAODFilterBit(1<<4); // (=16) filterbit 4! //GetStandardITSTPCTrackCuts2011(kFALSE); loose DCA, 2D cut
trackCutsDiel->SetClusterRequirementITS(AliESDtrackCuts::kSPD,AliESDtrackCuts::kFirst);
cgTrackCutsAnaSPDfirst = new AliDielectronCutGroup("cgTrackCutsAnaSPDfirst","cgTrackCutsAnaSPDfirst",AliDielectronCutGroup::kCompAND);
cgTrackCutsAnaSPDfirst->AddCut(trackCutsDiel);
cgTrackCutsAnaSPDfirst->AddCut(trackCutsAOD);
trackCuts = cgTrackCutsAnaSPDfirst;
break;
case kPbPb2011TRK_SDDfirstSPDnone4cls: // complimentary tracks, 4+ ITS clusters, strictly without SPD, to be combined with others!
AliDielectronVarCuts* trackCutsAOD =new AliDielectronVarCuts("trackCutsAOD","trackCutsAOD");
trackCutsAOD->AddCut(AliDielectronVarManager::kImpactParXY, -1.0, 1.0);
trackCutsAOD->AddCut(AliDielectronVarManager::kImpactParZ, -3.0, 3.0);
trackCutsAOD->AddCut(AliDielectronVarManager::kNclsITS, 4.0, 100.0); // means at least 4 with PID
trackCutsAOD->AddCut(AliDielectronVarManager::kTPCchi2Cl, 0.0, 4.0);
trackCutsAOD->AddCut(AliDielectronVarManager::kNFclsTPCr, 100.0, 160.0);
trackCutsAOD->AddCut(AliDielectronVarManager::kNFclsTPCfCross, 0.8, 1.1);
AliDielectronTrackCuts *trackCutsDiel = new AliDielectronTrackCuts("trackCutsDiel","trackCutsDiel");
trackCutsDiel->SetAODFilterBit(1<<6); // GetStandardITSTPCTrackCuts2011(kTRUE), SPD none, SDD first
cgTrackCutsAnaSDDnoSPD = new AliDielectronCutGroup("cgTrackCutsAnaSDDnoSPD","cgTrackCutsAnaSDDnoSPD",AliDielectronCutGroup::kCompAND);
cgTrackCutsAnaSDDnoSPD->AddCut(trackCutsDiel);
cgTrackCutsAnaSDDnoSPD->AddCut(trackCutsAOD);
trackCuts = cgTrackCutsAnaSDDnoSPD;
break;
// ==========
case kPbPb2011_TPCITS_TOFif1:
case kPbPb2011_TPCTOF_Semi2: // no pt and eta ranges in the trackcuts anymore!
AliDielectronVarCuts* trackCutsAOD =new AliDielectronVarCuts("trackCutsAOD","trackCutsAOD");
// trackCutsAOD->AddCut(AliDielectronVarManager::kEta, -0.84, 0.84); // eta commented out later. (05.02.2014)
trackCutsAOD->AddCut(AliDielectronVarManager::kImpactParXY, -1.0, 1.0);
trackCutsAOD->AddCut(AliDielectronVarManager::kImpactParZ, -3.0, 3.0);
trackCutsAOD->AddCut(AliDielectronVarManager::kNclsITS, 3.0, 100.0);
trackCutsAOD->AddCut(AliDielectronVarManager::kTPCchi2Cl, 0.0, 3.5);
trackCutsAOD->AddCut(AliDielectronVarManager::kNFclsTPCr, 110.0, 160.0);
trackCutsAOD->AddCut(AliDielectronVarManager::kNFclsTPCfCross, 0.8, 1.0);
AliDielectronTrackCuts *trackCutsDiel = new AliDielectronTrackCuts("trackCutsDiel","trackCutsDiel");
trackCutsDiel->SetAODFilterBit(16); //does nothing for ESDs // 16=2^4 -> filter bit 4!
trackCutsDiel->SetClusterRequirementITS(AliESDtrackCuts::kSPD,AliESDtrackCuts::kFirst); //function in AliDielectronTrackCuts
cgTrackCutsAna = new AliDielectronCutGroup("cgTrackCutsAna","cgTrackCutsAna",AliDielectronCutGroup::kCompAND);
cgTrackCutsAna->AddCut(trackCutsDiel);
cgTrackCutsAna->AddCut(trackCutsAOD);
trackCuts = cgTrackCutsAna;
break;
case kPbPb2011_TPCTOF_Semi1:
//[...]
default: cout << "No Analysis Track Cut defined " << endl;
}
return trackCuts;
}
//Relaxed PID cuts for additional rejectin step, do not use blindly
AliAnalysisCuts* GetPIDCutsPre(Int_t cutSet) {
cout << " >>>>>>>>>>>>>>>>>>>>>> GetPIDCutsPre() >>>>>>>>>>>>>>>>>>>>>> " << endl;
AliAnalysisCuts* pidCuts=0x0;
switch (cutSet) {
case kPbPb2011_pidITSTPC_trkSPDfirst_3:
case kPbPb2011_pidTPC_trkSPDfirst_3:
case kPbPb2011_pidITSTPCTOFif_trkSPDorSDD_2_loose:
case kPbPb2011_pidITSTPCTOFif_trkSPDfirst_2_loose:
case kPbPb2011_pidTPCTOF_trkSPDorSDD_2_loose:
case kPbPb2011_pidTPCTOF_trkSPDfirst_2_loose:
case kPbPb2011_pidITS2gevTPCTOFif_trkSPD5orSDD4cls_6_tight:
case kPbPb2011_pidITS2gevTPCTOFif_trkSPDfirst5cls_6_tight:
case kPbPb2011_pidITS2gevTPCTOFif_trkSPDorSDD_5_tight:
case kPbPb2011_pidITS2gevTPCTOFif_trkSPDfirst_5_tight:
case kPbPb2011_pidITSTPCTOFif_trkSPD5orSDD4cls_4:
case kPbPb2011_pidITSTPCTOFif_trkSPDfirst5cls_4:
case kPbPb2011_pidITSTPCTOFif_trkSPDorSDD_1:
case kPbPb2011_pidITSTPCTOFif_trkSPDfirst_1:
case kPbPb2011_pidTPCTOF_trkSPDorSDD_1:
case kPbPb2011_pidTPCTOF_trkSPDfirst_1:
case kPbPb2011_TPCITS_TOFif1:
case kPbPb2011_TPCTOF_Semi2:
// eta range:
AliDielectronVarCuts *etaRangePre1 = new AliDielectronVarCuts("etaRangePre1","etaRangePre1");
etaRangePre1->AddCut(AliDielectronVarManager::kEta,-0.9,0.9);
// pt range:
AliDielectronVarCuts *ptRangePre1 = new AliDielectronVarCuts("ptRangePre1","ptRangePre1");
ptRangePre1->AddCut(AliDielectronVarManager::kPt, .2, 3.5); // 0.2 is realistic. turnon at ~180MeV
//AliDielectronVarCuts *ptRangePre2 = new AliDielectronVarCuts("ptRangePre2","ptRangePre2");
//ptRangePre2->AddCut(AliDielectronVarManager::kPt, .4, 3.5);
//AliDielectronVarCuts *ptRangePre3 = new AliDielectronVarCuts("ptRangePre3","ptRangePre3");
//ptRangePre3->AddCut(AliDielectronVarManager::kPt, 0.05, 1.5);
AliDielectronCutGroup* cgITSTPCTOFpre = new AliDielectronCutGroup("cgITSTPCTOFpre","cgITSTPCTOFpre",AliDielectronCutGroup::kCompAND);
AliDielectronPID *pidITSTPCTOFpre = new AliDielectronPID("pidITSTPCTOFpre","pidITSTPCTOFpre");
pidITSTPCTOFpre->AddCut(AliDielectronPID::kTPC,AliPID::kElectron, -3. , 3., 0. ,100., kFALSE);
pidITSTPCTOFpre->AddCut(AliDielectronPID::kTPC,AliPID::kPion, -3. , 3., 0. ,100., kTRUE);
// ITS will be used:
// pidITSTPCTOFpre->AddCut(AliDielectronPID::kITS,AliPID::kElectron, -3. , 3., 0. ,1.7 , kFALSE);
// TOF will be used if available, and with pt instead of p:
// pidITSTPCTOFpre->AddCut(AliDielectronPID::kTOF,AliPID::kElectron, -3. , 3., 0.4,100., kFALSE,
// AliDielectronPID::kIfAvailable, AliDielectronVarManager::kPt);
cgITSTPCTOFpre->AddCut(pidITSTPCTOFpre);
cgITSTPCTOFpre->AddCut(etaRangePre1);
cgITSTPCTOFpre->AddCut(ptRangePre1);
cgITSTPCTOFpre->AddCut(GetTrackCutsAna(cutSet));
// AliDielectronCutGroup* cgTPCpre = new AliDielectronCutGroup("cgTPCpre","cgTPCpre",AliDielectronCutGroup::kCompAND);
// AliDielectronPID *pidTPCpre = new AliDielectronPID("pidTPCpre","pidTPCpre");
// pidTPCpre->AddCut(AliDielectronPID::kTPC,AliPID::kElectron, -3. , 3., 0. ,100., kFALSE);
// pidTPCpre->AddCut(AliDielectronPID::kTPC,AliPID::kPion, -3. , 3., 0. ,100., kTRUE);
// // TOF will be used if available, and with pt instead of p:
// pidTPCpre->AddCut(AliDielectronPID::kTOF,AliPID::kElectron, -3. , 3., 0.4,5. , kFALSE,
// AliDielectronPID::kIfAvailable, AliDielectronVarManager::kPt);
// cgTPCpre->AddCut(pidTPCpre);
// cgITSTPCTOFpre->AddCut(etaRangePre1);
// cgTPCpre->AddCut(ptRangePre2);
// cgTPCpre->AddCut(GetTrackCutsAna(cutSet));
// AliDielectronCutGroup* cgITSSA = new AliDielectronCutGroup("cgITSSA","cgITSSA",AliDielectronCutGroup::kCompAND);
// AliDielectronPID *pidITSSA = new AliDielectronPID("pidITSSA","pidITSSA");
// pidITSSA->AddCut(AliDielectronPID::kITS,AliPID::kElectron, -3., 3.);
// // this means that very many pions will be used for rejection!
// cgITSSA->AddCut(pidITSSA);
// cgITSTPCTOFpre->AddCut(etaRangePre1);
// cgITSSA->AddCut(ptRangePre3);
// cgITSSA->AddCut(GetTrackCutsPre(cutSet));
AliDielectronCutGroup* cgInitialTrackFilter = new AliDielectronCutGroup("cgInitialTrackFilter","cgInitialTrackFilter",AliDielectronCutGroup::kCompOR);
cgInitialTrackFilter->AddCut(GetPIDCutsAna(cutSet)); // in case the prefilter cuts do not include all needed global tracks.
cgInitialTrackFilter->AddCut(cgITSTPCTOFpre);
//cgInitialTrackFilter->AddCut(cgTPCpre);
//cgInitialTrackFilter->AddCut(cgITSSA);
pidCuts = cgInitialTrackFilter; // kCompOR works!!! <- checked with 'SetNoPairing()' and commented out 'GetPIDCutsAna(selectedPID)'
//cout << " ========== pidCuts prefilter: ========== " << endl;
//pidCuts->Print();
break;
case kPbPb2011_TPCTOF_Semi1:
//[...]
default: cout << "No Prefilter PID Cut defined " << endl;
}
return pidCuts;
}
//Possibly different cut sets for Prefilter step
//Not used at the moment
AliAnalysisCuts* GetTrackCutsPre(Int_t cutSet) {
cout << " >>>>>>>>>>>>>>>>>>>>>> GetTrackCutsPre() >>>>>>>>>>>>>>>>>>>>>> " << endl;
AliDielectronCutGroup* trackCuts=0x0;
switch (cutSet) {
case kPbPb2011_pidITSTPC_trkSPDfirst_3:
case kPbPb2011_pidTPC_trkSPDfirst_3:
case kPbPb2011_pidITSTPCTOFif_trkSPDorSDD_2_loose:
case kPbPb2011_pidITSTPCTOFif_trkSPDfirst_2_loose:
case kPbPb2011_pidTPCTOF_trkSPDorSDD_2_loose:
case kPbPb2011_pidTPCTOF_trkSPDfirst_2_loose:
case kPbPb2011_pidITS2gevTPCTOFif_trkSPD5orSDD4cls_6_tight:
case kPbPb2011_pidITS2gevTPCTOFif_trkSPDfirst5cls_6_tight:
case kPbPb2011_pidITS2gevTPCTOFif_trkSPDorSDD_5_tight:
case kPbPb2011_pidITS2gevTPCTOFif_trkSPDfirst_5_tight:
case kPbPb2011_pidITSTPCTOFif_trkSPD5orSDD4cls_4:
case kPbPb2011_pidITSTPCTOFif_trkSPDfirst5cls_4:
case kPbPb2011_pidITSTPCTOFif_trkSPDorSDD_1:
case kPbPb2011_pidITSTPCTOFif_trkSPDfirst_1:
case kPbPb2011_pidTPCTOF_trkSPDorSDD_1:
AliDielectronVarCuts* trackCutsAOD =new AliDielectronVarCuts("trackCutsAOD","trackCutsAOD");
trackCutsAOD->AddCut(AliDielectronVarManager::kEta,-0.84,0.84);
trackCutsAOD->AddCut(AliDielectronVarManager::kImpactParXY, -1.0, 1.0);
trackCutsAOD->AddCut(AliDielectronVarManager::kImpactParZ, -3.0, 3.0);
trackCutsAOD->AddCut(AliDielectronVarManager::kNclsITS, 3.0, 100.0);
AliDielectronTrackCuts *trackCutsDiel = new AliDielectronTrackCuts("trackCutsDiel","trackCutsDiel");
trackCutsDiel->SetAODFilterBit(1); //does nothing for ESDs, ITSSA(???) // maybe use FilterBit(2) instead!
cgTrackCutsPre = new AliDielectronCutGroup("cgTrackCutsPre","cgTrackCutsPre",AliDielectronCutGroup::kCompAND);
cgTrackCutsPre->AddCut(trackCutsDiel);
cgTrackCutsPre->AddCut(trackCutsAOD);
trackCuts = cgTrackCutsPre;
break;
case kPbPb2011_pidTPCTOF_trkSPDfirst_1:
AliDielectronVarCuts* trackCutsAOD =new AliDielectronVarCuts("trackCutsAOD","trackCutsAOD");
trackCutsAOD->AddCut(AliDielectronVarManager::kEta,-0.9,0.9);
trackCutsAOD->AddCut(AliDielectronVarManager::kImpactParXY, -1.0, 1.0);
trackCutsAOD->AddCut(AliDielectronVarManager::kImpactParZ, -3.0, 3.0);
trackCutsAOD->AddCut(AliDielectronVarManager::kNclsITS, 4.0, 100.0);
AliDielectronTrackCuts *trackCutsDiel = new AliDielectronTrackCuts("trackCutsDiel","trackCutsDiel");
trackCutsDiel->SetAODFilterBit(1); //does nothing for ESDs, ITSSA(???) // maybe use FilterBit(2) instead!
trackCutsDiel->SetRequireITSRefit(kTRUE); //function in AliDielectronTrackCuts
trackCutsDiel->SetClusterRequirementITS(AliESDtrackCuts::kSPD,AliESDtrackCuts::kFirst); //function in AliDielectronTrackCuts
cgTrackCutsPre = new AliDielectronCutGroup("cgTrackCutsPre","cgTrackCutsPre",AliDielectronCutGroup::kCompAND);
cgTrackCutsPre->AddCut(trackCutsDiel);
cgTrackCutsPre->AddCut(trackCutsAOD);
trackCuts = cgTrackCutsPre;
break;
case kPbPb2011_TPCITS_TOFif1:
case kPbPb2011_TPCTOF_Semi2: // no pt ranges in the trackcuts anymore!
AliDielectronVarCuts* trackCutsAOD =new AliDielectronVarCuts("trackCutsAOD","trackCutsAOD");
trackCutsAOD->AddCut(AliDielectronVarManager::kEta,-0.84,0.84);
trackCutsAOD->AddCut(AliDielectronVarManager::kImpactParXY, -1.0, 1.0);
trackCutsAOD->AddCut(AliDielectronVarManager::kImpactParZ, -3.0, 3.0);
trackCutsAOD->AddCut(AliDielectronVarManager::kNclsITS, 3.0, 100.0);
AliDielectronTrackCuts *trackCutsDiel = new AliDielectronTrackCuts("trackCutsDiel","trackCutsDiel");
trackCutsDiel->SetAODFilterBit(1); //does nothing for ESDs, ITSSA(???) // maybe use FilterBit(2) instead!
trackCutsDiel->SetRequireITSRefit(kTRUE); //function in AliDielectronTrackCuts
trackCutsDiel->SetClusterRequirementITS(AliESDtrackCuts::kSPD,AliESDtrackCuts::kFirst); //function in AliDielectronTrackCuts
cgTrackCutsPre = new AliDielectronCutGroup("cgTrackCutsPre","cgTrackCutsPre",AliDielectronCutGroup::kCompAND);
cgTrackCutsPre->AddCut(trackCutsDiel);
cgTrackCutsPre->AddCut(trackCutsAOD);
trackCuts = cgTrackCutsPre;
break;
case kPbPb2011_TPCTOF_Semi1:
//[...]
default: cout << "No Prefilter Track Cut defined " << endl;
}
return trackCuts;
}
//*******************************************************************************
//*******************************************************************************
//** ESD TRACK CUTS TUNED FOR AGREEMENT BETWEEN AODS AND ESDS ******************
//** NOT NECESSARILY 100% OPTIMIZED FOR DIEL-ANALYSIS ******************
//*******************************************************************************
//*******************************************************************************
//WHEN RUNNING ON ESDs: LOAD Default Cuts for AODs
AliAnalysisCuts* GetESDTrackCutsAna(Int_t cutSet) {
//cout << " >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> " << endl;
cout << " >>>>>>>>>>>>>>>>>>>>>> GetESDTrackCutsAna() >>>>>>>>>>>>>>>>>>>>>> " << endl;
//cout << " >>>>>>>>>>>>>>>>>>>>>> Setting ESD Track Cuts >>>>>>>>>>>>>>>>>>>>>> " << endl;
//cout << " >>>>>>>>>>>>>>>>>>>>>> ( do we run on ESD?! ) >>>>>>>>>>>>>>>>>>>>>> " << endl;
//cout << " >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> " << endl;
AliESDtrackCuts* esdTrackCutsH = 0x0;
switch (cutSet) {
case kPbPb2011_pidITSTPC_trkSPDfirst_3:
case kPbPb2011_pidTPC_trkSPDfirst_3:
case kPbPb2011_pidITSTPCTOFif_trkSPDorSDD_2_loose:
case kPbPb2011_pidITSTPCTOFif_trkSPDfirst_2_loose:
case kPbPb2011_pidTPCTOF_trkSPDorSDD_2_loose:
case kPbPb2011_pidTPCTOF_trkSPDfirst_2_loose:
case kPbPb2011_pidITS2gevTPCTOFif_trkSPD5orSDD4cls_6_tight:
case kPbPb2011_pidITS2gevTPCTOFif_trkSPDfirst5cls_6_tight:
case kPbPb2011_pidITS2gevTPCTOFif_trkSPDorSDD_5_tight:
case kPbPb2011_pidITS2gevTPCTOFif_trkSPDfirst_5_tight:
case kPbPb2011_pidITSTPCTOFif_trkSPD5orSDD4cls_4:
case kPbPb2011_pidITSTPCTOFif_trkSPDfirst5cls_4:
case kPbPb2011_pidITSTPCTOFif_trkSPDorSDD_1:
case kPbPb2011_pidITSTPCTOFif_trkSPDfirst_1:
case kPbPb2011_pidTPCTOF_trkSPDorSDD_1:
case kPbPb2011_pidTPCTOF_trkSPDfirst_1:
case kPbPb2011_TPCITS_TOFif1:
case kPbPb2011_TPCTOF_Semi2:
case kPbPb2011_TPCTOF_Semi1:
case kPbPb2011NoPID:
case kPbPb2011TPCandTOF :
case kPbPb2011TPCandTOFHPT:
case kPbPb2011TPC :
case kPbPb2011TPCandTOFwide :
case kPbPb2011TPCorTOF :
case kpp2010TPCandTOF :
case kpp2010TPCorTOF :
// standard cuts with very loose DCA: Bit4 (Int: 16), AOD095&115
esdTrackCutsH = AliESDtrackCuts::GetStandardITSTPCTrackCuts2011(kFALSE);
esdTrackCutsH->SetMaxDCAToVertexXY(2.4);
esdTrackCutsH->SetMaxDCAToVertexZ(3.2);
esdTrackCutsH->SetDCAToVertex2D(kTRUE);
//The cuts below should be the onyl ones that are missing
//explicitely in the TrackCutsAna method
//To be sure, StandardITSTPCTrackCuts is loaded however
/*
esdTrackCutsH = new AliESDtrackCuts();
esdTrackCutsH->SetAcceptKinkDaughters(kFALSE);
//Not done so far via dielectron cuts:
*/
/*
esdTrackCuts->SetDCAToVertex2D(kFALSE);
esdTrackCuts->SetRequireSigmaToVertex(kFALSE);
esdTrackCuts->SetMaxChi2PerClusterITS(36);
*/
break;
default: cout << "No ESD Track Cut defined " << endl;
}
return esdTrackCutsH;
}
};