7 # include <AliCDBManager.h>
8 # include <AliQADataMaker.h>
9 # include "AliFMDQADataMakerRec.h"
10 # include "AliFMDQADataMakerSim.h"
12 # include <TObjArray.h>
13 # include <AliRecoParam.h>
14 # include <AliRawReader.h>
15 # include <AliQACheckerBase.h>
16 # include <AliFMDQAChecker.h>
17 # include <AliQAChecker.h>
20 # include <AliFMDInput.h>
24 * Class to test the QA code
28 class QATest : public AliFMDInput
35 : AliFMDInput("galice.root"),
39 for (Int_t i = 0; i < AliQAv1::kNTASKINDEX; i++)
40 fTasks[i] = AliQAv1::kNULLTASKINDEX;
41 Int_t nArray = AliQAv1::kNTASKINDEX * AliRecoParam::kNSpecies;
42 Info("QAtest", "Allocating %dx%d=%d TObjArrays",
43 AliQAv1::kNTASKINDEX, AliRecoParam::kNSpecies, nArray);
44 fArray = new TObjArray*[nArray];
45 for (Int_t i = 0; i < nArray; i++) fArray[i] = 0;
48 * Set the location of the QA reference storage
50 * @param refloc Location of QA storage (e.g., local://${ALICE_ROOT}/QAref)
52 void SetQARefStorage(const char* refloc)
54 AliQAv1::SetQARefStorage(refloc);
57 * Calculate index of TObjArray* in fArray
59 * @param specie Event species
60 * @param task Task index
64 Int_t CalcArrayIndex(AliQAv1::TASKINDEX_t task,
65 AliRecoParam::EventSpecie_t specie) const
67 Int_t es = AliRecoParam::AConvert(specie);
68 if (es >= AliRecoParam::kNSpecies) return -1;
70 Int_t base = CalcSpeciesIndex(task);
71 if (base < 0) return base;
75 * Get index to species array
81 Int_t CalcSpeciesIndex(AliQAv1::TASKINDEX_t task) const
83 if (task >= AliQAv1::kNTASKINDEX) return -1;
84 // Species are consequtive
85 return task * AliRecoParam::kNSpecies;
92 * @return true on success, false otherwise
96 // --- Create the maker ------------------------------------------
97 if (IsLoaded(kHits) ||
99 IsLoaded(kKinematics) ||
100 IsLoaded(kSDigits)) {
102 fMaker = new AliFMDQADataMakerSim();
105 fMaker = new AliFMDQADataMakerRec();
107 // --- Figure out tasks ------------------------------------------
109 if (IsLoaded(kHits)) fTasks[j++] = AliQAv1::kHITS;
110 if (IsLoaded(kDigits)) fTasks[j++] = AliQAv1::kDIGITS;
111 if (IsLoaded(kSDigits)) fTasks[j++] = AliQAv1::kSDIGITS;
112 if (IsLoaded(kRecPoints)) fTasks[j++] = AliQAv1::kRECPOINTS;
113 if (IsLoaded(kESD)) fTasks[j++] = AliQAv1::kESDS;
114 if (IsLoaded(kRaw)) fTasks[j++] = AliQAv1::kRAWS;
116 AliError(Form("Loaded trees (%s) cannot be processed by QA",
117 LoadedString(true)));
122 // --- Data maker ------------------------------------------------
123 Info("TestQA", "Creating data maker");
124 fMaker = new AliFMDQADataMakerRec();
126 // --- Init all species histograms -------------------------------
127 Info("TestQA", "Setup data species");
128 AliQAv1* qa = AliQAv1::Instance();
129 for (unsigned int es = 0; es < AliRecoParam::kNSpecies; es++) {
130 AliRecoParam::EventSpecie_t specie = AliRecoParam::ConvertIndex(es);
131 fMaker->SetEventSpecie(specie);
132 qa->SetEventSpecie(specie);
133 for (Int_t i = 0; i < AliQAv1::kNTASKINDEX; i++) {
134 if (fTasks[i] == AliQAv1::kNULLTASKINDEX) continue;
135 Int_t k = CalcArrayIndex(fTasks[i], specie);
136 Info("Init", "Array for task %d (%s), specie %d (%s) @ %d/%d",
137 fTasks[i], AliQAv1::GetTaskName(fTasks[i]).Data(),
138 specie, AliRecoParam::GetEventSpecieName(specie), k,
139 AliQAv1::kNTASKINDEX * AliRecoParam::kNSpecies);
140 fArray[k] = fMaker->Init(fTasks[i], specie);
145 // --- Start of cycle --------------------------------------------
146 Int_t run = AliCDBManager::Instance()->GetRun();
148 for (Int_t i = 0; i < AliQAv1::kNTASKINDEX; i++) {
149 if (fTasks[i] == AliQAv1::kNULLTASKINDEX) continue;
150 fMaker->StartOfCycle(fTasks[i], run, same);
155 return AliFMDInput::Init();
160 * @return true on success
162 virtual Bool_t ProcessHits()
164 fMaker->SetEventSpecie(AliRecoParam::kLowMult);
165 fMaker->MakeHits(fTreeH);
171 * @return true on success
173 virtual Bool_t ProcessDigits()
175 fMaker->SetEventSpecie(AliRecoParam::kLowMult);
176 fMaker->MakeDigits(fTreeD);
180 * Process the summable digits
182 * @return true on success
184 virtual Bool_t ProcessSDigits()
186 fMaker->SetEventSpecie(AliRecoParam::kLowMult);
187 fMaker->MakeSDigits(fTreeS);
191 * Process the reconstructed points
193 * @return true on success
195 virtual Bool_t ProcessRecPoints()
197 fMaker->SetEventSpecie(AliRecoParam::kLowMult);
198 fMaker->MakeRecPoints(fTreeR);
202 * Process the event summary data
204 * @return true on success
206 virtual Bool_t ProcesssESDs()
208 fMaker->SetEventSpecie(AliRecoParam::kLowMult);
209 fMaker->MakeESDs(fESDEvent);
213 * Process the raw data
215 * @return true on success
217 virtual Bool_t ProcessRawDigits()
219 fMaker->SetEventSpecie(AliRecoParam::kLowMult);
220 fMaker->MakeRaws(fReader);
224 * Called at the end of the job. Runs the checkers
226 * @return true on success
228 virtual Bool_t Finish()
230 // --- End of cycle - this calls the checker ---------------------
231 Info("TestQA", "End of cycle");
232 for (Int_t i = 0; i < AliQAv1::kNTASKINDEX; i++) {
233 if (fTasks[i] == AliQAv1::kNULLTASKINDEX) continue;
234 fMaker->EndOfCycle(fTasks[i]);
237 // --- Get the checker -------------------------------------------
238 Info("TestQA", "Running checker");
239 AliQACheckerBase * checker = AliQAChecker::Instance()->
240 GetDetQAChecker(AliQAv1::GetDetIndex("FMD"));
242 // --- Test: Remake plots ----------------------------------------
243 for (unsigned int idx = 0; idx < AliQAv1::kNTASKINDEX; idx++) {
244 // AliRecoParam::EventSpecie_t specie = AliRecoParam::ConvertIndex(es);
245 // if (!qa->IsEventSpecieSet(specie)) continue;
246 if (fTasks[idx] == AliQAv1::kNTASKINDEX) continue;
247 AliQAv1::TASKINDEX_t task = AliQAv1::TASKINDEX_t(idx); // AliQAv1::kRAWS;
248 AliQAv1::MODE_t mode = AliQAv1::kRECMODE;
249 Int_t k = CalcSpeciesIndex(task);
250 Info("Init", "Array for task %d (%s) @ %d: %p",
251 task, AliQAv1::GetTaskName(task).Data(), k, fArray[k]);
252 if (!fArray[k]) continue;
254 checker->MakeImage(&(fArray[k]), task, mode);
259 // --- Get images from checker -----------------------------------
260 AliQAv1* qa = AliQAv1::Instance();
261 TObjArray* canvases = new TObjArray();
262 for (unsigned int es = 0; es < AliRecoParam::kNSpecies; es++) {
263 AliRecoParam::EventSpecie_t specie = AliRecoParam::ConvertIndex(es);
264 if (!qa->IsEventSpecieSet(specie)) continue;
266 TCanvas* c = checker->GetImage(specie);
272 // --- Create summary image --------------------------------------
273 TCanvas* out = new TCanvas("summary", "Summary", 1024, 1024);
274 out->SetFillColor(kWhite);
275 out->SetBorderSize(0);
276 out->SetBorderMode(0);
278 Int_t nImgs = canvases->GetEntriesFast();
279 Int_t nX = Int_t(TMath::Sqrt(nImgs) + .5);
282 for (Int_t i = 0; i < nImgs; i++) {
283 TVirtualPad* p = out->cd(i + 1);
284 p->SetRightMargin(0.001);
285 p->SetTopMargin(0.001);
287 Warning("TestQA", "No pad at index %d / %d", i+1, nImgs);
291 TCanvas* c = static_cast<TCanvas*>(canvases->At(i));
294 out->Print("summary.png");
299 AliQADataMaker* fMaker; // Data maker
300 AliQAv1::TASKINDEX_t fTasks[AliQAv1::kNTASKINDEX]; // Tasks to do
308 RunQATest(const char* src, Int_t runno=0)
310 gROOT->LoadMacro("$ALICE_ROOT/FMD/scripts/Compile.C");
311 gSystem->AddIncludePath("-DBUILD=1");
312 Compile("$ALICE_ROOT.trunk/FMD/scripts/RunQATest.C", "+g");
314 AliCDBManager* cdb = AliCDBManager::Instance();
317 QATest* qaTest = new QATest;
319 Int_t colon = what.Index(":");
321 if (colon != TString::kNPOS) {
322 type = what(0, colon);
323 what = what(colon+1, what.Length()-colon-1);
326 if (what.Contains("AliESD")) type = "esd";
327 else if (what.Contains("galice")) type = "sim";
328 else if (what.Contains(".raw")) type = "raw";
329 else if (what.Contains(".root")) type = "raw";
331 Info("RunQATest", "type=%s, what=%s", type.Data(), what.Data());
334 if (type.CompareTo("esd") == 0) {
335 qaTest->AddLoad(AliFMDInput::kESD);
336 qaTest->SetInputDir(what);
338 else if (type.CompareTo("raw") == 0) {
339 qaTest->AddLoad(AliFMDInput::kRaw);
340 qaTest->SetRawFile(what);
342 else if (type.CompareTo("sim") == 0) {
343 qaTest->AddLoad(AliFMDInput::kHits);
344 qaTest->AddLoad(AliFMDInput::kSDigits);
345 qaTest->AddLoad(AliFMDInput::kDigits);
347 else if (type.CompareTo("rec") == 0) {
348 qaTest->AddLoad(AliFMDInput::kDigits);
349 qaTest->AddLoad(AliFMDInput::kRecPoints);
350 qaTest->AddLoad(AliFMDInput::kESD);
353 Error("RunQATest", "Unknown type='%s' in '%s'", type.Data(), src);