class LMEECutLibTaku { public: static enum LMMECutSet { kPbPb2011TPCandTOF, //TOF required kPbPb2011TPCandTOFwide, //TOF required, more relaxed cut on TPC kPbPb2011TPCorTOF, kpp2010TPCandTOF, kpp2010TPCorTOF, kCUTSETMAX }; static enum LMMECentSel { kPbPb2011Central, kPbPb2011SemiCentral1, kPbPb2011SemiCentral2, kPbPb2011Peripheral, kCENTSELMAX }; static enum LMMEPairCutSet { kPbPb2011Mass, //Mass cut kPbPb2011OP, //Opening angle cut kPbPb2011Phiv, //Phiv cut kPAIRCUTSETMAX }; //char* LMEECutNames[kCUTSETMAX] = { "PbPb2011TPCandTOF","PbPb2011TPCorTOF"}; Bool_t useMC; LMEECutLib() {useMC=kFALSE;} AliDielectronEventCuts* GetEventCuts(Int_t cutSet); AliAnalysisCuts* GetCentralityCuts(Int_t centSel); AliDielectronTrackRotator* GetTrackRotator(Int_t cutSet); AliDielectronMixingHandler* GetMixingHandler(Int_t cutSet); AliAnalysisCuts* GetPIDCutsAna(Int_t cutSet); AliAnalysisCuts* GetPIDCutsPre(Int_t cutSet); AliAnalysisCuts* GetPairCuts(Int_t cutSet); AliAnalysisCuts* GetPairPreFilterCuts(Int_t cutSet); AliAnalysisCuts* GetTrackCutsAna(Int_t cutSet); AliAnalysisCuts* GetTrackCutsPre(Int_t cutSet); void SetMCFlag( Bool_t isMC=kTRUE) {useMC=isMC;} AliDielectronEventCuts* GetEventCuts(Int_t cutSet) { AliDielectronEventCuts* eventCuts = 0x0; switch (cutSet) { case kPbPb2011TPCandTOF : case kPbPb2011TPCandTOFwide : case kPbPb2011TPCorTOF : case kpp2010TPCandTOF : case kpp2010TPCorTOF : eventCuts=new AliDielectronEventCuts("eventCuts","Vertex Track && |vtxZ|<10 && ncontrib>0"); eventCuts->SetRequireVertex(); eventCuts->SetMinVtxContributors(1); eventCuts->SetVertexZ(-10.,10.); break; default: cout << "No Event Cut defined" << endl; } return eventCuts; } 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 kPbPb2011SemiCentral1: centCuts = new AliDielectronVarCuts("centCuts","CentralityPbPb2011SemiCentral1"); centCuts->AddCut(AliDielectronVarManager::kCentrality,10.,30.); break; case kPbPb2011SemiCentral2: centCuts = new AliDielectronVarCuts("centCuts","CentralityPbPb2011SemiCentral2"); centCuts->AddCut(AliDielectronVarManager::kCentrality,30.,50.); break; case kPbPb2011Peripheral: centCuts = new AliDielectronVarCuts("centCuts","CentralityPbPb2011Peripheral"); centCuts->AddCut(AliDielectronVarManager::kCentrality,50.,90.); break; default: cout << "No Centrality selected" << endl; } return centCuts; } AliDielectronTrackRotator* GetTrackRotator(Int_t cutSet) { AliDielectronTrackRotator* trackRotator = 0x0; switch (cutSet) { case kPbPb2011TPCandTOF : 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 kPbPb2011TPCandTOF : case kPbPb2011TPCandTOFwide : case kPbPb2011TPCorTOF : mixingHandler = new AliDielectronMixingHandler; mixingHandler->AddVariable(AliDielectronVarManager::kZvPrim,"-10,-5,0,5,10"); mixingHandler->AddVariable(AliDielectronVarManager::kCentrality,"0,5,10,20,40,80,100"); mixingHandler->AddVariable(AliDielectronVarManager::kv0ACrpH2,"-6*(TMath::Pi()/6),-5*(TMath::Pi()/6),-4*(TMath::Pi()/6),-3*(TMath::Pi()/6),-2*(TMath::Pi()/6),-1*(TMath::Pi()/6),0,1*(TMath::Pi()/6),2*(TMath::Pi()/6),3*(TMath::Pi()/6),4*(TMath::Pi()/6),5*(TMath::Pi()/6),6*(TMath::Pi()/6)"); //mixingHandler->SetDepth(50); mixingHandler->SetDepth(15); mixingHandler->SetMixType(AliDielectronMixingHandler::kAll); break; case kpp2010TPCandTOF : case kpp2010TPCorTOF : mixingHandler = new AliDielectronMixingHandler; mixingHandler->AddVariable(AliDielectronVarManager::kZvPrim,"-10,-5,0,5,10"); mixingHandler->AddVariable(AliDielectronVarManager::kNacc,"0,10000"); //might want to add multiplicity? mixingHandler->SetDepth(25); mixingHandler->SetMixType(AliDielectronMixingHandler::kAll); break; default: cout << "No Mixing Handler defined" << endl; } return mixingHandler; } AliAnalysisCuts* GetPIDCutsAna(Int_t cutSet) { AliAnalysisCuts* anaCuts=0x0; // + [2] added for Dec2010 Cut! TF1 *lowerCut = new TF1("lowerCut", "[0] * TMath::Exp([1]*x) + [2]", 0, 20); /* until Nov2010 lowerCut->SetParameter(0, -2.7); lowerCut->SetParameter(1, -0.4357); */ /* 18.01.2011 ALiHFEpid.cxx */ lowerCut->SetParameter(0,-3.7); lowerCut->SetParameter(1,-0.8); lowerCut->SetParameter(2,-0.35); if (useMC) { //overwrite parameters lowerCut->SetParameter(0,-2.5); lowerCut->SetParameter(2,-2.2); } //--------------------------------------------- AliDielectronPID *pidTPCTOFeOnly = new AliDielectronPID("TPC-TOF","TPC-TOF"); pidTPCTOFeOnly->AddCut(AliDielectronPID::kTPC,AliPID::kElectron,-3. ,3.,0.0,100.,kFALSE); pidTPCTOFeOnly->AddCut(AliDielectronPID::kTOF ,AliPID::kElectron , -3. , 3. , 0.0 , 100., kFALSE ); AliDielectronPID *pidTPCandTOF = new AliDielectronPID("TPC-TOF-HFE","TPC-TOF-HFE"); pidTPCandTOF->AddCut(AliDielectronPID::kTPC,AliPID::kElectron,-3.,3.,0.0,100.,kFALSE); pidTPCandTOF->AddCut(AliDielectronPID::kTPC,AliPID::kPion,-3.,3.,0.,100.,kTRUE); pidTPCandTOF->AddCut(AliDielectronPID::kTOF ,AliPID::kElectron , -3. , 3. , 0.0 , 100., kFALSE ); AliDielectronPID *pidTPChardTOF = new AliDielectronPID("TPC-TOF-HFE","TPC-TOF-HFE"); pidTPChardTOF->AddCut(AliDielectronPID::kTPC,AliPID::kElectron,lowerCut,3.,0.0,100.,kFALSE); pidTPChardTOF->AddCut(AliDielectronPID::kTPC,AliPID::kPion,-3.,3.,0.,100.,kTRUE); pidTPChardTOF->AddCut(AliDielectronPID::kTPC,AliPID::kProton,-3.,3.,0.,100.,kTRUE); pidTPChardTOF->AddCut(AliDielectronPID::kTPC,AliPID::kKaon,-3.,3.,0.,100.,kTRUE); pidTPChardTOF->AddCut(AliDielectronPID::kTOF ,AliPID::kElectron , -3. , 3. , 0.0 , 100., kFALSE ); //___________________________________________ AliDielectronPID *pidTT = new AliDielectronPID("TPC-TOF","TPC-TOF"); pidTT->AddCut(AliDielectronPID::kTPC,AliPID::kElectron,-1.5,3.,0.2,0.4,kFALSE); pidTT->AddCut(AliDielectronPID::kTPC,AliPID::kElectron,-3,3.,0.4,100.,kFALSE); pidTT->AddCut(AliDielectronPID::kTOF ,AliPID::kElectron , -3. , 3. , 0.2 , 100., kFALSE ); pidTT->AddCut(AliDielectronPID::kTPC,AliPID::kPion,-3,3.,0.,100.,kTRUE); pidTT->AddCut(AliDielectronPID::kTPC,AliPID::kProton,-3.,3.,0.,100.,kTRUE); pidTT->AddCut(AliDielectronPID::kTPC,AliPID::kKaon,-3.,3.,0.,100.,kTRUE); //___________________________________________ AliDielectronVarCuts *pidTPCsignal = new AliDielectronVarCuts("pidTPCsignal","cut on the TPC signal"); if (useMC) { pidTPCsignal->AddCut(AliDielectronVarManager::kTPCsignal,65.,85.); } else { pidTPCsignal->AddCut(AliDielectronVarManager::kTPCsignal,75.,90.); } //___________________________________________ AliDielectronVarCuts *pidTPCsignalWide = new AliDielectronVarCuts("pidTPCsignalWide","cut on the TPC signal"); pidTPCsignalWide->AddCut(AliDielectronVarManager::kTPCsignal,70.,90.); //___________________________________________ AliDielectronVarCuts *pTPC = new AliDielectronVarCuts("Py>.4","Py>.4"); pTPC->AddCut(AliDielectronVarManager::kPt,.4,5.); AliDielectronVarCuts *pMin = new AliDielectronVarCuts("P>.2","P>.2"); pMin->AddCut(AliDielectronVarManager::kPt,.2,5.); switch (cutSet) { case kPbPb2011TPCandTOF : AliDielectronCutGroup* cgSecondTrackFilterPIDTPC1 = new AliDielectronCutGroup("cgPIDTPC1","cgPIDTPC1",AliDielectronCutGroup::kCompAND); cgSecondTrackFilterPIDTPC1->AddCut(pTPC); cgSecondTrackFilterPIDTPC1->AddCut(pidTPCandTOF); cgSecondTrackFilterPIDTPC1->AddCut(pidTPCsignal); cgSecondTrackFilterPIDTPC1->AddCut(GetTrackCutsAna(cutSet)); anaCuts = cgSecondTrackFilterPIDTPC1; break; case kPbPb2011TPCandTOFwide : AliDielectronCutGroup* cgSecondTrackFilterPIDTPC1 = new AliDielectronCutGroup("cgPIDTPC1","cgPIDTPC1",AliDielectronCutGroup::kCompAND); cgSecondTrackFilterPIDTPC1->AddCut(pTPC); cgSecondTrackFilterPIDTPC1->AddCut(pidTPCandTOF); cgSecondTrackFilterPIDTPC1->AddCut(pidTPCsignalWide); cgSecondTrackFilterPIDTPC1->AddCut(GetTrackCutsAna(cutSet)); anaCuts = cgSecondTrackFilterPIDTPC1; break; case kPbPb2011TPCorTOF : AliDielectronCutGroup* cgSecondTrackFilterPIDTPC2 = new AliDielectronCutGroup("cgPIDTPC2","cgPIDTPC2",AliDielectronCutGroup::kCompAND); cgSecondTrackFilterPIDTPC2->AddCut(pMin); cgSecondTrackFilterPIDTPC2->AddCut(pidTT); cgSecondTrackFilterPIDTPC2->AddCut(pidTPCsignal); cgSecondTrackFilterPIDTPC2->AddCut(GetTrackCutsAna(cutSet)); anaCuts = cgSecondTrackFilterPIDTPC2; break; case kpp2010TPCandTOF : AliDielectronCutGroup* cgSecondTrackFilterPIDTPC = new AliDielectronCutGroup("cgPIDTPC","cgPIDTPC",AliDielectronCutGroup::kCompAND); cgSecondTrackFilterPIDTPC->AddCut(pTPC); //cgSecondTrackFilterPIDTPC->AddCut(pidTPChardTOF); cgSecondTrackFilterPIDTPC->AddCut(pidTPCandTOF); cgSecondTrackFilterPIDTPC->AddCut(pidTPCTOFeOnly); cgSecondTrackFilterPIDTPC->AddCut(GetTrackCutsAna(cutSet)); anaCuts = cgSecondTrackFilterPIDTPC; break; case kpp2010TPCorTOF : AliDielectronCutGroup* cgSecondTrackFilterPIDTPC = new AliDielectronCutGroup("cgPIDTPC","cgPIDTPC",AliDielectronCutGroup::kCompAND); cgSecondTrackFilterPIDTPC->AddCut(pMin); cgSecondTrackFilterPIDTPC->AddCut(pidTT); cgSecondTrackFilterPIDTPC->AddCut(GetTrackCutsAna(cutSet)); anaCuts = cgSecondTrackFilterPIDTPC; break; default: cout << "No Analysis PID Cut defined " << endl; } return anaCuts; } AliAnalysisCuts* GetPIDCutsPre(Int_t cutSet) { AliAnalysisCuts* anaCuts=0x0; switch (cutSet) { case kPbPb2011TPCandTOF : case kPbPb2011TPCandTOFwide : case kPbPb2011TPCorTOF : case kpp2010TPCandTOF : case kpp2010TPCorTOF : AliDielectronCutGroup* cgSecondTrackFilterPIDTPC = new AliDielectronCutGroup("cgPIDTPC","cgPIDTPC",AliDielectronCutGroup::kCompAND); AliDielectronCutGroup* cgITSTPC = new AliDielectronCutGroup("cgITSTPC","cgITSTPC",AliDielectronCutGroup::kCompAND); AliDielectronPID *pidITSTPC = new AliDielectronPID("TPCpre","TPCpre"); pidITSTPC->AddCut(AliDielectronPID::kTPC,AliPID::kElectron,-3.,3.); cgITSTPC->AddCut(pidITSTPC); cgITSTPC->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.); cgITSSA->AddCut(pidITSSA); cgITSSA->AddCut(GetTrackCutsPre(cutSet)); AliDielectronCutGroup* cgInitialTrackFilter = new AliDielectronCutGroup("cgInitialTrackFilter","cgInitialTrackFilter",AliDielectronCutGroup::kCompOR); cgInitialTrackFilter->AddCut(cgITSTPC); cgInitialTrackFilter->AddCut(cgITSSA); anaCuts = cgInitialTrackFilter; break; default: cout << "No Pre-PID Cut defined " << endl; } return anaCuts; } /* AliAnalysisCuts* GetPairCuts(Int_t cutSet) { AliDielectronVarCuts* pairCuts=0x0; switch (cutSet) { case kPbPb2011TPCorTOF : case kpp2010TPCandTOF : pairCuts = new AliDielectronVarCuts("InvMass","InvMass > 150 MeV"); pairCuts->AddCut(AliDielectronVarManager::kM,0.15,100.,kTRUE); break; case kPbPb2011TPCandTOF : case kPbPb2011TPCandTOFwide : case kpp2010TPCorTOF : pairCuts =new AliDielectronVarCuts("OpeningAngle","Opening angle > .035rad"); pairCuts->AddCut(AliDielectronVarManager::kOpeningAngle, 0. , 0.035); break; default: cout << "No Pair Cuts defined " << endl; } return pairCuts; } */ AliAnalysisCuts* GetPairCuts(Int_t cutSet) { AliDielectronVarCuts* pairCuts=0x0; switch (cutSet) { case kPbPb2011Mass: pairCuts = new AliDielectronVarCuts("InvMass","InvMass > 150 MeV"); pairCuts->AddCut(AliDielectronVarManager::kM, 0.15,100.); break; case kPbPb2011OP: pairCuts =new AliDielectronVarCuts("OpeningAngle","Opening angle > .035rad"); pairCuts->AddCut(AliDielectronVarManager::kOpeningAngle, 0. , 0.035, kTRUE); ///exclude break; case kPbPb2011Phiv: pairCuts =new AliDielectronVarCuts("Phiv Cuts","Phiv<2.0rad"); pairCuts->SetCutType(AliDielectronVarCuts::kAny); pairCuts->AddCut(AliDielectronVarManager::kPhivPair, 0.0, 2.0); pairCuts->AddCut(AliDielectronVarManager::kM, 0.15, 100.0); break; default: cout << "No Pair Cuts defined " << endl; } return pairCuts; } //// for the pairprefilter //// this cut is defined to "reject" pairs //// for the paircuts, defintion is based on "accept" pairs. AliAnalysisCuts* GetPairPreFilterCuts(Int_t cutSet) { AliDielectronVarCuts* pairCuts=0x0; switch (cutSet) { case kPbPb2011Mass: pairCuts = new AliDielectronVarCuts("InvMass","InvMass > 150 MeV"); pairCuts->AddCut(AliDielectronVarManager::kM, 0.15,100.,kTRUE); break; case kPbPb2011OP: pairCuts =new AliDielectronVarCuts("OpeningAngle","Opening angle > .035rad"); pairCuts->AddCut(AliDielectronVarManager::kOpeningAngle, 0. , 0.035); break; case kPbPb2011Phiv: pairCuts =new AliDielectronVarCuts("Phiv Cut and Mee Cut","Phiv<2.0rad"); pairCuts->AddCut(AliDielectronVarManager::kPhivPair, 2.0, TMath::ACos(-1.0)); pairCuts->AddCut(AliDielectronVarManager::kM, 0, 0.15); break; default: cout << "No Pair Cuts defined " << endl; } return pairCuts; } AliAnalysisCuts* GetTrackCutsAna(Int_t cutSet) { AliESDtrackCuts* trackCuts=0x0; switch (cutSet) { case kPbPb2011TPCandTOF : case kPbPb2011TPCandTOFwide : case kPbPb2011TPCorTOF : case kpp2010TPCandTOF : case kpp2010TPCorTOF : trackCuts = new AliESDtrackCuts(); trackCuts->SetDCAToVertex2D(kTRUE); trackCuts->SetMaxDCAToVertexZ(3.0); trackCuts->SetMaxDCAToVertexXY(1.0); //trackCuts->SetMaxNsigmaToVertex(3.0); trackCuts->SetPtRange( 0.05 , 200.0); trackCuts->SetEtaRange( -0.84 , 0.84 ); trackCuts->SetAcceptKinkDaughters(kFALSE); trackCuts->SetRequireITSRefit(kTRUE); trackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,AliESDtrackCuts::kFirst); trackCuts->SetMinNClustersITS(3); trackCuts->SetRequireTPCRefit(kTRUE); //trackCuts->SetMinNClustersTPC(60); trackCuts->SetMinNCrossedRowsTPC(110); trackCuts->SetMinRatioCrossedRowsOverFindableClustersTPC(0.7); trackCuts->SetMaxChi2PerClusterTPC(3.5); //trackCuts->SetMaxChi2PerClusterITS(6); break; default: cout << "No Analysis Track Cut defined " << endl; } return trackCuts; } AliAnalysisCuts* GetTrackCutsPre(Int_t cutSet) { AliESDtrackCuts* trackCuts=0x0; switch (cutSet) { case kPbPb2011TPCandTOF : case kPbPb2011TPCandTOFwide : case kPbPb2011TPCorTOF : case kpp2010TPCandTOF : case kpp2010TPCorTOF : trackCuts = new AliESDtrackCuts(); trackCuts->SetDCAToVertex2D(kTRUE); trackCuts->SetMaxDCAToVertexZ(3.0); trackCuts->SetMaxDCAToVertexXY(1.0); trackCuts->SetEtaRange( -0.84 , 0.84 ); trackCuts->SetPtRange( 0.05 , 0.5); trackCuts->SetAcceptKinkDaughters(kFALSE); trackCuts->SetRequireITSRefit(kTRUE); trackCuts->SetRequireITSStandAlone(kTRUE); trackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,AliESDtrackCuts::kFirst); trackCuts->SetMinNClustersITS(3); //PhotonGroup-Dalitz: 2?! break; default: cout << "No Pre-Track Cut defined " << endl; } return trackCuts; } };