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