3 # include <TDirectory.h> 4 # include <TCollection.h> 5 # include <TParameter.h> 10 # include <TClonesArray.h> 26 TClass* cls,
Bool_t verbose=
true)
28 if (!cls)
return true;
29 if (!o->IsA()->InheritsFrom(cls)) {
31 Warning(
"CheckClass",
"Object \"%s\" from \"%s\" is not a %s but a %s",
32 o->GetName(), dir->GetName(), cls->GetName(), o->ClassName());
44 if (verbose) Warning(
"GetObject",
"No directory passed");
49 if (verbose) Warning(
"GetObject",
"Object \"%s\" not found in \"%s\"",
50 name, dir->GetName());
54 if (!
CheckClass(o, dir, cls, verbose))
return 0;
64 if (verbose) Warning(
"GetObject",
"No collection passed");
67 TObject* o = dir->FindObject(name);
70 Warning(
"GetObject",
"Object \"%s\" not found in \"%s\"",
71 name, dir->GetName());
75 if (!
CheckClass(o, dir, cls,verbose))
return 0;
95 return static_cast<TH1*
>(
GetObject(dir, name, TH1::Class(),verbose));
100 return static_cast<TH1*
>(
GetObject(dir, name, TH1::Class(),verbose));
105 return static_cast<TAxis*
>(
GetObject(dir, name, TAxis::Class(),verbose));
110 return static_cast<TAxis*
>(
GetObject(dir, name, TAxis::Class(),verbose));
134 Long_t def=0,
Bool_t verbose=
true)
145 Long_t def=0,
Bool_t verbose=
true)
202 Warning(
"Trending2ELoss", msg);
203 TFile* stamp = TFile::Open(
"bad.root",
"RECREATE");
217 if (!gROOT->GetClass(
"AliFMDCorrELossFit")) {
218 const char*
fwd =
"$ALICE_PHYSICS/PWGLF/FORWARD/analysis2";
219 gROOT->Macro(Form(
"%s/scripts/LoadLibs.C", fwd));
222 if (fname.BeginsWith(
"alien:")) {
223 TGrid::Connect(
"alien:");
224 if (!gGrid)
return Fail(Form(
"Failed to connect to grid"));
227 TFile*
file = TFile::Open(fname,
"READ");
228 if (!file)
return Fail(Form(
"Failed to open \"%s\"",
fileName));
231 if (!top)
return false;
234 if (!ins)
return false;
242 TH1* acc =
GetH1(ins,
"nEventsAccepted");
244 if (run <= 0 || sys <= 0 || sNN <= 0 || fld > 100)
245 return Fail(Form(
"Unknown run (%d) system (%d), energy (%d), or field (%d)",
248 Long_t minEvents = 10000;
249 if (sys == 1) minEvents = 1000000;
250 else if (sys == 3) minEvents = 100000;
251 else if (sys == 4) minEvents = 100000;
252 if (!acc || acc->GetEntries() < minEvents)
253 return Fail(Form(
"%09d: Too (%ld) few (<%ld) events for sys=%d",
254 run, acc ? Long_t(acc->GetEntries()) : 0, minEvents, sys));
257 if (!enf)
return false;
267 if (nps <= 0)
return Fail(Form(
"%09d: Too (%d) few peaks fitted", run, nps));
268 if (low <= 0)
return Fail(Form(
"%09d: Lower bound (%f) too low", run, low));
269 if (mxc <= 0 || mre <= 0 || lwt <= 0)
270 return Fail(Form(
"%09d: Max chi^2/nu (%f), max dp/p (%f), " 271 "least weight (%f) invalid",
272 run, mxc, mre, lwt));
273 if (!het)
return Fail(
"No eta axis defined");
282 TClonesArray tmp(
"AliFMDCorrELossFit::ELossFit");
284 TH1* hRate =
new TH1D(
"rate",
"Success rate", 5, .5, 5.5);
285 TH1* hTotal =
new TH1I(
"total",
"Total fits", 5, .5, 5.5);
286 TH1* hMax =
new TH1I(
"max",
"Max gap", 5, .5, 5.5);
287 hRate ->SetFillColor(kRed+2); hRate ->SetFillStyle(3001);
288 hTotal->SetFillColor(kGreen+2); hTotal->SetFillStyle(3001);
289 hMax ->SetFillColor(kBlue+2); hMax ->SetFillStyle(3001);
290 hRate ->SetDirectory(0);
291 hTotal->SetDirectory(0);
292 hMax ->SetDirectory(0);
293 hRate ->GetListOfFunctions()->Add(
new TLine(.5,100*minRate,5.5,100*minRate));
294 hMax ->GetListOfFunctions()->Add(
new TLine(.5,maxGap,5.5,maxGap));
295 hTotal->GetListOfFunctions()->Add(
new TLine(.5,15,5.5,15));
296 hTotal->GetListOfFunctions()->Add(
new TLine(.5,25,5.5,25));
302 Char_t r = q == 0 ?
'I' :
'O';
303 TString nam = Form(
"FMD%d%c", d, r);
314 for (
Int_t bin = 1; bin <= eta.GetNbins(); bin++) {
315 TH1* dst =
GetH1(eld, Form(
"%s_etabin%03d", nam.Data(), bin),
false);
320 TList* fcs = dst->GetListOfFunctions();
325 while ((fun = static_cast<TF1*>(nxt()))) {
336 Warning(
"Trending2ELoss",
"No fit found for %s %3d",
343 max = TMath::Max(dist,max);
351 Info(
"Trending2ELoss",
"FMD%d%c [%d] %3d/%3d: %5.1f%% (max: %d)",
352 d, r, ir, nOK, nTotal, 100*rate, max);
353 if (rate < minRate) bad |= (1 << ir);
354 if (max > maxGap) bad |= (1 << ir);
355 if (r ==
'I' && nTotal < 25) bad |= (1 << ir);
356 else if (nTotal < 15) bad |= (1 << ir);
359 hRate ->GetXaxis()->SetBinLabel(ir, Form(
"FMD%d%c",d,r));
360 hTotal->GetXaxis()->SetBinLabel(ir, Form(
"FMD%d%c",d,r));
361 hMax ->GetXaxis()->SetBinLabel(ir, Form(
"FMD%d%c",d,r));
362 hRate ->SetBinContent(ir, 100*rate);
363 hTotal->SetBinContent(ir, nTotal);
364 hMax ->SetBinContent(ir, max);
369 TFile* diag = TFile::Open(
"diagnostics.root",
"RECREATE");
370 hRate ->SetMaximum(100); hRate ->SetMinimum(0); hRate ->Write();
371 hTotal->SetMaximum(35); hTotal->SetMinimum(0); hTotal->Write();
372 hMax ->SetMaximum(10); hTotal->SetMinimum(0); hMax ->Write();
376 if (testBad != (bad>0)) {
377 Warning(
"Trending2ELoss",
"Mismatch between this (%s) and test (%s)",
378 (bad>0) ?
"bad" :
"good", testBad ?
"bad" :
"good");
381 return Fail(Form(
"%09d: One or more detectors are bad: 0x%x", run, bad));
384 if (!man.
Store(corr,run,sys,sNN,fld,mc,sat,
"fmd_corrections.root"))
385 return Fail(Form(
"%09d: Failed to store correction", run));
void SetLowCut(Double_t cut)
Bool_t SetFit(UShort_t d, Char_t r, Double_t eta, Int_t quality, const TF1 &f)
TH1 * GetH1(TDirectory *dir, const char *name, Bool_t verbose=true)
TCollection * GetCollection(TDirectory *dir, const char *name, Bool_t verbose=true)
const TAxis & GetEtaAxis() const
Bool_t Trending2ELoss(const char *fileName="trending.root", Double_t minRate=.7, Int_t maxGap=3)
void CalculateQuality(Double_t maxChi2nu=fgMaxChi2nu, Double_t maxRelError=fgMaxRelError, Double_t leastWeight=fgLeastWeight)
TAxis * GetAxis(TDirectory *dir, const char *name, Bool_t verbose=true)
Bool_t GetBool(TDirectory *dir, const char *name, Bool_t def=false, Bool_t verbose=true)
Long_t GetLong(TDirectory *dir, const char *name, Long_t def=0, Bool_t verbose=true)
Bool_t IsGood(Bool_t verbose=true, Double_t minRate=.7, Int_t maxGap=3, Int_t minInner=25, Int_t minOuter=15, Int_t minQuality=kDefaultQuality)
virtual Bool_t Store(TObject *o, ULong_t runNo, UShort_t sys, UShort_t sNN, Short_t field, Bool_t mc, Bool_t sat, const char *file, const char *meth="NEAR") const
TObject * GetObject(TDirectory *dir, const char *name, TClass *cls, Bool_t verbose=true)
Int_t GetInt(TDirectory *dir, const char *name, Int_t def=0, Bool_t verbose=true)
Double_t GetDouble(TDirectory *dir, const char *name, Double_t def=0, Bool_t verbose=true)
void SetEtaAxis(const TAxis &axis)
Bool_t Fail(const char *msg)
TFile * file
TList with histograms for a given trigger.
Bool_t CheckClass(TObject *o, const TObject *dir, TClass *cls, Bool_t verbose=true)
static AliForwardCorrectionManager & Instance()