#include "TCanvas.h"
#include "TList.h"
#include "TDatime.h"
#include "TStyle.h"
#include "TColor.h"
#include "TText.h"
#include "TASImage.h"
#include "TLatex.h"
#include "TLegend.h"
#include "TGraphErrors.h"
#include "AliFigure.h"
TStyle *AliFigure::fgStyle;
AliFigure::AliFigure(const char* name, const char* title, Int_t ww, Int_t wh) :
TCanvas(name, title, ww, wh),
fDisabled(kFALSE),
isMC(kFALSE),
fStatus(kWorkInProgress),
fDateFormat("%d/%m/%Y"),
fTextSize(20),
fTextColor(kBlack),
fLogoFilename(),
fLogoPosX(0.2),
fLogoPosY(0.5),
fLogoHeight(100),
fLogoPad(0x0),
fDate(0x0),
fStatusPad(0x0),
fCollSystem(0x0),
fDataSample(0x0),
fTag(0x0),
fLogo(0x0)
{
fStatusString[kWorkInProgress] = "work in progress";
fStatusString[kThisWork] = "- this work -";
fStatusString[kPerformance] = "Performance";
fStatusString[kPreliminary] = "Preliminary";
fStatusString[kFinal] = "";
fLogoFilename[kWorkInProgress] = "$ALICE_ROOT/PWG/Tools/fig/2011-Nov-24-ALICE_logo_WithoutStrapline.eps";
fLogoFilename[kThisWork] = "";
fLogoFilename[kPerformance] = "$ALICE_ROOT/PWG/Tools/fig/2011-Nov-24-ALICE_logo_WithoutStrapline.eps";
fLogoFilename[kPreliminary] = "$ALICE_ROOT/PWG/Tools/fig/2011-Nov-24-ALICE_PRELIMINARY_logo_BLACK_small_usage_design.eps";
fLogoFilename[kFinal] = "";
this->SetLeftMargin(0.15);
this->SetRightMargin(0.04);
this->SetRightMargin(0.04);
this->SetBottomMargin(0.15);
TDatime now;
char date[30];
time_t t = (time_t) now.Convert();
struct tm* loctis = localtime(&t);
strftime(date, 30, fDateFormat.Data(), loctis);
fCollSystem = new TLatex(0.96, 0.95, "pp #sqrt{s} = 7 TeV");
fCollSystem->SetNDC();
fCollSystem->SetTextSize(fTextSize);
fCollSystem->SetTextFont(43);
fCollSystem->SetTextAlign(33);
fCollSystem->SetTextColor(fTextColor);
fDataSample = new TLatex(0.15, 0.05, "Run ######");
fDataSample->SetNDC();
fDataSample->SetTextSize(fTextSize);
fDataSample->SetTextFont(43);
fDataSample->SetTextAlign(11);
fDataSample->SetTextColor(fTextColor);
fDate = new TText(0.5, 0., date);
fDate->SetNDC();
fDate->SetTextSize(fTextSize);
fDate->SetTextFont(43);
fDate->SetTextAlign(22);
fDate->SetTextColor(fTextColor);
fStatusPad = new TText(0.5, 0.15, fStatusString[fStatus]);
fStatusPad->SetNDC();
fStatusPad->SetTextSize(fTextSize);
fStatusPad->SetTextFont(43);
fStatusPad->SetTextAlign(22);
fStatusPad->SetTextColor(fTextColor);
fTag = new TText(0.5, 0., "");
fTag->SetNDC();
fTag->SetTextSize(fTextSize);
fTag->SetTextFont(43);
fTag->SetTextAlign(22);
fTag->SetTextColor(fTextColor);
fLogoPad = new TPad("aliceLogo", "Pad for ALICE Logo", .2, .2, .4, .4);
this->UpdateLogo();
fLogoPad->GetListOfPrimitives()->Add(fLogo);
UpdateLogoPos();
}
AliFigure::~AliFigure()
{
};
void AliFigure::Draw(Option_t *option)
{
TCanvas::Draw(option);
}
void AliFigure::Paint(Option_t *option)
{
TCanvas::Paint(option);
}
void AliFigure::Clear(Option_t *option)
{
TList *listOfPrimitives = this->GetListOfPrimitives();
TIter iter(listOfPrimitives);
TObject *obj = 0x0;
while ((obj = iter())) {
if ((obj == fCollSystem) || (obj == fStatusPad) || (obj == fLogoPad) || (obj == fDate) || (obj == fTag) || (obj == fDataSample)) {
listOfPrimitives->Remove(obj);
}
}
TCanvas::Clear(option);
}
void AliFigure::Update()
{
if (fDisabled)
return;
this->UpdateLogoPos();
this->UpdatePad(this);
if (fLogo && fLogo->IsValid()) {
this->GetListOfPrimitives()->Add(fLogoPad);
}
this->GetListOfPrimitives()->Add(fCollSystem);
if ((fStatus == kWorkInProgress) || (fStatus == kThisWork))
this->GetListOfPrimitives()->Add(fStatusPad);
this->GetListOfPrimitives()->Add(fDataSample);
this->GetListOfPrimitives()->Add(fTag);
this->Modified(kTRUE);
TCanvas::Update();
}
void AliFigure::SetStatus(Status_t status)
{
fStatus = status;
fStatusPad->SetText(fStatusPad->GetX(), fStatusPad->GetY(), fStatusString[fStatus]);
UpdateLogo();
this->Modified(kTRUE);
}
void AliFigure::SetLogoFilename(Status_t status, TString filename)
{
fLogoFilename[status] = filename;
}
void AliFigure::UpdateLogo()
{
if (fLogo)
fLogoPad->GetListOfPrimitives()->Remove(fLogo);
delete fLogo;
if (fLogoFilename[fStatus].Length() > 0) {
fLogo = new TASImage(fLogoFilename[fStatus]);
if (fLogo->IsValid()) {
fLogo->SetImageQuality(TASImage::kImgBest);
}
}
else
fLogo = 0x0;
this->UpdateLogoPos();
}
void AliFigure::SetLogoPos(Float_t x, Float_t y)
{
fLogoPosX = x;
fLogoPosY = y;
this->UpdateLogoPos();
}
void AliFigure::SetLogoPos(Pos_t pos)
{
switch (pos) {
case kN:
SetLogoPos(0.5, 0.8);
break;
case kNE:
SetLogoPos(0.8, 0.8);
break;
case kE:
SetLogoPos(0.8, 0.5);
break;
case kSE:
SetLogoPos(0.8, 0.2);
break;
case kS:
SetLogoPos(0.5, 0.2);
break;
case kSW:
SetLogoPos(0.25, 0.2);
break;
case kW:
SetLogoPos(0.25, 0.5);
break;
case kNW:
SetLogoPos(0.25, 0.8);
break;
case kCenter:
SetLogoPos(0.5, 0.5);
break;
default:
this->Error(__FUNCTION__, "Unknown position specifier");
}
}
void AliFigure::SetLogoSize(Float_t size)
{
fLogoHeight = this->GetWh() * size;
this->UpdateLogoPos();
}
void AliFigure::SetCollSystem(TString txt)
{
fCollSystem->SetText(fCollSystem->GetX(), fCollSystem->GetY(), txt);
}
void AliFigure::SetCollSystemPos(Float_t x, Float_t y)
{
fCollSystem->SetX(x);
fCollSystem->SetY(y);
}
void AliFigure::SetDataSample(TString txt)
{
fDataSample->SetText(fDataSample->GetX(), fDataSample->GetY(), txt);
}
TStyle* AliFigure::Style()
{
if (!fgStyle) {
fgStyle = new TStyle(*gStyle);
fgStyle->SetName("alice");
fgStyle->SetTitle("ALICE figure style");
const int font = 43;
fgStyle->SetFrameBorderMode(0);
fgStyle->SetFrameFillColor(0);
fgStyle->SetCanvasBorderMode(0);
fgStyle->SetPadBorderMode(0);
fgStyle->SetPadColor(10);
fgStyle->SetCanvasColor(10);
fgStyle->SetOptTitle(0);
fgStyle->SetTitleFillColor(10);
fgStyle->SetTitleBorderSize(0);
if ((font % 10) == 3)
fgStyle->SetTitleFontSize(30);
else
fgStyle->SetTitleFontSize(0.08);
fgStyle->SetStatColor(10);
fgStyle->SetStatBorderSize(1);
fgStyle->SetDrawBorder(0);
fgStyle->SetTextFont(font);
fgStyle->SetStatFont(font);
fgStyle->SetStatFontSize(0.05);
fgStyle->SetStatX(0.97);
fgStyle->SetStatY(0.98);
fgStyle->SetStatH(0.03);
fgStyle->SetStatW(0.3);
fgStyle->SetTickLength(0.02,"y");
fgStyle->SetEndErrorSize(3);
if ((font % 10) == 3)
fgStyle->SetLabelSize(30, "xyz");
else
fgStyle->SetLabelSize(0.05,"xyz");
fgStyle->SetLabelFont(font,"xyz");
fgStyle->SetLabelOffset(0.01,"xyz");
fgStyle->SetTitleFont(font,"xyz");
fgStyle->SetTitleOffset(1.,"xyz");
if ((font % 10) == 3)
fgStyle->SetTitleSize(34, "xyz");
else
fgStyle->SetTitleSize(0.06,"xyz");
fgStyle->SetMarkerSize(1);
fgStyle->SetPalette(1,0);
if (kFALSE) {
fgStyle->SetOptStat(1111);
fgStyle->SetOptFit(1111);
}
else {
fgStyle->SetOptStat(0);
fgStyle->SetOptFit(0);
}
}
return fgStyle;
}
void AliFigure::SetTextSize(Float_t size)
{
fTextSize = size;
fStatusPad->SetTextSize(fTextSize);
this->UpdateLogoPos();
this->UpdatePad(this);
}
void AliFigure::UpdateLogoPos()
{
Float_t ratio = 1.;
Float_t height = 0.;
Float_t width = 0.;
if (fLogo && fLogo->IsValid()) {
ratio = fLogo->GetWidth();
ratio /= (Float_t) fLogo->GetHeight();
ratio *= (Float_t) this->GetWh();
ratio /= (Float_t) this->GetWw();
height = fLogoHeight / this->GetWh();
width = height*ratio;
fLogoPad->SetPad(fLogoPosX - width/2, fLogoPosY - height/2,
fLogoPosX + width/2, fLogoPosY + height/2);
}
Float_t offset = - (0.*fTextSize)/this->GetWh();
if ((fStatus == kPerformance) ||
(fStatus == kWorkInProgress)) {
fStatusPad->SetX(fLogoPosX);
fStatusPad->SetY(fLogoPosY - height/2 + offset);
offset -= (1.2*fTextSize)/this->GetWh();
}
else if (fStatus == kThisWork) {
fStatusPad->SetX(0.25);
fStatusPad->SetY(0.95);
}
fDate->SetX(fLogoPosX);
fDate->SetY(fLogoPosY - height/2 + offset);
offset -= (1.2*fTextSize)/this->GetWh();
fTag->SetX(fLogoPosX);
fTag->SetY(fLogoPosY - height/2 + offset);
this->Modified();
}
void AliFigure::UpdatePad(TPad *pad)
{
pad->SetLeftMargin(0.15);
pad->SetRightMargin(0.04);
pad->SetBottomMargin(0.15);
fCollSystem->SetX(.96);
TList *listOfPrimitives = pad->GetListOfPrimitives();
TIter iter(listOfPrimitives);
TObject *obj = 0x0;
while ((obj = iter())) {
if ((obj == fCollSystem) || (obj == fStatusPad) || (obj == fLogoPad) || (obj == fDate) || (obj == fTag) || (obj == fDataSample)) {
listOfPrimitives->Remove(obj);
}
else {
if (obj->InheritsFrom("TPad")) {
}
else if (obj->InheritsFrom("TH2")) {
pad->SetRightMargin(.18);
fCollSystem->SetX(.82);
}
else if (obj->InheritsFrom("TLegend")) {
TLegend *leg = (TLegend*) obj;
leg->SetBorderSize(1);
leg->SetFillStyle(0);
leg->SetFillColor(1);
leg->SetShadowColor(0);
leg->SetMargin(0.25);
leg->SetTextSize(fTextSize);
leg->SetEntrySeparation(0.25);
}
}
}
}