]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGLF/RESONANCES/macros/lego_train/RsnConfig.C
f13b54f5fe8d1ab1f431a2cb435218ddf1d5e6cd
[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    axisPtBig->SetBins(0.0,12.0,0.5);
380
381    // kTOFnsigmaK
382    AliRsnValueDaughter *axisTPCnsigmaK = new AliRsnValueDaughter("K", AliRsnValueDaughter::kTPCnsigmaK);
383    axisTPCnsigmaK->SetBins(1001,-100,100);
384
385    // output: 2D histogram of TPC signal vs. TPC momentum
386    AliRsnListOutput *outMonitorTPCnsigmaK = new AliRsnListOutput("TPC_nsigma", AliRsnListOutput::kHistoDefault);
387    outMonitorTPCnsigmaK->AddValue(axisTPCnsigmaK);
388    outMonitorTPCnsigmaK->AddValue(axisPtBig);
389
390    // add outputs to loop
391    if (mon) mon->Add(outMonitorTPCnsigmaK);
392    if (lm) lm->AddOutput(outMonitorTPCnsigmaK);
393
394    // kTPCnsigmaPi
395    AliRsnValueDaughter *axisTPCnsigmaPi = new AliRsnValueDaughter("pi", AliRsnValueDaughter::kTPCnsigmaPi);
396    axisTPCnsigmaPi->SetBins(1001,-100,100);
397
398    // output: 2D histogram of TPC signal vs. TPC momentum
399    AliRsnListOutput *outMonitorTPCnsigmaPi = new AliRsnListOutput("TPC_nsigma", AliRsnListOutput::kHistoDefault);
400    outMonitorTPCnsigmaPi->AddValue(axisTPCnsigmaPi);
401    outMonitorTPCnsigmaPi->AddValue(axisPtBig);
402
403    // add outputs to loop
404    if (mon) mon->Add(outMonitorTPCnsigmaPi);
405    if (lm) lm->AddOutput(outMonitorTPCnsigmaPi);
406
407    // kTPCnsigmaP
408    AliRsnValueDaughter *axisTPCnsigmaP = new AliRsnValueDaughter("p", AliRsnValueDaughter::kTPCnsigmaP);
409    axisTPCnsigmaP->SetBins(1001,-100,100);
410
411    // output: 2D histogram of TPC signal vs. TPC momentum
412    AliRsnListOutput *outMonitorTPCnsigmaP = new AliRsnListOutput("TPC_nsigma", AliRsnListOutput::kHistoDefault);
413    outMonitorTPCnsigmaP->AddValue(axisTPCnsigmaP);
414    outMonitorTPCnsigmaP->AddValue(axisPtBig);
415
416    // add outputs to loop
417    if (mon) mon->Add(outMonitorTPCnsigmaP);
418    if (lm) lm->AddOutput(outMonitorTPCnsigmaP);
419
420
421    if (!opt.Contains("NoTOFSIGMA")) {
422
423       // kTOFnsigmaK
424       AliRsnValueDaughter *axisTOFnsigmaK = new AliRsnValueDaughter("K", AliRsnValueDaughter::kTOFnsigmaK);
425       axisTOFnsigmaK->SetBins(1001,-100,100);
426
427       // output: 2D histogram of TPC signal vs. TPC momentum
428       AliRsnListOutput *outMonitorTOFnsigmaK = new AliRsnListOutput("TOF_nsigma", AliRsnListOutput::kHistoDefault);
429       outMonitorTOFnsigmaK->AddValue(axisTOFnsigmaK);
430       outMonitorTOFnsigmaK->AddValue(axisPtBig);
431
432       // add outputs to loop
433       if (mon) mon->Add(outMonitorTOFnsigmaK);
434       if (lm) lm->AddOutput(outMonitorTOFnsigmaK);
435
436       // kTOFnsigmaPi
437       AliRsnValueDaughter *axisTOFnsigmaPi = new AliRsnValueDaughter("pi", AliRsnValueDaughter::kTOFnsigmaPi);
438       axisTOFnsigmaPi->SetBins(1001,-100,100);
439
440       // output: 2D histogram of TPC signal vs. TPC momentum
441       AliRsnListOutput *outMonitorTOFnsigmaPi = new AliRsnListOutput("TOF_nsigma", AliRsnListOutput::kHistoDefault);
442       outMonitorTOFnsigmaPi->AddValue(axisTOFnsigmaPi);
443       outMonitorTOFnsigmaPi->AddValue(axisPtBig);
444
445       // add outputs to loop
446       if (mon) mon->Add(outMonitorTOFnsigmaPi);
447       if (lm) lm->AddOutput(outMonitorTOFnsigmaPi);
448
449       // kTOFnsigmaP
450       AliRsnValueDaughter *axisTOFnsigmaP = new AliRsnValueDaughter("p", AliRsnValueDaughter::kTOFnsigmaP);
451       axisTOFnsigmaP->SetBins(1001,-100,100);
452
453       // output: 2D histogram of TPC signal vs. TPC momentum
454       AliRsnListOutput *outMonitorTOFnsigmaP = new AliRsnListOutput("TOF_nsigma", AliRsnListOutput::kHistoDefault);
455       outMonitorTOFnsigmaP->AddValue(axisTOFnsigmaP);
456       outMonitorTOFnsigmaP->AddValue(axisPtBig);
457
458       // add outputs to loop
459       if (mon) mon->Add(outMonitorTOFnsigmaP);
460       if (lm) lm->AddOutput(outMonitorTOFnsigmaP);
461    }
462
463
464    // nITCcluster
465    AliRsnValueDaughter *axisITSnClusters = new AliRsnValueDaughter("ITS", AliRsnValueDaughter::kNITSclusters);
466    axisITSnClusters->SetBins(10,0,10);
467
468    AliRsnListOutput *outMonitorITSnClusters = new AliRsnListOutput("nClusters", AliRsnListOutput::kHistoDefault);
469    outMonitorITSnClusters->AddValue(axisITSnClusters);
470    // add outputs to loop
471    if (mon) mon->Add(outMonitorITSnClusters);
472    if (lm) lm->AddOutput(outMonitorITSnClusters);
473
474    // nTPCcluster
475    AliRsnValueDaughter *axisTPCnClusters = new AliRsnValueDaughter("TPC", AliRsnValueDaughter::kNTPCclusters);
476    axisTPCnClusters->SetBins(300,0,300);
477
478    AliRsnListOutput *outMonitorTPCnClusters = new AliRsnListOutput("nClusters", AliRsnListOutput::kHistoDefault);
479    outMonitorTPCnClusters->AddValue(axisTPCnClusters);
480    // add outputs to loop
481    if (mon) mon->Add(outMonitorTPCnClusters);
482    if (lm) lm->AddOutput(outMonitorTPCnClusters);
483
484    // ITSchi2
485    AliRsnValueDaughter *axisITSchi2 = new AliRsnValueDaughter("ITS", AliRsnValueDaughter::kITSchi2);
486    axisITSchi2->SetBins(10,0,10);
487
488    AliRsnListOutput *outMonitorITSchi2 = new AliRsnListOutput("chi2", AliRsnListOutput::kHistoDefault);
489    outMonitorITSchi2->AddValue(axisITSchi2);
490    // add outputs to loop
491    if (mon) mon->Add(outMonitorITSchi2);
492    if (lm) lm->AddOutput(outMonitorITSchi2);
493
494    // TPCchi2
495    AliRsnValueDaughter *axisTPCchi2 = new AliRsnValueDaughter("TPC", AliRsnValueDaughter::kTPCchi2);
496    axisTPCchi2->SetBins(10,0,10);
497
498    AliRsnListOutput *outMonitorTPCchi2 = new AliRsnListOutput("chi2", AliRsnListOutput::kHistoDefault);
499    outMonitorTPCchi2->AddValue(axisTPCchi2);
500    // add outputs to loop
501    if (mon) mon->Add(outMonitorTPCchi2);
502    if (lm) lm->AddOutput(outMonitorTPCchi2);
503
504    // DCAXY
505    AliRsnValueDaughter *axisDCAXY = new AliRsnValueDaughter("XY", AliRsnValueDaughter::kDCAXY);
506    axisDCAXY->SetBins(200,-1,1);
507
508    AliRsnListOutput *outMonitorDCAXY = new AliRsnListOutput("DCA", AliRsnListOutput::kHistoDefault);
509    outMonitorDCAXY->AddValue(axisDCAXY);
510    // add outputs to loop
511    if (mon) mon->Add(outMonitorDCAXY);
512    if (lm) lm->AddOutput(outMonitorDCAXY);
513
514    // DCAZ
515    AliRsnValueDaughter *axisDCAZ = new AliRsnValueDaughter("Z", AliRsnValueDaughter::kDCAZ);
516    axisDCAZ->SetBins(200,-1,1);
517
518    AliRsnListOutput *outMonitorDCAZ = new AliRsnListOutput("DCA", AliRsnListOutput::kHistoDefault);
519    outMonitorDCAZ->AddValue(axisDCAZ);
520    // add outputs to loop
521    if (mon) mon->Add(outMonitorDCAZ);
522    if (lm) lm->AddOutput(outMonitorDCAZ);
523
524    AliRsnListOutput *outMonitorPTvsMult = new AliRsnListOutput("PTvsMult",AliRsnListOutput::kHistoDefault);
525    AliRsnValueDaughter *vd1 = new AliRsnValueDaughter("pt",AliRsnValueDaughter::kPt);
526    vd1->SetBins(0.0,5.0,0.01);
527    outMonitorPTvsMult->AddValue(vd1);
528
529    AliRsnValueEvent *ve1 = new AliRsnValueEvent("mult",AliRsnValueEvent::kMult);
530    ve1->SetBins(0.0,100.0,1);
531    outMonitorPTvsMult->AddValue(ve1);
532    if (mon) mon->Add(outMonitorPTvsMult);
533    if (lm) lm->AddOutput(outMonitorPTvsMult);
534
535 //    AliRsnListOutput *outMonitorMult = new AliRsnListOutput("EventMult",AliRsnListOutput::kHistoDefault);
536 //
537 //    AliRsnValueEvent *ve1Multi = new AliRsnValueEvent("centrality",AliRsnValueEvent::kCentralityV0);
538 //    ve1Multi->SetBins(0.0,100,10.0);
539 //    outMonitorMult->AddValue(ve1Multi);
540 //    if (mon) mon->Add(outMonitorMult);
541 //    if (lm) lm->AddOutput(outMonitorMult);
542 }
543
544 void AddMonitorOutputMini(AliRsnMiniMonitorTask *task,Int_t listID1,TString name = "",Char_t charge='0')
545 {
546    TString chargeName="all";
547    if ( charge == '+' ) chargeName = "pos";
548    if ( charge == '-' ) chargeName = "neg";
549
550    AliRsnMiniMonitor *mondEdx = task->CreateMonitor(Form("%s_dEdx_pTPC_%s", name.Data(),chargeName.Data()),AliRsnMiniMonitor::kdEdxTPCvsP, listID1);
551    mondEdx->SetCharge(charge);
552    AliRsnMiniMonitor *monPt = task->CreateMonitor(Form("%s_Pt_%s", name.Data(),chargeName.Data()),AliRsnMiniMonitor::kTrackPt, listID1);
553    monPt->SetCharge(charge);
554 }
555
556 void AddParticleMonitor(AliAnalysisTaskSE *task, Bool_t isMC, Int_t listID1,AliRsnCutSet *commonEventCuts=0,AliRsnCutSet *cutPair=0,TString name = "")
557 {
558    Bool_t valid;
559    Int_t isRsnMini = AliRsnTrainManager::GetGlobalInt("IsRsnMini",valid);
560    Int_t useMCMon = AliRsnTrainManager::GetGlobalInt("RsnUseMCMonitoring",valid);
561
562    if (isRsnMini) {
563 //       Printf("Monitoring by mini is not supported now. It will be soon !!!");
564 //       return ;
565       AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
566       AliRsnMiniMonitorTask *monTask = new AliRsnMiniMonitorTask(name.Data(),useMCMon);
567       AddMonitorOutputMini(monTask,listID1,name);
568 //       AddMonitorOutputMini(monTask,listID1,name,'+');
569 //       AddMonitorOutputMini(monTask,listID1,name,'-');
570       mgr->AddTask(monTask);
571       // connect input container according to source choice
572       mgr->ConnectInput(monTask, 0, mgr->GetCommonInputContainer());
573
574       // create paths for the output in the common file
575       TString commonPath = AliAnalysisManager::GetCommonFileName();
576
577       // create containers for output
578       AliAnalysisDataContainer *output = mgr->CreateContainer(Form("RsnMonMini%s", name.Data()), TList::Class(), AliAnalysisManager::kOutputContainer, commonPath.Data());
579
580       mgr->ConnectOutput(monTask, 1, output);
581
582
583
584    } else {
585
586       TList *listLoops = new TList;
587       // monitor definition
588       AliRsnDaughterDef *tracksAll = new AliRsnDaughterDef(AliRsnDaughter::kTrack /*'+' or '-'*/);
589 // //       AliRsnDaughterDef *tracksPos = new AliRsnDaughterDef(AliRsnDaughter::kTrack,'+');
590 // //       AliRsnDaughterDef *tracksNeg = new AliRsnDaughterDef(AliRsnDaughter::kTrack,'-');
591 //
592       AliRsnLoopDaughter *lm =0;
593 //       // loop object
594       listLoops->Add(new AliRsnLoopDaughter(Form("ALL_%s", name.Data()), listID1, tracksAll));
595 //
596 // //       listLoops->Add(new AliRsnLoopDaughter(Form("%s_pos", name.Data()), listID1, tracksPos));
597 // //       listLoops->Add(new AliRsnLoopDaughter(Form("%s_neg", name.Data()), listID1, tracksNeg));
598 //
599       TIter next(listLoops);
600       while ((lm = (AliRsnLoopDaughter *)next.Next())) {
601 //          if (commonEventCuts) lm->SetEventCuts(commonEventCuts);
602          AddMonitorOutput(0,"mc_loop",lm);
603          ((AliRsnAnalysisTask *)task)->AddLoop(lm);
604       }
605    }
606 }
607