// --- ROOT system ---
#include <TClass.h>
#include <TH1F.h>
+#include <TH2.h>
#include <TH1I.h>
#include <TIterator.h>
#include <TKey.h>
#include <TCanvas.h>
#include <TPaveText.h>
#include <TStyle.h>
+#include <TLatex.h>
// --- AliRoot header files ---
#include "AliLog.h"
axis->SetTitle(t);
return ret;
}
+ void RestoreLog(TAxis* axis, Bool_t log)
+ {
+ if (!log) return;
+ TString t(axis->GetTitle());
+ t.Append("[log]");
+ axis->SetTitle(t);
+ }
}
//____________________________________________________________________________
Int_t nImages = 0 ;
Double_t max = 0;
Double_t min = 10000;
+
+ // Loop over all species
for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++) {
AliRecoParam::EventSpecie_t spe = AliRecoParam::ConvertIndex(specie);
if (!AliQAv1::Instance(AliQAv1::GetDetIndex(GetName()))
->IsEventSpecieSet(spe))
continue;
- // if (!AliQAv1::Instance()->IsEventSpecieSet(specie)) continue ;
-
+
+ // If nothing is defined for this specie, go on.
if(!list[specie] || list[specie]->GetEntriesFast() == 0) continue;
+ // Loop over the histograms and figure out how many histograms we
+ // have and the min/max
TH1* hist = 0;
Int_t nHist = list[specie]->GetEntriesFast();
for(Int_t i= 0; i< nHist; i++) {
// hist->GetBinContent(hist->GetMinimumBin());
max = TMath::Max(max, hMax);
min = TMath::Min(min, hMin);
- AliInfo(Form("Histogram %30s min=%f, max=%f (min=%f,max=%f)",
- name.Data(), hMin, hMax, min, max));
}
}
break ;
min = TMath::Max(0.1, min);
max = TMath::Max(1.0, max);
+ // IF no images, go on.
if (nImages == 0) {
AliDebug(AliQAv1::GetQADebugLevel(),
Form("No histogram will be plotted for %s %s\n", GetName(),
Form("%d histograms will be plotted for %s %s\n",
nImages, GetName(), AliQAv1::GetTaskName(task).Data()));
gStyle->SetOptStat(0);
+
+ // Again loop over species and draw a canvas
for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++) {
if (!AliQAv1::Instance(AliQAv1::GetDetIndex(GetName()))
->IsEventSpecieSet(specie)) continue;
-
- if(!list[specie] || list[specie]->GetEntries() <= 0) continue;
+ // if Nothing here, go on
+ if(!list[specie] || list[specie]->GetEntries() <= 0 ||
+ nImages <= 0) continue;
+
+ // Form the title
const Char_t * title = Form("QA_%s_%s_%s", GetName(),
AliQAv1::GetTaskName(task).Data(),
AliRecoParam::GetEventSpecieName(specie));
- if (!fImage[specie])
- fImage[specie] = new TCanvas(title, title) ;
+ if (!fImage[specie]) fImage[specie] = new TCanvas(title, title) ;
fImage[specie]->Clear() ;
fImage[specie]->SetTitle(title) ;
fImage[specie]->cd() ;
+ // Put something in the canvas - even if empty
TPaveText someText(0.015, 0.015, 0.98, 0.98) ;
someText.AddText(title) ;
+ someText.SetFillColor(0);
+ someText.SetFillStyle(0);
+ someText.SetBorderSize(0);
+ someText.SetTextColor(kRed+1);
someText.Draw() ;
TString outName(Form("%s%s%d.%s", AliQAv1::GetImageFileName(),
AliQAv1::GetModeName(mode),
AliQAChecker::Instance()->GetRunNumber(),
AliQAv1::GetImageFileFormat()));
fImage[specie]->Print(outName, "ps") ;
- fImage[specie]->Clear();
+
+ // Now set some parameters on the canvas
+ fImage[specie]->Clear();
+ fImage[specie]->SetTopMargin(0.10);
+ fImage[specie]->SetBottomMargin(0.15);
+ fImage[specie]->SetLeftMargin(0.15);
+ fImage[specie]->SetRightMargin(0.05);
+
+ // Put title on top
+ const char* topT = Form("Mode: %s, Task: %s, Specie: %s, Run: %d",
+ AliQAv1::GetModeName(mode),
+ AliQAv1::GetTaskName(task).Data(),
+ AliRecoParam::GetEventSpecieName(specie),
+ AliQAChecker::Instance()->GetRunNumber());
+ TLatex* topText = new TLatex(.5, .99, topT);
+ topText->SetTextAlign(23);
+ topText->SetTextSize(.038);
+ topText->SetTextFont(42);
+ topText->SetTextColor(kBlue+3);
+ topText->SetNDC();
+ topText->Draw();
+
+ // Divide canvas
Int_t nx = int(nImages + .5) / 2;
Int_t ny = 2;
fImage[specie]->Divide(nx, ny, 0, 0);
+ // Loop over histograms
TH1* hist = 0;
Int_t nHist = list[specie]->GetEntriesFast();
- // list[specie]->Print();
Int_t j = 0;
for (Int_t i = 0; i < nHist; i++) {
hist = static_cast<TH1*>(list[specie]->At(i));
if (!hist || !hist->TestBit(AliQAv1::GetImageBit())) continue;
-
+
+ // Go to sub-pad
TVirtualPad* pad = fImage[specie]->cd(++j);
- pad->SetRightMargin(0.001);
+ pad->SetRightMargin(0.01);
+
+ // Check for log scale
Int_t logOpts = 0;
logOpts |= CheckForLog(hist->GetXaxis(), pad, 1);
logOpts |= CheckForLog(hist->GetYaxis(), pad, 2);
logOpts |= CheckForLog(hist->GetZaxis(), pad, 3);
- if (hist->GetEntries() > 0)
- AliInfo(Form("Drawing %30s (min=%f, max=%f) in pad %d",
- hist->GetName(), min, max, j));
+ // Figure out special cases
TString opt;
TString name(hist->GetName());
if (name.Contains("readouterrors", TString::kIgnoreCase)) {
opt="COLZ";
}
else {
+ pad->SetGridx();
+ pad->SetGridy();
hist->SetMinimum(min);
hist->SetMaximum(max);
}
+ // Draw (As a copy)
hist->DrawCopy(opt);
- if (name.Contains("readouterrors", TString::kIgnoreCase))
- continue;
-
- TPad* insert = new TPad("insert", "Zoom",
- .4,.4, .99, .95, 0, 0, 0);
- insert->SetTopMargin(0);
- insert->SetRightMargin(0.001);
- insert->SetFillColor(0);
- insert->SetBorderSize(1);
- insert->SetBorderMode(0);
- insert->Draw();
- insert->cd();
- if (logOpts & 0x1) insert->SetLogx();
- if (logOpts & 0x2) insert->SetLogy();
- if (logOpts & 0x4) insert->SetLogz();
- hist->GetXaxis()->SetRangeUser(hist->GetXaxis()->GetXmin(),
- hist->GetXaxis()->GetXmax()/8);
- hist->DrawCopy(opt);
+ // Special cases
+ if (name.Contains("readouterrors", TString::kIgnoreCase)) {
+ for (Int_t kk = 1; kk <= 3; kk++) {
+ TH1* proj = static_cast<TH2*>(hist)->ProjectionY("",kk,kk);
+ Double_t m = proj->GetMean();
+ TLatex* l = new TLatex(kk, 30, Form("Mean: %f", m));
+ l->SetTextAngle(90);
+ l->SetTextColor(m > 10 ? kRed+1 : m > 1 ? kOrange+2 :kGreen+2);
+ l->Draw();
+ }
+ }
+ else {
+ gStyle->SetOptTitle(0);
+ TPad* insert = new TPad("insert", "Zoom",
+ .4,.4, .99, .95, 0, 0, 0);
+ insert->SetTopMargin(0.01);
+ insert->SetRightMargin(0.01);
+ insert->SetFillColor(0);
+ insert->SetBorderSize(1);
+ insert->SetBorderMode(0);
+ insert->Draw();
+ insert->cd();
+ if (logOpts & 0x1) insert->SetLogx();
+ if (logOpts & 0x2) insert->SetLogy();
+ if (logOpts & 0x4) insert->SetLogz();
+ hist->GetXaxis()->SetRangeUser(hist->GetXaxis()->GetXmin(),
+ hist->GetXaxis()->GetXmax()/8);
+ hist->DrawCopy(opt);
+ // Restore full range
+ hist->GetXaxis()->SetRangeUser(hist->GetXaxis()->GetXmin(),
+ hist->GetXaxis()->GetXmax());
+ gStyle->SetOptTitle(1);
+ }
pad->cd();
+ // Possibly restore the log options
+ RestoreLog(hist->GetXaxis(), logOpts & 0x1);
+ RestoreLog(hist->GetYaxis(), logOpts & 0x2);
+ RestoreLog(hist->GetZaxis(), logOpts & 0x4);
}
-
+ // Print to a post-script file
fImage[specie]->Print(outName, "ps");
}
}
*/
QATest()
: AliFMDInput("galice.root"),
- fMaker(0)
+ fMaker(0),
+ fArray(0)
{
for (Int_t i = 0; i < AliQAv1::kNTASKINDEX; i++)
fTasks[i] = AliQAv1::kNULLTASKINDEX;
+ Int_t nArray = AliQAv1::kNTASKINDEX * AliRecoParam::kNSpecies;
+ Info("QAtest", "Allocating %dx%d=%d TObjArrays",
+ AliQAv1::kNTASKINDEX, AliRecoParam::kNSpecies, nArray);
+ fArray = new TObjArray*[nArray];
+ for (Int_t i = 0; i < nArray; i++) fArray[i] = 0;
}
/**
* Set the location of the QA reference storage
{
AliQAv1::SetQARefStorage(refloc);
}
+ /**
+ * Calculate index of TObjArray* in fArray
+ *
+ * @param specie Event species
+ * @param task Task index
+ *
+ * @return Index.
+ */
+ Int_t CalcArrayIndex(AliQAv1::TASKINDEX_t task,
+ AliRecoParam::EventSpecie_t specie) const
+ {
+ Int_t es = AliRecoParam::AConvert(specie);
+ if (es >= AliRecoParam::kNSpecies) return -1;
+
+ Int_t base = CalcSpeciesIndex(task);
+ if (base < 0) return base;
+ return base + es;
+ }
+ /**
+ * Get index to species array
+ *
+ * @param task Task
+ *
+ * @return
+ */
+ Int_t CalcSpeciesIndex(AliQAv1::TASKINDEX_t task) const
+ {
+ if (task >= AliQAv1::kNTASKINDEX) return -1;
+ // Species are consequtive
+ return task * AliRecoParam::kNSpecies;
+ }
+
/**
* Initialise the code
*
LoadedString(true)));
return false;
}
-
- // --- Data maker --------------------------------------------------
+ // Int_t nTasks = j;
+
+ // --- Data maker ------------------------------------------------
Info("TestQA", "Creating data maker");
fMaker = new AliFMDQADataMakerRec();
- // --- Init all species histograms ---------------------------------
+ // --- Init all species histograms -------------------------------
Info("TestQA", "Setup data species");
AliQAv1* qa = AliQAv1::Instance();
for (unsigned int es = 0; es < AliRecoParam::kNSpecies; es++) {
qa->SetEventSpecie(specie);
for (Int_t i = 0; i < AliQAv1::kNTASKINDEX; i++) {
if (fTasks[i] == AliQAv1::kNULLTASKINDEX) continue;
- fMaker->Init(fTasks[i], specie);
+ Int_t k = CalcArrayIndex(fTasks[i], specie);
+ Info("Init", "Array for task %d (%s), specie %d (%s) @ %d/%d",
+ fTasks[i], AliQAv1::GetTaskName(fTasks[i]).Data(),
+ specie, AliRecoParam::GetEventSpecieName(specie), k,
+ AliQAv1::kNTASKINDEX * AliRecoParam::kNSpecies);
+ fArray[k] = fMaker->Init(fTasks[i], specie);
+ fArray[k]->ls();
}
}
fMaker->EndOfCycle(fTasks[i]);
}
- // --- Running checker -------------------------------------------
+ // --- Get the checker -------------------------------------------
Info("TestQA", "Running checker");
AliQACheckerBase * checker = AliQAChecker::Instance()->
GetDetQAChecker(AliQAv1::GetDetIndex("FMD"));
+
+ // --- Test: Remake plots ----------------------------------------
+ for (unsigned int idx = 0; idx < AliQAv1::kNTASKINDEX; idx++) {
+ // AliRecoParam::EventSpecie_t specie = AliRecoParam::ConvertIndex(es);
+ // if (!qa->IsEventSpecieSet(specie)) continue;
+ if (fTasks[idx] == AliQAv1::kNTASKINDEX) continue;
+ AliQAv1::TASKINDEX_t task = AliQAv1::TASKINDEX_t(idx); // AliQAv1::kRAWS;
+ AliQAv1::MODE_t mode = AliQAv1::kRECMODE;
+ Int_t k = CalcSpeciesIndex(task);
+ Info("Init", "Array for task %d (%s) @ %d: %p",
+ task, AliQAv1::GetTaskName(task).Data(), k, fArray[k]);
+ if (!fArray[k]) continue;
+ fArray[k]->ls();
+ checker->MakeImage(&(fArray[k]), task, mode);
+ }
+
+
// --- Get images from checker -----------------------------------
AliQAv1* qa = AliQAv1::Instance();
protected:
AliQADataMaker* fMaker; // Data maker
AliQAv1::TASKINDEX_t fTasks[AliQAv1::kNTASKINDEX]; // Tasks to do
+ TObjArray** fArray;
+
+ ClassDef(QATest, 0);
};
#else
{
gROOT->LoadMacro("$ALICE_ROOT/FMD/scripts/Compile.C");
gSystem->AddIncludePath("-DBUILD=1");
- Compile("$ALICE_ROOT/FMD/scripts/RunQATest.C", "+g");
+ Compile("$ALICE_ROOT.trunk/FMD/scripts/RunQATest.C", "+g");
+
+ AliCDBManager* cdb = AliCDBManager::Instance();
+ cdb->SetRun(runno);
- QATest* qaTest = new QATest();
+ QATest* qaTest = new QATest;
TString what(src);
Int_t colon = what.Index(":");
TString type = "";
if (what.Contains("AliESD")) type = "esd";
else if (what.Contains("galice")) type = "sim";
else if (what.Contains(".raw")) type = "raw";
+ else if (what.Contains(".root")) type = "raw";
}
Info("RunQATest", "type=%s, what=%s", type.Data(), what.Data());
type.ToLower();