]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGLF/RESONANCES/macros/lego_train/RsnConfig.C
Merge branch 'feature-movesplit'
[u/mrichter/AliRoot.git] / PWGLF / RESONANCES / macros / lego_train / RsnConfig.C
1 #ifndef __CINT__
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>
16 #include <AliRsnMiniMonitorTask.h>
17 #include <TROOT.h>
18 #endif
19
20 Bool_t RsnConfig(AliAnalysisTaskSE *task,AliRsnInputHandler *rsnIH=0,TList *listRsn=0) {
21 // ,Bool_t isMC,Bool_t isMixing,AliRsnInputHandler *rsnIH=0,TList *listRsn=0) {
22
23    if (!task) return kFALSE;
24
25    if (!listRsn) {
26       return kFALSE;
27    }
28    Bool_t valid;
29    Int_t isMC = AliRsnTrainManager::GetGlobalInt("IsMC",valid);
30    Int_t isRsnMini = AliRsnTrainManager::GetGlobalInt("IsRsnMini",valid);
31    Int_t isMixing = AliRsnTrainManager::GetGlobalInt("IsMixing",valid);
32    // TODO
33    TString rsnCutOptCommon = AliRsnTrainManager::GetGlobalStr("RsnLegoTrainCommonCutOption",valid);
34
35
36    Int_t cutIndex = 0;
37    Int_t numOfCuts = 0;
38
39    // set commol eventCuts
40
41    if (!RsnLoadMacroFromConfig("AddRsnCommonEventCuts.C")) return kFALSE;
42    AliRsnCutSet *commonEventCuts = AddRsnCommonEventCuts(task);
43
44    if (!RsnLoadMacroFromConfig("AddRsnCommonPairCuts.C")) return kFALSE;
45    AliRsnCutSet *commonPairCuts = AddRsnCommonPairCuts();
46
47    TIter next(listRsn);
48    TNamed *rsnObj=0;
49    TString rsnName,rsnNameOpt,rsnNameOptFull,rsnCutName,rsnCutOpt,rsnCutNameOptFull;
50    while ((rsnObj = (TNamed *)next())) {
51       GetOptionFromString(rsnObj->GetName(),rsnName,rsnNameOpt);
52       rsnNameOptFull=rsnName;
53       if (!rsnNameOpt.IsNull()) rsnNameOptFull += Form("_%s",rsnNameOpt.Data());
54
55       GetOptionFromString(rsnObj->GetTitle(),rsnCutName,rsnCutOpt);
56       rsnCutNameOptFull=rsnCutName;
57       if (!rsnCutOpt.IsNull())rsnCutNameOptFull += Form("_%s",rsnCutOpt.Data());
58
59       if (!rsnCutOptCommon.IsNull()) {
60          if (!rsnCutOpt.IsNull()) rsnCutOpt += "_";
61          rsnCutOpt += rsnCutOptCommon.Data();
62       }
63
64       if (!RsnLoadMacroFromConfig(Form("AddRsnDaughterCuts%s.C",rsnCutName.Data()))) return kFALSE;
65       if (!RsnLoadMacroFromConfig(Form("AddRsnPairs%s.C",rsnName.Data()))) return kFALSE;
66
67       rsnNameOptFull.ToLower();
68       rsnName.ToLower();
69       // add cuts
70       if (!rsnName.CompareTo("phi")) {
71          numOfCuts = gROOT->ProcessLine(Form("AddRsnDaughterCuts%s(AliPID::kKaon,AliPID::kKaon,\"%s\",(AliRsnInputHandler*)%p,(AliAnalysisTaskSE*)%p)",rsnCutName.Data(), rsnCutOpt.Data(),rsnIH, task));
72          if (numOfCuts) {
73             if (rsnNameOpt.Contains("mon")) AddParticleMonitor(task,isMC,cutIndex,commonEventCuts,commonPairCuts,Form("%s_%s_K",rsnNameOptFull.Data(),rsnCutNameOptFull.Data()));
74             AddRsnPairsPhi(task,isMC,isMixing,AliPID::kKaon,cutIndex,AliPID::kKaon,cutIndex,commonEventCuts,commonPairCuts,Form("%s.%s",rsnNameOptFull.Data(),rsnCutNameOptFull.Data()));
75             cutIndex+=numOfCuts;
76          }
77       } else if (!rsnName.CompareTo("kstar")) {
78          numOfCuts = gROOT->ProcessLine(Form("AddRsnDaughterCuts%s(AliPID::kKaon,AliPID::kPion,\"%s\",(AliRsnInputHandler*)%p,(AliAnalysisTaskSE*)%p)",rsnCutName.Data(), rsnCutOpt.Data(),rsnIH,task));
79          if (numOfCuts) {
80             if (rsnNameOpt.Contains("mon")) AddParticleMonitor(task,isMC,cutIndex,commonEventCuts,commonPairCuts,Form("%s_%s_K",rsnNameOptFull.Data(),rsnCutNameOptFull.Data()));
81             if (rsnNameOpt.Contains("mon")) AddParticleMonitor(task,isMC,cutIndex+1,commonEventCuts,commonPairCuts,Form("%s_%s_pi",rsnNameOptFull.Data(),rsnCutNameOptFull.Data()));
82             AddRsnPairsKStar(task,isMC,isMixing,AliPID::kKaon,cutIndex,AliPID::kPion,cutIndex+1,commonEventCuts,commonPairCuts,Form("%s.%s",rsnNameOptFull.Data(),rsnCutNameOptFull.Data()));
83             cutIndex+=numOfCuts;
84          }
85       } else if (!rsnName.CompareTo("rho")) {
86          numOfCuts = gROOT->ProcessLine(Form("AddRsnDaughterCuts%s(AliPID::kPion,AliPID::kPion,\"%s\",(AliRsnInputHandler*)%p,(AliAnalysisTaskSE*)%p)",rsnCutName.Data(), rsnCutOpt.Data(),rsnIH,task));
87          if (numOfCuts) {
88             if (rsnNameOpt.Contains("mon")) AddParticleMonitor(task,isMC,cutIndex,commonEventCuts,commonPairCuts,Form("%s_%s_pi",rsnNameOptFull.Data(),rsnCutNameOptFull.Data()));
89             AddRsnPairsRho(task,isMC,isMixing,AliPID::kPion,cutIndex,AliPID::kPion,cutIndex,commonEventCuts,commonPairCuts,Form("%s.%s",rsnNameOptFull.Data(),rsnCutNameOptFull.Data()));
90             cutIndex+=numOfCuts;
91          }
92       } else if (!rsnName.CompareTo("lambda")) {
93          numOfCuts = gROOT->ProcessLine(Form("AddRsnDaughterCuts%s(AliPID::kProton,AliPID::kKaon,\"%s\",(AliRsnInputHandler*)%p,(AliAnalysisTaskSE*)%p)",rsnCutName.Data(), rsnCutOpt.Data(),rsnIH,task));
94          if (numOfCuts) {
95             if (rsnNameOpt.Contains("mon")) AddParticleMonitor(task,isMC,cutIndex,commonEventCuts,commonPairCuts,Form("%s_%s_p",rsnNameOptFull.Data(),rsnCutNameOptFull.Data()));
96             if (rsnNameOpt.Contains("mon")) AddParticleMonitor(task,isMC,cutIndex+1,commonEventCuts,commonPairCuts,Form("%s_%s_K",rsnNameOptFull.Data(),rsnCutNameOptFull.Data()));
97             AddRsnPairsLambda(task,isMC,isMixing,AliPID::kProton,cutIndex,AliPID::kKaon,cutIndex+1,commonEventCuts,commonPairCuts,Form("%s.%s",rsnNameOptFull.Data(),rsnCutNameOptFull.Data()));
98             cutIndex+=numOfCuts;
99          }
100       } else {
101          Printf("Error : Particle %s is not supported !!!!",rsnName.Data());
102          return kFALSE;
103       }
104
105    }
106
107    return kTRUE;
108 }
109
110 Bool_t RsnLoadMacroFromConfig(TString macro,TString path="") {
111
112    Bool_t valid;
113    TString lego_path = AliAnalysisManager::GetGlobalStr("RsnLegoTrainPath",valid);
114    if (!valid) lego_path = "$ALICE_ROOT/PWGLF/RESONANCES/macros/lego_train";
115
116    if (!gSystem->AccessPathName(macro.Data())) {
117       Int_t ret = gROOT->LoadMacro(macro.Data());
118       Printf("Macro loaded from %s/%s [%d]...",gSystem->pwd(),macro.Data(),ret);
119       return kTRUE;
120    }
121
122    if (!gSystem->AccessPathName(gSystem->ExpandPathName(TString::Format("%s/%s",lego_path.Data(),macro.Data()).Data()))) {
123       Printf("Loading macro %s ...",gSystem->ExpandPathName(TString::Format("%s/%s",lego_path.Data(),macro.Data()).Data()));
124       gROOT->LoadMacro(gSystem->ExpandPathName(TString::Format("%s/%s",lego_path.Data(),macro.Data()).Data()));
125       Printf("Macro loaded from %s ...",gSystem->ExpandPathName(TString::Format("%s/%s",lego_path.Data(),macro.Data()).Data()));
126       return kTRUE;
127    }
128
129    Printf("Error loading %s",macro.Data());
130
131    return kFALSE;
132 }
133
134 void GetOptionFromString(TString str,TString &outStr1,TString &outStr2,TString d=":") {
135    //   TStringO
136    TObjArray *tokens = str.Tokenize(d.Data());
137    TObjString *objStr =  (TObjString *)tokens->At(0);
138    if (!objStr) {
139       outStr1 = "err";
140       outStr2 = "";
141       return;
142    }
143    outStr1 = objStr->GetString();
144
145    objStr =  (TObjString *) tokens->At(1);
146    if (!objStr) {
147       outStr2 = "";
148       return;
149    }
150    outStr2 = objStr->GetString();
151
152 }
153
154 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 = "") {
155
156    Bool_t valid;
157    Int_t useMCMomentum = AliRsnTrainManager::GetGlobalInt("RsnUseMCMomentum",valid);
158    Bool_t typeSame = (pType1 == pType2);
159
160    Printf("------------- id1=%d id2=%d",pType1,pType2);
161
162    TList *listLoops = new TList;
163
164    // pair definition
165    AliRsnPairDef  *pairDefPM         = new AliRsnPairDef((AliRsnDaughter::ESpecies)pType1, '+', (AliRsnDaughter::ESpecies)pType2, '-', pdgMother, massMother);
166    AliRsnPairDef  *pairDefMP         = new AliRsnPairDef((AliRsnDaughter::ESpecies)pType1, '-', (AliRsnDaughter::ESpecies)pType2, '+', pdgMother, massMother);
167    AliRsnPairDef  *pairDefPP         = new AliRsnPairDef((AliRsnDaughter::ESpecies)pType1, '+', (AliRsnDaughter::ESpecies)pType2, '+', pdgMother, massMother);
168    AliRsnPairDef  *pairDefMM         = new AliRsnPairDef((AliRsnDaughter::ESpecies)pType1, '-', (AliRsnDaughter::ESpecies)pType2, '-', pdgMother, massMother);
169
170    // loop object creation
171    AliRsnLoopPair *lp = 0;
172
173    // sets +-
174    lp = new AliRsnLoopPair(Form("%s.RecPM", name.Data()), pairDefPM, kFALSE);
175    listLoops->Add(lp);
176
177    if (!typeSame) {
178       lp = new AliRsnLoopPair(Form("%s.RecMP", name.Data()), pairDefMP, kFALSE);
179       listLoops->Add(lp);
180    }
181
182    // sets +- TRUE pairs
183    if (isMC) {
184       lp = new AliRsnLoopPair(Form("%s.RecPM_RecMother", name.Data()), pairDefPM, kFALSE);
185       lp->SetOnlyTrue(kTRUE);
186       lp->SetCheckDecay(kTRUE);
187       listLoops->Add(lp);
188       if (!typeSame) {
189          lp = new AliRsnLoopPair(Form("%s.RecMP_RecMother", name.Data()), pairDefMP, kFALSE);
190          lp->SetOnlyTrue(kTRUE);
191          lp->SetCheckDecay(kTRUE);
192          listLoops->Add(lp);
193       }
194       // sets +- TRUE paris (MC is used for momentum)
195       lp = new AliRsnLoopPair(Form("%s.GenPM_RecMother", name.Data()), pairDefPM, kFALSE);
196       lp->SetTrueMC(kTRUE);
197       listLoops->Add(lp);
198       if (!typeSame) {
199          // sets +- TRUE paris (MC is used for momentum)
200          lp = new AliRsnLoopPair(Form("%s.GenMP_RecMother", name.Data()), pairDefMP, kFALSE);
201          lp->SetTrueMC(kTRUE);
202          listLoops->Add(lp);
203       }
204    }
205
206    // sets ++
207    lp = new AliRsnLoopPair(Form("%s.RecPP", name.Data()), pairDefPP, kFALSE);
208    listLoops->Add(lp);
209
210    // sets --
211    lp = new AliRsnLoopPair(Form("%s.RecMM", name.Data()), pairDefMM, kFALSE);
212    listLoops->Add(lp);
213
214    if (isMixing) {
215       // sets +- Mixing (NOT mini)
216       lp = new AliRsnLoopPair(Form("%s.RecPM_mix", name.Data()), pairDefPM, kTRUE);
217       listLoops->Add(lp);
218
219       // sets -+ Mixing (NOT mini)
220       lp = new AliRsnLoopPair(Form("%s.RecMP_mix", name.Data()), pairDefMP, kTRUE);
221       listLoops->Add(lp);
222
223       // sets ++ Mixing (NOT mini)
224       lp = new AliRsnLoopPair(Form("%s.RecPP_mix", name.Data()), pairDefPP, kTRUE);
225       listLoops->Add(lp);
226
227       // sets -- Mixing (NOT mini)
228       lp = new AliRsnLoopPair(Form("%s.RecMM_mix", name.Data()), pairDefMM, kTRUE);
229       listLoops->Add(lp);
230    }
231
232
233    // loops over all AliRsnLoops and sets everything (don't touch it if you don't know what you are doing)
234    TIter next(listLoops);
235    while ((lp = (AliRsnLoopPair *)next.Next())) {
236       lp->SetListID(0, listID1);
237       lp->SetListID(1, listID2);
238       lp->SetMCRefInfo(useMCMomentum);
239       if (commonPairCuts) lp->SetPairCuts(commonPairCuts);
240       if (commonEventCuts) lp->SetEventCuts(commonEventCuts);
241       if (name.Contains("phi")) AddPairOutputPhi(lp);
242       else if (name.Contains("kstar")) AddPairOutputKStar(lp);
243       else if (name.Contains("rho")) AddPairOutputRho(lp);
244       else if (name.Contains("lambda")) AddPairOutputLambda(lp);
245       else if (name.Contains("sigma")) AddPairOutputSigma(lp);
246       else continue;
247       ((AliRsnAnalysisTask *)task)->AddLoop(lp);
248    }
249    return kTRUE;
250 }
251
252 void AddMonitorOutput(TObjArray *mon=0,TString opt="",AliRsnLoopDaughter *lm=0)
253 {
254
255    Bool_t valid;
256    Int_t useMCMon = AliRsnTrainManager::GetGlobalInt("RsnUseMCMonitoring",valid);
257 //     if (useMCMon) return;
258
259    // dEdx tpc
260    AliRsnValueDaughter *axisMomTPC = new AliRsnValueDaughter("pTPC", AliRsnValueDaughter::kPtpc);
261    AliRsnValueDaughter *axisSigTPC = new AliRsnValueDaughter("sTPC", AliRsnValueDaughter::kTPCsignal);
262    //axisMomTPC->SetBins(0.0,5.0,0.01);
263    axisMomTPC->SetBins(0.0,12.0,0.05);
264    axisSigTPC->SetBins(0.0,500.0,2.0);
265
266    // output: 2D histogram of TPC signal vs. TPC momentum
267    AliRsnListOutput *outMonitordEdxTPC = new AliRsnListOutput("dEdx", AliRsnListOutput::kHistoDefault);
268    outMonitordEdxTPC->AddValue(axisMomTPC);
269    outMonitordEdxTPC->AddValue(axisSigTPC);
270
271    // add outputs to loop
272    if (mon) mon->Add(outMonitordEdxTPC);
273    if (lm) lm->AddOutput(outMonitordEdxTPC);
274
275    // dEdx tpc
276    AliRsnValueDaughter *axisMomTPCForTOF = new AliRsnValueDaughter("pTPC", AliRsnValueDaughter::kPtpc);
277    AliRsnValueDaughter *axisSigTOF = new AliRsnValueDaughter("sTOF", AliRsnValueDaughter::kTOFsignal);
278    //axisMomTPCForTOF->SetBins(0.0,5.0,0.01);
279    //axisSigTOF->SetBins(0.0,500.0,2.0);
280    axisMomTPCForTOF->SetBins(0.0,12.0,0.05);
281    axisSigTOF->SetBins(0.0,5.e5,1.e3);
282
283    // output: 2D histogram of TPC signal vs. TPC momentum
284    AliRsnListOutput *outMonitordEdxTOF = new AliRsnListOutput("TOF", AliRsnListOutput::kHistoDefault);
285    outMonitordEdxTOF->AddValue(axisMomTPCForTOF);
286    outMonitordEdxTOF->AddValue(axisSigTOF);
287
288    // add outputs to loop
289    if (mon) mon->Add(outMonitordEdxTOF);
290    if (lm) lm->AddOutput(outMonitordEdxTOF);
291
292
293    // Momentum
294    AliRsnValueDaughter *axisMomP = new AliRsnValueDaughter("p", AliRsnValueDaughter::kP);
295    //axisMomP->SetBins(0.0,5.0,0.01);
296    axisMomP->SetBins(0.0,12.0,0.05);
297
298    // output: 2D histogram of TPC signal vs. TPC momentum
299    AliRsnListOutput *outMonitorP = new AliRsnListOutput("P", AliRsnListOutput::kHistoDefault);
300    outMonitorP->AddValue(axisMomP);
301
302    // add outputs to loop
303    if (mon) mon->Add(outMonitorP);
304    if (lm) lm->AddOutput(outMonitorP);
305
306
307    if (useMCMon) {
308       AliRsnValueDaughter *axisMomPMC = new AliRsnValueDaughter("pMC", AliRsnValueDaughter::kP);
309       axisMomPMC->SetUseMCInfo(kTRUE);
310       //axisMomPMC->SetBins(0.0,5.0,0.01);
311       axisMomPMC->SetBins(0.0,12.0,0.05);
312
313       // output: 2D histogram of TPC signal vs. TPC momentum
314       AliRsnListOutput *outMonitorPMC = new AliRsnListOutput("PMC", AliRsnListOutput::kHistoDefault);
315       outMonitorPMC->AddValue(axisMomPMC);
316
317       // add outputs to loop
318       if (mon) mon->Add(outMonitorPMC);
319       if (lm) lm->AddOutput(outMonitorPMC);
320    }
321
322
323    // Momentum Pt
324    AliRsnValueDaughter *axisMomPt = new AliRsnValueDaughter("pt", AliRsnValueDaughter::kPt);
325    //axisMomPt->SetBins(0.0,5.0,0.01);
326    axisMomPt->SetBins(0.0,12.0,0.05);
327
328    // output: 2D histogram of TPC signal vs. TPC momentum
329    AliRsnListOutput *outMonitorPt = new AliRsnListOutput("Pt", AliRsnListOutput::kHistoDefault);
330    outMonitorPt->AddValue(axisMomPt);
331
332    // add outputs to loop
333    if (mon) mon->Add(outMonitorPt);
334    if (lm) lm->AddOutput(outMonitorPt);
335    if (useMCMon) {
336       // Momentum Pt
337       AliRsnValueDaughter *axisMomPtMC = new AliRsnValueDaughter("ptMC", AliRsnValueDaughter::kPt);
338       axisMomPtMC->SetUseMCInfo(kTRUE);
339       //axisMomPtMC->SetBins(0.0,5.0,0.01);
340       axisMomPtMC->SetBins(0.0,12.0,0.05);
341
342       // output: 2D histogram of TPC signal vs. TPC momentum
343       AliRsnListOutput *outMonitorPtMC = new AliRsnListOutput("PtMC", AliRsnListOutput::kHistoDefault);
344       outMonitorPtMC->AddValue(axisMomPtMC);
345
346       // add outputs to loop
347       if (mon) mon->Add(outMonitorPtMC);
348       if (lm) lm->AddOutput(outMonitorPtMC);
349    }
350
351    // Eta
352    AliRsnValueDaughter *axisMomEta = new AliRsnValueDaughter("eta", AliRsnValueDaughter::kEta);
353    axisMomEta->SetBins(-1.0,1.0,0.01);
354
355    // output: 2D histogram of TPC signal vs. TPC momentum
356    AliRsnListOutput *outMonitorEta = new AliRsnListOutput("Eta", AliRsnListOutput::kHistoDefault);
357    outMonitorEta->AddValue(axisMomEta);
358
359    // add outputs to loop
360    if (mon) mon->Add(outMonitorEta);
361    if (lm) lm->AddOutput(outMonitorEta);
362
363    if (useMCMon) {
364       // Eta
365       AliRsnValueDaughter *axisMomEtaMC = new AliRsnValueDaughter("etaMC", AliRsnValueDaughter::kEta);
366       axisMomEtaMC->SetUseMCInfo(kTRUE);
367       axisMomEtaMC->SetBins(-1.0,1.0,0.01);
368
369       // output: 2D histogram of TPC signal vs. TPC momentum
370       AliRsnListOutput *outMonitorEtaMC = new AliRsnListOutput("EtaMC", AliRsnListOutput::kHistoDefault);
371       outMonitorEtaMC->AddValue(axisMomEtaMC);
372
373       // add outputs to loop
374       if (mon) mon->Add(outMonitorEtaMC);
375       if (lm) lm->AddOutput(outMonitorEtaMC);
376    }
377
378 //   AliRsnValueDaughter *axisPtBig = new AliRsnValueDaughter("pt", AliRsnValueDaughter::kPt);
379    AliRsnValueDaughter *axisPtBig = new AliRsnValueDaughter("p", AliRsnValueDaughter::kP);
380    axisPtBig->SetBins(0.0,12.0,0.1);
381
382    // kTOFnsigmaK
383    AliRsnValueDaughter *axisTPCnsigmaK = new AliRsnValueDaughter("K", AliRsnValueDaughter::kTPCnsigmaK);
384    axisTPCnsigmaK->SetBins(1000,-100,100);
385
386    // output: 2D histogram of TPC signal vs. TPC momentum
387    AliRsnListOutput *outMonitorTPCnsigmaK = new AliRsnListOutput("TPC_nsigma", AliRsnListOutput::kHistoDefault);
388    outMonitorTPCnsigmaK->AddValue(axisPtBig);
389    outMonitorTPCnsigmaK->AddValue(axisTPCnsigmaK);
390
391    // add outputs to loop
392    if (mon) mon->Add(outMonitorTPCnsigmaK);
393    if (lm) lm->AddOutput(outMonitorTPCnsigmaK);
394
395    // kTPCnsigmaPi
396    AliRsnValueDaughter *axisTPCnsigmaPi = new AliRsnValueDaughter("pi", AliRsnValueDaughter::kTPCnsigmaPi);
397    axisTPCnsigmaPi->SetBins(1000,-100,100);
398
399    // output: 2D histogram of TPC signal vs. TPC momentum
400    AliRsnListOutput *outMonitorTPCnsigmaPi = new AliRsnListOutput("TPC_nsigma", AliRsnListOutput::kHistoDefault);
401    outMonitorTPCnsigmaPi->AddValue(axisPtBig);
402    outMonitorTPCnsigmaPi->AddValue(axisTPCnsigmaPi);
403
404    // add outputs to loop
405    if (mon) mon->Add(outMonitorTPCnsigmaPi);
406    if (lm) lm->AddOutput(outMonitorTPCnsigmaPi);
407
408    // kTPCnsigmaP
409    AliRsnValueDaughter *axisTPCnsigmaP = new AliRsnValueDaughter("p", AliRsnValueDaughter::kTPCnsigmaP);
410    axisTPCnsigmaP->SetBins(1000,-100,100);
411
412    // output: 2D histogram of TPC signal vs. TPC momentum
413    AliRsnListOutput *outMonitorTPCnsigmaP = new AliRsnListOutput("TPC_nsigma", AliRsnListOutput::kHistoDefault);
414    outMonitorTPCnsigmaP->AddValue(axisPtBig);
415    outMonitorTPCnsigmaP->AddValue(axisTPCnsigmaP);
416
417    // add outputs to loop
418    if (mon) mon->Add(outMonitorTPCnsigmaP);
419    if (lm) lm->AddOutput(outMonitorTPCnsigmaP);
420
421
422    if (!opt.Contains("NoTOFSIGMA")) {
423
424       // kTOFnsigmaK
425       AliRsnValueDaughter *axisTOFnsigmaK = new AliRsnValueDaughter("K", AliRsnValueDaughter::kTOFnsigmaK);
426       axisTOFnsigmaK->SetBins(1000,-100,100);
427
428       // output: 2D histogram of TPC signal vs. TPC momentum
429       AliRsnListOutput *outMonitorTOFnsigmaK = new AliRsnListOutput("TOF_nsigma", AliRsnListOutput::kHistoDefault);
430       outMonitorTOFnsigmaK->AddValue(axisPtBig);
431       outMonitorTOFnsigmaK->AddValue(axisTOFnsigmaK);
432
433       // add outputs to loop
434       if (mon) mon->Add(outMonitorTOFnsigmaK);
435       if (lm) lm->AddOutput(outMonitorTOFnsigmaK);
436
437       // kTOFnsigmaPi
438       AliRsnValueDaughter *axisTOFnsigmaPi = new AliRsnValueDaughter("pi", AliRsnValueDaughter::kTOFnsigmaPi);
439       axisTOFnsigmaPi->SetBins(1000,-100,100);
440
441       // output: 2D histogram of TPC signal vs. TPC momentum
442       AliRsnListOutput *outMonitorTOFnsigmaPi = new AliRsnListOutput("TOF_nsigma", AliRsnListOutput::kHistoDefault);
443       outMonitorTOFnsigmaPi->AddValue(axisPtBig);
444       outMonitorTOFnsigmaPi->AddValue(axisTOFnsigmaPi);
445
446       // add outputs to loop
447       if (mon) mon->Add(outMonitorTOFnsigmaPi);
448       if (lm) lm->AddOutput(outMonitorTOFnsigmaPi);
449
450       // kTOFnsigmaP
451       AliRsnValueDaughter *axisTOFnsigmaP = new AliRsnValueDaughter("p", AliRsnValueDaughter::kTOFnsigmaP);
452       axisTOFnsigmaP->SetBins(1000,-100,100);
453
454       // output: 2D histogram of TPC signal vs. TPC momentum
455       AliRsnListOutput *outMonitorTOFnsigmaP = new AliRsnListOutput("TOF_nsigma", AliRsnListOutput::kHistoDefault);
456       outMonitorTOFnsigmaP->AddValue(axisPtBig);
457       outMonitorTOFnsigmaP->AddValue(axisTOFnsigmaP);
458
459       // add outputs to loop
460       if (mon) mon->Add(outMonitorTOFnsigmaP);
461       if (lm) lm->AddOutput(outMonitorTOFnsigmaP);
462    }
463
464
465    // nITCcluster
466    AliRsnValueDaughter *axisITSnClusters = new AliRsnValueDaughter("ITS", AliRsnValueDaughter::kNITSclusters);
467    axisITSnClusters->SetBins(8,-0.5,7.5);
468
469    AliRsnListOutput *outMonitorITSnClusters = new AliRsnListOutput("nClusters", AliRsnListOutput::kHistoDefault);
470    outMonitorITSnClusters->AddValue(axisPtBig);
471    outMonitorITSnClusters->AddValue(axisITSnClusters);
472    // add outputs to loop
473    if (mon) mon->Add(outMonitorITSnClusters);
474    if (lm) lm->AddOutput(outMonitorITSnClusters);
475
476    // nTPCcluster
477    AliRsnValueDaughter *axisTPCnClusters = new AliRsnValueDaughter("TPC", AliRsnValueDaughter::kNTPCclusters);
478    axisTPCnClusters->SetBins(166,-0.5,165.5);
479
480    AliRsnListOutput *outMonitorTPCnClusters = new AliRsnListOutput("nClusters", AliRsnListOutput::kHistoDefault);
481    outMonitorTPCnClusters->AddValue(axisPtBig);
482    outMonitorTPCnClusters->AddValue(axisTPCnClusters);
483    // add outputs to loop
484    if (mon) mon->Add(outMonitorTPCnClusters);
485    if (lm) lm->AddOutput(outMonitorTPCnClusters);
486
487    // ITSchi2
488    AliRsnValueDaughter *axisITSchi2 = new AliRsnValueDaughter("ITS", AliRsnValueDaughter::kITSchi2);
489    axisITSchi2->SetBins(100,0,10);
490
491    AliRsnListOutput *outMonitorITSchi2 = new AliRsnListOutput("chi2", AliRsnListOutput::kHistoDefault);
492    outMonitorITSchi2->AddValue(axisPtBig);
493    outMonitorITSchi2->AddValue(axisITSchi2);
494    // add outputs to loop
495    if (mon) mon->Add(outMonitorITSchi2);
496    if (lm) lm->AddOutput(outMonitorITSchi2);
497
498    // TPCchi2
499    AliRsnValueDaughter *axisTPCchi2 = new AliRsnValueDaughter("TPC", AliRsnValueDaughter::kTPCchi2);
500    axisTPCchi2->SetBins(100,0,10);
501
502    AliRsnListOutput *outMonitorTPCchi2 = new AliRsnListOutput("chi2", AliRsnListOutput::kHistoDefault);
503    outMonitorTPCchi2->AddValue(axisPtBig);
504    outMonitorTPCchi2->AddValue(axisTPCchi2);
505    // add outputs to loop
506    if (mon) mon->Add(outMonitorTPCchi2);
507    if (lm) lm->AddOutput(outMonitorTPCchi2);
508
509    // DCAXY
510    AliRsnValueDaughter *axisDCAXY = new AliRsnValueDaughter("XY", AliRsnValueDaughter::kDCAXY);
511    axisDCAXY->SetBins(200,-1,1);
512
513    AliRsnListOutput *outMonitorDCAXY = new AliRsnListOutput("DCA", AliRsnListOutput::kHistoDefault);
514    outMonitorDCAXY->AddValue(axisPtBig);
515    outMonitorDCAXY->AddValue(axisDCAXY);
516    // add outputs to loop
517    if (mon) mon->Add(outMonitorDCAXY);
518    if (lm) lm->AddOutput(outMonitorDCAXY);
519
520    // DCAZ
521    AliRsnValueDaughter *axisDCAZ = new AliRsnValueDaughter("Z", AliRsnValueDaughter::kDCAZ);
522    axisDCAZ->SetBins(200,-1,1);
523
524    AliRsnListOutput *outMonitorDCAZ = new AliRsnListOutput("DCA", AliRsnListOutput::kHistoDefault);
525    outMonitorDCAZ->AddValue(axisPtBig);
526    outMonitorDCAZ->AddValue(axisDCAZ);
527    // add outputs to loop
528    if (mon) mon->Add(outMonitorDCAZ);
529    if (lm) lm->AddOutput(outMonitorDCAZ);
530
531    AliRsnListOutput *outMonitorPTvsMult = new AliRsnListOutput("PTvsMult",AliRsnListOutput::kHistoDefault);
532    AliRsnValueDaughter *vd1 = new AliRsnValueDaughter("pt",AliRsnValueDaughter::kPt);
533    vd1->SetBins(0.0,5.0,0.01);
534    outMonitorPTvsMult->AddValue(vd1);
535
536    AliRsnValueEvent *ve1 = new AliRsnValueEvent("mult",AliRsnValueEvent::kMult);
537    ve1->SetBins(0.0,100.0,1);
538    outMonitorPTvsMult->AddValue(ve1);
539    if (mon) mon->Add(outMonitorPTvsMult);
540    if (lm) lm->AddOutput(outMonitorPTvsMult);
541
542 //    AliRsnListOutput *outMonitorMult = new AliRsnListOutput("EventMult",AliRsnListOutput::kHistoDefault);
543 //
544 //    AliRsnValueEvent *ve1Multi = new AliRsnValueEvent("centrality",AliRsnValueEvent::kCentralityV0);
545 //    ve1Multi->SetBins(0.0,100,10.0);
546 //    outMonitorMult->AddValue(ve1Multi);
547 //    if (mon) mon->Add(outMonitorMult);
548 //    if (lm) lm->AddOutput(outMonitorMult);
549 }
550
551 void AddMonitorOutputMini(AliRsnMiniMonitorTask *task,Int_t listID1,TString name = "",Char_t charge='0')
552 {
553    TString chargeName="all";
554    if ( charge == '+' ) chargeName = "pos";
555    if ( charge == '-' ) chargeName = "neg";
556
557    AliRsnMiniMonitor *mondEdx = task->CreateMonitor(Form("%s_dEdx_pTPC_%s", name.Data(),chargeName.Data()),AliRsnMiniMonitor::kdEdxTPCvsP, listID1);
558    mondEdx->SetCharge(charge);
559    AliRsnMiniMonitor *monPt = task->CreateMonitor(Form("%s_Pt_%s", name.Data(),chargeName.Data()),AliRsnMiniMonitor::kTrackPt, listID1);
560    monPt->SetCharge(charge);
561 }
562
563 void AddParticleMonitor(AliAnalysisTaskSE *task, Bool_t isMC, Int_t listID1,AliRsnCutSet *commonEventCuts=0,AliRsnCutSet *cutPair=0,TString name = "")
564 {
565    Bool_t valid;
566    Int_t isRsnMini = AliRsnTrainManager::GetGlobalInt("IsRsnMini",valid);
567    Int_t useMCMon = AliRsnTrainManager::GetGlobalInt("RsnUseMCMonitoring",valid);
568
569    if (isRsnMini) {
570 //       Printf("Monitoring by mini is not supported now. It will be soon !!!");
571 //       return ;
572       AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
573       AliRsnMiniMonitorTask *monTask = new AliRsnMiniMonitorTask(name.Data(),useMCMon);
574       AddMonitorOutputMini(monTask,listID1,name);
575 //       AddMonitorOutputMini(monTask,listID1,name,'+');
576 //       AddMonitorOutputMini(monTask,listID1,name,'-');
577       mgr->AddTask(monTask);
578       // connect input container according to source choice
579       mgr->ConnectInput(monTask, 0, mgr->GetCommonInputContainer());
580
581       // create paths for the output in the common file
582       TString commonPath = AliAnalysisManager::GetCommonFileName();
583
584       // create containers for output
585       AliAnalysisDataContainer *output = mgr->CreateContainer(Form("RsnMonMini%s", name.Data()), TList::Class(), AliAnalysisManager::kOutputContainer, commonPath.Data());
586
587       mgr->ConnectOutput(monTask, 1, output);
588
589
590
591    } else {
592
593       TList *listLoops = new TList;
594       // monitor definition
595       AliRsnDaughterDef *tracksAll = new AliRsnDaughterDef(AliRsnDaughter::kTrack /*'+' or '-'*/);
596 // //       AliRsnDaughterDef *tracksPos = new AliRsnDaughterDef(AliRsnDaughter::kTrack,'+');
597 // //       AliRsnDaughterDef *tracksNeg = new AliRsnDaughterDef(AliRsnDaughter::kTrack,'-');
598 //
599       AliRsnLoopDaughter *lm =0;
600 //       // loop object
601       listLoops->Add(new AliRsnLoopDaughter(Form("ALL_%s", name.Data()), listID1, tracksAll));
602 //
603 // //       listLoops->Add(new AliRsnLoopDaughter(Form("%s_pos", name.Data()), listID1, tracksPos));
604 // //       listLoops->Add(new AliRsnLoopDaughter(Form("%s_neg", name.Data()), listID1, tracksNeg));
605 //
606       TIter next(listLoops);
607       while ((lm = (AliRsnLoopDaughter *)next.Next())) {
608 //          if (commonEventCuts) lm->SetEventCuts(commonEventCuts);
609          AddMonitorOutput(0,"mc_loop",lm);
610          ((AliRsnAnalysisTask *)task)->AddLoop(lm);
611       }
612    }
613 }
614