2 #include <PWG2/RESONANCES/AliRsnCutPrimaryVertex.h>
3 #include <PWG2/RESONANCES/AliRsnValuePair.h>
4 #include <PWG2/RESONANCES/AliRsnListOutput.h>
5 #include <PWG2/RESONANCES/AliRsnPairDef.h>
6 #include <PWG2/RESONANCES/AliRsnLoopPair.h>
7 #include <PWG2/RESONANCES/AliRsnAnalysisTask.h>
8 #include <PWG2/RESONANCES/AliRsnLoopDaughter.h>
9 #include <PWG2/RESONANCES/AliRsnValueDaughter.h>
10 #include <PWG2/RESONANCES/AliRsnMiniAnalysisTask.h>
11 #include <PWG2/RESONANCES/AliRsnCutMiniPair.h>
12 #include <PWG2/RESONANCES/AliRsnInputHandler.h>
13 #include <PWG2/RESONANCES/AliRsnMiniMonitor.h>
14 #include <ANALYSIS/AliAnalysisManager.h>
15 #include <PWG2/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);
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; if (!rsnNameOpt.IsNull()) rsnNameOptFull += Form("_%s",rsnNameOpt.Data());
46 GetOptionFromString(rsnObj->GetTitle(),rsnCutName,rsnCutOpt);
47 rsnCutNameOptFull=rsnCutName; if (!rsnCutOpt.IsNull())rsnCutNameOptFull += Form("_%s",rsnCutOpt.Data());
49 if (!RsnLoadMacroFromConfig(Form("AddRsnDaughterCuts%s.C",rsnCutName.Data()))) return kFALSE;
50 if (!RsnLoadMacroFromConfig(Form("AddRsnPairs%s.C",rsnName.Data()))) return kFALSE;
52 rsnNameOptFull.ToLower();
55 if (!rsnName.CompareTo("phi")) {
56 numOfCuts = gROOT->ProcessLine(Form("AddRsnDaughterCuts%s(AliPID::kKaon,AliPID::kKaon,\"%s\",%d,(AliRsnInputHandler*)%p,(AliAnalysisTaskSE*)%p)",rsnCutName.Data(), rsnCutOpt.Data(),isRsnMini,rsnIH, task));
58 if (rsnNameOpt.Contains("mon")) AddParticleMonitor(task,isMC,cutIndex,commonEventCuts,commonPairCuts,Form("%s_%s_K",rsnNameOptFull.Data(),rsnCutNameOptFull.Data()));
59 AddRsnPairsPhi(task,isMC,isMixing,AliPID::kKaon,cutIndex,AliPID::kKaon,cutIndex,commonEventCuts,commonPairCuts,Form("%s_%s",rsnNameOptFull.Data(),rsnCutNameOptFull.Data()));
62 } else if (!rsnName.CompareTo("kstar")) {
63 numOfCuts = gROOT->ProcessLine(Form("AddRsnDaughterCuts%s(AliPID::kKaon,AliPID::kPion,\"%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 if (rsnNameOpt.Contains("mon")) AddParticleMonitor(task,isMC,cutIndex+1,commonEventCuts,commonPairCuts,Form("%s_%s_pi",rsnNameOptFull.Data(),rsnCutNameOptFull.Data()));
67 AddRsnPairsKStar(task,isMC,isMixing,AliPID::kKaon,cutIndex,AliPID::kPion,cutIndex+1,commonEventCuts,commonPairCuts,Form("%s_%s",rsnNameOptFull.Data(),rsnCutNameOptFull.Data()));
71 Printf("Error : Particle %s is not supported !!!!",rsnName.Data());
80 Bool_t RsnLoadMacroFromConfig(TString macro,TString path="") {
83 TString lego_path = AliAnalysisManager::GetGlobalStr("rsnLegoTrainPath",valid);
84 if (!valid) lego_path = "$ALICE_ROOT/PWG2/RESONANCES/macros/lego_train";
86 if (!gSystem->AccessPathName(macro.Data())) {
87 gROOT->LoadMacro(macro.Data());
88 Printf("Macro loaded from %s/%s ...",gSystem->pwd(),macro.Data());
92 if (!gSystem->AccessPathName(gSystem->ExpandPathName(Form("%s/%s",lego_path.Data(),macro.Data())))) {
93 gROOT->LoadMacro(gSystem->ExpandPathName(Form("%s/%s",lego_path.Data(),macro.Data())));
94 Printf("Macro loaded from %s ...",gSystem->ExpandPathName(Form("%s/%s",lego_path.Data(),macro.Data())));
98 Printf("Error loading %s",macro.Data());
103 void GetOptionFromString(TString str,TString &outStr1,TString &outStr2,TString d=":") {
105 TObjArray *tokens = str.Tokenize(d.Data());
106 TObjString *objStr = (TObjString *)tokens->At(0);
112 outStr1 = objStr->GetString();
114 objStr = (TObjString *) tokens->At(1);
119 outStr2 = objStr->GetString();
123 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 = "") {
126 Int_t useMCMomentum = AliAnalysisManager::GetGlobalInt("rsnUseMCMomentum",valid);
128 Bool_t typeSame = (pType1 == pType2);
130 // Printf("------------- id1=%d id2=%d",listID1,listID2);
132 TList *listLoops = new TList;
135 AliRsnPairDef *pairDefPM = new AliRsnPairDef((AliRsnDaughter::ESpecies)pType1, '+', (AliRsnDaughter::ESpecies)pType2, '-', pdgMother, massMother);
136 AliRsnPairDef *pairDefMP = new AliRsnPairDef((AliRsnDaughter::ESpecies)pType1, '-', (AliRsnDaughter::ESpecies)pType2, '+', pdgMother, massMother);
137 AliRsnPairDef *pairDefPP = new AliRsnPairDef((AliRsnDaughter::ESpecies)pType1, '+', (AliRsnDaughter::ESpecies)pType2, '+', pdgMother, massMother);
138 AliRsnPairDef *pairDefMM = new AliRsnPairDef((AliRsnDaughter::ESpecies)pType1, '-', (AliRsnDaughter::ESpecies)pType2, '-', pdgMother, massMother);
140 // loop object creation
141 AliRsnLoopPair *lp = 0;
144 lp = new AliRsnLoopPair(Form("%s_PM", name.Data()), pairDefPM, kFALSE);
148 lp = new AliRsnLoopPair(Form("%s_MP", name.Data()), pairDefMP, kFALSE);
152 // sets +- TRUE pairs
154 lp = new AliRsnLoopPair(Form("%s_PM_TRUE", name.Data()), pairDefPM, kFALSE);
155 lp->SetOnlyTrue(kTRUE);
156 lp->SetCheckDecay(kTRUE);
159 lp = new AliRsnLoopPair(Form("%s_MP_TRUE", name.Data()), pairDefMP, kFALSE);
160 lp->SetOnlyTrue(kTRUE);
161 lp->SetCheckDecay(kTRUE);
164 // sets +- TRUE paris (MC is used for momentum)
165 lp = new AliRsnLoopPair(Form("%s_PM_TRUE_MC", name.Data()), pairDefPM, kFALSE);
166 lp->SetTrueMC(kTRUE);
169 // sets +- TRUE paris (MC is used for momentum)
170 lp = new AliRsnLoopPair(Form("%s_MP_TRUE_MC", name.Data()), pairDefMP, kFALSE);
171 lp->SetTrueMC(kTRUE);
177 lp = new AliRsnLoopPair(Form("%s_PP", name.Data()), pairDefPP, kFALSE);
181 lp = new AliRsnLoopPair(Form("%s_MM", name.Data()), pairDefMM, kFALSE);
185 // sets +- Mixing (NOT mini)
186 lp = new AliRsnLoopPair(Form("%s_PM", name.Data()), pairDefPM, kTRUE);
189 // sets -+ Mixing (NOT mini)
190 lp = new AliRsnLoopPair(Form("%s_MP", name.Data()), pairDefMP, kTRUE);
193 // sets ++ Mixing (NOT mini)
194 lp = new AliRsnLoopPair(Form("%s_PP", name.Data()), pairDefPP, kTRUE);
197 // sets -- Mixing (NOT mini)
198 lp = new AliRsnLoopPair(Form("%s_MM", name.Data()), pairDefMM, kTRUE);
203 // loops over all AliRsnLoops and sets everything (don't touch it if you don't know what you are doing)
204 TIter next(listLoops);
205 while ((lp = (AliRsnLoopPair *)next.Next())) {
206 lp->SetListID(0, listID1);
207 lp->SetListID(1, listID2);
208 lp->SetMCRefInfo(useMCMomentum);
209 if (commonPairCuts) lp->SetPairCuts(commonPairCuts);
210 if (commonEventCuts) lp->SetEventCuts(commonEventCuts);
211 if (name.Contains("phi")) AddPairOutputPhi(lp);
212 else if (name.Contains("kstar")) AddPairOutputKStar(lp);
214 ((AliRsnAnalysisTask *)task)->AddLoop(lp);
219 // void AddMonitorOutput(AliRsnLoopDaughter *mon)
221 void AddMonitorOutput(TObjArray *mon)
224 if (!mon) {Printf("Error: mon is null !!!!");return;}
227 Int_t useMCMomentum = AliAnalysisManager::GetGlobalInt("rsnUseMCMomentum",valid);
228 if (useMCMomentum) return;
231 AliRsnValueDaughter *axisMomTPC = new AliRsnValueDaughter("pTPC", AliRsnValueDaughter::kPtpc);
232 AliRsnValueDaughter *axisSigTPC = new AliRsnValueDaughter("sTPC", AliRsnValueDaughter::kTPCsignal);
233 axisMomTPC->SetBins(0.0,5.0,0.01);
234 axisSigTPC->SetBins(0.0,500.0,2.0);
236 // output: 2D histogram of TPC signal vs. TPC momentum
237 AliRsnListOutput *outMonitordEdxTPC = new AliRsnListOutput("dEdx", AliRsnListOutput::kHistoDefault);
238 outMonitordEdxTPC->AddValue(axisMomTPC);
239 outMonitordEdxTPC->AddValue(axisSigTPC);
241 // add outputs to loop
242 mon->Add(outMonitordEdxTPC);
245 AliRsnValueDaughter *axisMomTPCForTOF = new AliRsnValueDaughter("pTPC", AliRsnValueDaughter::kPtpc);
246 AliRsnValueDaughter *axisSigTOF = new AliRsnValueDaughter("sTOF", AliRsnValueDaughter::kTOFsignal);
247 axisMomTPCForTOF->SetBins(0.0,5.0,0.01);
248 axisSigTOF->SetBins(0.0,500.0,2.0);
250 // output: 2D histogram of TPC signal vs. TPC momentum
251 AliRsnListOutput *outMonitordEdxTOF = new AliRsnListOutput("Edx", AliRsnListOutput::kHistoDefault);
252 outMonitordEdxTOF->AddValue(axisMomTPCForTOF);
253 outMonitordEdxTOF->AddValue(axisSigTOF);
255 // add outputs to loop
256 // mon->Add(outMonitordEdxTOF);
260 AliRsnValueDaughter *axisMomP = new AliRsnValueDaughter("p", AliRsnValueDaughter::kP);
261 axisMomP->SetBins(0.0,5.0,0.01);
263 // output: 2D histogram of TPC signal vs. TPC momentum
264 AliRsnListOutput *outMonitorP = new AliRsnListOutput("P", AliRsnListOutput::kHistoDefault);
265 outMonitorP->AddValue(axisMomP);
267 // add outputs to loop
268 mon->Add(outMonitorP);
271 AliRsnValueDaughter *axisMomPt = new AliRsnValueDaughter("pt", AliRsnValueDaughter::kPt);
272 axisMomPt->SetBins(0.0,5.0,0.01);
274 // output: 2D histogram of TPC signal vs. TPC momentum
275 AliRsnListOutput *outMonitorPt = new AliRsnListOutput("Pt", AliRsnListOutput::kHistoDefault);
276 outMonitorPt->AddValue(axisMomPt);
278 // add outputs to loop
279 mon->Add(outMonitorPt);
282 AliRsnValueDaughter *axisMomEta = new AliRsnValueDaughter("eta", AliRsnValueDaughter::kEta);
283 axisMomEta->SetBins(-1.0,1.0,0.01);
285 // output: 2D histogram of TPC signal vs. TPC momentum
286 AliRsnListOutput *outMonitorEta = new AliRsnListOutput("Eta", AliRsnListOutput::kHistoDefault);
287 outMonitorEta->AddValue(axisMomEta);
289 // add outputs to loop
290 mon->Add(outMonitorEta);
293 AliRsnValueDaughter *axisTPCnsigmaK = new AliRsnValueDaughter("K", AliRsnValueDaughter::kTPCnsigmaK);
294 axisTPCnsigmaK->SetBins(1000,0,100);
296 // output: 2D histogram of TPC signal vs. TPC momentum
297 AliRsnListOutput *outMonitorTPCnsigmaK = new AliRsnListOutput("TPC_nsigma", AliRsnListOutput::kHistoDefault);
298 outMonitorTPCnsigmaK->AddValue(axisTPCnsigmaK);
300 // add outputs to loop
301 mon->Add(outMonitorTPCnsigmaK);
304 AliRsnValueDaughter *axisTPCnsigmaPi = new AliRsnValueDaughter("pi", AliRsnValueDaughter::kTPCnsigmaPi);
305 axisTPCnsigmaPi->SetBins(1000,0,100);
307 // output: 2D histogram of TPC signal vs. TPC momentum
308 AliRsnListOutput *outMonitorTPCnsigmaPi = new AliRsnListOutput("TPC_nsigma", AliRsnListOutput::kHistoDefault);
309 outMonitorTPCnsigmaPi->AddValue(axisTPCnsigmaPi);
311 // add outputs to loop
312 mon->Add(outMonitorTPCnsigmaPi);
315 AliRsnValueDaughter *axisTPCnsigmaP = new AliRsnValueDaughter("p", AliRsnValueDaughter::kTPCnsigmaP);
316 axisTPCnsigmaP->SetBins(1000,0,100);
318 // output: 2D histogram of TPC signal vs. TPC momentum
319 AliRsnListOutput *outMonitorTPCnsigmaP = new AliRsnListOutput("TPC_nsigma", AliRsnListOutput::kHistoDefault);
320 outMonitorTPCnsigmaP->AddValue(axisTPCnsigmaP);
322 // add outputs to loop
323 mon->Add(outMonitorTPCnsigmaP);
327 AliRsnValueDaughter *axisTOFnsigmaK = new AliRsnValueDaughter("K", AliRsnValueDaughter::kTOFnsigmaK);
328 axisTOFnsigmaK->SetBins(1000,0,100);
330 // output: 2D histogram of TPC signal vs. TPC momentum
331 AliRsnListOutput *outMonitorTOFnsigmaK = new AliRsnListOutput("TOF_nsigma", AliRsnListOutput::kHistoDefault);
332 outMonitorTOFnsigmaK->AddValue(axisTOFnsigmaK);
334 // add outputs to loop
335 mon->Add(outMonitorTOFnsigmaK);
338 AliRsnValueDaughter *axisTOFnsigmaPi = new AliRsnValueDaughter("pi", AliRsnValueDaughter::kTOFnsigmaPi);
339 axisTOFnsigmaPi->SetBins(1000,0,100);
341 // output: 2D histogram of TPC signal vs. TPC momentum
342 AliRsnListOutput *outMonitorTOFnsigmaPi = new AliRsnListOutput("TOF_nsigma", AliRsnListOutput::kHistoDefault);
343 outMonitorTOFnsigmaPi->AddValue(axisTOFnsigmaPi);
345 // add outputs to loop
346 mon->Add(outMonitorTOFnsigmaPi);
349 AliRsnValueDaughter *axisTOFnsigmaP = new AliRsnValueDaughter("p", AliRsnValueDaughter::kTOFnsigmaP);
350 axisTOFnsigmaP->SetBins(1000,0,100);
352 // output: 2D histogram of TPC signal vs. TPC momentum
353 AliRsnListOutput *outMonitorTOFnsigmaP = new AliRsnListOutput("TOF_nsigma", AliRsnListOutput::kHistoDefault);
354 outMonitorTOFnsigmaP->AddValue(axisTOFnsigmaP);
356 // add outputs to loop
357 mon->Add(outMonitorTOFnsigmaP);
360 AliRsnListOutput *outMonitorPTvsMult = new AliRsnListOutput("PTvsMult",AliRsnListOutput::kHistoDefault);
361 AliRsnValueDaughter *vd1 = new AliRsnValueDaughter("pt",AliRsnValueDaughter::kPt);
362 vd1->SetBins(0.0,5.0,0.01);
363 outMonitorPTvsMult->AddValue(vd1);
365 AliRsnValueEvent *ve1 = new AliRsnValueEvent("mult",AliRsnValueEvent::kMult);
366 ve1->SetBins(0.0,100.0,1);
367 outMonitorPTvsMult->AddValue(ve1);
368 mon->Add(outMonitorPTvsMult);
370 // mon->SetMCRefInfo(gRsnUseMCMomentum);
374 void AddMonitorOutputMini(AliRsnMiniAnalysisTask *task,Int_t listID1,TString name = "",Char_t charge='0')
376 TString chargeName="all";
377 if ( charge == '+' ) chargeName = "pos";
378 if ( charge == '-' ) chargeName = "neg";
380 AliRsnMiniMonitor *mondEdx = new AliRsnMiniMonitor(Form("%s_dEdxTPCvsP_%s", name.Data(),chargeName.Data()),AliRsnMiniMonitor::kdEdxTPCvsP, listID1);
381 mondEdx->SetCharge(charge);
383 AliRsnMiniMonitor *monPt = new AliRsnMiniMonitor(Form("%s_Pt_%s", name.Data(),chargeName.Data()),AliRsnMiniMonitor::kTrackPt, listID1);
384 monPt->SetCharge(charge);
388 void AddParticleMonitor(AliAnalysisTaskSE *task, Bool_t isMC, Int_t listID1,AliRsnCutSet *commonEventCuts=0,AliRsnCutSet *cutPair=0,TString name = "")
391 Int_t isRsnMini = AliAnalysisManager::GetGlobalInt("rsnUseMiniPackage",valid);
393 Printf("Monitoring by mini is not supported now. It will be soon !!!");
395 // AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
397 // AddMonitorOutputMini((AliRsnMiniAnalysisTask *)task,listID1,name);
398 // AddMonitorOutputMini((AliRsnMiniAnalysisTask *)task,listID1,name,'+');
399 // AddMonitorOutputMini((AliRsnMiniAnalysisTask *)task,listID1,name,'-');
401 TList *listLoops = new TList;
402 // monitor definition
403 AliRsnDaughterDef *tracksAll = new AliRsnDaughterDef(AliRsnDaughter::kTrack /*'+' or '-'*/);
404 AliRsnDaughterDef *tracksPos = new AliRsnDaughterDef(AliRsnDaughter::kTrack,'+');
405 AliRsnDaughterDef *tracksNeg = new AliRsnDaughterDef(AliRsnDaughter::kTrack,'-');
407 AliRsnLoopDaughter *lm =0;
409 listLoops->Add(new AliRsnLoopDaughter(Form("%s_all", name.Data()), listID1, tracksAll));
410 listLoops->Add(new AliRsnLoopDaughter(Form("%s_pos", name.Data()), listID1, tracksPos));
411 listLoops->Add(new AliRsnLoopDaughter(Form("%s_neg", name.Data()), listID1, tracksNeg));
413 TIter next(listLoops);
414 while ((lm = (AliRsnLoopDaughter *)next.Next())) {
415 if (commonEventCuts) lm->SetEventCuts(commonEventCuts);
416 AddMonitorOutput(lm);
417 ((AliRsnAnalysisTask *)task)->AddLoop(lm);