2 #include <AliAnalysisManager.h>
3 #include <PWGLF/RESONANCES/AliRsnCutPrimaryVertex.h>
4 #include <PWGLF/RESONANCES/AliRsnValuePair.h>
5 #include <PWGLF/RESONANCES/AliRsnListOutput.h>
6 #include <PWGLF/RESONANCES/AliRsnPairDef.h>
7 #include <PWGLF/RESONANCES/AliRsnLoopPair.h>
8 #include <PWGLF/RESONANCES/AliRsnAnalysisTask.h>
9 #include <PWGLF/RESONANCES/AliRsnLoopDaughter.h>
10 #include <PWGLF/RESONANCES/AliRsnValueDaughter.h>
11 #include <PWGLF/RESONANCES/AliRsnMiniAnalysisTask.h>
12 #include <PWGLF/RESONANCES/AliRsnCutMiniPair.h>
13 #include <PWGLF/RESONANCES/AliRsnInputHandler.h>
14 #include <PWGLF/RESONANCES/AliRsnMiniMonitor.h>
15 #include <PWGLF/RESONANCES/AliRsnValueEvent.h>
18 Bool_t RsnConfig(AliAnalysisTaskSE *task,Bool_t isMC,Bool_t isMixing,AliRsnInputHandler *rsnIH=0,TList *listRsn=0) {
20 if (!task) return kFALSE;
26 Int_t isRsnMini = AliAnalysisManager::GetGlobalInt("rsnUseMiniPackage",valid);
27 TString rsnCutOptCommon = AliAnalysisManager::GetGlobalStr("rsnLegoTrainCommonCutOption",valid);
31 // set commol eventCuts
33 if (!RsnLoadMacroFromConfig("AddRsnCommonEventCuts.C")) return kFALSE;
34 AliRsnCutSet *commonEventCuts = AddRsnCommonEventCuts(task);
36 if (!RsnLoadMacroFromConfig("AddRsnCommonPairCuts.C")) return kFALSE;
37 AliRsnCutSet *commonPairCuts = AddRsnCommonPairCuts();
41 TString rsnName,rsnNameOpt,rsnNameOptFull,rsnCutName,rsnCutOpt,rsnCutNameOptFull;
42 while ((rsnObj = (TNamed *)next())) {
43 GetOptionFromString(rsnObj->GetName(),rsnName,rsnNameOpt);
44 rsnNameOptFull=rsnName;
45 if (!rsnNameOpt.IsNull()) rsnNameOptFull += Form("_%s",rsnNameOpt.Data());
47 GetOptionFromString(rsnObj->GetTitle(),rsnCutName,rsnCutOpt);
48 rsnCutNameOptFull=rsnCutName;
49 if (!rsnCutOpt.IsNull())rsnCutNameOptFull += Form("_%s",rsnCutOpt.Data());
51 if (!rsnCutOptCommon.IsNull()) {
52 if (!rsnCutOpt.IsNull()) rsnCutOpt += "_";
53 rsnCutOpt += rsnCutOptCommon.Data();
56 if (!RsnLoadMacroFromConfig(Form("AddRsnDaughterCuts%s.C",rsnCutName.Data()))) return kFALSE;
57 if (!RsnLoadMacroFromConfig(Form("AddRsnPairs%s.C",rsnName.Data()))) return kFALSE;
59 rsnNameOptFull.ToLower();
62 if (!rsnName.CompareTo("phi")) {
63 numOfCuts = gROOT->ProcessLine(Form("AddRsnDaughterCuts%s(AliPID::kKaon,AliPID::kKaon,\"%s\",%d,(AliRsnInputHandler*)%p,(AliAnalysisTaskSE*)%p)",rsnCutName.Data(), rsnCutOpt.Data(),isRsnMini,rsnIH, task));
65 if (rsnNameOpt.Contains("mon")) AddParticleMonitor(task,isMC,cutIndex,commonEventCuts,commonPairCuts,Form("%s_%s_K",rsnNameOptFull.Data(),rsnCutNameOptFull.Data()));
66 AddRsnPairsPhi(task,isMC,isMixing,AliPID::kKaon,cutIndex,AliPID::kKaon,cutIndex,commonEventCuts,commonPairCuts,Form("%s_%s",rsnNameOptFull.Data(),rsnCutNameOptFull.Data()));
69 } else if (!rsnName.CompareTo("kstar")) {
70 numOfCuts = gROOT->ProcessLine(Form("AddRsnDaughterCuts%s(AliPID::kKaon,AliPID::kPion,\"%s\",%d,(AliRsnInputHandler*)%p,(AliAnalysisTaskSE*)%p)",rsnCutName.Data(), rsnCutOpt.Data(),isRsnMini,rsnIH,task));
72 if (rsnNameOpt.Contains("mon")) AddParticleMonitor(task,isMC,cutIndex,commonEventCuts,commonPairCuts,Form("%s_%s_K",rsnNameOptFull.Data(),rsnCutNameOptFull.Data()));
73 if (rsnNameOpt.Contains("mon")) AddParticleMonitor(task,isMC,cutIndex+1,commonEventCuts,commonPairCuts,Form("%s_%s_pi",rsnNameOptFull.Data(),rsnCutNameOptFull.Data()));
74 AddRsnPairsKStar(task,isMC,isMixing,AliPID::kKaon,cutIndex,AliPID::kPion,cutIndex+1,commonEventCuts,commonPairCuts,Form("%s_%s",rsnNameOptFull.Data(),rsnCutNameOptFull.Data()));
78 Printf("Error : Particle %s is not supported !!!!",rsnName.Data());
87 Bool_t RsnLoadMacroFromConfig(TString macro,TString path="") {
90 TString lego_path = AliAnalysisManager::GetGlobalStr("rsnLegoTrainPath",valid);
91 if (!valid) lego_path = "$ALICE_ROOT/PWGLF/RESONANCES/macros/lego_train";
93 if (!gSystem->AccessPathName(macro.Data())) {
94 gROOT->LoadMacro(macro.Data());
95 Printf("Macro loaded from %s/%s ...",gSystem->pwd(),macro.Data());
99 if (!gSystem->AccessPathName(gSystem->ExpandPathName(Form("%s/%s",lego_path.Data(),macro.Data())))) {
100 gROOT->LoadMacro(gSystem->ExpandPathName(Form("%s/%s",lego_path.Data(),macro.Data())));
101 Printf("Macro loaded from %s ...",gSystem->ExpandPathName(Form("%s/%s",lego_path.Data(),macro.Data())));
105 Printf("Error loading %s",macro.Data());
110 void GetOptionFromString(TString str,TString &outStr1,TString &outStr2,TString d=":") {
112 TObjArray *tokens = str.Tokenize(d.Data());
113 TObjString *objStr = (TObjString *)tokens->At(0);
119 outStr1 = objStr->GetString();
121 objStr = (TObjString *) tokens->At(1);
126 outStr2 = objStr->GetString();
130 Bool_t AddPair(AliAnalysisTaskSE *task, Bool_t isMC,Bool_t isMixing, AliPID::EParticleType pType1,Int_t listID1, AliPID::EParticleType pType2,Int_t listID2, Int_t pdgMother,Double_t massMother, AliRsnCutSet *commonEventCuts=0,AliRsnCutSet *commonPairCuts=0, TString name = "") {
133 Int_t useMCMomentum = AliAnalysisManager::GetGlobalInt("rsnUseMCMomentum",valid);
135 Bool_t typeSame = (pType1 == pType2);
137 // Printf("------------- id1=%d id2=%d",listID1,listID2);
139 TList *listLoops = new TList;
142 AliRsnPairDef *pairDefPM = new AliRsnPairDef((AliRsnDaughter::ESpecies)pType1, '+', (AliRsnDaughter::ESpecies)pType2, '-', pdgMother, massMother);
143 AliRsnPairDef *pairDefMP = new AliRsnPairDef((AliRsnDaughter::ESpecies)pType1, '-', (AliRsnDaughter::ESpecies)pType2, '+', pdgMother, massMother);
144 AliRsnPairDef *pairDefPP = new AliRsnPairDef((AliRsnDaughter::ESpecies)pType1, '+', (AliRsnDaughter::ESpecies)pType2, '+', pdgMother, massMother);
145 AliRsnPairDef *pairDefMM = new AliRsnPairDef((AliRsnDaughter::ESpecies)pType1, '-', (AliRsnDaughter::ESpecies)pType2, '-', pdgMother, massMother);
147 // loop object creation
148 AliRsnLoopPair *lp = 0;
151 lp = new AliRsnLoopPair(Form("%s_PM", name.Data()), pairDefPM, kFALSE);
155 lp = new AliRsnLoopPair(Form("%s_MP", name.Data()), pairDefMP, kFALSE);
159 // sets +- TRUE pairs
161 lp = new AliRsnLoopPair(Form("%s_PM_TRUE", name.Data()), pairDefPM, kFALSE);
162 lp->SetOnlyTrue(kTRUE);
163 lp->SetCheckDecay(kTRUE);
166 lp = new AliRsnLoopPair(Form("%s_MP_TRUE", name.Data()), pairDefMP, kFALSE);
167 lp->SetOnlyTrue(kTRUE);
168 lp->SetCheckDecay(kTRUE);
171 // sets +- TRUE paris (MC is used for momentum)
172 lp = new AliRsnLoopPair(Form("%s_PM_TRUE_MC", name.Data()), pairDefPM, kFALSE);
173 lp->SetTrueMC(kTRUE);
176 // sets +- TRUE paris (MC is used for momentum)
177 lp = new AliRsnLoopPair(Form("%s_MP_TRUE_MC", name.Data()), pairDefMP, kFALSE);
178 lp->SetTrueMC(kTRUE);
184 lp = new AliRsnLoopPair(Form("%s_PP", name.Data()), pairDefPP, kFALSE);
188 lp = new AliRsnLoopPair(Form("%s_MM", name.Data()), pairDefMM, kFALSE);
192 // sets +- Mixing (NOT mini)
193 lp = new AliRsnLoopPair(Form("%s_PM", name.Data()), pairDefPM, kTRUE);
196 // sets -+ Mixing (NOT mini)
197 lp = new AliRsnLoopPair(Form("%s_MP", name.Data()), pairDefMP, kTRUE);
200 // sets ++ Mixing (NOT mini)
201 lp = new AliRsnLoopPair(Form("%s_PP", name.Data()), pairDefPP, kTRUE);
204 // sets -- Mixing (NOT mini)
205 lp = new AliRsnLoopPair(Form("%s_MM", name.Data()), pairDefMM, kTRUE);
210 // loops over all AliRsnLoops and sets everything (don't touch it if you don't know what you are doing)
211 TIter next(listLoops);
212 while ((lp = (AliRsnLoopPair *)next.Next())) {
213 lp->SetListID(0, listID1);
214 lp->SetListID(1, listID2);
215 lp->SetMCRefInfo(useMCMomentum);
216 if (commonPairCuts) lp->SetPairCuts(commonPairCuts);
217 if (commonEventCuts) lp->SetEventCuts(commonEventCuts);
218 if (name.Contains("phi")) AddPairOutputPhi(lp);
219 else if (name.Contains("kstar")) AddPairOutputKStar(lp);
221 ((AliRsnAnalysisTask *)task)->AddLoop(lp);
226 // void AddMonitorOutput(AliRsnLoopDaughter *mon)
228 void AddMonitorOutput(TObjArray *mon,TString opt="")
232 Printf("Error: mon is null !!!!");
237 Int_t useMCMon = AliAnalysisManager::GetGlobalInt("rsnUseMCMonitoring",valid);
238 // if (useMCMon) return;
241 AliRsnValueDaughter *axisMomTPC = new AliRsnValueDaughter("pTPC", AliRsnValueDaughter::kPtpc);
242 AliRsnValueDaughter *axisSigTPC = new AliRsnValueDaughter("sTPC", AliRsnValueDaughter::kTPCsignal);
243 axisMomTPC->SetBins(0.0,5.0,0.01);
244 axisSigTPC->SetBins(0.0,500.0,2.0);
246 // output: 2D histogram of TPC signal vs. TPC momentum
247 AliRsnListOutput *outMonitordEdxTPC = new AliRsnListOutput("dEdx", AliRsnListOutput::kHistoDefault);
248 outMonitordEdxTPC->AddValue(axisMomTPC);
249 outMonitordEdxTPC->AddValue(axisSigTPC);
251 // add outputs to loop
252 mon->Add(outMonitordEdxTPC);
255 AliRsnValueDaughter *axisMomTPCForTOF = new AliRsnValueDaughter("pTPC", AliRsnValueDaughter::kPtpc);
256 AliRsnValueDaughter *axisSigTOF = new AliRsnValueDaughter("sTOF", AliRsnValueDaughter::kTOFsignal);
257 axisMomTPCForTOF->SetBins(0.0,5.0,0.01);
258 axisSigTOF->SetBins(0.0,500.0,2.0);
260 // output: 2D histogram of TPC signal vs. TPC momentum
261 AliRsnListOutput *outMonitordEdxTOF = new AliRsnListOutput("Edx", AliRsnListOutput::kHistoDefault);
262 outMonitordEdxTOF->AddValue(axisMomTPCForTOF);
263 outMonitordEdxTOF->AddValue(axisSigTOF);
265 // add outputs to loop
266 mon->Add(outMonitordEdxTOF);
270 AliRsnValueDaughter *axisMomP = new AliRsnValueDaughter("p", AliRsnValueDaughter::kP);
271 axisMomP->SetBins(0.0,5.0,0.01);
273 // output: 2D histogram of TPC signal vs. TPC momentum
274 AliRsnListOutput *outMonitorP = new AliRsnListOutput("P", AliRsnListOutput::kHistoDefault);
275 outMonitorP->AddValue(axisMomP);
277 // add outputs to loop
278 mon->Add(outMonitorP);
282 AliRsnValueDaughter *axisMomPMC = new AliRsnValueDaughter("pMC", AliRsnValueDaughter::kP);
283 axisMomPMC->SetUseMCInfo(kTRUE);
284 axisMomPMC->SetBins(0.0,5.0,0.01);
286 // output: 2D histogram of TPC signal vs. TPC momentum
287 AliRsnListOutput *outMonitorPMC = new AliRsnListOutput("PMC", AliRsnListOutput::kHistoDefault);
288 outMonitorPMC->AddValue(axisMomPMC);
290 // add outputs to loop
291 mon->Add(outMonitorPMC);
296 AliRsnValueDaughter *axisMomPt = new AliRsnValueDaughter("pt", AliRsnValueDaughter::kPt);
297 axisMomPt->SetBins(0.0,5.0,0.01);
299 // output: 2D histogram of TPC signal vs. TPC momentum
300 AliRsnListOutput *outMonitorPt = new AliRsnListOutput("Pt", AliRsnListOutput::kHistoDefault);
301 outMonitorPt->AddValue(axisMomPt);
303 // add outputs to loop
304 mon->Add(outMonitorPt);
308 AliRsnValueDaughter *axisMomPtMC = new AliRsnValueDaughter("ptMC", AliRsnValueDaughter::kPt);
309 axisMomPtMC->SetUseMCInfo(kTRUE);
310 axisMomPtMC->SetBins(0.0,5.0,0.01);
312 // output: 2D histogram of TPC signal vs. TPC momentum
313 AliRsnListOutput *outMonitorPtMC = new AliRsnListOutput("PtMC", AliRsnListOutput::kHistoDefault);
314 outMonitorPtMC->AddValue(axisMomPtMC);
316 // add outputs to loop
317 mon->Add(outMonitorPtMC);
321 AliRsnValueDaughter *axisMomEta = new AliRsnValueDaughter("eta", AliRsnValueDaughter::kEta);
322 axisMomEta->SetBins(-1.0,1.0,0.01);
324 // output: 2D histogram of TPC signal vs. TPC momentum
325 AliRsnListOutput *outMonitorEta = new AliRsnListOutput("Eta", AliRsnListOutput::kHistoDefault);
326 outMonitorEta->AddValue(axisMomEta);
328 // add outputs to loop
329 mon->Add(outMonitorEta);
333 AliRsnValueDaughter *axisMomEtaMC = new AliRsnValueDaughter("etaMC", AliRsnValueDaughter::kEta);
334 axisMomEtaMC->SetUseMCInfo(kTRUE);
335 axisMomEtaMC->SetBins(-1.0,1.0,0.01);
337 // output: 2D histogram of TPC signal vs. TPC momentum
338 AliRsnListOutput *outMonitorEtaMC = new AliRsnListOutput("EtaMC", AliRsnListOutput::kHistoDefault);
339 outMonitorEtaMC->AddValue(axisMomEtaMC);
341 // add outputs to loop
342 mon->Add(outMonitorEtaMC);
345 AliRsnValueDaughter *axisTPCnsigmaK = new AliRsnValueDaughter("K", AliRsnValueDaughter::kTPCnsigmaK);
346 axisTPCnsigmaK->SetBins(1001,-100,100);
348 // output: 2D histogram of TPC signal vs. TPC momentum
349 AliRsnListOutput *outMonitorTPCnsigmaK = new AliRsnListOutput("TPC_nsigma", AliRsnListOutput::kHistoDefault);
350 outMonitorTPCnsigmaK->AddValue(axisTPCnsigmaK);
352 // add outputs to loop
353 mon->Add(outMonitorTPCnsigmaK);
356 AliRsnValueDaughter *axisTPCnsigmaPi = new AliRsnValueDaughter("pi", AliRsnValueDaughter::kTPCnsigmaPi);
357 axisTPCnsigmaPi->SetBins(1001,-100,100);
359 // output: 2D histogram of TPC signal vs. TPC momentum
360 AliRsnListOutput *outMonitorTPCnsigmaPi = new AliRsnListOutput("TPC_nsigma", AliRsnListOutput::kHistoDefault);
361 outMonitorTPCnsigmaPi->AddValue(axisTPCnsigmaPi);
363 // add outputs to loop
364 mon->Add(outMonitorTPCnsigmaPi);
367 AliRsnValueDaughter *axisTPCnsigmaP = new AliRsnValueDaughter("p", AliRsnValueDaughter::kTPCnsigmaP);
368 axisTPCnsigmaP->SetBins(1001,-100,100);
370 // output: 2D histogram of TPC signal vs. TPC momentum
371 AliRsnListOutput *outMonitorTPCnsigmaP = new AliRsnListOutput("TPC_nsigma", AliRsnListOutput::kHistoDefault);
372 outMonitorTPCnsigmaP->AddValue(axisTPCnsigmaP);
374 // add outputs to loop
375 mon->Add(outMonitorTPCnsigmaP);
378 if (!opt.Contains("NoTOFSIGMA")) {
381 AliRsnValueDaughter *axisTOFnsigmaK = new AliRsnValueDaughter("K", AliRsnValueDaughter::kTOFnsigmaK);
382 axisTOFnsigmaK->SetBins(1001,-100,100);
384 // output: 2D histogram of TPC signal vs. TPC momentum
385 AliRsnListOutput *outMonitorTOFnsigmaK = new AliRsnListOutput("TOF_nsigma", AliRsnListOutput::kHistoDefault);
386 outMonitorTOFnsigmaK->AddValue(axisTOFnsigmaK);
388 // add outputs to loop
389 mon->Add(outMonitorTOFnsigmaK);
392 AliRsnValueDaughter *axisTOFnsigmaPi = new AliRsnValueDaughter("pi", AliRsnValueDaughter::kTOFnsigmaPi);
393 axisTOFnsigmaPi->SetBins(1001,-100,100);
395 // output: 2D histogram of TPC signal vs. TPC momentum
396 AliRsnListOutput *outMonitorTOFnsigmaPi = new AliRsnListOutput("TOF_nsigma", AliRsnListOutput::kHistoDefault);
397 outMonitorTOFnsigmaPi->AddValue(axisTOFnsigmaPi);
399 // add outputs to loop
400 mon->Add(outMonitorTOFnsigmaPi);
403 AliRsnValueDaughter *axisTOFnsigmaP = new AliRsnValueDaughter("p", AliRsnValueDaughter::kTOFnsigmaP);
404 axisTOFnsigmaP->SetBins(1001,-100,100);
406 // output: 2D histogram of TPC signal vs. TPC momentum
407 AliRsnListOutput *outMonitorTOFnsigmaP = new AliRsnListOutput("TOF_nsigma", AliRsnListOutput::kHistoDefault);
408 outMonitorTOFnsigmaP->AddValue(axisTOFnsigmaP);
410 // add outputs to loop
411 mon->Add(outMonitorTOFnsigmaP);
415 AliRsnListOutput *outMonitorPTvsMult = new AliRsnListOutput("PTvsMult",AliRsnListOutput::kHistoDefault);
416 AliRsnValueDaughter *vd1 = new AliRsnValueDaughter("pt",AliRsnValueDaughter::kPt);
417 vd1->SetBins(0.0,5.0,0.01);
418 outMonitorPTvsMult->AddValue(vd1);
420 AliRsnValueEvent *ve1 = new AliRsnValueEvent("mult",AliRsnValueEvent::kMult);
421 ve1->SetBins(0.0,100.0,1);
422 outMonitorPTvsMult->AddValue(ve1);
423 mon->Add(outMonitorPTvsMult);
425 // mon->SetMCRefInfo(gRsnUseMCMomentum);
429 void AddMonitorOutputMini(AliRsnMiniAnalysisTask *task,Int_t listID1,TString name = "",Char_t charge='0')
431 TString chargeName="all";
432 if ( charge == '+' ) chargeName = "pos";
433 if ( charge == '-' ) chargeName = "neg";
435 AliRsnMiniMonitor *mondEdx = new AliRsnMiniMonitor(Form("%s_dEdxTPCvsP_%s", name.Data(),chargeName.Data()),AliRsnMiniMonitor::kdEdxTPCvsP, listID1);
436 mondEdx->SetCharge(charge);
438 AliRsnMiniMonitor *monPt = new AliRsnMiniMonitor(Form("%s_Pt_%s", name.Data(),chargeName.Data()),AliRsnMiniMonitor::kTrackPt, listID1);
439 monPt->SetCharge(charge);
443 void AddParticleMonitor(AliAnalysisTaskSE *task, Bool_t isMC, Int_t listID1,AliRsnCutSet *commonEventCuts=0,AliRsnCutSet *cutPair=0,TString name = "")
446 Int_t isRsnMini = AliAnalysisManager::GetGlobalInt("rsnUseMiniPackage",valid);
448 Printf("Monitoring by mini is not supported now. It will be soon !!!");
450 // AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
452 // AddMonitorOutputMini((AliRsnMiniAnalysisTask *)task,listID1,name);
453 // AddMonitorOutputMini((AliRsnMiniAnalysisTask *)task,listID1,name,'+');
454 // AddMonitorOutputMini((AliRsnMiniAnalysisTask *)task,listID1,name,'-');
456 TList *listLoops = new TList;
457 // monitor definition
458 AliRsnDaughterDef *tracksAll = new AliRsnDaughterDef(AliRsnDaughter::kTrack /*'+' or '-'*/);
459 AliRsnDaughterDef *tracksPos = new AliRsnDaughterDef(AliRsnDaughter::kTrack,'+');
460 AliRsnDaughterDef *tracksNeg = new AliRsnDaughterDef(AliRsnDaughter::kTrack,'-');
462 AliRsnLoopDaughter *lm =0;
464 listLoops->Add(new AliRsnLoopDaughter(Form("%s_all", name.Data()), listID1, tracksAll));
465 listLoops->Add(new AliRsnLoopDaughter(Form("%s_pos", name.Data()), listID1, tracksPos));
466 listLoops->Add(new AliRsnLoopDaughter(Form("%s_neg", name.Data()), listID1, tracksNeg));
468 TIter next(listLoops);
469 while ((lm = (AliRsnLoopDaughter *)next.Next())) {
470 if (commonEventCuts) lm->SetEventCuts(commonEventCuts);
471 AddMonitorOutput(lm);
472 ((AliRsnAnalysisTask *)task)->AddLoop(lm);