31 fUseSecondaryMap(true),
32 fUseVertexBias(false),
33 fUseAcceptance(false),
34 fUseMergingEfficiency(false),
38 DGUARD(fDebug, 3,
"Default CTOR of AliFMDCorrector");
43 :
TNamed(
"fmdCorrector", title),
45 fUseSecondaryMap(true),
46 fUseVertexBias(false),
47 fUseAcceptance(false),
48 fUseMergingEfficiency(false),
55 DGUARD(
fDebug, 3,
"Named CTOR of AliFMDCorrector: %s", title);
63 fUseSecondaryMap(o.fUseSecondaryMap),
64 fUseVertexBias(o.fUseVertexBias),
65 fUseAcceptance(o.fUseAcceptance),
66 fUseMergingEfficiency(o.fUseMergingEfficiency),
98 if (&o ==
this)
return *
this;
126 AliWarning(
"Secondary maps not used - BE CAREFUL");
128 AliWarning(
"Vertex bias not used");
130 AliWarning(
"Acceptance from dead-channels not used");
148 case 1: idx = 0;
break;
149 case 2: idx = 1 + (r ==
'I' || r ==
'i' ? 0 : 1);
break;
150 case 3: idx = 3 + (r ==
'I' || r ==
'i' ? 0 : 1);
break;
152 if (idx < 0 || idx >=
fRingHistos.GetEntries())
return 0;
160 Bool_t alsoUnderOver)
const
167 if (!num || !denom)
return;
169 Int_t first = (alsoUnderOver ? 0 : 1);
170 Int_t lastX = num->GetNbinsX() + (alsoUnderOver ? 1 : 0);
171 Int_t lastY = num->GetNbinsY() + (alsoUnderOver ? 1 : 0);
173 for (
Int_t ix = first; ix <= lastX; ix++) {
174 for (
Int_t iy = first; iy <= lastY; iy++) {
175 Int_t bin = num->GetBin(ix,iy);
176 Double_t c0 = num->GetBinContent(bin);
177 Double_t c1 = denom->GetBinContent(bin);
179 num->SetBinContent(bin,0);
180 num->SetBinError(bin, 0);
184 Double_t e0 = num->GetBinError(bin);
185 Double_t e1 = denom->GetBinError(bin);
187 Double_t e2 = (e0*e0*c1*c1 + e1*e1*c0*c0)/(c12*c12);
189 num->SetBinContent(bin, w);
190 num->SetBinError(bin, TMath::Sqrt(e2));
208 DGUARD(
fDebug, 1,
"Correct histograms of AliFMDCorrector");
215 Char_t r = (q == 0 ?
'I' :
'O');
222 AliWarning(Form(
"No secondary correction for FMDM%d%c "
223 "in vertex bin %d", d, r, uvb));
232 AliWarning(Form(
"No event %s vertex bias correction in vertex bin %d",
233 (r ==
'I' || r ==
'i' ?
"inner" :
"outer"), uvb));
242 AliWarning(Form(
"No acceptance correction for FMD%d%c in "
243 "vertex bin %d", d, r, uvb));
247 for (
Int_t i = 1; i <= h->GetNbinsX(); i++)
248 h->SetBinContent(i, h->GetNbinsY()+1, 1);
256 AliWarning(
"No merging efficiencies");
261 AliWarning(Form(
"No merging efficiency for FMD%d%c at vertex bin %d",
267 for (
Int_t ieta = 1; ieta <= h->GetNbinsX(); ieta++) {
268 Float_t c = sf->GetBinContent(ieta);
269 Float_t ec = sf->GetBinError(ieta);
271 for (
Int_t iphi = 1; iphi <= h->GetNbinsY(); iphi++) {
273 h->SetBinContent(ieta,iphi,0);
274 h->SetBinError(ieta,iphi,0);
278 Double_t m = h->GetBinContent(ieta, iphi) /
c;
279 Double_t em = h->GetBinError(ieta, iphi);
281 Double_t e = TMath::Sqrt(em * em + (m * ec) * (m * ec));
283 h->SetBinContent(ieta,iphi,m);
284 h->SetBinError(ieta,iphi,e);
306 DGUARD(
fDebug, 1,
"Scale histograms of AliFMDCorrector");
307 if (nEvents <= 0)
return;
308 TList* d =
static_cast<TList*
>(dir->FindObject(GetName()));
312 out->SetName(d->GetName());
322 THStack* sums =
new THStack(
"sums",
"Sums of ring results");
323 while ((o = static_cast<RingHistos*>(next()))) {
326 Warning(
"Terminate",
"No density from %s", o->
GetName());
331 sum->Scale(1.,
"width");
333 sum->SetDirectory(0);
334 sum->SetYTitle(
"#sum N_{ch,primary}");
353 d->SetName(GetName());
369 while ((o = static_cast<RingHistos*>(next()))) {
374 #define PF(N,V,...) \
375 AliForwardUtil::PrintField(N,V, ## __VA_ARGS__)
376 #define PFB(N,FLAG) \
378 AliForwardUtil::PrintName(N); \
379 std::cout << std::boolalpha << (FLAG) << std::noboolalpha << std::endl; \
381 #define PFV(N,VALUE) \
383 AliForwardUtil::PrintName(N); \
384 std::cout << (VALUE) << std::endl; } while(false)
396 gROOT->IncreaseDirLevel();
401 gROOT->DecreaseDirLevel();
426 "#sum N_{ch,primary}/(#Delta#eta#Delta#phi)",
427 200, -4, 6, (r ==
'I' || r ==
'i' ? 20 : 40),
433 fDensity->SetYTitle(
"#phi [radians]");
434 fDensity->SetZTitle(
"Primary N_{ch} density");
460 if (&o ==
this)
return *
this;
463 if (fDensity)
delete fDensity;
487 TList* d = DefineOutputList(dir);
501 TList* l = GetOutputList(dir);
504 TH2D* density =
static_cast<TH2D*
>(GetOutputHist(l,
"primaryDensity"));
505 if (density) density->Scale(1./nEvents);
TH2D * GetCorrection(UShort_t d, Char_t r, Double_t v) const
RingHistos & operator=(const RingHistos &o)
TH2D * GetCorrection(Char_t r, Double_t v) const
RingHistos * GetRingHistos(UShort_t d, Char_t r) const
virtual ~AliFMDCorrector()
TH2D * GetCorrection(UShort_t d, Char_t r, Double_t v) const
virtual void CreateOutputObjects(TList *dir)
virtual void Print(Option_t *option="") const
const char * GetName() const
virtual void Terminate(const TList *dir, TList *output, Int_t nEvents)
void Terminate(TList *dir, Int_t nEvents)
virtual Bool_t Correct(AliForwardUtil::Histos &hists, UShort_t vtxBin)
void CreateOutputObjects(TList *dir)
TH1D * GetCorrection(UShort_t d, Char_t r, Double_t v) const
Bool_t HasOverflow() const
const AliFMDCorrMergingEfficiency * GetMergingEfficiency() const
AliFMDCorrector & operator=(const AliFMDCorrector &)
#define DGUARD(L, N, F,...)
static void PrintTask(const TObject &o)
TH2D * Get(UShort_t d, Char_t r) const
static TObject * MakeParameter(const char *name, UShort_t value)
ClassImp(AliFMDCorrector) AliFMDCorrector
RingHistos & operator=(const RingHistos &o)
Float_t nEvents[nProd]
Input train file.
void DivideMap(TH2 *num, const TH2 *denom, Bool_t alsoUnderOver=false) const
const AliFMDCorrAcceptance * GetAcceptance() const
const AliFMDCorrVertexBias * GetVertexBias() const
virtual void SetupForData(const TAxis &etaAxis)
const AliFMDCorrSecondaryMap * GetSecondaryMap() const
Bool_t fUseMergingEfficiency
static AliForwardCorrectionManager & Instance()