]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGLF/RESONANCES/macros/lego_train/RsnConfig.C
New version of lego_train macros (M. Vala)
[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 #endif
17
18 Bool_t RsnConfig(AliAnalysisTaskSE *task,Bool_t isMC,Bool_t isMixing,AliRsnInputHandler *rsnIH=0,TList *listRsn=0) {
19
20    if (!task) return kFALSE;
21
22    if (!listRsn) {
23       return kFALSE;
24    }
25    Bool_t valid;
26    Int_t isRsnMini = AliAnalysisManager::GetGlobalInt("rsnUseMiniPackage",valid);
27    TString rsnCutOptCommon = AliAnalysisManager::GetGlobalStr("rsnLegoTrainCommonCutOption",valid);
28    Int_t cutIndex = 0;
29    Int_t numOfCuts = 0;
30
31    // set commol eventCuts
32
33    if (!RsnLoadMacroFromConfig("AddRsnCommonEventCuts.C")) return kFALSE;
34    AliRsnCutSet *commonEventCuts = AddRsnCommonEventCuts(task);
35
36    if (!RsnLoadMacroFromConfig("AddRsnCommonPairCuts.C")) return kFALSE;
37    AliRsnCutSet *commonPairCuts = AddRsnCommonPairCuts();
38
39    TIter next(listRsn);
40    TNamed *rsnObj=0;
41    TString rsnName,rsnNameOpt,rsnNameOptFull,rsnCutName,rsnCutOpt,rsnCutNameOptFull;
42    while ((rsnObj = (TNamed *)next())) {
43       GetOptionFromString(rsnObj->GetName(),rsnName,rsnNameOpt);
44       rsnNameOptFull=rsnName;
45       if (!rsnNameOpt.IsNull()) rsnNameOptFull += Form("_%s",rsnNameOpt.Data());
46
47       GetOptionFromString(rsnObj->GetTitle(),rsnCutName,rsnCutOpt);
48       rsnCutNameOptFull=rsnCutName;
49       if (!rsnCutOpt.IsNull())rsnCutNameOptFull += Form("_%s",rsnCutOpt.Data());
50
51       if (!rsnCutOptCommon.IsNull()) {
52          if (!rsnCutOpt.IsNull()) rsnCutOpt += "_";
53          rsnCutOpt += rsnCutOptCommon.Data();
54       }
55
56       if (!RsnLoadMacroFromConfig(Form("AddRsnDaughterCuts%s.C",rsnCutName.Data()))) return kFALSE;
57       if (!RsnLoadMacroFromConfig(Form("AddRsnPairs%s.C",rsnName.Data()))) return kFALSE;
58
59       rsnNameOptFull.ToLower();
60       rsnName.ToLower();
61       // add cuts
62       if (!rsnName.CompareTo("phi")) {
63          numOfCuts = gROOT->ProcessLine(Form("AddRsnDaughterCuts%s(AliPID::kKaon,AliPID::kKaon,\"%s\",%d,(AliRsnInputHandler*)%p,(AliAnalysisTaskSE*)%p)",rsnCutName.Data(), rsnCutOpt.Data(),isRsnMini,rsnIH, task));
64          if (numOfCuts) {
65             if (rsnNameOpt.Contains("mon")) AddParticleMonitor(task,isMC,cutIndex,commonEventCuts,commonPairCuts,Form("%s_%s_K",rsnNameOptFull.Data(),rsnCutNameOptFull.Data()));
66             AddRsnPairsPhi(task,isMC,isMixing,AliPID::kKaon,cutIndex,AliPID::kKaon,cutIndex,commonEventCuts,commonPairCuts,Form("%s_%s",rsnNameOptFull.Data(),rsnCutNameOptFull.Data()));
67             cutIndex+=numOfCuts;
68          }
69       } else if (!rsnName.CompareTo("kstar")) {
70          numOfCuts = gROOT->ProcessLine(Form("AddRsnDaughterCuts%s(AliPID::kKaon,AliPID::kPion,\"%s\",%d,(AliRsnInputHandler*)%p,(AliAnalysisTaskSE*)%p)",rsnCutName.Data(), rsnCutOpt.Data(),isRsnMini,rsnIH,task));
71          if (numOfCuts) {
72             if (rsnNameOpt.Contains("mon")) AddParticleMonitor(task,isMC,cutIndex,commonEventCuts,commonPairCuts,Form("%s_%s_K",rsnNameOptFull.Data(),rsnCutNameOptFull.Data()));
73             if (rsnNameOpt.Contains("mon")) AddParticleMonitor(task,isMC,cutIndex+1,commonEventCuts,commonPairCuts,Form("%s_%s_pi",rsnNameOptFull.Data(),rsnCutNameOptFull.Data()));
74             AddRsnPairsKStar(task,isMC,isMixing,AliPID::kKaon,cutIndex,AliPID::kPion,cutIndex+1,commonEventCuts,commonPairCuts,Form("%s_%s",rsnNameOptFull.Data(),rsnCutNameOptFull.Data()));
75             cutIndex+=numOfCuts;
76          }
77       } else {
78          Printf("Error : Particle %s is not supported !!!!",rsnName.Data());
79          return kFALSE;
80       }
81
82    }
83
84    return kTRUE;
85 }
86
87 Bool_t RsnLoadMacroFromConfig(TString macro,TString path="") {
88
89    Bool_t valid;
90    TString lego_path = AliAnalysisManager::GetGlobalStr("rsnLegoTrainPath",valid);
91    if (!valid) lego_path = "$ALICE_ROOT/PWGLF/RESONANCES/macros/lego_train";
92
93    if (!gSystem->AccessPathName(macro.Data())) {
94       gROOT->LoadMacro(macro.Data());
95       Printf("Macro loaded from %s/%s ...",gSystem->pwd(),macro.Data());
96       return kTRUE;
97    }
98
99    if (!gSystem->AccessPathName(gSystem->ExpandPathName(Form("%s/%s",lego_path.Data(),macro.Data())))) {
100       gROOT->LoadMacro(gSystem->ExpandPathName(Form("%s/%s",lego_path.Data(),macro.Data())));
101       Printf("Macro loaded from %s ...",gSystem->ExpandPathName(Form("%s/%s",lego_path.Data(),macro.Data())));
102       return kTRUE;
103    }
104
105    Printf("Error loading %s",macro.Data());
106
107    return kFALSE;
108 }
109
110 void GetOptionFromString(TString str,TString &outStr1,TString &outStr2,TString d=":") {
111    //   TStringO
112    TObjArray *tokens = str.Tokenize(d.Data());
113    TObjString *objStr =  (TObjString *)tokens->At(0);
114    if (!objStr) {
115       outStr1 = "err";
116       outStr2 = "";
117       return;
118    }
119    outStr1 = objStr->GetString();
120
121    objStr =  (TObjString *) tokens->At(1);
122    if (!objStr) {
123       outStr2 = "";
124       return;
125    }
126    outStr2 = objStr->GetString();
127
128 }
129
130 Bool_t AddPair(AliAnalysisTaskSE *task, Bool_t isMC,Bool_t isMixing, AliPID::EParticleType pType1,Int_t listID1, AliPID::EParticleType pType2,Int_t listID2, Int_t pdgMother,Double_t massMother, AliRsnCutSet *commonEventCuts=0,AliRsnCutSet *commonPairCuts=0, TString name = "") {
131
132    Bool_t valid;
133    Int_t useMCMomentum = AliAnalysisManager::GetGlobalInt("rsnUseMCMomentum",valid);
134
135    Bool_t typeSame = (pType1 == pType2);
136
137    //    Printf("------------- id1=%d id2=%d",listID1,listID2);
138
139    TList *listLoops = new TList;
140
141    // pair definition
142    AliRsnPairDef  *pairDefPM         = new AliRsnPairDef((AliRsnDaughter::ESpecies)pType1, '+', (AliRsnDaughter::ESpecies)pType2, '-', pdgMother, massMother);
143    AliRsnPairDef  *pairDefMP         = new AliRsnPairDef((AliRsnDaughter::ESpecies)pType1, '-', (AliRsnDaughter::ESpecies)pType2, '+', pdgMother, massMother);
144    AliRsnPairDef  *pairDefPP         = new AliRsnPairDef((AliRsnDaughter::ESpecies)pType1, '+', (AliRsnDaughter::ESpecies)pType2, '+', pdgMother, massMother);
145    AliRsnPairDef  *pairDefMM         = new AliRsnPairDef((AliRsnDaughter::ESpecies)pType1, '-', (AliRsnDaughter::ESpecies)pType2, '-', pdgMother, massMother);
146
147    // loop object creation
148    AliRsnLoopPair *lp = 0;
149
150    // sets +-
151    lp = new AliRsnLoopPair(Form("%s_PM", name.Data()), pairDefPM, kFALSE);
152    listLoops->Add(lp);
153
154    if (!typeSame) {
155       lp = new AliRsnLoopPair(Form("%s_MP", name.Data()), pairDefMP, kFALSE);
156       listLoops->Add(lp);
157    }
158
159    // sets +- TRUE pairs
160    if (isMC) {
161       lp = new AliRsnLoopPair(Form("%s_PM_TRUE", name.Data()), pairDefPM, kFALSE);
162       lp->SetOnlyTrue(kTRUE);
163       lp->SetCheckDecay(kTRUE);
164       listLoops->Add(lp);
165       if (!typeSame) {
166          lp = new AliRsnLoopPair(Form("%s_MP_TRUE", name.Data()), pairDefMP, kFALSE);
167          lp->SetOnlyTrue(kTRUE);
168          lp->SetCheckDecay(kTRUE);
169          listLoops->Add(lp);
170       }
171       // sets +- TRUE paris (MC is used for momentum)
172       lp = new AliRsnLoopPair(Form("%s_PM_TRUE_MC", name.Data()), pairDefPM, kFALSE);
173       lp->SetTrueMC(kTRUE);
174       listLoops->Add(lp);
175       if (!typeSame) {
176          // sets +- TRUE paris (MC is used for momentum)
177          lp = new AliRsnLoopPair(Form("%s_MP_TRUE_MC", name.Data()), pairDefMP, kFALSE);
178          lp->SetTrueMC(kTRUE);
179          listLoops->Add(lp);
180       }
181    }
182
183    // sets ++
184    lp = new AliRsnLoopPair(Form("%s_PP", name.Data()), pairDefPP, kFALSE);
185    listLoops->Add(lp);
186
187    // sets --
188    lp = new AliRsnLoopPair(Form("%s_MM", name.Data()), pairDefMM, kFALSE);
189    listLoops->Add(lp);
190
191    if (isMixing) {
192       // sets +- Mixing (NOT mini)
193       lp = new AliRsnLoopPair(Form("%s_PM", name.Data()), pairDefPM, kTRUE);
194       listLoops->Add(lp);
195
196       // sets -+ Mixing (NOT mini)
197       lp = new AliRsnLoopPair(Form("%s_MP", name.Data()), pairDefMP, kTRUE);
198       listLoops->Add(lp);
199
200       // sets ++ Mixing (NOT mini)
201       lp = new AliRsnLoopPair(Form("%s_PP", name.Data()), pairDefPP, kTRUE);
202       listLoops->Add(lp);
203
204       // sets -- Mixing (NOT mini)
205       lp = new AliRsnLoopPair(Form("%s_MM", name.Data()), pairDefMM, kTRUE);
206       listLoops->Add(lp);
207    }
208
209
210    // loops over all AliRsnLoops and sets everything (don't touch it if you don't know what you are doing)
211    TIter next(listLoops);
212    while ((lp = (AliRsnLoopPair *)next.Next())) {
213       lp->SetListID(0, listID1);
214       lp->SetListID(1, listID2);
215       lp->SetMCRefInfo(useMCMomentum);
216       if (commonPairCuts) lp->SetPairCuts(commonPairCuts);
217       if (commonEventCuts) lp->SetEventCuts(commonEventCuts);
218       if (name.Contains("phi")) AddPairOutputPhi(lp);
219       else if (name.Contains("kstar")) AddPairOutputKStar(lp);
220       else continue;
221       ((AliRsnAnalysisTask *)task)->AddLoop(lp);
222    }
223    return kTRUE;
224 }
225
226 // void AddMonitorOutput(AliRsnLoopDaughter *mon)
227
228 void AddMonitorOutput(TObjArray *mon,TString opt="")
229 {
230
231    if (!mon) {
232       Printf("Error: mon is null !!!!");
233       return;
234    }
235
236    Bool_t valid;
237    Int_t useMCMon = AliAnalysisManager::GetGlobalInt("rsnUseMCMonitoring",valid);
238 //     if (useMCMon) return;
239
240    // dEdx tpc
241    AliRsnValueDaughter *axisMomTPC = new AliRsnValueDaughter("pTPC", AliRsnValueDaughter::kPtpc);
242    AliRsnValueDaughter *axisSigTPC = new AliRsnValueDaughter("sTPC", AliRsnValueDaughter::kTPCsignal);
243    axisMomTPC->SetBins(0.0,5.0,0.01);
244    axisSigTPC->SetBins(0.0,500.0,2.0);
245
246    // output: 2D histogram of TPC signal vs. TPC momentum
247    AliRsnListOutput *outMonitordEdxTPC = new AliRsnListOutput("dEdx", AliRsnListOutput::kHistoDefault);
248    outMonitordEdxTPC->AddValue(axisMomTPC);
249    outMonitordEdxTPC->AddValue(axisSigTPC);
250
251    // add outputs to loop
252    mon->Add(outMonitordEdxTPC);
253
254    // dEdx tpc
255    AliRsnValueDaughter *axisMomTPCForTOF = new AliRsnValueDaughter("pTPC", AliRsnValueDaughter::kPtpc);
256    AliRsnValueDaughter *axisSigTOF = new AliRsnValueDaughter("sTOF", AliRsnValueDaughter::kTOFsignal);
257    axisMomTPCForTOF->SetBins(0.0,5.0,0.01);
258    axisSigTOF->SetBins(0.0,500.0,2.0);
259
260    // output: 2D histogram of TPC signal vs. TPC momentum
261    AliRsnListOutput *outMonitordEdxTOF = new AliRsnListOutput("Edx", AliRsnListOutput::kHistoDefault);
262    outMonitordEdxTOF->AddValue(axisMomTPCForTOF);
263    outMonitordEdxTOF->AddValue(axisSigTOF);
264
265    // add outputs to loop
266    mon->Add(outMonitordEdxTOF);
267
268
269    // Momentum
270    AliRsnValueDaughter *axisMomP = new AliRsnValueDaughter("p", AliRsnValueDaughter::kP);
271    axisMomP->SetBins(0.0,5.0,0.01);
272
273    // output: 2D histogram of TPC signal vs. TPC momentum
274    AliRsnListOutput *outMonitorP = new AliRsnListOutput("P", AliRsnListOutput::kHistoDefault);
275    outMonitorP->AddValue(axisMomP);
276
277    // add outputs to loop
278    mon->Add(outMonitorP);
279
280
281    if (useMCMon) {
282       AliRsnValueDaughter *axisMomPMC = new AliRsnValueDaughter("pMC", AliRsnValueDaughter::kP);
283       axisMomPMC->SetUseMCInfo(kTRUE);
284       axisMomPMC->SetBins(0.0,5.0,0.01);
285
286       // output: 2D histogram of TPC signal vs. TPC momentum
287       AliRsnListOutput *outMonitorPMC = new AliRsnListOutput("PMC", AliRsnListOutput::kHistoDefault);
288       outMonitorPMC->AddValue(axisMomPMC);
289
290       // add outputs to loop
291       mon->Add(outMonitorPMC);
292    }
293
294
295    // Momentum Pt
296    AliRsnValueDaughter *axisMomPt = new AliRsnValueDaughter("pt", AliRsnValueDaughter::kPt);
297    axisMomPt->SetBins(0.0,5.0,0.01);
298
299    // output: 2D histogram of TPC signal vs. TPC momentum
300    AliRsnListOutput *outMonitorPt = new AliRsnListOutput("Pt", AliRsnListOutput::kHistoDefault);
301    outMonitorPt->AddValue(axisMomPt);
302
303    // add outputs to loop
304    mon->Add(outMonitorPt);
305
306    if (useMCMon) {
307       // Momentum Pt
308       AliRsnValueDaughter *axisMomPtMC = new AliRsnValueDaughter("ptMC", AliRsnValueDaughter::kPt);
309       axisMomPtMC->SetUseMCInfo(kTRUE);
310       axisMomPtMC->SetBins(0.0,5.0,0.01);
311
312       // output: 2D histogram of TPC signal vs. TPC momentum
313       AliRsnListOutput *outMonitorPtMC = new AliRsnListOutput("PtMC", AliRsnListOutput::kHistoDefault);
314       outMonitorPtMC->AddValue(axisMomPtMC);
315
316       // add outputs to loop
317       mon->Add(outMonitorPtMC);
318    }
319
320    // Eta
321    AliRsnValueDaughter *axisMomEta = new AliRsnValueDaughter("eta", AliRsnValueDaughter::kEta);
322    axisMomEta->SetBins(-1.0,1.0,0.01);
323
324    // output: 2D histogram of TPC signal vs. TPC momentum
325    AliRsnListOutput *outMonitorEta = new AliRsnListOutput("Eta", AliRsnListOutput::kHistoDefault);
326    outMonitorEta->AddValue(axisMomEta);
327
328    // add outputs to loop
329    mon->Add(outMonitorEta);
330
331    if (useMCMon) {
332       // Eta
333       AliRsnValueDaughter *axisMomEtaMC = new AliRsnValueDaughter("etaMC", AliRsnValueDaughter::kEta);
334       axisMomEtaMC->SetUseMCInfo(kTRUE);
335       axisMomEtaMC->SetBins(-1.0,1.0,0.01);
336
337       // output: 2D histogram of TPC signal vs. TPC momentum
338       AliRsnListOutput *outMonitorEtaMC = new AliRsnListOutput("EtaMC", AliRsnListOutput::kHistoDefault);
339       outMonitorEtaMC->AddValue(axisMomEtaMC);
340
341       // add outputs to loop
342       mon->Add(outMonitorEtaMC);
343    }
344    // kTOFnsigmaK
345    AliRsnValueDaughter *axisTPCnsigmaK = new AliRsnValueDaughter("K", AliRsnValueDaughter::kTPCnsigmaK);
346    axisTPCnsigmaK->SetBins(1001,-100,100);
347
348    // output: 2D histogram of TPC signal vs. TPC momentum
349    AliRsnListOutput *outMonitorTPCnsigmaK = new AliRsnListOutput("TPC_nsigma", AliRsnListOutput::kHistoDefault);
350    outMonitorTPCnsigmaK->AddValue(axisTPCnsigmaK);
351
352    // add outputs to loop
353    mon->Add(outMonitorTPCnsigmaK);
354
355    // kTPCnsigmaPi
356    AliRsnValueDaughter *axisTPCnsigmaPi = new AliRsnValueDaughter("pi", AliRsnValueDaughter::kTPCnsigmaPi);
357    axisTPCnsigmaPi->SetBins(1001,-100,100);
358
359    // output: 2D histogram of TPC signal vs. TPC momentum
360    AliRsnListOutput *outMonitorTPCnsigmaPi = new AliRsnListOutput("TPC_nsigma", AliRsnListOutput::kHistoDefault);
361    outMonitorTPCnsigmaPi->AddValue(axisTPCnsigmaPi);
362
363    // add outputs to loop
364    mon->Add(outMonitorTPCnsigmaPi);
365
366    // kTPCnsigmaP
367    AliRsnValueDaughter *axisTPCnsigmaP = new AliRsnValueDaughter("p", AliRsnValueDaughter::kTPCnsigmaP);
368    axisTPCnsigmaP->SetBins(1001,-100,100);
369
370    // output: 2D histogram of TPC signal vs. TPC momentum
371    AliRsnListOutput *outMonitorTPCnsigmaP = new AliRsnListOutput("TPC_nsigma", AliRsnListOutput::kHistoDefault);
372    outMonitorTPCnsigmaP->AddValue(axisTPCnsigmaP);
373
374    // add outputs to loop
375    mon->Add(outMonitorTPCnsigmaP);
376
377
378    if (!opt.Contains("NoTOFSIGMA")) {
379
380       // kTOFnsigmaK
381       AliRsnValueDaughter *axisTOFnsigmaK = new AliRsnValueDaughter("K", AliRsnValueDaughter::kTOFnsigmaK);
382       axisTOFnsigmaK->SetBins(1001,-100,100);
383
384       // output: 2D histogram of TPC signal vs. TPC momentum
385       AliRsnListOutput *outMonitorTOFnsigmaK = new AliRsnListOutput("TOF_nsigma", AliRsnListOutput::kHistoDefault);
386       outMonitorTOFnsigmaK->AddValue(axisTOFnsigmaK);
387
388       // add outputs to loop
389       mon->Add(outMonitorTOFnsigmaK);
390
391       // kTOFnsigmaPi
392       AliRsnValueDaughter *axisTOFnsigmaPi = new AliRsnValueDaughter("pi", AliRsnValueDaughter::kTOFnsigmaPi);
393       axisTOFnsigmaPi->SetBins(1001,-100,100);
394
395       // output: 2D histogram of TPC signal vs. TPC momentum
396       AliRsnListOutput *outMonitorTOFnsigmaPi = new AliRsnListOutput("TOF_nsigma", AliRsnListOutput::kHistoDefault);
397       outMonitorTOFnsigmaPi->AddValue(axisTOFnsigmaPi);
398
399       // add outputs to loop
400       mon->Add(outMonitorTOFnsigmaPi);
401
402       // kTOFnsigmaP
403       AliRsnValueDaughter *axisTOFnsigmaP = new AliRsnValueDaughter("p", AliRsnValueDaughter::kTOFnsigmaP);
404       axisTOFnsigmaP->SetBins(1001,-100,100);
405
406       // output: 2D histogram of TPC signal vs. TPC momentum
407       AliRsnListOutput *outMonitorTOFnsigmaP = new AliRsnListOutput("TOF_nsigma", AliRsnListOutput::kHistoDefault);
408       outMonitorTOFnsigmaP->AddValue(axisTOFnsigmaP);
409
410       // add outputs to loop
411       mon->Add(outMonitorTOFnsigmaP);
412    }
413
414
415    AliRsnListOutput *outMonitorPTvsMult = new AliRsnListOutput("PTvsMult",AliRsnListOutput::kHistoDefault);
416    AliRsnValueDaughter *vd1 = new AliRsnValueDaughter("pt",AliRsnValueDaughter::kPt);
417    vd1->SetBins(0.0,5.0,0.01);
418    outMonitorPTvsMult->AddValue(vd1);
419
420    AliRsnValueEvent *ve1 = new AliRsnValueEvent("mult",AliRsnValueEvent::kMult);
421    ve1->SetBins(0.0,100.0,1);
422    outMonitorPTvsMult->AddValue(ve1);
423    mon->Add(outMonitorPTvsMult);
424
425    //    mon->SetMCRefInfo(gRsnUseMCMomentum);
426
427 }
428
429 void AddMonitorOutputMini(AliRsnMiniAnalysisTask *task,Int_t listID1,TString name = "",Char_t charge='0')
430 {
431    TString chargeName="all";
432    if ( charge == '+' ) chargeName = "pos";
433    if ( charge == '-' ) chargeName = "neg";
434
435    AliRsnMiniMonitor *mondEdx = new AliRsnMiniMonitor(Form("%s_dEdxTPCvsP_%s", name.Data(),chargeName.Data()),AliRsnMiniMonitor::kdEdxTPCvsP, listID1);
436    mondEdx->SetCharge(charge);
437
438    AliRsnMiniMonitor *monPt = new AliRsnMiniMonitor(Form("%s_Pt_%s", name.Data(),chargeName.Data()),AliRsnMiniMonitor::kTrackPt, listID1);
439    monPt->SetCharge(charge);
440
441 }
442
443 void AddParticleMonitor(AliAnalysisTaskSE *task, Bool_t isMC, Int_t listID1,AliRsnCutSet *commonEventCuts=0,AliRsnCutSet *cutPair=0,TString name = "")
444 {
445    Bool_t valid;
446    Int_t isRsnMini = AliAnalysisManager::GetGlobalInt("rsnUseMiniPackage",valid);
447    if (isRsnMini) {
448       Printf("Monitoring by mini is not supported now. It will be soon !!!");
449       return ;
450       //       AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
451       //
452       //       AddMonitorOutputMini((AliRsnMiniAnalysisTask *)task,listID1,name);
453       //       AddMonitorOutputMini((AliRsnMiniAnalysisTask *)task,listID1,name,'+');
454       //       AddMonitorOutputMini((AliRsnMiniAnalysisTask *)task,listID1,name,'-');
455    } else {
456       TList *listLoops = new TList;
457       // monitor definition
458       AliRsnDaughterDef *tracksAll = new AliRsnDaughterDef(AliRsnDaughter::kTrack /*'+' or '-'*/);
459       AliRsnDaughterDef *tracksPos = new AliRsnDaughterDef(AliRsnDaughter::kTrack,'+');
460       AliRsnDaughterDef *tracksNeg = new AliRsnDaughterDef(AliRsnDaughter::kTrack,'-');
461
462       AliRsnLoopDaughter *lm =0;
463       // loop object
464       listLoops->Add(new AliRsnLoopDaughter(Form("%s_all", name.Data()), listID1, tracksAll));
465       listLoops->Add(new AliRsnLoopDaughter(Form("%s_pos", name.Data()), listID1, tracksPos));
466       listLoops->Add(new AliRsnLoopDaughter(Form("%s_neg", name.Data()), listID1, tracksNeg));
467
468       TIter next(listLoops);
469       while ((lm = (AliRsnLoopDaughter *)next.Next())) {
470          if (commonEventCuts) lm->SetEventCuts(commonEventCuts);
471          AddMonitorOutput(lm);
472          ((AliRsnAnalysisTask *)task)->AddLoop(lm);
473       }
474    }
475 }