4 // AliMixInfo object contains information about one cut on for event mixing
5 // available for users containing mixing information
8 // Martin Vala (martin.vala@cern.ch)
20 #include <TPavesText.h>
25 #include "AliMixInfo.h"
26 #include "AliMixEventPool.h"
27 #include "AliMixEventCutObj.h"
31 //_________________________________________________________________________________________________
32 AliMixInfo::AliMixInfo(const char *name, const char *title) :
37 // Default constructor.
39 AliDebug(AliLog::kDebug + 5, "<-");
40 AliDebug(AliLog::kDebug + 5, "->");
42 //_________________________________________________________________________________________________
43 AliMixInfo::AliMixInfo(const AliMixInfo &obj) :
45 fHistogramList(obj.fHistogramList)
50 AliDebug(AliLog::kDebug + 5, "<-");
51 AliDebug(AliLog::kDebug + 5, "->");
53 //_________________________________________________________________________________________________
54 AliMixInfo::~AliMixInfo()
61 //_________________________________________________________________________________________________
62 void AliMixInfo::CreateHistogram(AliMixInfo::EInfoHistorgramType type, Int_t nbins, Int_t min, Int_t max)
65 // Create mix info histograms
67 if (!fHistogramList) {
68 fHistogramList = new TList;
69 fHistogramList->SetOwner(kTRUE);
71 TH1I *hist = (TH1I *) fHistogramList->FindObject(GetNameHistogramByType(type));
73 hist = new TH1I(GetNameHistogramByType(type), GetTitleHistogramByType(type), nbins, min, max);
74 fHistogramList->Add(hist);
77 //_________________________________________________________________________________________________
78 void AliMixInfo::FillHistogram(AliMixInfo::EInfoHistorgramType type, Int_t value)
81 // Create mix info histograms
83 if (type == kMixedEvents && value < 0) return;
84 if (!fHistogramList) {
85 AliError("fHistogramList is null");
88 TH1I *hist = (TH1I *) fHistogramList->FindObject(GetNameHistogramByType(type));
91 AliDebug(AliLog::kDebug, Form("%s was filled with %d sum is %.0f", GetNameHistogramByType(type), value, hist->GetBinContent(value)));
93 AliError(Form("Problem filling histogram %s", GetNameHistogramByType(type)));
97 //_________________________________________________________________________________________________
98 const char *AliMixInfo::GetNameHistogramByType(Int_t index) const
101 // Retruns name of cut
105 return "hMainEvents";
107 return "hMixedEvents";
112 //_________________________________________________________________________________________________
113 const char *AliMixInfo::GetTitleHistogramByType(Int_t index) const
116 // Retruns name of cut
120 return "Main Events";
122 return "Mixed Events";
127 //_________________________________________________________________________________________________
128 void AliMixInfo::Print(Option_t *option) const
133 if (!fHistogramList) return;
135 AliInfo(Form("Name %s with option is %s", GetName(), option));
136 TIter next(fHistogramList);
138 for (Int_t i = 0; i < fHistogramList->GetEntries(); i++) {
139 h = dynamic_cast<TH1I *>(fHistogramList->At(i));
146 //_________________________________________________________________________________________________
147 void AliMixInfo::Draw(Option_t* option)
150 // Drwas mixi info canvas
152 if (!fHistogramList) return;
154 // creating main canvas
155 TCanvas *cMain = new TCanvas("cMain", "Mixing Info", 500, 500);
157 cMain->Divide(1, 2, 0.001, 0.001);
159 // TVirtualPad *upperPad = cMain->cd(1);
160 // upperPad->Divide(2,1);
161 // TVirtualPad *upperPad1 = gPad->cd(2);
162 // upperPad1->Divide(1,2);
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");
170 // gets corresponding histograms
171 TH1I *hMain = GetHistogramByType(kMainEvents);
173 AliError("hMain is null");
176 TH1I *hMix = GetHistogramByType(kMixedEvents);
178 AliError("hMix is null");
183 TH2I *hMixInfo2D = 0;
184 // TH1I *hOK=0,*hBad=0;
185 AliMixEventPool *evPool = (AliMixEventPool *) GetEventPool("mixEventPool");
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++) {
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);
199 hMixInfo2D->SetBinContent(iBin + 1, 1, 3);
204 TStyle *style = gStyle;
205 Int_t cols[4] = { kYellow, kViolet, kRed, kGreen };
206 style->SetPalette(4, cols);
208 hMixInfo2D->SetMaximum(4);
209 hMixInfo2D->SetStats(0);
210 hMixInfo2D->SetTitle("");
211 hMixInfo2D->GetXaxis()->SetNdivisions(510);
212 hMixInfo2D->GetYaxis()->SetNdivisions(0);
215 // hMixInfo2D->SetBarWidth(1);
216 // hMixInfo2D->SetLineColor(kBlack);
217 // hMixInfo2D->SetLineWidth(11);
218 hMixInfo2D->Draw(Form("COL %s", option));
220 // TLegend *legend = new TLegend(0.55,0.65,0.76,0.82);
221 // legend->AddEntry(hOK,"OK","f");
222 // legend->AddEntry(hBad,"NOT OK","f");
225 cMain->cd(2)->AddExec("dynamic", Form("AliMixInfo::DynamicExec((AliMixInfo*)0x%lx)", (ULong_t)this));
228 //_________________________________________________________________________________________________
229 void AliMixInfo::DynamicExec(AliMixInfo *const mixInfo)
232 // Function which is run when user move mouse over mix info
235 TObject *select = gPad->GetSelected();
237 if (!select->InheritsFrom(TH2I::Class())) {
238 gPad->SetUniqueID(0);
242 TH2I *hSelected = (TH2I *) select;
243 gPad->GetCanvas()->FeedbackMode(kTRUE);
245 //erase old position and draw a line at current position
246 Int_t uid = gPad->GetUniqueID();
247 // int pxold = gPad->GetUniqueID();
248 Int_t px = gPad->GetEventX();
249 // Int_t py = gPad->GetEventY();
250 // float uxmin = gPad->GetUxmin();
251 // float uxmax = gPad->GetUxmax();
252 // float uymin = gPad->GetUymin();
253 // float uymax = gPad->GetUymax();
254 // Int_t pxmin = gPad->XtoAbsPixel ( uxmin );
255 // Int_t pxmax = gPad->XtoAbsPixel ( uxmax );
256 // Int_t pymin = gPad->YtoAbsPixel ( uymin );
257 // Int_t pymax = gPad->YtoAbsPixel ( uymax );
258 // // if(pxold) gVirtualX->DrawLine(pxold,pymin,pxold,pymax);
259 // // else gVirtualX->DrawLine(px,pymin,px,pymax);
260 // gPad->SetUniqueID ( px );
262 Float_t upx = gPad->AbsPixeltoX(px);
263 // Float_t upy = gPad->AbsPixeltoY(py);
265 Float_t x = gPad->PadtoX(upx);
266 // Float_t y = gPad->PadtoY ( upy );
268 Int_t binX = hSelected->GetXaxis()->FindBin(x) - 1;
269 // Int_t binY = hSelected->GetYaxis()->FindBin(y)-1;
273 // return in case of same bin
274 if (uid == binX) return;
275 // Printf("%d %d",uid,binX);
277 //create or set the new canvas cInfo
279 TVirtualPad *padsav = gPad;
280 TCanvas *cInfo = (TCanvas *) gROOT->GetListOfCanvases()->FindObject("cMain");
282 text = (TPaveText *)cInfo->GetPrimitive("mixInfoText");
284 text = new TPavesText(0.05, 0.05, 0.95, 0.95, 1);
289 } else cInfo = new TCanvas("cInfo", "MixInfo Canvas", 510, 0, 350, 150);
291 TVirtualPad *upperPad = cInfo->cd(1);
292 // TVirtualPad *upperPadL = upperPad->cd(1);
293 // TVirtualPad *upperPadR = upperPad->cd(2);
294 // TVirtualPad *upperPadR1 = upperPadR->cd(1);
295 // TVirtualPad *upperPadR2 = upperPadR->cd(2);
303 // gets corresponding histograms
304 TH1I *hMain = mixInfo->GetHistogramByType(kMainEvents);
306 Printf("hMain is null");
309 TH1I *hMix = mixInfo->GetHistogramByType(kMixedEvents);
311 Printf("hMix is null");
315 Double_t numMain = hMain->GetBinContent(binX);
316 Double_t numMix = hMix->GetBinContent(binX);
317 Int_t hist2DValue = (Int_t) hSelected->GetBinContent(binX + 1, 1);
321 text->SetName("mixInfoText");
322 text->SetTextAlign(12);
323 text->SetToolTipText("Mixing Info about current binX");
324 // text->SetTextSize(0.1);
325 // text->SetTextColor(3);
326 text->SetBorderSize(2);
327 text->AddText(Form("binX=%d", binX));
328 text->AddText(Form("numMain=%.0f", numMain));
329 text->AddText(Form("numMix=%.0f", numMix));
330 text->AddText(Form("BINCONTENT=%d", hist2DValue));
334 AliMixEventPool *evPool = (AliMixEventPool *) mixInfo->GetEventPool("mixEventPool");
336 mixNum = evPool->GetMixNumber();
338 evPool->SetCutValuesFromBinIndex(binX - 1);
339 TObjArray *eventCuts = evPool->GetListOfEventCuts();
342 TObjArrayIter next(eventCuts);
343 AliMixEventCutObj *cut;
344 while ((cut = (AliMixEventCutObj *) next())) {
345 if (hist2DValue > 1) text->AddText(Form("%s <%.2f,%.2f)", cut->GetCutName(), cut->GetMin(), cut->GetMax()));
346 else text->AddText(Form("%s <Out of Range>", cut->GetCutName()));
353 switch (hist2DValue) {
355 text->SetFillColor(kYellow);
358 text->SetFillColor(kViolet);
361 text->SetFillColor(kRed);
364 text->SetFillColor(kGreen);
367 text->SetFillColor(kWhite);
373 // TH1D *proj1 = hSelected->ProjectionY("_xxx",binX);
376 // TH1D *proj2 = hSelected->ProjectionY("_xxx",binX);
383 gPad->SetUniqueID(binX);
386 //_________________________________________________________________________________________________
387 Long64_t AliMixInfo::Merge(TCollection *list)
395 Long64_t counter = 0;
396 while ((mi = (AliMixInfo *) nxfc())) {
397 // Do not merge with ourself
398 if (mi == this) continue;
399 // Make sure that it is a AliMixInfo
400 if (!mi->InheritsFrom(AliMixInfo::Class())) {
401 Error("Merge", "attempt to add object of class: %s to a %s", mi->ClassName(), ClassName());
412 TH1I *AliMixInfo::GetHistogramByType(Int_t index) const
415 // GetHistogramByType
417 return (TH1I *) fHistogramList->FindObject(GetNameHistogramByType(index));
420 //_________________________________________________________________________________________________
421 void AliMixInfo::Add(AliMixInfo *mi)
427 AliInfo(Form("Adding %p", mi));
429 if (!fHistogramList) return;
430 TH1I *hMain = GetHistogramByType(kMainEvents);
432 AliError("hMain is null");
435 TH1I *hMix = GetHistogramByType(kMixedEvents);
437 AliError("hMain is null");
440 hMain->Add(mi->GetHistogramByType(kMainEvents));
441 hMix->Add(mi->GetHistogramByType(kMixedEvents));
444 //_________________________________________________________________________________________________
445 void AliMixInfo::SetEventPool(AliMixEventPool *evPool)
452 if (!fHistogramList) return;
454 fHistogramList->Add(evPool);
457 //_________________________________________________________________________________________________
458 AliMixEventPool *AliMixInfo::GetEventPool(const char *name)
463 if (!fHistogramList) return 0;
465 return (AliMixEventPool *) fHistogramList->FindObject(name);