void InitHistograms(AliDielectron *die, Int_t cutDefinition); void InitCF(AliDielectron* die, Int_t cutDefinition); void SetupEventCuts(AliDielectron *die, Int_t cutDefinition); void SetupTrackCuts(AliDielectron *die, Int_t cutDefinition); void SetupPairCuts(AliDielectron *die, Int_t cutDefinition); void SetupMCsignals(AliDielectron *die); TVectorD *GetRunNumbers(); TString names=("default"); TObjArray *arrNames=names.Tokenize(";"); const Int_t nDie=arrNames->GetEntries(); Bool_t isAOD=kFALSE; Bool_t hasMC=kFALSE; Int_t iPeriod=-1; enum { k10b=0, k10c, k10d, k10e, k10f, k10h, k11a, k11d, k11h, k12h }; //______________________________________________________________________________________ AliAnalysisTask* AddTask_jpsi_Default(TString prod="", Bool_t isMC=kFALSE) { //get the current analysis manager AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager(); if (!mgr) { Error("AddTask_jpsi_JPsi", "No analysis manager found."); return 0; } //Do we have an MC handler? hasMC=(AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler()!=0x0); //AOD input? isAOD=mgr->GetInputEventHandler()->IsA()==AliAODInputHandler::Class(); if(isAOD) hasMC=isMC; //Get the current train configuration TString trainConfig=gSystem->Getenv("CONFIG_FILE"); TString list=gSystem->Getenv("LIST"); if( list.IsNull()) list=prod; // selected period if( !prod.CompareTo("LHC10b") ) iPeriod = k10b; else if( !prod.CompareTo("LHC10c") ) iPeriod = k10c; else if( !prod.CompareTo("LHC10d") ) iPeriod = k10d; else if( !prod.CompareTo("LHC10e") ) iPeriod = k10e; else if( !prod.CompareTo("LHC10f") ) iPeriod = k10f; else if( !prod.CompareTo("LHC10h") ) iPeriod = k10h; else if( !prod.CompareTo("LHC11a") ) iPeriod = k11a; else if( !prod.CompareTo("LHC11d") ) iPeriod = k11d; else if( !prod.CompareTo("LHC11h") ) iPeriod = k11h; else if( !prod.CompareTo("LHC12h") ) iPeriod = k12h; // // aod monte carlo // if( list.Contains("LHC11a10") || // list.Contains("LHC11b10") || // list.Contains("LHC12a17") || // list.Contains("fix") // ) hasMC=kTRUE; //create task and add it to the manager AliAnalysisTaskMultiDielectron *task=new AliAnalysisTaskMultiDielectron("JpsiDefault"); // task->SetBeamEnergy(1380.); // not neeeded since we are not looking at helicity and Collins-Soper coordinates if (!hasMC) task->UsePhysicsSelection(); // add special triggers switch(iPeriod) { case k11d: task->SetTriggerMask(AliVEvent::kEMCEJE+AliVEvent::kEMC7+AliVEvent::kEMCEGA); break; case k11h: task->SetTriggerMask(AliVEvent::kMB+AliVEvent::kCentral+AliVEvent::kSemiCentral); break; case k12h: task->SetTriggerMask(AliVEvent::kAnyINT); break; } mgr->AddTask(task); //add dielectron analysis with different cuts to the task for (Int_t i=0; iSetHasMC(hasMC); task->AddDielectron(jpsi); } // task->SetTriggerOnV0AND(); // if ( trainConfig=="pp" ) task->SetRejectPileup(); //create output container AliAnalysisDataContainer *coutput1 = mgr->CreateContainer("jpsi_Default_tree", TTree::Class(), AliAnalysisManager::kExchangeContainer, "jpsi_Default_default"); AliAnalysisDataContainer *cOutputHist1 = mgr->CreateContainer("jpsi_Default_QA", TList::Class(), AliAnalysisManager::kOutputContainer, "jpsi_Default.root"); AliAnalysisDataContainer *cOutputHist2 = mgr->CreateContainer("jpsi_Default_CF", TList::Class(), AliAnalysisManager::kOutputContainer, "jpsi_Default.root"); AliAnalysisDataContainer *cOutputHist3 = mgr->CreateContainer("jpsi_Default_EventStat", TH1D::Class(), AliAnalysisManager::kOutputContainer, "jpsi_Default.root"); mgr->ConnectInput(task, 0, mgr->GetCommonInputContainer()); mgr->ConnectOutput(task, 0, coutput1 ); mgr->ConnectOutput(task, 1, cOutputHist1); mgr->ConnectOutput(task, 2, cOutputHist2); mgr->ConnectOutput(task, 3, cOutputHist3); return task; } //______________________________________________________________________________________ //______________________________________________________________________________________ //______________________________________________________________________________________ // // Here the configuration part starts // AliDielectron* ConfigDefault(Int_t cutDefinition) { // // Setup the instance of AliDielectron // // create the actual framework object TString name=Form("%02d",cutDefinition); if (cutDefinitionGetEntriesFast()){ name=arrNames->At(cutDefinition)->GetName(); } AliDielectron *die = new AliDielectron(Form("%s",name.Data()), Form("Track cuts: %s",name.Data())); /* vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv CUTS vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv */ SetupEventCuts(die,cutDefinition); SetupTrackCuts(die,cutDefinition); SetupPairCuts(die,cutDefinition); /* vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv MISC vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv */ // Monte Carlo Signals if (hasMC) SetupMCsignals(die); // prefilter settings die->SetPreFilterUnlikeOnly();// die->SetNoPairing();// die->SetPreFilterAllSigns(); // cut QA die->SetCutQA(); /* vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv OUTPUT vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv */ InitHistograms(die,cutDefinition); InitCF(die,cutDefinition); // AliDielectronMixingHandler *mix=new AliDielectronMixingHandler; // mix->AddVariable(AliDielectronVarManager::kZvPrim,"-10,-8,-5,0,5,8,10"); // mix->AddVariable(AliDielectronVarManager::kPhi ,"0,3.14,6.3"); // mix->SetDepth(10); // die->SetMixingHandler(mix); // return die; } //______________________________________________________________________________________ void SetupEventCuts(AliDielectron *die, Int_t cutDefinition) { // // Setup the event cuts // AliDielectronEventCuts *eventCuts=new AliDielectronEventCuts("eventCuts","eventCuts"); if(isAOD) eventCuts->SetVertexType(AliDielectronEventCuts::kVtxAny); eventCuts->SetRequireVertex(); eventCuts->SetMinVtxContributors(1); eventCuts->SetVertexZ(-10.,+10.); eventCuts->Print(); die->GetEventFilter().AddCuts(eventCuts); } //______________________________________________________________________________________ void SetupTrackCuts(AliDielectron *die, Int_t cutDefinition) { // // Setup the track cuts // /* vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv TRACK CUTS vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv */ AliDielectronVarCuts *varAccCuts = new AliDielectronVarCuts("acc","acc"); varAccCuts->AddCut(AliDielectronVarManager::kPt, 0.8, 1e30); varAccCuts->AddCut(AliDielectronVarManager::kEta, -0.9, 0.9); die->GetTrackFilter().AddCuts(varAccCuts); varAccCuts->Print(); AliDielectronVarCuts *varRecCuts = new AliDielectronVarCuts("VarRecCuts","VarRecCuts"); varRecCuts->AddCut(AliDielectronVarManager::kNclsTPC, 70., 160.); varRecCuts->AddCut(AliDielectronVarManager::kImpactParXY, -1.0, 1.0); varRecCuts->AddCut(AliDielectronVarManager::kImpactParZ, -3.0, 3.0); varRecCuts->AddCut(AliDielectronVarManager::kTPCchi2Cl, 0.0, 4.0); // varRecCuts->AddCut(AliDielectronVarManager::kITSchi2Cl, 0. , 36. ); // not defined in AOD varRecCuts->AddCut(AliDielectronVarManager::kKinkIndex0, 0.0); AliDielectronTrackCuts *trkRecCuts = new AliDielectronTrackCuts("TrkRecCuts","TrkRecCuts"); trkRecCuts->SetITSclusterCut(AliDielectronTrackCuts::kOneOf, 3); // SPD any trkRecCuts->SetRequireITSRefit(kTRUE); trkRecCuts->SetRequireTPCRefit(kTRUE); AliDielectronCutGroup *grpRecCuts = new AliDielectronCutGroup("rec","rec",AliDielectronCutGroup::kCompAND); grpRecCuts->AddCut(trkRecCuts); grpRecCuts->AddCut(varRecCuts); die->GetTrackFilter().AddCuts(grpRecCuts); grpRecCuts->Print(); /* vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv PID CUTS vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv */ AliDielectronVarCuts *pidVarCuts = new AliDielectronVarCuts("varPIDCuts","varPIDCuts"); pidVarCuts->AddCut(AliDielectronVarManager::kTPCnSigmaEle, -2. , 3. ); //-3.0 pidVarCuts->AddCut(AliDielectronVarManager::kTPCnSigmaPio, 3.5, 1000. ); pidVarCuts->AddCut(AliDielectronVarManager::kTPCnSigmaPro, 4. , 1000. ); //3.0 // AliDielectronPID *pidCuts = new AliDielectronPID("PIDCuts","PIDCuts"); //not used AliDielectronCutGroup *grpPIDCuts = new AliDielectronCutGroup("PID","PID",AliDielectronCutGroup::kCompAND); grpPIDCuts->AddCut(pidVarCuts); //grpPIDCuts->AddCut(pidCuts); die->GetTrackFilter().AddCuts(grpPIDCuts); grpPIDCuts->Print(); // //exclude conversion electrons selected by the tender // AliDielectronTrackCuts *noconv=new AliDielectronTrackCuts("noConv","noConv"); // noconv->SetV0DaughterCut(AliPID::kElectron,kTRUE); // cuts->AddCut(noconv); } //______________________________________________________________________________________ void SetupPairCuts(AliDielectron *die, Int_t cutDefinition) { // // Setup the pair cuts // // add conversion rejection AliDielectronVarCuts *gammaCut=new AliDielectronVarCuts("gammaCut","gammaCut"); gammaCut->AddCut(AliDielectronVarManager::kM,0.,.05); die->GetPairPreFilter().AddCuts(gammaCut); } //______________________________________________________________________________________ void InitHistograms(AliDielectron *die, Int_t cutDefinition) { // // Initialise the histograms // //Setup histogram Manager AliDielectronHistos *histos= new AliDielectronHistos(die->GetName(), die->GetTitle()); //Initialise histogram classes histos->SetReservedWords("Track;Pair"); //Track classes //to fill also track info from 2nd event loop until 2 for (Int_t i=0; i<2; ++i){ histos->AddClass(Form("Track_%s",AliDielectron::TrackClassName(i))); } //Pair classes // to fill also mixed event histograms loop until 10 for (Int_t i=0; i<3; ++i){ histos->AddClass(Form("Pair_%s",AliDielectron::PairClassName(i))); } //add MC signal histograms to track and pair class if(die->GetMCSignals()) { for(Int_t isig=0; isigGetMCSignals()->GetEntriesFast(); isig++) { TString sigMCname = die->GetMCSignals()->At(isig)->GetName(); // mc truth histos->AddClass(Form("Pair_%s_MCtruth", sigMCname.Data())); histos->AddClass(Form("Track_Legs_%s_MCtruth", sigMCname.Data())); // mc reconstructed histos->AddClass(Form("Pair_%s", sigMCname.Data())); histos->AddClass(Form("Track_Legs_%s", sigMCname.Data())); } } //add histograms to event class if (cutDefinition==0) { histos->AddClass("Event"); histos->UserHistogram("Event","","",300,-15.,15.,AliDielectronVarManager::kZvPrim); histos->UserHistogram("Event","","", 100,-2.,2.,100,-2.,2.,AliDielectronVarManager::kXvPrim,AliDielectronVarManager::kYvPrim); histos->UserHistogram("Event","","",GetRunNumbers(),AliDielectronVarManager::kRunNumber); } //add histograms to Track classes histos->UserHistogram("Track","","",200,0,20.,AliDielectronVarManager::kPt); histos->UserHistogram("Track","","", 400,0.2,20.,200,0.,200.,AliDielectronVarManager::kPIn,AliDielectronVarManager::kTPCsignal,kTRUE); histos->UserHistogram("Track","","", 100,0.2,20.,100,-10.,10.,AliDielectronVarManager::kPIn,AliDielectronVarManager::kTPCnSigmaEle,kTRUE); histos->UserHistogram("Track","","", 100,0.2,20.,100,-10.,10.,AliDielectronVarManager::kPIn,AliDielectronVarManager::kTPCnSigmaPio,kTRUE); histos->UserHistogram("Track","","", 100,0.2,20.,100,-10.,10.,AliDielectronVarManager::kPIn,AliDielectronVarManager::kTPCnSigmaPro,kTRUE); histos->UserHistogram("Track","","", 100,-2,2,144,0,6.285,AliDielectronVarManager::kEta,AliDielectronVarManager::kPhi); histos->UserHistogram("Track","","", 160,-0.5,159.5,AliDielectronVarManager::kNclsTPC); histos->UserHistogram("Track","","", 100,0.,10.,AliDielectronVarManager::kTPCchi2Cl); histos->UserHistogram("Track","","", 150,-15,15,160,-0.5,159.5,AliDielectronVarManager::kYsignedIn,AliDielectronVarManager::kTPCsignalN); histos->UserHistogram("Track","","", 1000,0.,0.,AliDielectronVarManager::kKinkIndex0); histos->UserHistogram("Track","","",500,-1.,1.,AliDielectronVarManager::kImpactParXY); histos->UserHistogram("Track","","",600,-3.,3.,AliDielectronVarManager::kImpactParZ); //add histograms to Pair classes histos->UserHistogram("Pair","","", 301,-.01,6.01,AliDielectronVarManager::kM); histos->UserHistogram("Pair","","", 100,-1.,1.,AliDielectronVarManager::kY); histos->UserHistogram("Pair","","", 100,0.,3.15,AliDielectronVarManager::kOpeningAngle); die->SetHistogramManager(histos); } //______________________________________________________________________________________ void InitCF(AliDielectron* die, Int_t cutDefinition) { // // Setupd the CF Manager if needed // AliDielectronCF *cf=new AliDielectronCF(die->GetName(),die->GetTitle()); //pair variables cf->AddVariable(AliDielectronVarManager::kPt,"0.0, 1.0, 1.3, 2.0, 3.0, 5., 7.0, 10.0, 100.0"); cf->AddVariable(AliDielectronVarManager::kZvPrim,"-10,-5,0,5,10"); cf->AddVariable(AliDielectronVarManager::kY,"-1,-0.9,-0.8,-0.3,0,0.3,0.9,1.0"); cf->AddVariable(AliDielectronVarManager::kM,125,0.,125*.04); //40Mev Steps cf->AddVariable(AliDielectronVarManager::kPairType,11,0,11); //leg variables cf->AddVariable(AliDielectronVarManager::kPt,"0.0, 0.8, 1.0, 1.1, 1.2, 1.3, 100.0",kTRUE); cf->AddVariable(AliDielectronVarManager::kEta,"-1.,-0.9,-0.8,0,0.8,0.9,1.0",kTRUE); //cf->AddVariable(AliDielectronVarManager::kITSLayerFirstCls,6,0,6,kTRUE); if (hasMC && 0){ //ATTENTION SWITCHED OFF cf->AddVariable(AliDielectronVarManager::kPdgCode,10000,-5000.5,4999.5,kTRUE); cf->AddVariable(AliDielectronVarManager::kPdgCodeMother,10000,-5000.5,4999.5,kTRUE); cf->AddVariable(AliDielectronVarManager::kPdgCodeGrandMother,10000,-5000.5,4999.5,kTRUE); } if(hasMC) { //only steps for efficiencies cf->SetStepsForMCtruthOnly(); //only in this case write MC truth info if (cutDefinition==0){ cf->SetStepForMCtruth(); } } // cf->SetStepsForSignal(); die->SetCFManagerPair(cf); } //______________________________________________________________________________________ void SetupMCsignals(AliDielectron *die){ AliDielectronSignalMC* promptJpsi = new AliDielectronSignalMC("promptJpsi","Prompt J/psi"); // prompt J/psi (not from beauty decays) promptJpsi->SetLegPDGs(11,-11); promptJpsi->SetMotherPDGs(443,443); promptJpsi->SetGrandMotherPDGs(503,503,kTRUE,kTRUE); // not from beauty hadrons promptJpsi->SetMothersRelation(AliDielectronSignalMC::kSame); promptJpsi->SetFillPureMCStep(kTRUE); promptJpsi->SetLegSources(AliDielectronSignalMC::kFinalState, AliDielectronSignalMC::kFinalState); promptJpsi->SetCheckBothChargesLegs(kTRUE,kTRUE); promptJpsi->SetCheckBothChargesMothers(kTRUE,kTRUE); promptJpsi->SetCheckBothChargesGrandMothers(kTRUE,kTRUE); die->AddSignalMC(promptJpsi); AliDielectronSignalMC* promptJpsiNonRad = new AliDielectronSignalMC("promptJpsiNonRad","Prompt J/psi non-Radiative"); // prompt J/psi (not from beauty decays) promptJpsiNonRad->SetLegPDGs(11,-11); promptJpsiNonRad->SetMotherPDGs(443,443); promptJpsiNonRad->SetGrandMotherPDGs(503,503,kTRUE,kTRUE); // not from beauty hadrons promptJpsiNonRad->SetMothersRelation(AliDielectronSignalMC::kSame); promptJpsiNonRad->SetFillPureMCStep(kTRUE); promptJpsiNonRad->SetLegSources(AliDielectronSignalMC::kFinalState, AliDielectronSignalMC::kFinalState); promptJpsiNonRad->SetCheckBothChargesLegs(kTRUE,kTRUE); promptJpsiNonRad->SetCheckBothChargesMothers(kTRUE,kTRUE); promptJpsiNonRad->SetCheckBothChargesGrandMothers(kTRUE,kTRUE); promptJpsiNonRad->SetJpsiRadiative(AliDielectronSignalMC::kIsNotRadiative); die->AddSignalMC(promptJpsiNonRad); AliDielectronSignalMC* promptJpsiRad = new AliDielectronSignalMC("promptJpsiRad","Prompt J/psi Radiative"); // prompt J/psi (not from beauty decays) promptJpsiRad->SetLegPDGs(11,-11); promptJpsiRad->SetMotherPDGs(443,443); promptJpsiRad->SetGrandMotherPDGs(503,503,kTRUE,kTRUE); // not from beauty hadrons promptJpsiRad->SetMothersRelation(AliDielectronSignalMC::kSame); promptJpsiRad->SetFillPureMCStep(kTRUE); promptJpsiRad->SetLegSources(AliDielectronSignalMC::kFinalState, AliDielectronSignalMC::kFinalState); promptJpsiRad->SetCheckBothChargesLegs(kTRUE,kTRUE); promptJpsiRad->SetCheckBothChargesMothers(kTRUE,kTRUE); promptJpsiRad->SetCheckBothChargesGrandMothers(kTRUE,kTRUE); promptJpsiRad->SetJpsiRadiative(AliDielectronSignalMC::kIsRadiative); die->AddSignalMC(promptJpsiRad); } TVectorD *GetRunNumbers() { // returns a vector with the runnumber used in the period Double_t first=0; Double_t last =1; switch(iPeriod) { case k10b: first=114737; last=117223; break; case k10c: first=117777; last=121417; break; case k10d: first=121692; last=126437; break; case k10e: first=127102; last=130850; break; case k10f: first=130931; last=135031; break; case k10h: first=136831; last=139517; break; case k11a: first=141052; last=146974; break; case k11d: first=155838; last=159649; break; case k11h: first=165772; last=170718; break; case k12h: first=188720; last=192738; break; } // printf("iPeriod: %d \t %.0f-%.0f \n",iPeriod,first,last); return (AliDielectronHelper::MakeLinBinning(last-first, first, last)); }