#include #include #include #include #include #include #include //Use: //Set hard coded commentet with //set this!! // root[] .L makeInput...C++ // root[] makeInputAliAnalysisTaskSE...() //similar macros for D mesons as well as for Lc->3prongs //Author: Annalisa De Caro - decaro@sa.infn.it //macro to make a .root file which contains an AliRDHFCutsLctoV0 for AliAnalysisTaskSELc2pK0S task void makeInputAliAnalysisTaskSELctoV0bachelor(){ AliESDtrackCuts* esdTrackCuts=new AliESDtrackCuts(); esdTrackCuts->SetRequireSigmaToVertex(kFALSE); //default esdTrackCuts->SetRequireTPCRefit(kTRUE); esdTrackCuts->SetRequireITSRefit(kTRUE); esdTrackCuts->SetMinNClustersITS(4); // default is 5 esdTrackCuts->SetMinNClustersTPC(70); esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kAny); // default is kBoth, otherwise kAny esdTrackCuts->SetMinDCAToVertexXY(0.); esdTrackCuts->SetPtRange(0.3,1.e10); AliRDHFCutsLctoV0* RDHFLctoV0An=new AliRDHFCutsLctoV0(); RDHFLctoV0An->SetName("LctoV0AnalysisCuts"); RDHFLctoV0An->SetTitle("Analysis cuts for Lc analysis"); AliRDHFCutsLctoV0* RDHFLctoV0Prod=new AliRDHFCutsLctoV0(); RDHFLctoV0Prod->SetName("LctoV0ProductionCuts"); RDHFLctoV0Prod->SetTitle("Production cuts for Lc analysis"); RDHFLctoV0Prod->AddTrackCuts(esdTrackCuts); RDHFLctoV0An->AddTrackCuts(esdTrackCuts); const Int_t nptbins=1; Float_t* ptbins; ptbins=new Float_t[nptbins+1]; ptbins[0]=0.; ptbins[1]=99999999.; RDHFLctoV0Prod->SetPtBins(nptbins+1,ptbins); RDHFLctoV0An->SetPtBins(nptbins+1,ptbins); const Int_t nvars=9 ; Float_t** prodcutsval; prodcutsval=new Float_t*[nvars]; for(Int_t ic=0;icSetCuts(nvars,nptbins,prodcutsval); Float_t** anacutsval; anacutsval=new Float_t*[nvars]; for(Int_t ic=0;icSetCuts(nvars,nptbins,anacutsval); //RDHFLc->SetRecoKF(); //set this if you want to recompute the secondary vertex with the KF package //pid settings //1. bachelor: default one AliAODPidHF* pidObjBachelor = new AliAODPidHF(); Double_t sigmasBac[5]={3.,1.,1.,3.,3.}; // 0, 1(A), 2(A) -> TPC; 3 -> TOF; 4 -> ITS pidObjBachelor->SetSigma(sigmasBac); pidObjBachelor->SetAsym(kFALSE); pidObjBachelor->SetMatch(1); pidObjBachelor->SetTPC(kTRUE); pidObjBachelor->SetTOF(kTRUE); pidObjBachelor->SetTOFdecide(kFALSE); RDHFLctoV0An->SetPidHF(pidObjBachelor); //2. V0pos AliAODPidHF* pidObjV0pos = new AliAODPidHF(); Double_t sigmasV0pos[5]={3.,1.,1.,3.,3.}; // 0, 1(A), 2(A) -> TPC; 3 -> TOF; 4 -> ITS pidObjV0pos->SetSigma(sigmasV0pos); pidObjV0pos->SetAsym(kFALSE); pidObjV0pos->SetMatch(1); pidObjV0pos->SetTPC(kTRUE); pidObjV0pos->SetTOF(kTRUE); pidObjV0pos->SetTOFdecide(kFALSE); RDHFLctoV0An->SetPidHF(pidObjV0pos); //2. V0neg AliAODPidHF* pidObjV0neg = new AliAODPidHF(); Double_t sigmasV0neg[5]={3.,1.,1.,3.,3.}; // 0, 1(A), 2(A) -> TPC; 3 -> TOF; 4 -> ITS pidObjV0neg->SetSigma(sigmasV0neg); pidObjV0neg->SetAsym(kFALSE); pidObjV0neg->SetMatch(1); pidObjV0neg->SetTPC(kTRUE); pidObjV0neg->SetTOF(kTRUE); pidObjV0neg->SetTOFdecide(kFALSE); RDHFLctoV0An->SetPidHF(pidObjV0neg); // uncomment these lines for Baysian PID: // Double_t threshold=0.3; // SetupCombinedPID(RDHFLctoV0An ,threshold); // RDHFLctoV0An ->SetPIDStrategy(AliRDHFCutsLctoV0::kCombined); // //uncomment these lines to apply cuts with the KF package //RDHFLctoV0An->SetCutsStrategy(AliRDHFCutsLctoV0::kKF); //for(Int_t ipt2=0;ipt2SetUsePID(pidflag); if(pidflag) cout<<"PID is used"<PrintAll(); cout<<"This is the object I'm going to save:"<PrintAll(); TFile* fout=new TFile("Lc2pK0SCuts.root","RECREATE"); fout->cd(); RDHFLctoV0Prod->Write(); RDHFLctoV0An->Write(); fout->Close(); delete fout; delete pidObjBachelor; delete pidObjV0neg; delete pidObjV0pos; delete RDHFLctoV0Prod; delete RDHFLctoV0An; } //macro to make a .root file (for significance maximization) which contains an AliRDHFCutsLctoV0 with loose set of cuts and TParameter with the tighest value of these cuts void makeInputAliAnalysisTaskSESignificanceMaximization(){ AliRDHFCutsLctoV0* RDHFLctoV0=new AliRDHFCutsLctoV0(); RDHFLctoV0->SetName("loosercuts"); RDHFLctoV0->SetTitle("Cuts for significance maximization"); AliESDtrackCuts* esdTrackCuts=new AliESDtrackCuts(); esdTrackCuts->SetRequireSigmaToVertex(kFALSE); //default esdTrackCuts->SetRequireTPCRefit(kTRUE); esdTrackCuts->SetMinNClustersTPC(70); esdTrackCuts->SetRequireITSRefit(kTRUE); esdTrackCuts->SetMinNClustersITS(4); esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,AliESDtrackCuts::kAny); esdTrackCuts->SetMinDCAToVertexXY(0.); esdTrackCuts->SetEtaRange(-0.8,0.8); esdTrackCuts->SetPtRange(0.3,1.e10); RDHFLctoV0->AddTrackCuts(esdTrackCuts); const Int_t nvars=9; const Int_t nptbins=1; //change this when adding pt bins! Float_t ptbins[nptbins+1]; ptbins[0]=0.; ptbins[1]=999999999.; RDHFLctoV0->SetPtBins(nptbins+1,ptbins); Float_t** rdcutsvalmine; rdcutsvalmine=new Float_t*[nvars]; for(Int_t iv=0;ivSetCuts(nvars,nptbins,cutsMatrixTransposeStand); Int_t nvarsforopt=RDHFLctoV0->GetNVarsForOpt(); Int_t dim=7; //set this!! Bool_t *boolforopt; boolforopt=new Bool_t[nvars]; if(dim>nvarsforopt){ cout<<"Number of variables for optimization has probably changed, check and edit accordingly"<GetVarsForOpt(); }else{ TString *names; names=new TString[nvars]; TString answer=""; Int_t checktrue=0; names=RDHFLctoV0->GetVarNames(); for(Int_t i=0;i>answer; if(answer=="y") { boolforopt[i]=kTRUE; checktrue++; } else boolforopt[i]=kFALSE; } if (checktrue!=dim) { cout<<"Error! You set "<SetVarsForOpt(dim,boolforopt); } } Float_t tighterval[dim][nptbins]; // 0(2): inv. mass V0 if K0S [GeV] // 1(3): inv. mass V0 if Lambda [GeV] // 2(4): pT min bachelor track [GeV/c] // 3(5): pT min V0-positive track [GeV/c] // 4(6): pT min V0-negative track [GeV/c] // 5(7): dca cascade cut (cm) // 6(8): dca V0 cut (cm) // number of steps for each variable is set in the AddTask arguments (default=8) // set this!! for(Int_t ipt=0;ipt"<",arrdim); for(Int_t ival=0;ival(name.Data(),tighterval[ival][jpt]); } } Bool_t flagPID=kFALSE; RDHFLctoV0->SetUsePID(flagPID); RDHFLctoV0->PrintAll(); printf("Use PID? %s\n",flagPID ? "yes" : "no"); //pid settings //1. bachelor: default one AliAODPidHF* pidObjBachelor = new AliAODPidHF(); Double_t sigmasBac[5]={3.,1.,1.,3.,3.}; // 0, 1(A), 2(A) -> TPC; 3 -> TOF; 4 -> ITS pidObjBachelor->SetSigma(sigmasBac); pidObjBachelor->SetAsym(kFALSE); pidObjBachelor->SetMatch(1); pidObjBachelor->SetTPC(kTRUE); pidObjBachelor->SetTOF(kTRUE); pidObjBachelor->SetTOFdecide(kFALSE); RDHFLctoV0->SetPidHF(pidObjBachelor); //2. V0pos AliAODPidHF* pidObjV0pos = new AliAODPidHF(); Double_t sigmasV0pos[5]={3.,1.,1.,3.,3.}; // 0, 1(A), 2(A) -> TPC; 3 -> TOF; 4 -> ITS pidObjV0pos->SetSigma(sigmasV0pos); pidObjV0pos->SetAsym(kFALSE); pidObjV0pos->SetMatch(1); pidObjV0pos->SetTPC(kTRUE); pidObjV0pos->SetTOF(kTRUE); pidObjV0pos->SetTOFdecide(kFALSE); RDHFLctoV0->SetPidHF(pidObjV0pos); //2. V0neg AliAODPidHF* pidObjV0neg = new AliAODPidHF(); Double_t sigmasV0neg[5]={3.,1.,1.,3.,3.}; // 0, 1(A), 2(A) -> TPC; 3 -> TOF; 4 -> ITS pidObjV0neg->SetSigma(sigmasV0neg); pidObjV0neg->SetAsym(kFALSE); pidObjV0neg->SetMatch(1); pidObjV0neg->SetTPC(kTRUE); pidObjV0neg->SetTOF(kTRUE); pidObjV0neg->SetTOFdecide(kFALSE); RDHFLctoV0->SetPidHF(pidObjV0neg); //activate pileup rejection (for pp) //RDHFLctoV0->SetOptPileup(AliRDHFCuts::kRejectPileupEvent); //Do not recalculate the vertex RDHFLctoV0->SetRemoveDaughtersFromPrim(kFALSE); //activate for pp TString cent=""; //centrality selection (Pb-Pb) Float_t minc=20,maxc=80; RDHFLctoV0->SetMinCentrality(minc); RDHFLctoV0->SetMaxCentrality(maxc); cent=Form("%.0f%.0f",minc,maxc); //RDHFLctoV0->SetUseCentrality(AliRDHFCuts::kCentV0M); //kCentOff,kCentV0M,kCentTRK,kCentTKL,kCentCL1,kCentInvalid RDHFLctoV0->SetUseCentrality(AliRDHFCuts::kCentOff); //kCentOff,kCentV0M,kCentTRK,kCentTKL,kCentCL1,kCentInvalid //temporary //RDHFLctoV0->SetFixRefs(); TFile* fout=new TFile(Form("cuts4SignifMaxim%s%s%sRecVtx%sPileupRej.root", RDHFLctoV0->GetUseCentrality()==0 ? "pp" : "PbPb", cent.Data(), RDHFLctoV0->GetIsPrimaryWithoutDaughters() ? "" : "No", RDHFLctoV0->GetOptPileUp() ? "" : "No"),"recreate"); //set this!! fout->cd(); RDHFLctoV0->Write(); max.Write(); fout->Close(); }