#include <TList.h>
#include <TPad.h>
#include <TROOT.h>
#include <TFile.h>
#include <TH1.h>
#include <TH2.h>
#include <TProfile.h>
#include <TStyle.h>
#include <TLegend.h>
#include <TPavesText.h>
#include <TCanvas.h>
#include "AliLog.h"
#include "AliMixInfo.h"
#include "AliMixEventPool.h"
#include "AliMixEventCutObj.h"
ClassImp(AliMixInfo)
AliMixInfo::AliMixInfo(const char *name, const char *title) :
TNamed(name, title),
fHistogramList(0)
{
AliDebug(AliLog::kDebug + 5, "<-");
AliDebug(AliLog::kDebug + 5, "->");
}
AliMixInfo::AliMixInfo(const AliMixInfo &obj) :
TNamed(obj),
fHistogramList(obj.fHistogramList)
{
AliDebug(AliLog::kDebug + 5, "<-");
AliDebug(AliLog::kDebug + 5, "->");
}
AliMixInfo::~AliMixInfo()
{
}
void AliMixInfo::CreateHistogram(AliMixInfo::EInfoHistorgramType type, Int_t nbins, Int_t min, Int_t max)
{
if (!fHistogramList) {
fHistogramList = new TList;
fHistogramList->SetOwner(kTRUE);
}
TH1I *hist = (TH1I *) fHistogramList->FindObject(GetNameHistogramByType(type));
if (hist) return;
hist = new TH1I(GetNameHistogramByType(type), GetTitleHistogramByType(type), nbins, min, max);
fHistogramList->Add(hist);
}
void AliMixInfo::FillHistogram(AliMixInfo::EInfoHistorgramType type, Int_t value)
{
if (type == kMixedEvents && value < 0) return;
if (!fHistogramList) {
AliError("fHistogramList is null");
return;
}
TH1I *hist = (TH1I *) fHistogramList->FindObject(GetNameHistogramByType(type));
if (hist) {
hist->Fill(value);
AliDebug(AliLog::kDebug, Form("%s was filled with %d sum is %.0f", GetNameHistogramByType(type), value, hist->GetBinContent(value)));
} else {
AliError(Form("Problem filling histogram %s", GetNameHistogramByType(type)));
}
}
const char *AliMixInfo::GetNameHistogramByType(Int_t index) const
{
switch (index) {
case kMainEvents:
return "hMainEvents";
case kMixedEvents:
return "hMixedEvents";
}
return "";
}
const char *AliMixInfo::GetTitleHistogramByType(Int_t index) const
{
switch (index) {
case kMainEvents:
return "Main Events";
case kMixedEvents:
return "Mixed Events";
}
return "";
}
void AliMixInfo::Print(Option_t *option) const
{
if (!fHistogramList) return;
if (option)
AliInfo(Form("Name %s with option is %s", GetName(), option));
TIter next(fHistogramList);
TH1I *h = 0;
for (Int_t i = 0; i < fHistogramList->GetEntries(); i++) {
h = dynamic_cast<TH1I *>(fHistogramList->At(i));
if (h) {
h->Print();
continue;
}
}
}
void AliMixInfo::Draw(Option_t *option)
{
if (!fHistogramList) return;
TCanvas *cMain = new TCanvas("cMain", "Mixing Info", 500, 500);
if (!cMain) return;
cMain->Divide(1, 2, 0.001, 0.001);
cMain->cd(1);
TPavesText *text = new TPavesText(0.05, 0.05, 0.95, 0.95, 1);
text->SetName("mixInfoText");
text->AddText("Help:");
text->AddText("Move over histogram to see mix info for different bins");
text->Draw();
TH1I *hMain = GetHistogramByType(kMainEvents);
if (!hMain) {
AliError("hMain is null");
return;
}
TH1I *hMix = GetHistogramByType(kMixedEvents);
if (!hMix) {
AliError("hMix is null");
return;
}
TH2I *hMixInfo2D = 0;
AliMixEventPool *evPool = (AliMixEventPool *) GetEventPool("mixEventPool");
if (evPool) {
Int_t mixNum = evPool->GetMixNumber();
Int_t bufferSize = evPool->GetBufferSize();
if (!hMixInfo2D) hMixInfo2D = new TH2I("hMixInfo2D", "hMixInfo2D", hMain->GetXaxis()->GetNbins() + 1, hMain->GetXaxis()->GetXmin() - 1, hMain->GetXaxis()->GetXmax(), 1, 0, 1);
for (Int_t iBin = 0; iBin < hMain->GetNbinsX() + 1; iBin++) {
if (!iBin) {
hMixInfo2D->SetBinContent(iBin + 1, 1, 1);
} else if (!hMain->GetBinContent(iBin) && !hMix->GetBinContent(iBin)) {
hMixInfo2D->SetBinContent(iBin + 1, 1, 2);
} else if (hMix->GetBinContent(iBin) == mixNum * bufferSize * hMain->GetBinContent(iBin)) {
hMixInfo2D->SetBinContent(iBin + 1, 1, 4);
} else {
hMixInfo2D->SetBinContent(iBin + 1, 1, 3);
}
}
}
TStyle *style = gStyle;
Int_t cols[4] = { kYellow, kViolet, kRed, kGreen };
style->SetPalette(4, cols);
cMain->cd(2);
if (hMixInfo2D) {
hMixInfo2D->SetMaximum(4);
hMixInfo2D->SetStats(0);
hMixInfo2D->SetTitle("");
hMixInfo2D->GetXaxis()->SetNdivisions(510);
hMixInfo2D->GetYaxis()->SetNdivisions(0);
}
if (hMixInfo2D) hMixInfo2D->Draw(Form("COL %s", option));
cMain->cd(2)->AddExec("dynamic", Form("AliMixInfo::DynamicExec((AliMixInfo*)0x%lx)", (ULong_t)this));
}
void AliMixInfo::DynamicExec(AliMixInfo *const mixInfo)
{
if (!mixInfo) return;
TObject *select = gPad->GetSelected();
if (!select) return;
if (!select->InheritsFrom(TH2I::Class())) {
gPad->SetUniqueID(0);
return;
}
TH2I *hSelected = (TH2I *) select;
gPad->GetCanvas()->FeedbackMode(kTRUE);
Int_t uid = gPad->GetUniqueID();
Int_t px = gPad->GetEventX();
Float_t upx = gPad->AbsPixeltoX(px);
Float_t x = gPad->PadtoX(upx);
Int_t binX = hSelected->GetXaxis()->FindBin(x) - 1;
if (uid == binX) return;
TPaveText *text = 0;
TVirtualPad *padsav = gPad;
TCanvas *cInfo = (TCanvas *) gROOT->GetListOfCanvases()->FindObject("cMain");
if (cInfo) {
text = (TPaveText *)cInfo->GetPrimitive("mixInfoText");
if (!text) {
text = new TPavesText(0.05, 0.05, 0.95, 0.95, 1);
} else {
text->DeleteText();
}
} else cInfo = new TCanvas("cInfo", "MixInfo Canvas", 510, 0, 350, 150);
TVirtualPad *upperPad = cInfo->cd(1);
TH1I *hMain = mixInfo->GetHistogramByType(kMainEvents);
if (!hMain) {
Printf("hMain is null");
return;
}
TH1I *hMix = mixInfo->GetHistogramByType(kMixedEvents);
if (!hMix) {
Printf("hMix is null");
return;
}
Double_t numMain = hMain->GetBinContent(binX);
Double_t numMix = hMix->GetBinContent(binX);
Int_t hist2DValue = (Int_t) hSelected->GetBinContent(binX + 1, 1);
if (text) {
if (mixInfo) {
AliMixEventPool *evPool = (AliMixEventPool *) mixInfo->GetEventPool("mixEventPool");
if (evPool) {
if (binX - 1 >= 0) {
if (!evPool->SetCutValuesFromBinIndex(binX - 1)) return;
}
text->SetName("mixInfoText");
text->SetTextAlign(12);
text->SetToolTipText("Mixing Info about current binX");
text->SetBorderSize(2);
text->AddText(Form("binX=%d", binX));
text->AddText(Form("numMain=%.0f", numMain));
text->AddText(Form("numMix=%.0f", numMix));
text->AddText(Form("BINCONTENT=%d", hist2DValue));
TObjArray *eventCuts = evPool->GetListOfEventCuts();
if (eventCuts) {
TObjArrayIter next(eventCuts);
AliMixEventCutObj *cut;
while ((cut = (AliMixEventCutObj *) next())) {
if (hist2DValue > 1) text->AddText(Form("%s <%.2f,%.2f)", cut->GetCutName(), cut->GetCurrentMin(), cut->GetCurrentMax()));
else text->AddText(Form("%s <Out of Range>", cut->GetCutName()));
}
}
}
}
switch (hist2DValue) {
case 1 :
text->SetFillColor(kYellow);
break;
case 2 :
text->SetFillColor(kViolet);
break;
case 3 :
text->SetFillColor(kRed);
break;
case 4 :
text->SetFillColor(kGreen);
break;
default:
text->SetFillColor(kWhite);
break;
}
upperPad->cd();
text->Draw();
}
cInfo->Update();
padsav->cd();
gPad->SetUniqueID(binX);
}
Long64_t AliMixInfo::Merge(TCollection *list)
{
if (!list) return 0;
TIter nxfc(list);
AliMixInfo *mi = 0;
Long64_t counter = 0;
while ((mi = (AliMixInfo *) nxfc())) {
if (mi == this) continue;
if (!mi->InheritsFrom(AliMixInfo::Class())) {
Error("Merge", "attempt to add object of class: %s to a %s", mi->ClassName(), ClassName());
return -1;
}
Add(mi);
counter++;
}
return counter;
}
TH1I *AliMixInfo::GetHistogramByType(Int_t index) const
{
return (TH1I *) fHistogramList->FindObject(GetNameHistogramByType(index));
}
void AliMixInfo::Add(AliMixInfo *mi)
{
if (!mi) return;
if (!fHistogramList) return;
TH1I *hMain = GetHistogramByType(kMainEvents);
if (!hMain) {
AliError("hMain is null");
return;
}
TH1I *hMix = GetHistogramByType(kMixedEvents);
if (!hMix) {
AliError("hMain is null");
return;
}
hMain->Add(mi->GetHistogramByType(kMainEvents));
hMix->Add(mi->GetHistogramByType(kMixedEvents));
}
void AliMixInfo::SetEventPool(AliMixEventPool *evPool)
{
if (!evPool) return;
if (!fHistogramList) return;
fHistogramList->Add(evPool);
}
AliMixEventPool *AliMixInfo::GetEventPool(const char *name)
{
if (!fHistogramList) return 0;
return (AliMixEventPool *) fHistogramList->FindObject(name);
}