//
Bool_t AddAnalysisTaskRsn
(
- Bool_t sourceESD = kTRUE // if true, the source of data is ESD, otherwise is AOD from filter task
+ Bool_t sourceESD = kTRUE // if true, the source of data is ESD, otherwise is AOD from filter task
)
{
- //AliLog::SetClassDebugLevel("AliRsnCut", AliLog::kDebug+3);
+ AliLog::SetClassDebugLevel("AliMCEvent", AliLog::kWarning);
//AliLog::SetClassDebugLevel("AliRsnCutStd", AliLog::kDebug+3);
//AliLog::SetClassDebugLevel("AliRsnCutBetheBloch", AliLog::kDebug+3);
AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
// initialize task with 4 slots:
- AliRsnAnalysisSE *task = new AliRsnAnalysisSE("RsnAnalysis", 4);
+ AliRsnAnalysisSE *task = new AliRsnAnalysisSE("RsnAnalysis", 2);
// set prior probabilities for PID
task->SetPriorProbability(AliPID::kElectron, 0.02);
// initialize analysis manager with pairs from config
AliRsnAnalysisManager *anaMgr = 0x0;
- // manager #0: phi NO PID
+ // manager #0: phi
anaMgr = task->GetAnalysisManager(0);
- anaMgr->Add(RsnConfig(AliRsnPair::kNoPID, "PHI" , 333, AliPID::kKaon, AliPID::kKaon));
- anaMgr->Add(RsnConfig(AliRsnPair::kNoPID, "PHIBB", 333, AliPID::kKaon, AliPID::kKaon, 0.2));
- // manager #1: phi with PID (realistic & perfect)
+ anaMgr->Add(RsnConfig("PHI_NOPID", 333, AliPID::kKaon, AliPID::kKaon));
+ anaMgr->Add(RsnConfig("PHI_BB" , 333, AliPID::kKaon, AliPID::kKaon));
+ anaMgr->Add(RsnConfig("PHI_PID" , 333, AliPID::kKaon, AliPID::kKaon));
+ // manager #1: kstar
anaMgr = task->GetAnalysisManager(1);
- anaMgr->Add(RsnConfig(AliRsnPair::kRealisticPID, "PHI", 333, AliPID::kKaon, AliPID::kKaon));
- anaMgr->Add(RsnConfig(AliRsnPair::kPerfectPID , "PHI", 333, AliPID::kKaon, AliPID::kKaon));
- // manager #2: kstar NO PID
- anaMgr = task->GetAnalysisManager(2);
- anaMgr->Add(RsnConfig(AliRsnPair::kNoPID, "KSTAR" , 313, AliPID::kPion, AliPID::kKaon));
- anaMgr->Add(RsnConfig(AliRsnPair::kNoPID, "KSTARBB", 313, AliPID::kPion, AliPID::kKaon, 0.2));
- // manager #1: kstar with PID (realistic & perfect)
- anaMgr = task->GetAnalysisManager(3);
- anaMgr->Add(RsnConfig(AliRsnPair::kRealisticPID, "KSTAR", 313, AliPID::kPion, AliPID::kKaon));
- anaMgr->Add(RsnConfig(AliRsnPair::kPerfectPID , "KSTAR", 313, AliPID::kPion, AliPID::kKaon));
+ anaMgr->Add(RsnConfig("KSTAR_NOPID", 313, AliPID::kPion, AliPID::kKaon));
+ anaMgr->Add(RsnConfig("KSTAR_BB" , 313, AliPID::kPion, AliPID::kKaon));
+ anaMgr->Add(RsnConfig("KSTAR_PID" , 313, AliPID::kPion, AliPID::kKaon));
// setup cuts for events (good primary vertex)
AliRsnCutPrimaryVertex *cutVertex = new AliRsnCutPrimaryVertex("cutVertex", 3);
// define and connect output containers
AliAnalysisDataContainer *outputInfo = mgr->CreateContainer("RsnInfo", TList::Class(), AliAnalysisManager::kOutputContainer, "info.root");
- AliAnalysisDataContainer *outputRsn[4];
- outputRsn[0] = mgr->CreateContainer("PHI_NOPID" , TList::Class(), AliAnalysisManager::kOutputContainer, "phi_nopid.root");
- outputRsn[1] = mgr->CreateContainer("PHI_PID" , TList::Class(), AliAnalysisManager::kOutputContainer, "phi_pid.root");
- outputRsn[2] = mgr->CreateContainer("KSTAR_NOPID", TList::Class(), AliAnalysisManager::kOutputContainer, "kstar_nopid.root");
- outputRsn[3] = mgr->CreateContainer("KSTAR_PID" , TList::Class(), AliAnalysisManager::kOutputContainer, "kstar_pid.root");
+ AliAnalysisDataContainer *outputRsn[2];
+ outputRsn[0] = mgr->CreateContainer("PHI" , TList::Class(), AliAnalysisManager::kOutputContainer, "phi.root");
+ outputRsn[1] = mgr->CreateContainer("KSTAR", TList::Class(), AliAnalysisManager::kOutputContainer, "kstar.root");
mgr->ConnectOutput(task, 1, outputInfo);
mgr->ConnectOutput(task, 2, outputRsn[0]);
mgr->ConnectOutput(task, 3, outputRsn[1]);
- mgr->ConnectOutput(task, 4, outputRsn[2]);
- mgr->ConnectOutput(task, 5, outputRsn[3]);
}
--- /dev/null
+//
+// This macro add an analysis task for computing efficiency.
+// It will have as output an AliCFContainer with several steps:
+//
+// 0) all resonances in MC which decay in the pair specified
+// 1) subset of (0) whose daughters are in acceptance
+// 2) subset of (1) whose daughters satisfy quality track cuts (covariance, chi square && nTPCclusters)
+// 3) subset of (2) whose daughters satisfy primary track cuts (nsigma to vertex, no kink daughters)
+// 4) subset of (3) whose daughters satisty the BB TPC compatibility cut at 3 sigma
+//
+Bool_t AddAnalysisTaskRsnEff
+(
+ Bool_t useBB = kFALSE,
+ Double_t sigmaTPC = 0.065,
+ const char *outFile = "eff"
+)
+{
+ // retrieve analysis manager
+ AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
+
+ // common suffixes
+ TString suf[2];
+ suf[0] = "nopid";
+ suf[1] = "pid";
+
+ // create task
+ AliRsnAnalysisEffSE *task[2];
+ task[0] = new AliRsnAnalysisEffSE("EffNoPID");
+ task[1] = new AliRsnAnalysisEffSE("EffPID");
+
+ // set prior probabilities for PID
+ for (Int_t i = 0; i < 2; i++)
+ {
+ task[i]->SetPriorProbability(AliPID::kElectron, 0.02);
+ task[i]->SetPriorProbability(AliPID::kMuon, 0.02);
+ task[i]->SetPriorProbability(AliPID::kPion, 0.83);
+ task[i]->SetPriorProbability(AliPID::kKaon, 0.07);
+ task[i]->SetPriorProbability(AliPID::kProton, 0.06);
+ task[i]->DumpPriors();
+ }
+
+ // pair definitions:
+ // phi --> K+ K-
+ // kstar --> K+ pi- & K- pi+
+ AliRsnPairDef *pairPhi = new AliRsnPairDef('+', AliPID::kKaon, '-', AliPID::kKaon, 333);
+ AliRsnPairDef *pairKStar1 = new AliRsnPairDef('-', AliPID::kKaon, '+', AliPID::kPion, 313);
+ AliRsnPairDef *pairKStar2 = new AliRsnPairDef('+', AliPID::kKaon, '-', AliPID::kPion, 313);
+ for (Int_t i = 0; i < 2; i++)
+ {
+ task[i]->AddPairDef(pairPhi);
+ task[i]->AddPairDef(pairKStar1);
+ task[i]->AddPairDef(pairKStar2);
+ }
+
+ // axis definition
+ // 0) transverse momentum
+ // 1) pseudo-rapidity
+ // 2) multiplicity (estimated with SPD tracklets - uncorrected)
+ AliRsnFunctionAxis *axisPt = new AliRsnFunctionAxis(AliRsnFunctionAxis::kPairPt, 40, 0.0, 10.0);
+ AliRsnFunctionAxis *axisEta = new AliRsnFunctionAxis(AliRsnFunctionAxis::kPairEta, 20, -1.5, 1.5);
+ AliRsnFunctionAxis *axisMult = new AliRsnFunctionAxis(AliRsnFunctionAxis::kEventMult, 8, 0.0, 200.0);
+ for (Int_t i = 0; i < 2; i++)
+ {
+ task[i]->AddAxis(axisMult);
+ task[i]->AddAxis(axisPt);
+ task[i]->AddAxis(axisEta);
+ }
+
+ // define cuts for event selection:
+ // this will determine the filling of bins in the "info" histograms
+ // and should be computed as additional correction factor in efficiency
+ AliRsnCutPrimaryVertex *cutVertex = new AliRsnCutPrimaryVertex("cutVertex", 3);
+ AliRsnCutSet *cutSetEvent = new AliRsnCutSet("eventCuts");
+ cutSetEvent->AddCut(cutVertex);
+ cutSetEvent->SetCutScheme("cutVertex");
+ for (Int_t i = 0; i < 2; i++)
+ {
+ task[i]->SetEventCuts(cutSetEvent);
+ }
+
+ //
+ // *** STEP 0 - All resonances which decay in the specified pairs
+ //
+ // This step does not need any kind of definition, since
+ // its requirement is automatically checked during execution,
+ // but to avoid segfaults, it is better to initialize a cut manager.
+ //
+ AliRsnCutMgr *cutMgrMC_step0 = new AliRsnCutMgr("mc_step0", "");
+
+ //
+ // *** STEP 1 - Acceptance
+ //
+ // Here we add a cut on the pseudorapidity for both tracks
+ //
+ AliRsnCutStd *cutEta = new AliRsnCutStd("cutEta", AliRsnCutStd::kEta, -0.9, 0.9);
+
+ AliRsnCutMgr *cutMgrMC_step1 = new AliRsnCutMgr("mc_step1", "");
+ AliRsnCutSet *cutSetTrack_step1 = new AliRsnCutSet("mc_step1_tracks");
+
+ cutSetTrack_step1->AddCut(cutEta);
+ cutSetTrack_step1->SetCutScheme("cutEta");
+ cutMgrMC_step1 ->SetCutSet(AliRsnCut::kParticle, cutSetTrack_step1);
+
+ //
+ // *** STEP 2 - Reconstruction & track quality
+ //
+ // Use the interface to AliESDtrackCuts
+ // and set only the cuts we are interested in
+ AliRsnCutESDPrimary *cutQuality = new AliRsnCutESDPrimary("cutCov");
+ cutQuality->GetCuts()->SetMaxCovDiagonalElements(2.0, 2.0, 0.5, 0.5, 2.0);
+ cutQuality->GetCuts()->SetRequireSigmaToVertex(kTRUE);
+ cutQuality->GetCuts()->SetMaxNsigmaToVertex(10000.0);
+ cutQuality->GetCuts()->SetRequireTPCRefit(kTRUE);
+ cutQuality->GetCuts()->SetAcceptKinkDaughters(kTRUE);
+ cutQuality->GetCuts()->SetMinNClustersTPC(50);
+ cutQuality->GetCuts()->SetMaxChi2PerClusterTPC(3.5);
+
+ AliRsnCutMgr *cutMgrESD_step2 = new AliRsnCutMgr("esd_step2", "");
+ AliRsnCutSet *cutSetTrack_step2 = new AliRsnCutSet("esd_step2_tracks");
+
+ cutSetTrack_step2->AddCut(cutQuality);
+ cutSetTrack_step2->SetCutScheme("cutQuality");
+ cutMgrESD_step2 ->SetCutSet(AliRsnCut::kParticle, cutSetTrack_step2);
+
+ //
+ // *** STEP 3 - Primary tracks
+ //
+ // Use the interface to AliESDtrackCuts
+ // and set only the cuts we are interested in
+ // we also disable the cuts we applied before, for clarity
+ AliRsnCutESDPrimary *cutESDPrimary = new AliRsnCutESDPrimary("cutESDPrimary");
+ cutESDPrimary->GetCuts()->SetMaxCovDiagonalElements(100.0, 100.0, 100.0, 100.0, 100.0);
+ cutESDPrimary->GetCuts()->SetRequireSigmaToVertex(kTRUE);
+ cutESDPrimary->GetCuts()->SetMaxNsigmaToVertex(3.0);
+ cutESDPrimary->GetCuts()->SetRequireTPCRefit(kFALSE);
+ cutESDPrimary->GetCuts()->SetAcceptKinkDaughters(kFALSE);
+ cutESDPrimary->GetCuts()->SetMinNClustersTPC(0);
+ cutESDPrimary->GetCuts()->SetMaxChi2PerClusterTPC(100000000.0);
+
+ AliRsnCutMgr *cutMgrESD_step3 = new AliRsnCutMgr("esd_step3", "");
+ AliRsnCutSet *cutSetTrack_step3 = new AliRsnCutSet("esd_step3_tracks");
+
+ cutSetTrack_step3->AddCut(cutESDPrimary);
+ cutSetTrack_step3->SetCutScheme("cutESDPrimary");
+ cutMgrESD_step3 ->SetCutSet(AliRsnCut::kParticle, cutSetTrack_step3);
+
+ //
+ // *** STEP 4 - Two possibilities (depend on the first macro argument)
+ //
+ // option 1 = Bethe-Bloch cut in 3 sigma (the sigma is one argument)
+ // option 2 = realistic Bayesian PID with all detectors
+ //
+ AliRsnCutMgr *cutMgrESD_step4[2];
+ AliRsnCutSet *cutSetTrack_step4[2];
+
+ cutMgrESD_step4[0] = new AliRsnCutMgr("esd_step4_nopid", "");
+ cutMgrESD_step4[1] = new AliRsnCutMgr("esd_step4_pid", "");
+ cutSetTrack_step4[0] = new AliRsnCutSet("esd_step4_tracks_nopid");
+ cutSetTrack_step4[1] = new AliRsnCutSet("esd_step4_tracks_pid");
+
+ // Bethe-Bloch with kaon mass hypothesis
+ AliRsnCutBetheBloch *cutKaonBB = new AliRsnCutBetheBloch("cutKaonBB", 3.0 * sigmaTPC, AliPID::kKaon);
+ cutKaonBB->SetCalibConstant(0, 0.76176e-1);
+ cutKaonBB->SetCalibConstant(1, 10.632);
+ cutKaonBB->SetCalibConstant(2, 0.13279e-4);
+ cutKaonBB->SetCalibConstant(3, 1.8631);
+ cutKaonBB->SetCalibConstant(4, 1.9479);
+
+ // cuts for realistic PID match
+ AliRsnCutStd *cutRealisticPID = new AliRsnCutStd("cutKaonPID", AliRsnCutStd::kRealisticPIDMatch, 0);
+
+ cutSetTrack_step4[0]->AddCut(cutKaonBB);
+ cutSetTrack_step4[0]->SetCutScheme("cutKaonBB");
+
+ cutSetTrack_step4[1]->AddCut(cutRealisticPID);
+ cutSetTrack_step4[1]->SetCutScheme("cutRealisticPID");
+
+ cutMgrESD_step4[0]->SetCutSet(AliRsnCut::kParticle, cutSetTrack_step4[0]);
+ cutMgrESD_step4[1]->SetCutSet(AliRsnCut::kParticle, cutSetTrack_step4[1]);
+
+ // add all steps to the task
+ for (Int_t i = 0; i < 2; i++)
+ {
+ task[i]->AddStepMC (cutMgrMC_step0);
+ task[i]->AddStepMC (cutMgrMC_step1);
+ task[i]->AddStepESD(cutMgrESD_step2);
+ task[i]->AddStepESD(cutMgrESD_step3);
+ task[i]->AddStepESD(cutMgrESD_step4[i]);
+ }
+
+ // connect containers and finalize
+ for (Int_t i = 0; i < 2; i++)
+ {
+ mgr->AddTask(task[i]);
+ mgr->ConnectInput(task[i], 0, mgr->GetCommonInputContainer());
+
+ // initialize and connect container for the output
+ AliAnalysisDataContainer *info = 0x0, *out = 0x0;
+ info = mgr->CreateContainer(Form("EffInfo_%s", suf[i].Data()), TList::Class(), AliAnalysisManager::kOutputContainer, "info.root");
+ out = mgr->CreateContainer(Form("EFF_%s", suf[i].Data()), TList::Class(), AliAnalysisManager::kOutputContainer, Form("%s_%s.root", outFile, suf[i].Data()));
+
+ mgr->ConnectOutput(task[i], 1, info);
+ mgr->ConnectOutput(task[i], 2, out);
+ }
+
+ return kTRUE;
+}
+++ /dev/null
-Bool_t AddAnalysisTaskRsnEffNoPID
-(
- const char *outFile = "eff_nopid.root", // output file name
-)
-{
- // retrieve analysis manager
- AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
-
- // create task
- AliRsnAnalysisEffSE *task = new AliRsnAnalysisEffSE("EffNoPID");
-
- // set prior probabilities for PID
- task->SetPriorProbability(AliPID::kElectron, 0.02);
- task->SetPriorProbability(AliPID::kMuon, 0.02);
- task->SetPriorProbability(AliPID::kPion, 0.83);
- task->SetPriorProbability(AliPID::kKaon, 0.07);
- task->SetPriorProbability(AliPID::kProton, 0.06);
- task->DumpPriors();
-
- // pair definition
- AliRsnPairDef *pairDef1 = new AliRsnPairDef('+', AliPID::kKaon, '-', AliPID::kKaon, 333);
- AliRsnPairDef *pairDef2 = new AliRsnPairDef('-', AliPID::kKaon, '+', AliPID::kPion, 313);
- AliRsnPairDef *pairDef3 = new AliRsnPairDef('+', AliPID::kKaon, '-', AliPID::kPion, 313);
- task->AddPairDef(pairDef1);
- task->AddPairDef(pairDef2);
- task->AddPairDef(pairDef3);
-
- // axis definition
- AliRsnFunctionAxis *axisPt = new AliRsnFunctionAxis(AliRsnFunctionAxis::kPairPt, 100, 0.0, 10.0);
- AliRsnFunctionAxis *axisEta = new AliRsnFunctionAxis(AliRsnFunctionAxis::kPairEta, 10, -1.0, 1.0);
- AliRsnFunctionAxis *axisMult = new AliRsnFunctionAxis(AliRsnFunctionAxis::kEventMult, 500, 0.0, 500.0);
- task->AddAxis(axisMult);
- task->AddAxis(axisPt);
- task->AddAxis(axisEta);
-
- // setup cuts for events (good primary vertex)
- AliRsnCutPrimaryVertex *cutVertex = new AliRsnCutPrimaryVertex("cutVertex", 3);
- AliRsnCutSet *cutSetEvent = new AliRsnCutSet("eventCuts");
- cutSetEvent->AddCut(cutVertex);
- cutSetEvent->SetCutScheme("cutVertex");
- task->SetEventCuts(cutSetEvent);
-
- // *** STEP 0 - All resonances
-
- AliRsnCutMgr *cutMgr0 = new AliRsnCutMgr("step0", "");
- AliRsnCutSet *cutSetTrack0 = new AliRsnCutSet("step0_tracks");
- AliRsnCutSet *cutSetPair0 = new AliRsnCutSet("step0_pairs");
-
- cutMgr0->SetCutSet(AliRsnCut::kParticle, cutSetTrack0);
- cutMgr0->SetCutSet(AliRsnCut::kPair , cutSetPair0 );
-
- task->AddStepMC(cutMgr0);
-
- // *** STEP 1 - Acceptance
-
- AliRsnCutMgr *cutMgr1 = new AliRsnCutMgr("step1", "");
- AliRsnCutSet *cutSetTrack1 = new AliRsnCutSet("step1_tracks");
- AliRsnCutSet *cutSetPair1 = new AliRsnCutSet("step1_pairs");
-
- AliRsnCutStd *cutEta = new AliRsnCutStd("cutEta", AliRsnCutStd::kEta, -0.9, 0.9);
-
- cutSetTrack1->AddCut(cutEta);
- cutSetTrack1->SetCutScheme("cutEta");
-
- cutMgr1->SetCutSet(AliRsnCut::kParticle, cutSetTrack1);
- cutMgr1->SetCutSet(AliRsnCut::kPair , cutSetPair1 );
-
- task->AddStepMC(cutMgr1);
-
- // *** STEP 2 - Reconstruction & quality
-
- AliRsnCutMgr *cutMgr2 = new AliRsnCutMgr("step2", "");
- AliRsnCutSet *cutSetTrack2 = new AliRsnCutSet("step2_tracks");
- AliRsnCutSet *cutSetPair2 = new AliRsnCutSet("step2_pairs");
-
- // cuts for tracks:
- // -- primary track quality
- AliRsnCutESDPrimary *cutESDPrimary = new AliRsnCutESDPrimary("cutESDPrimary");
- cutESDPrimary->GetCuts()->SetMaxCovDiagonalElements(2.0, 2.0, 0.5, 0.5, 2.0);
- cutESDPrimary->GetCuts()->SetRequireSigmaToVertex(kTRUE);
- cutESDPrimary->GetCuts()->SetMaxNsigmaToVertex(4.0);
- cutESDPrimary->GetCuts()->SetRequireTPCRefit(kTRUE);
- cutESDPrimary->GetCuts()->SetAcceptKinkDaughters(kFALSE);
- cutESDPrimary->GetCuts()->SetMinNClustersTPC(50);
- cutESDPrimary->GetCuts()->SetMaxChi2PerClusterTPC(3.5);
-
- cutSetTrack2->AddCut(cutESDPrimary);
- cutSetTrack2->SetCutScheme("cutESDPrimary");
-
- cutMgr2->SetCutSet(AliRsnCut::kParticle, cutSetTrack2);
- cutMgr2->SetCutSet(AliRsnCut::kPair , cutSetPair2 );
-
- task->AddStepESD(cutMgr2);
-
- // *** STEP 3 - Bethe-Bloch cut (0.2)
-
- AliRsnCutMgr *cutMgr3 = new AliRsnCutMgr("step3", "");
- AliRsnCutSet *cutSetTrack3 = new AliRsnCutSet("step3_tracks");
- AliRsnCutSet *cutSetPair3 = new AliRsnCutSet("step3_pairs");
-
- // cuts for tracks:
- // -- Bethe-Bloch with kaon mass hypothesis
- AliRsnCutBetheBloch *cutKaonBB = new AliRsnCutBetheBloch("cutKaonBB", 0.2, AliPID::kKaon);
- cutKaonBB->SetCalibConstant(0, 0.76176e-1);
- cutKaonBB->SetCalibConstant(1, 10.632);
- cutKaonBB->SetCalibConstant(2, 0.13279e-4);
- cutKaonBB->SetCalibConstant(3, 1.8631);
- cutKaonBB->SetCalibConstant(4, 1.9479);
-
- cutSetTrack3->AddCut(cutKaonBB);
- cutSetTrack3->SetCutScheme("cutKaonBB");
- //AliLog::SetClassDebugLevel("AliRsnCut", AliLog::kDebug+3);
- //AliLog::SetClassDebugLevel("AliRsnCutStd", AliLog::kDebug+3);
- //AliLog::SetClassDebugLevel("AliRsnCutBetheBloch", AliLog::kDebug+3);
-
- cutMgr3->SetCutSet(AliRsnCut::kParticle, cutSetTrack3);
- cutMgr3->SetCutSet(AliRsnCut::kPair , cutSetPair3 );
-
- task->AddStepESD(cutMgr3);
-
- // add the task to manager
- mgr->AddTask(task);
-
- // connect input container according to source choice
- mgr->ConnectInput(task, 0, mgr->GetCommonInputContainer());
-
- // initialize and connect container for the output
- AliAnalysisDataContainer *outputInfo = mgr->CreateContainer("EffNoPIDInfo", TList::Class(), AliAnalysisManager::kOutputContainer, "info.root");
- AliAnalysisDataContainer *out = mgr->CreateContainer("EFF_NOPID", TList::Class(), AliAnalysisManager::kOutputContainer, outFile);
- mgr->ConnectOutput(task, 1, outputInfo);
- mgr->ConnectOutput(task, 2, out);
-
- return kTRUE;
-}
+++ /dev/null
-Bool_t AddAnalysisTaskRsnEffPID
-(
- const char *outFile = "eff_pid.root", // output file name
-)
-{
- // retrieve analysis manager
- AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
-
- // create task
- AliRsnAnalysisEffSE *task = new AliRsnAnalysisEffSE("EffPID");
-
- // set prior probabilities for PID
- task->SetPriorProbability(AliPID::kElectron, 0.02);
- task->SetPriorProbability(AliPID::kMuon, 0.02);
- task->SetPriorProbability(AliPID::kPion, 0.83);
- task->SetPriorProbability(AliPID::kKaon, 0.07);
- task->SetPriorProbability(AliPID::kProton, 0.06);
- task->DumpPriors();
-
- // pair definition
- AliRsnPairDef *pairDef1 = new AliRsnPairDef('+', AliPID::kKaon, '-', AliPID::kKaon, 333);
- AliRsnPairDef *pairDef2 = new AliRsnPairDef('-', AliPID::kKaon, '+', AliPID::kPion, 313);
- AliRsnPairDef *pairDef3 = new AliRsnPairDef('+', AliPID::kKaon, '-', AliPID::kPion, 313);
- task->AddPairDef(pairDef1);
- task->AddPairDef(pairDef2);
- task->AddPairDef(pairDef3);
-
- // axis definition
- //AliRsnFunctionAxis *axisIM = new AliRsnFunctionAxis(AliRsnFunctionAxis::kPairInvMass, 1000, 0.0, 2.0);
- AliRsnFunctionAxis *axisPt = new AliRsnFunctionAxis(AliRsnFunctionAxis::kPairPt, 100, 0.0, 10.0);
- AliRsnFunctionAxis *axisEta = new AliRsnFunctionAxis(AliRsnFunctionAxis::kPairEta, 10, -1.0, 1.0);
- AliRsnFunctionAxis *axisMult = new AliRsnFunctionAxis(AliRsnFunctionAxis::kEventMult, 8, 0.0, 200.0);
- //task->AddAxis(axisIM);
- task->AddAxis(axisMult);
- task->AddAxis(axisPt);
- task->AddAxis(axisEta);
-
- // setup cuts for events (good primary vertex)
- AliRsnCutPrimaryVertex *cutVertex = new AliRsnCutPrimaryVertex("cutVertex", 3);
- AliRsnCutSet *cutSetEvent = new AliRsnCutSet("eventCuts");
- cutSetEvent->AddCut(cutVertex);
- cutSetEvent->SetCutScheme("cutVertex");
- task->SetEventCuts(cutSetEvent);
-
- // *** STEP 0 - All resonances
-
- AliRsnCutMgr *cutMgr0 = new AliRsnCutMgr("step0", "");
- AliRsnCutSet *cutSetTrack0 = new AliRsnCutSet("step0_tracks");
- AliRsnCutSet *cutSetPair0 = new AliRsnCutSet("step0_pairs");
-
- cutMgr0->SetCutSet(AliRsnCut::kParticle, cutSetTrack0);
- cutMgr0->SetCutSet(AliRsnCut::kPair , cutSetPair0 );
-
- task->AddStepMC(cutMgr0);
-
- // *** STEP 1 - Acceptance
-
- AliRsnCutMgr *cutMgr1 = new AliRsnCutMgr("step1", "");
- AliRsnCutSet *cutSetTrack1 = new AliRsnCutSet("step1_tracks");
- AliRsnCutSet *cutSetPair1 = new AliRsnCutSet("step1_pairs");
-
- AliRsnCutStd *cutEta = new AliRsnCutStd("cutEta", AliRsnCutStd::kEta, -0.9, 0.9);
-
- cutSetTrack1->AddCut(cutEta);
- cutSetTrack1->SetCutScheme("cutEta");
-
- cutMgr1->SetCutSet(AliRsnCut::kParticle, cutSetTrack1);
- cutMgr1->SetCutSet(AliRsnCut::kPair , cutSetPair1 );
-
- task->AddStepMC(cutMgr1);
-
- // *** STEP 2 - Reconstruction & quality
-
- AliRsnCutMgr *cutMgr2 = new AliRsnCutMgr("step2", "");
- AliRsnCutSet *cutSetTrack2 = new AliRsnCutSet("step2_tracks");
- AliRsnCutSet *cutSetPair2 = new AliRsnCutSet("step2_pairs");
-
- // cuts for tracks:
- // -- primary track quality
- AliRsnCutESDPrimary *cutESDPrimary = new AliRsnCutESDPrimary("cutESDPrimary");
- cutESDPrimary->GetCuts()->SetMaxCovDiagonalElements(2.0, 2.0, 0.5, 0.5, 2.0);
- cutESDPrimary->GetCuts()->SetRequireSigmaToVertex(kTRUE);
- cutESDPrimary->GetCuts()->SetMaxNsigmaToVertex(4.0);
- cutESDPrimary->GetCuts()->SetRequireTPCRefit(kTRUE);
- cutESDPrimary->GetCuts()->SetAcceptKinkDaughters(kFALSE);
- cutESDPrimary->GetCuts()->SetMinNClustersTPC(50);
- cutESDPrimary->GetCuts()->SetMaxChi2PerClusterTPC(3.5);
-
- cutSetTrack2->AddCut(cutESDPrimary);
- cutSetTrack2->SetCutScheme("cutESDPrimary");
-
- cutMgr2->SetCutSet(AliRsnCut::kParticle, cutSetTrack2);
- cutMgr2->SetCutSet(AliRsnCut::kPair , cutSetPair2 );
-
- task->AddStepESD(cutMgr2);
-
- // *** STEP 3 - Realistic PID
-
- AliRsnCutMgr *cutMgr3 = new AliRsnCutMgr("step3", "");
- AliRsnCutSet *cutSetTrack3 = new AliRsnCutSet("step3_tracks");
- AliRsnCutSet *cutSetPair3 = new AliRsnCutSet("step3_pairs");
-
- // cuts for tracks:
- // -- realistic PID
- AliRsnCutStd *cutRealisticPID = new AliRsnCutStd("cutKaonPID", AliRsnCutStd::kRealisticPIDMatch, 0);
-
- cutSetTrack3->AddCut(cutRealisticPID);
- cutSetTrack3->SetCutScheme("cutRealisticPID");
-
- cutMgr3->SetCutSet(AliRsnCut::kParticle, cutSetTrack3);
- cutMgr3->SetCutSet(AliRsnCut::kPair , cutSetPair3 );
-
- task->AddStepESD(cutMgr3);
-
- // add the task to manager
- mgr->AddTask(task);
-
- // connect input container according to source choice
- mgr->ConnectInput(task, 0, mgr->GetCommonInputContainer());
-
- // initialize and connect container for the output
- AliAnalysisDataContainer *outputInfo = mgr->CreateContainer("EffPIDInfo", TList::Class(), AliAnalysisManager::kOutputContainer, "info.root");
- AliAnalysisDataContainer *out = mgr->CreateContainer("EFF_PID", TList::Class(), AliAnalysisManager::kOutputContainer, outFile);
- mgr->ConnectOutput(task, 1, outputInfo);
- mgr->ConnectOutput(task, 2, out);
-
- return kTRUE;
-}
-AliRsnPairManager* RsnConfig
-(
- AliRsnPair::EPairType pidType, // PID type (NoPID, RealisticPID or PerfectPID)
- const char *pairMgrName, // name for the pair manager
- Int_t resonancePDG, // PDG code of resonance (for true pairs)
- AliPID::EParticleType type1, // PID of one member of decay (+)
- AliPID::EParticleType type2, // PID of other member of decay (-)
- Double_t bbCut = 10000.0 // Bethe-Bloch TPC cut value (large --> excluded)
-)
-{
//
-// Creates an AliRsnPairMgr for a specified resonance, which contains:
+// This is an example macro for creation of a pair manager
+// for a resonance analysis with the PWG2/RESONANCES package.
+// Its output is an AliRsnPairManager which will be added to the task.
+// It will contain:
// - signal (inv. mass)
-// - event mixing (inv. mass)
+// - true pairs (inv. mass)
// - like-sign (inv. mass)
// - true pairs (inv. mass, resolution)
+// All histogram are done w.r. to Pt or Eta and w.r. to multiplicity.
+// The binnings are hard-coded. Change them according to your preferences.
//
-// For all pairs, a binning in Pt and Eta is provided, and a cut in multiplicity
-// which defines a multiplicity bin where the analysis is computed.
+// Arguments:
+// -- pairMgrName : a name for the pair manager which must contain
+// some keywords to choose amond the available cuts
+// and PID selection available here (this is a personal customization)
+// -- resonancePDG: PDG code of resonance (for true pairs)
+// -- type1, type2: particle species for track 1 and 2 in the pair (using AliPID enumeration)
//
-// Arguments define how the pair manager must be built, and are explained above
+// NOTE:
+// the keyword available here are the following:
+// -- "NOPID": completely no PID analysis (only primary track cuts are applied)
+// -- "BB" : all tracks are used, but the TPC Bethe-Bloch cut is applied (cut value = 0.2)
+// -- "PID" : realistic PID is used
//
-
+AliRsnPairManager* RsnConfig
+(
+ const char *pairMgrName, // name for the pair manager
+ Int_t resonancePDG, // PDG code of resonance (for true pairs)
+ AliPID::EParticleType type1, // PID of one member of decay (+)
+ AliPID::EParticleType type2 // PID of other member of decay (-)
+)
+{
// === NAME DEFINITIONS =========================================================================
AliRsnPairManager *pairMgr = new AliRsnPairManager(pairMgrName);
+ // examines the given name to define details about track selection and cuts
+ TString str(pairMgrName);
+ AliRsnPair::EPairType pidType;
+ Bool_t useBBCut;
+ if (str.Contains("NOPID"))
+ {
+ pidType = AliRsnPair::kNoPID;
+ useBBCut = kFALSE;
+ Info("RsnConfig", "PID TYPE = No PID -- BB CUT: not used");
+ }
+ else if (str.Contains("BB"))
+ {
+ pidType = AliRsnPair::kNoPID;
+ useBBCut = kTRUE;
+ Info("RsnConfig", "PID TYPE = No PID -- BB CUT: used");
+ }
+ else if (str.Contains("PID"))
+ {
+ pidType = AliRsnPair::kRealisticPID;
+ useBBCut = kFALSE;
+ Info("RsnConfig", "PID TYPE = Realistic PID -- BB CUT: not used");
+ }
+ else
+ {
+ Error("RsnConfig", "Unrecognized keywords in the name. Can't continue");
+ return 0x0;
+ }
+
// === PAIR DEFINITIONS =========================================================================
// if particle #1 and #2 are different, two histograms must be built
AliRsnCutESDPrimary *cutESDPrimary = new AliRsnCutESDPrimary("cutESDPrimary");
cutESDPrimary->GetCuts()->SetMaxCovDiagonalElements(2.0, 2.0, 0.5, 0.5, 2.0);
cutESDPrimary->GetCuts()->SetRequireSigmaToVertex(kTRUE);
- cutESDPrimary->GetCuts()->SetMaxNsigmaToVertex(4.0);
+ cutESDPrimary->GetCuts()->SetMaxNsigmaToVertex(3.0);
cutESDPrimary->GetCuts()->SetRequireTPCRefit(kTRUE);
cutESDPrimary->GetCuts()->SetAcceptKinkDaughters(kFALSE);
cutESDPrimary->GetCuts()->SetMinNClustersTPC(50);
cutESDPrimary->GetCuts()->SetMaxChi2PerClusterTPC(3.5);
// -- Bethe-Bloch with kaon mass hypothesis
- AliRsnCutBetheBloch *cutKaonBB = new AliRsnCutBetheBloch("cutKaonBB", bbCut, AliPID::kKaon);
+ Double_t sigmaTPC = 0.065;
+ AliRsnCutBetheBloch *cutKaonBB = new AliRsnCutBetheBloch("cutKaonBB", 3.0 * sigmaTPC, AliPID::kKaon);
cutKaonBB->SetCalibConstant(0, 0.76176e-1);
cutKaonBB->SetCalibConstant(1, 10.632);
cutKaonBB->SetCalibConstant(2, 0.13279e-4);
// cut set definition for all pairs
AliRsnCutSet *cutSetParticle = new AliRsnCutSet("trackCuts");
cutSetParticle->AddCut(cutESDPrimary);
- if (pidType == AliRsnPair::kNoPID && bbCut < 10.0)
+ if (useBBCut)
{
- Info("RsnConfig", "PID TYPE = NOPID AND BB CUT = %f -- Adding this cut", bbCut);
cutSetParticle->AddCut(cutKaonBB);
cutSetParticle->SetCutScheme("cutKaonBB&cutESDPrimary");
}
else {
- Info("RsnConfig", "PID TYPE = %d AND BB CUT = %f -- Excluding cut", pidType, bbCut);
cutSetParticle->SetCutScheme("cutESDPrimary");
}
// define all binnings
AliRsnFunctionAxis *axisIM = new AliRsnFunctionAxis(AliRsnFunctionAxis::kPairInvMass, 1000, 0.0, 2.0);
- AliRsnFunctionAxis *axisPt = new AliRsnFunctionAxis(AliRsnFunctionAxis::kPairPt, 400, 0.0, 10.0);
- AliRsnFunctionAxis *axisEta = new AliRsnFunctionAxis(AliRsnFunctionAxis::kPairEta, 10, -1.0, 1.0);
+ AliRsnFunctionAxis *axisPt = new AliRsnFunctionAxis(AliRsnFunctionAxis::kPairPt, 40, 0.0, 10.0);
+ AliRsnFunctionAxis *axisEta = new AliRsnFunctionAxis(AliRsnFunctionAxis::kPairEta, 20, -1.5, 1.5);
AliRsnFunctionAxis *axisMult = new AliRsnFunctionAxis(AliRsnFunctionAxis::kEventMult, 8, 0.0, 200.0);
// function #1: pt, mult