]> git.uio.no Git - u/mrichter/AliRoot.git/blob - ANALYSIS/EventMixing/AliMixInfo.cxx
24de78e1c6b5b4ff7d3b9bb183ca5e8e0eb9b90d
[u/mrichter/AliRoot.git] / ANALYSIS / EventMixing / AliMixInfo.cxx
1 //
2 // Class AliMixInfo
3 //
4 // AliMixInfo object contains information about one cut on for event mixing
5 // available for users containing mixing information
6 //
7 // authors:
8 //          Martin Vala (martin.vala@cern.ch)
9 //
10
11 #include <TList.h>
12 #include <TPad.h>
13 #include <TROOT.h>
14 #include <TFile.h>
15 #include <TH1.h>
16 #include <TH2.h>
17 #include <TProfile.h>
18 #include <TStyle.h>
19 #include <TLegend.h>
20 #include <TPavesText.h>
21 #include <TCanvas.h>
22
23 #include "AliLog.h"
24
25 #include "AliMixInfo.h"
26 #include "AliMixEventPool.h"
27 #include "AliMixEventCutObj.h"
28
29 ClassImp(AliMixInfo)
30
31 //_________________________________________________________________________________________________
32 AliMixInfo::AliMixInfo(const char *name, const char *title) :
33    TNamed(name, title),
34    fHistogramList(0)
35 {
36    //
37    // Default constructor.
38    //
39    AliDebug(AliLog::kDebug + 5, "<-");
40    AliDebug(AliLog::kDebug + 5, "->");
41 }
42 //_________________________________________________________________________________________________
43 AliMixInfo::AliMixInfo(const AliMixInfo &obj) :
44    TNamed(obj),
45    fHistogramList(obj.fHistogramList)
46 {
47    //
48    // Copy constructor.
49    //
50    AliDebug(AliLog::kDebug + 5, "<-");
51    AliDebug(AliLog::kDebug + 5, "->");
52 }
53 //_________________________________________________________________________________________________
54 AliMixInfo::~AliMixInfo()
55 {
56    //
57    // Destructor
58    //
59 }
60
61 //_________________________________________________________________________________________________
62 void AliMixInfo::CreateHistogram(AliMixInfo::EInfoHistorgramType type, Int_t nbins, Int_t min, Int_t max)
63 {
64    //
65    // Create mix info histograms
66    //
67    if (!fHistogramList) {
68       fHistogramList = new TList;
69       fHistogramList->SetOwner(kTRUE);
70    }
71    TH1I *hist = (TH1I *) fHistogramList->FindObject(GetNameHistogramByType(type));
72    if (hist) return;
73    hist = new TH1I(GetNameHistogramByType(type), GetTitleHistogramByType(type), nbins, min, max);
74    fHistogramList->Add(hist);
75 }
76
77 //_________________________________________________________________________________________________
78 void AliMixInfo::FillHistogram(AliMixInfo::EInfoHistorgramType type, Int_t value)
79 {
80    //
81    // Create mix info histograms
82    //
83    if (type == kMixedEvents && value < 0) return;
84    if (!fHistogramList) {
85       AliError("fHistogramList is null");
86       return;
87    }
88    TH1I *hist = (TH1I *) fHistogramList->FindObject(GetNameHistogramByType(type));
89    if (hist) {
90       hist->Fill(value);
91       AliDebug(AliLog::kDebug, Form("%s was filled with %d sum is %.0f", GetNameHistogramByType(type), value, hist->GetBinContent(value)));
92    } else {
93       AliError(Form("Problem filling histogram %s", GetNameHistogramByType(type)));
94    }
95 }
96
97 //_________________________________________________________________________________________________
98 const char *AliMixInfo::GetNameHistogramByType(Int_t index) const
99 {
100    //
101    // Retruns name of cut
102    //
103    switch (index) {
104       case kMainEvents:
105          return "hMainEvents";
106       case kMixedEvents:
107          return "hMixedEvents";
108    }
109    return "";
110 }
111
112 //_________________________________________________________________________________________________
113 const char *AliMixInfo::GetTitleHistogramByType(Int_t index) const
114 {
115    //
116    // Retruns name of cut
117    //
118    switch (index) {
119       case kMainEvents:
120          return "Main Events";
121       case kMixedEvents:
122          return "Mixed Events";
123    }
124    return "";
125 }
126
127 //_________________________________________________________________________________________________
128 void AliMixInfo::Print(Option_t *option) const
129 {
130    //
131    // Print Mix info
132    //
133    if (!fHistogramList) return;
134    if (option)
135       AliInfo(Form("Name %s with option is %s", GetName(), option));
136    TIter next(fHistogramList);
137    TH1I *h = 0;
138    for (Int_t i = 0; i < fHistogramList->GetEntries(); i++) {
139       h = dynamic_cast<TH1I *>(fHistogramList->At(i));
140       if (h) {
141          h->Print();
142          continue;
143       }
144    }
145 }
146 //_________________________________________________________________________________________________
147 void AliMixInfo::Draw(Option_t *option)
148 {
149    //
150    // Drwas mixi info canvas
151    //
152    if (!fHistogramList) return;
153
154    // creating main canvas
155    TCanvas *cMain = new TCanvas("cMain", "Mixing Info", 500, 500);
156    if (!cMain) return;
157    cMain->Divide(1, 2, 0.001, 0.001);
158    cMain->cd(1);
159 //     TVirtualPad *upperPad = cMain->cd(1);
160 //     upperPad->Divide(2,1);
161 //     TVirtualPad *upperPad1 = gPad->cd(2);
162 //     upperPad1->Divide(1,2);
163 //     upperPad1->cd(1);
164    TPavesText *text = new TPavesText(0.05, 0.05, 0.95, 0.95, 1);
165    text->SetName("mixInfoText");
166    text->AddText("Help:");
167    text->AddText("Move over histogram to see mix info for different bins");
168    text->Draw();
169
170    // gets corresponding histograms
171    TH1I *hMain = GetHistogramByType(kMainEvents);
172    if (!hMain) {
173       AliError("hMain is null");
174       return;
175    }
176    TH1I *hMix =  GetHistogramByType(kMixedEvents);
177    if (!hMix) {
178       AliError("hMix is null");
179       return;
180    }
181
182
183    TH2I *hMixInfo2D = 0;
184 //     TH1I *hOK=0,*hBad=0;
185    AliMixEventPool *evPool = (AliMixEventPool *) GetEventPool("mixEventPool");
186    if (evPool) {
187       Int_t mixNum = evPool->GetMixNumber();
188 //         hOK = (TH1I *) hMain->Clone();
189 //         hBad = (TH1I *) hMain->Clone();
190       if (!hMixInfo2D) hMixInfo2D = new TH2I("hMixInfo2D", "hMixInfo2D", hMain->GetXaxis()->GetNbins() + 1, hMain->GetXaxis()->GetXmin() - 1, hMain->GetXaxis()->GetXmax(), 1, 0, 1);
191       for (Int_t iBin = 0; iBin < hMain->GetNbinsX() + 1; iBin++) {
192          if (!iBin) {
193             hMixInfo2D->SetBinContent(iBin + 1, 1, 1);
194          } else if (!hMain->GetBinContent(iBin) && !hMix->GetBinContent(iBin)) {
195             hMixInfo2D->SetBinContent(iBin + 1, 1, 2);
196          } else if (hMix->GetBinContent(iBin) == mixNum * hMain->GetBinContent(iBin)) {
197             hMixInfo2D->SetBinContent(iBin + 1, 1, 4);
198          } else {
199             hMixInfo2D->SetBinContent(iBin + 1, 1, 3);
200          }
201       }
202    }
203
204    TStyle *style = gStyle;
205    Int_t cols[4] = { kYellow, kViolet, kRed, kGreen  };
206    style->SetPalette(4, cols);
207    cMain->cd(2);
208 //    cMain->SetGrid();
209    if (hMixInfo2D) {
210       hMixInfo2D->SetMaximum(4);
211       hMixInfo2D->SetStats(0);
212       hMixInfo2D->SetTitle("");
213       hMixInfo2D->GetXaxis()->SetNdivisions(510);
214       hMixInfo2D->GetYaxis()->SetNdivisions(0);
215    }
216
217    if (hMixInfo2D) hMixInfo2D->Draw(Form("COL %s", option));
218 //
219 //     TLegend *legend = new TLegend(0.55,0.65,0.76,0.82);
220 //     legend->AddEntry(hOK,"OK","f");
221 //     legend->AddEntry(hBad,"NOT OK","f");
222 //     legend->Draw();
223
224    cMain->cd(2)->AddExec("dynamic", Form("AliMixInfo::DynamicExec((AliMixInfo*)0x%lx)", (ULong_t)this));
225 }
226
227 //_________________________________________________________________________________________________
228 void AliMixInfo::DynamicExec(AliMixInfo *const mixInfo)
229 {
230    //
231    // Function which is run when user move mouse over mix info
232    //
233
234    if (!mixInfo) return;
235
236    TObject *select = gPad->GetSelected();
237    if (!select) return;
238    if (!select->InheritsFrom(TH2I::Class())) {
239       gPad->SetUniqueID(0);
240       return;
241    }
242
243    TH2I *hSelected = (TH2I *) select;
244    gPad->GetCanvas()->FeedbackMode(kTRUE);
245
246    //erase old position and draw a line at current position
247    Int_t uid = gPad->GetUniqueID();
248 //     int pxold = gPad->GetUniqueID();
249    Int_t px = gPad->GetEventX();
250 //     Int_t py = gPad->GetEventY();
251 //     float uxmin = gPad->GetUxmin();
252 //     float uxmax = gPad->GetUxmax();
253 //     float uymin = gPad->GetUymin();
254 //     float uymax = gPad->GetUymax();
255    //     Int_t pxmin = gPad->XtoAbsPixel ( uxmin );
256    //     Int_t pxmax = gPad->XtoAbsPixel ( uxmax );
257    //     Int_t pymin = gPad->YtoAbsPixel ( uymin );
258    //     Int_t pymax = gPad->YtoAbsPixel ( uymax );
259 // //     if(pxold) gVirtualX->DrawLine(pxold,pymin,pxold,pymax);
260 // //     else gVirtualX->DrawLine(px,pymin,px,pymax);
261 //     gPad->SetUniqueID ( px );
262
263    Float_t upx = gPad->AbsPixeltoX(px);
264 //     Float_t upy = gPad->AbsPixeltoY(py);
265
266    Float_t x = gPad->PadtoX(upx);
267 //     Float_t y = gPad->PadtoY ( upy );
268
269    Int_t binX = hSelected->GetXaxis()->FindBin(x) - 1;
270 //     Int_t binY = hSelected->GetYaxis()->FindBin(y)-1;
271
272
273
274    // return in case of same bin
275    if (uid == binX) return;
276 //     Printf("%d %d",uid,binX);
277
278    //create or set the new canvas cInfo
279    TPaveText *text = 0;
280    TVirtualPad *padsav = gPad;
281    TCanvas *cInfo = (TCanvas *) gROOT->GetListOfCanvases()->FindObject("cMain");
282    if (cInfo) {
283       text = (TPaveText *)cInfo->GetPrimitive("mixInfoText");
284       if (!text) {
285          text = new TPavesText(0.05, 0.05, 0.95, 0.95, 1);
286       } else {
287          text->DeleteText();
288       }
289
290    } else   cInfo = new TCanvas("cInfo", "MixInfo Canvas", 510, 0, 350, 150);
291
292    TVirtualPad *upperPad = cInfo->cd(1);
293 //     TVirtualPad *upperPadL = upperPad->cd(1);
294 //     TVirtualPad *upperPadR = upperPad->cd(2);
295 //     TVirtualPad *upperPadR1 = upperPadR->cd(1);
296 //     TVirtualPad *upperPadR2 = upperPadR->cd(2);
297 //     TH1I *hMain = 0;
298 //     TH1I *hMix = 0;
299
300
301 //     mixInfo->Print();
302 //     return;
303
304    // gets corresponding histograms
305    TH1I *hMain = mixInfo->GetHistogramByType(kMainEvents);
306    if (!hMain) {
307       Printf("hMain is null");
308       return;
309    }
310    TH1I *hMix =  mixInfo->GetHistogramByType(kMixedEvents);
311    if (!hMix) {
312       Printf("hMix is null");
313       return;
314    }
315
316    Double_t numMain = hMain->GetBinContent(binX);
317    Double_t numMix = hMix->GetBinContent(binX);
318    Int_t hist2DValue = (Int_t) hSelected->GetBinContent(binX + 1, 1);
319
320 //    Int_t mixNum = 1;
321    if (text) {
322       if (mixInfo) {
323          AliMixEventPool *evPool = (AliMixEventPool *) mixInfo->GetEventPool("mixEventPool");
324          if (evPool) {
325 //             mixNum = evPool->GetMixNumber();
326             if (binX - 1 >= 0) {
327                if (!evPool->SetCutValuesFromBinIndex(binX - 1)) return;
328             }
329             text->SetName("mixInfoText");
330             text->SetTextAlign(12);
331             text->SetToolTipText("Mixing Info about current binX");
332             text->SetBorderSize(2);
333             text->AddText(Form("binX=%d", binX));
334             text->AddText(Form("numMain=%.0f", numMain));
335             text->AddText(Form("numMix=%.0f", numMix));
336             text->AddText(Form("BINCONTENT=%d", hist2DValue));
337             TObjArray *eventCuts = evPool->GetListOfEventCuts();
338             if (eventCuts) {
339                TObjArrayIter next(eventCuts);
340                AliMixEventCutObj *cut;
341                while ((cut = (AliMixEventCutObj *) next())) {
342                   if (hist2DValue > 1) text->AddText(Form("%s <%.2f,%.2f)", cut->GetCutName(), cut->GetMin(), cut->GetMax()));
343                   else text->AddText(Form("%s <Out of Range>", cut->GetCutName()));
344                }
345             }
346          }
347       }
348       switch (hist2DValue) {
349          case 1 :
350             text->SetFillColor(kYellow);
351             break;
352          case 2 :
353             text->SetFillColor(kViolet);
354             break;
355          case 3 :
356             text->SetFillColor(kRed);
357             break;
358          case 4 :
359             text->SetFillColor(kGreen);
360             break;
361          default:
362             text->SetFillColor(kWhite);
363             break;
364       }
365       upperPad->cd();
366       text->Draw();
367 //         upperPadR1->cd();
368 //         TH1D *proj1 = hSelected->ProjectionY("_xxx",binX);
369 //         proj1->Draw();
370 //         upperPadR2->cd();
371 //         TH1D *proj2 = hSelected->ProjectionY("_xxx",binX);
372 //         proj1->Draw();
373
374    }
375    cInfo->Update();
376    padsav->cd();
377
378    gPad->SetUniqueID(binX);
379 }
380
381 //_________________________________________________________________________________________________
382 Long64_t AliMixInfo::Merge(TCollection *list)
383 {
384    //
385    // Merge function
386    //
387    if (!list) return 0;
388    TIter nxfc(list);
389    AliMixInfo *mi = 0;
390    Long64_t counter = 0;
391    while ((mi = (AliMixInfo *) nxfc())) {
392       // Do not merge with ourself
393       if (mi == this) continue;
394       // Make sure that it is a AliMixInfo
395       if (!mi->InheritsFrom(AliMixInfo::Class())) {
396          Error("Merge", "attempt to add object of class: %s to a %s", mi->ClassName(), ClassName());
397          return -1;
398       }
399       // Merge now
400       Add(mi);
401       counter++;
402    }
403    // Done
404    return counter;
405 }
406
407 TH1I *AliMixInfo::GetHistogramByType(Int_t index) const
408 {
409    //
410    // GetHistogramByType
411    //
412    return (TH1I *) fHistogramList->FindObject(GetNameHistogramByType(index));
413 }
414
415 //_________________________________________________________________________________________________
416 void AliMixInfo::Add(AliMixInfo *mi)
417 {
418    //
419    // adds AliMixInfo
420    //
421
422 //    AliInfo(Form("Adding %p", mi));
423    if (!mi) return;
424    if (!fHistogramList) return;
425    TH1I *hMain = GetHistogramByType(kMainEvents);
426    if (!hMain) {
427       AliError("hMain is null");
428       return;
429    }
430    TH1I *hMix =  GetHistogramByType(kMixedEvents);
431    if (!hMix) {
432       AliError("hMain is null");
433       return;
434    }
435    hMain->Add(mi->GetHistogramByType(kMainEvents));
436    hMix->Add(mi->GetHistogramByType(kMixedEvents));
437 }
438
439 //_________________________________________________________________________________________________
440 void AliMixInfo::SetEventPool(AliMixEventPool *evPool)
441 {
442    //
443    // Sets event pool
444    //
445    if (!evPool) return;
446
447    if (!fHistogramList) return;
448
449    fHistogramList->Add(evPool);
450 }
451
452 //_________________________________________________________________________________________________
453 AliMixEventPool *AliMixInfo::GetEventPool(const char *name)
454 {
455    //
456    // Gets event pool
457    //
458    if (!fHistogramList) return 0;
459
460    return (AliMixEventPool *) fHistogramList->FindObject(name);
461 }
462