19 #include <TStopwatch.h>
20 #include <TParameter.h>
42 fUsePhiAcceptance(kPhiCorrectNch),
56 fRecalculatePhi(false),
67 DGUARD(fDebug, 3,
"Default CTOR of FMD density calculator");
72 :
TNamed(fgkFolderName, title),
79 fUsePhiAcceptance(kPhiCorrectNch),
93 fRecalculatePhi(false),
107 DGUARD(
fDebug, 3,
"Named CTOR of FMD density calculator: %s", title);
114 fWeightedSum =
new TH1D(
"weightedSum",
"Weighted sum of Landau propability",
117 fWeightedSum->SetXTitle(
"#sum_{i} i a_{i} f_{i}(#Delta)");
131 fLowCuts =
new TH2D(
"lowCuts",
"Low cuts used", 1, 0, 1, 1, 0, 1);
142 fSumOfWeights(o.fSumOfWeights),
143 fWeightedSum(o.fWeightedSum),
144 fCorrections(o.fCorrections),
145 fMaxParticles(o.fMaxParticles),
146 fUsePoisson(o.fUsePoisson),
147 fUsePhiAcceptance(o.fUsePhiAcceptance),
150 fFMD1iMax(o.fFMD1iMax),
151 fFMD2iMax(o.fFMD2iMax),
152 fFMD2oMax(o.fFMD2oMax),
153 fFMD3iMax(o.fFMD3iMax),
154 fFMD3oMax(o.fFMD3oMax),
155 fMaxWeights(o.fMaxWeights),
156 fLowCuts(o.fLowCuts),
157 fEtaLumping(o.fEtaLumping),
158 fPhiLumping(o.fPhiLumping),
161 fRecalculatePhi(o.fRecalculatePhi),
162 fMinQuality(o.fMinQuality),
164 fDoTiming(o.fDoTiming),
165 fHTiming(o.fHTiming),
166 fMaxOutliers(o.fMaxOutliers),
167 fOutlierCut(o.fOutlierCut)
175 DGUARD(
fDebug, 3,
"Copy CTOR of FMD density calculator");
204 DGUARD(
fDebug, 3,
"Assignment of FMD density calculator");
205 if (&o ==
this)
return *
this;
206 TNamed::operator=(o);
255 while ((o = static_cast<RingHistos*>(next()))) {
278 case 1: idx = 0;
break;
279 case 2: idx = 1 + (r ==
'I' || r ==
'i' ? 0 : 1);
break;
280 case 3: idx = 3 + (r ==
'I' || r ==
'i' ? 0 : 1);
break;
283 AliWarning(Form(
"Index %d of FMD%d%c out of range", idx, d, r));
294 if (xbin < 1 && xbin > h->GetXaxis()->GetNbins())
return ret;
297 case 1: ybin = 1;
break;
298 case 2: ybin = (r==
'i' || r==
'I') ? 2 : 3;
break;
299 case 3: ybin = (r==
'i' || r==
'I') ? 4 : 5;
break;
302 ret = h->GetBinContent(xbin,ybin);
320 return Rng2Cut(d, r, ieta,
fLowCuts);
338 return Rng2Cut(d, r, ieta,
fLowCuts);
343 # define START_TIMER(T) if (fDoTiming) T.Start(true)
344 # define GET_TIMER(T,V) if (fDoTiming) V = T.CpuTime()
345 # define ADD_TIMER(T,V) if (fDoTiming) V += T.CpuTime()
347 # define START_TIMER(T) do {} while (false)
348 # define GET_TIMER(T,V) do {} while (false)
349 # define ADD_TIMER(T,V) do {} while (false)
371 DGUARD(
fDebug, 1,
"Calculate density in FMD density calculator");
405 Char_t r = (q == 0 ?
'I' :
'O');
411 AliError(Form(
"No ring histogram found for FMD%d%c", d, r));
424 memset(etaCache, 0,
sizeof(
Double_t)*20*512);
425 memset(phiCache, 0,
sizeof(
Double_t)*20*512);
433 Float_t mult = fmd.Multiplicity(d,r,s,t);
434 Double_t phi = fmd.Phi(d,r,s,t) * TMath::DegToRad();
443 TMath::Abs(eta) < 1) {
444 AliWarningF(
"FMD%d%c[%2d,%3d] (%f,%f,%f) eta=%f phi=%f (%f)",
445 d, r, s, t, ip.X(), ip.Y(), ip.Z(), eta,
450 DMSG(
fDebug, 10,
"IP(x,y,z)=%f,%f,%f Eta=%f -> %f Phi=%f -> %f",
451 ip.X(), ip.Y(), ip.Z(), oldEta, eta, oldPhi, phi);
455 etaCache[s*nt+t] = eta;
456 phiCache[s*nt+t] = phi;
460 if (mult == AliESDFMD::kInvalidMult) {
468 AliWarningF(
"Raw multiplicity of FMD%d%c[%02d,%03d] = %f > 20",
471 rh->
fGood->Fill(eta);
488 if (eta != AliESDFMD::kInvalidEta) cut =
GetMultCut(d, r, eta,
false);
489 else AliWarningF(
"Eta for FMD%d%c[%02d,%03d] is invalid: %f",
495 if (cut > 0 && mult > cut) n =
NParticles(mult,d,r,eta,lowFlux);
513 rh->
fCorr->Fill(eta, c);
516 Bool_t hit = (n > 0.9 && c > 0);
545 for (
Int_t i = 0; i <= h->GetNbinsX()+1; i++) {
546 for (
Int_t j = 0; j <= h->GetNbinsY()+1; j++) {
547 hclone->SetBinContent(i,j,h->GetBinContent(i,j));
548 hclone->SetBinError(i,j,h->GetBinError(i,j));
559 for (
Int_t t=0; t < poisson->GetNbinsX(); t++) {
560 for (
Int_t s=0; s < poisson->GetNbinsY(); s++) {
562 Double_t poissonV = poisson->GetBinContent(t+1,s+1);
570 h->Fill(eta,phi,poissonV);
571 rh->
fDensity->Fill(eta, phi, poissonV);
574 hclone->Fill(eta,phi,poissonV);
581 Int_t nY = h->GetNbinsY();
584 for (
Int_t ieta=1; ieta <= h->GetNbinsX(); ieta++) {
588 h->SetBinContent(ieta, nY+1, phiAcc);
589 h->SetBinError(ieta, nY+1, phiAccE);
590 Double_t eta = h->GetXaxis()->GetBinCenter(ieta);
591 rh->
fPhiAcc->Fill(eta, ip.Z(), phiAcc);
592 for (
Int_t iphi=1; iphi<= nY; iphi++) {
597 poissonV = h->GetBinContent(ieta,iphi);
598 eLossV = hclone->GetBinContent(ieta,iphi);
601 poissonV = hclone->GetBinContent(ieta,iphi);
602 eLossV = h->GetBinContent(ieta,iphi);
605 if (poissonV < 1e-12 && eLossV < 1e-12)
610 Double_t rel = eLossV < 1e-12 ? 0 : (poissonV - eLossV) / eLossV;
623 Int_t nTotal = (nIn+nOut);
654 if (eloss < 1e-6)
return true;
655 Double_t diff = TMath::Abs(poisson - eloss) / eloss;
672 DGUARD(
fDebug, 10,
"Find maximum weight in FMD density calculator");
698 DGUARD(
fDebug, 10,
"Find maximum weight in FMD density calculator");
718 DGUARD(
fDebug, 2,
"Cache maximum weights in FMD density calculator");
724 TAxis eta(axis.GetNbins(),
732 Int_t nEta = eta.GetNbins();
739 fMaxWeights->SetBins(nEta, eta.GetXmin(), eta.GetXmax(), 5, .5, 5.5);
746 AliInfo(Form(
"Get eta axis with %d bins from %f to %f",
747 nEta, eta.GetXmin(), eta.GetXmax()));
748 fLowCuts->SetBins(nEta, eta.GetXmin(), eta.GetXmax(), 5, .5, 5.5);
749 fLowCuts->GetYaxis()->SetBinLabel(1,
"FMD1i");
750 fLowCuts->GetYaxis()->SetBinLabel(2,
"FMD2i");
751 fLowCuts->GetYaxis()->SetBinLabel(3,
"FMD2o");
752 fLowCuts->GetYaxis()->SetBinLabel(4,
"FMD3i");
753 fLowCuts->GetYaxis()->SetBinLabel(5,
"FMD3o");
755 for (
Int_t i = 0; i < nEta; i++) {
763 for (
Int_t j = 0; j < 5; j++)
764 if (w[j] > 0)
fMaxWeights->SetBinContent(i+1, j+1, w[j]);
787 if (iEta < 0)
return -1;
796 AliWarning(Form(
"No array for FMD%d%c", d, r));
800 if (iEta >= max->fN) {
801 AliWarning(Form(
"Eta bin %3d out of bounds [0,%d]",
806 AliDebug(30,Form(
"Max weight for FMD%d%c eta bin %3d: %d", d, r, iEta,
808 return max->At(iEta);
858 DGUARD(
fDebug, 3,
"Calculate Nch in FMD density calculator");
859 if (lowFlux)
return 1;
864 AliWarning(Form(
"No energy loss fit for FMD%d%c at eta=%f qual=%d",
871 AliWarning(Form(
"No good fits for FMD%d%c at eta=%f", d, r, eta));
879 AliInfo(Form(
"FMD%d%c, eta=%7.4f, %8.5f -> %8.5f", d, r, eta, mult, ret));
915 DGUARD(
fDebug, 10,
"Apply correction in FMD density calculator");
927 Double_t dblC = dblHitCor->GetBinContent(dblHitCor->FindBin(eta));
928 if (dblC > 0) correction *= dblC;
950 DGUARD(
fDebug, 3,
"Make acceptance correction in FMD density calculator");
951 const Double_t ic1[] = { 4.9895, 15.3560 };
952 const Double_t ic2[] = { 1.8007, 17.2000 };
953 const Double_t oc1[] = { 4.2231, 26.6638 };
954 const Double_t oc2[] = { 1.8357, 27.9500 };
955 const Double_t* c1 = (r ==
'I' || r ==
'i' ? ic1 : oc1);
956 const Double_t* c2 = (r ==
'I' || r ==
'i' ? ic2 : oc2);
957 Double_t minR = (r ==
'I' || r ==
'i' ? 4.5213 : 15.4);
958 Double_t maxR = (r ==
'I' || r ==
'i' ? 17.2 : 28.0);
959 Int_t nStrips = (r ==
'I' || r ==
'i' ? 512 : 256);
960 Int_t nSec = (r ==
'I' || r ==
'i' ? 20 : 40);
961 Float_t basearc = 2 * TMath::Pi() / nSec;
963 Float_t segment = rad / nStrips;
964 Float_t cr = TMath::Sqrt(c1[0]*c1[0]+c1[1]*c1[1]);
968 Float_t D = c1[0] * c2[1] - c1[1] * c2[0];
971 Float_t dr = TMath::Sqrt(dx*dx+dy*dy);
973 TH1D* ret =
new TH1D(Form(
"acc%c", r),
974 Form(
"Acceptance correction for FMDx%c", r),
975 nStrips, -.5, nStrips-.5);
976 ret->SetXTitle(
"Strip");
977 ret->SetYTitle(
"#varphi acceptance");
978 ret->SetDirectory(0);
979 ret->SetFillColor(r ==
'I' || r ==
'i' ? kRed+1 : kBlue+1);
980 ret->SetFillStyle(3001);
982 for (
Int_t t = 0; t < nStrips; t++) {
983 Float_t radius = minR + t * segment;
988 ret->SetBinContent(t+1, 1);
997 Float_t det = radius * radius * dr * dr - D*D;
1002 ret->SetBinContent(t+1, 1);
1007 Float_t x = (+D * dy + dx * TMath::Sqrt(det)) / dr / dr;
1008 Float_t y = (-D * dx + dy * TMath::Sqrt(det)) / dr / dr;
1009 Float_t th = TMath::ATan2(x, y);
1011 ret->SetBinContent(t+1, th / basearc);
1031 return acc->GetBinContent(t+1);
1046 DGUARD(
fDebug, 1,
"Scale histograms in FMD density calculator");
1047 if (nEvents <= 0)
return;
1048 TList* d =
static_cast<TList*
>(dir->FindObject(GetName()));
1052 out->SetName(d->GetName());
1062 THStack* sums =
new THStack(
"sums",
"sums of ring signals");
1063 while ((o = static_cast<RingHistos*>(next()))) {
1066 Warning(
"Terminate",
"No density in %s", o->
GetName());
1071 sum->Scale(1.,
"width");
1073 sum->SetDirectory(0);
1074 sum->SetYTitle(
"#sum N_{ch,incl}");
1091 DGUARD(
fDebug, 1,
"Define output FMD density calculator");
1094 d->SetName(GetName());
1105 nFiles->SetMergeMode(
'+');
1128 while ((o = static_cast<RingHistos*>(next()))) {
1135 fHTiming =
new TProfile(
"timing",
"#LTt_{part}#GT", 8, .5, 8.5);
1137 fHTiming->SetYTitle(
"#LTt_{part}#GT");
1146 xaxis->SetBinLabel(1,
"Re-calculation of #eta");
1147 xaxis->SetBinLabel(2,
"N_{particle}");
1148 xaxis->SetBinLabel(3,
"Correction");
1149 xaxis->SetBinLabel(4,
"Re-calculation of #phi");
1150 xaxis->SetBinLabel(5,
"Copy to cache");
1151 xaxis->SetBinLabel(6,
"Poisson calculation");
1152 xaxis->SetBinLabel(7,
"Diagnostics");
1153 xaxis->SetBinLabel(8,
"Total");
1156 #define PF(N,V,...) \
1157 AliForwardUtil::PrintField(N,V, ## __VA_ARGS__)
1158 #define PFB(N,FLAG) \
1160 AliForwardUtil::PrintName(N); \
1161 std::cout << std::boolalpha << (FLAG) << std::noboolalpha << std::endl; \
1163 #define PFV(N,VALUE) \
1165 AliForwardUtil::PrintName(N); \
1166 std::cout << (VALUE) << std::endl; } while(false)
1179 gROOT->IncreaseDirLevel();
1194 PFB(
"Use phi acceptance", phiM);
1195 PFV(
"Lower cut",
"");
1200 if (!opt.Contains(
"nomax")) {
1201 PFV(
"Max weights",
"");
1204 for (
Int_t i = 0; i < gROOT->GetDirLevel(); i++) ind[i] =
' ';
1205 ind[gROOT->GetDirLevel()] =
'\0';
1209 ind[gROOT->GetDirLevel()] =
' ';
1210 ind[gROOT->GetDirLevel()+1] =
'\0';
1211 Char_t r = (q == 0 ?
'I' :
'O');
1212 std::cout << ind <<
" FMD" << d << r <<
":";
1213 ind[gROOT->GetDirLevel()+1] =
' ';
1214 ind[gROOT->GetDirLevel()+2] =
'\0';
1220 for (
Int_t i = 0; i < a.fN; i++) {
1221 if (a.fArray[i] < 1)
continue;
1222 if (j % 6 == 0) std::cout <<
"\n " << ind;
1224 std::cout <<
" " << std::setw(3) << i <<
": " << a.fArray[i];
1226 std::cout << std::endl;
1230 gROOT->DecreaseDirLevel();
1244 fDiffELossPoisson(0),
1245 fELossVsPoissonOut(0),
1246 fDiffELossPoissonOut(0),
1276 fDiffELossPoisson(0),
1277 fELossVsPoissonOut(0),
1278 fDiffELossPoissonOut(0),
1280 fPoisson(
"ignored"),
1300 fEvsN =
new TH2D(
"elossVsNnocorr",
1301 "#Delta E/#Delta E_{mip} vs uncorrected inclusive N_{ch}",
1302 250, -.5, 24.5, 251, -1.5, 24.5);
1303 fEvsN->SetXTitle(
"#Delta E/#Delta E_{mip}");
1304 fEvsN->SetYTitle(
"Inclusive N_{ch} (uncorrected)");
1306 fEvsN->SetDirectory(0);
1308 fEvsM =
static_cast<TH2D*
>(fEvsN->Clone(
"elossVsNcorr"));
1309 fEvsM->SetTitle(
"#Delta E/#Delta E_{mip} vs corrected inclusive N_{ch}");
1310 fEvsM->SetDirectory(0);
1312 fEtaVsN =
new TProfile(
"etaVsNnocorr",
1313 "Average inclusive N_{ch} vs #eta (uncorrected)",
1315 fEtaVsN->SetXTitle(
"#eta");
1316 fEtaVsN->SetYTitle(
"#LT N_{ch,incl}#GT (uncorrected)");
1317 fEtaVsN->SetDirectory(0);
1318 fEtaVsN->SetLineColor(
Color());
1319 fEtaVsN->SetFillColor(
Color());
1321 fEtaVsM =
static_cast<TProfile*
>(fEtaVsN->Clone(
"etaVsNcorr"));
1322 fEtaVsM->SetTitle(
"Average inclusive N_{ch} vs #eta (corrected)");
1323 fEtaVsM->SetYTitle(
"#LT N_{ch,incl}#GT (corrected)");
1324 fEtaVsM->SetDirectory(0);
1327 fCorr =
new TProfile(
"corr",
"Average correction", 200, -4, 6);
1328 fCorr->SetXTitle(
"#eta");
1329 fCorr->SetYTitle(
"#LT correction#GT");
1330 fCorr->SetDirectory(0);
1334 fDensity =
new TH2D(
"inclDensity",
"Inclusive N_{ch} density",
1335 200, -4, 6, (r ==
'I' || r ==
'i' ? 20 : 40),
1340 fDensity->SetYTitle(
"#phi [radians]");
1341 fDensity->SetZTitle(
"Inclusive N_{ch} density");
1346 const char* nchP =
"N_{ch}^{Poisson}";
1347 const char* nchE =
"N_{ch}^{#Delta}";
1350 "N_{ch} from energy loss vs from Poisson",
1351 bins.GetSize()-1, bins.GetArray(),
1352 bins.GetSize()-1, bins.GetArray());
1359 ->Clone(Form(
"%sOutlier",
1369 Form(
"(%s-%s)/%s", nchP, nchE, nchE),
1389 fOutliers =
new TH1D(
"outliers",
"Fraction of outliers", 100, 0, 1);
1391 fOutliers->SetXTitle(
"N_{outlier}/(N_{outlier}+N_{inside})");
1392 fOutliers->SetYTitle(
"#sum_{events}#sum_{bins}");
1397 fELoss =
new TH1D(
"eloss",
"#Delta/#Delta_{mip} in all strips",
1399 fELoss->SetXTitle(
"#Delta/#Delta_{mip} (selected)");
1400 fELoss->SetYTitle(
"P(#Delta/#Delta_{mip})");
1402 fELoss->SetFillStyle(3003);
1403 fELoss->SetLineColor(kBlack);
1409 fELossUsed->SetTitle(
"#Delta/#Delta_{mip} in used strips");
1414 fPhiBefore =
new TH1D(
"phiBefore",
"#phi distribution (before recalc)",
1415 (r ==
'I' || r ==
'i' ? 20 : 40), 0, 2*TMath::Pi());
1426 fPhiAfter->SetTitle(
"#phi distribution (after re-calc)");
1429 fEtaBefore =
new TH1D(
"etaBefore",
"#eta distribution (before recalc)",
1441 fEtaAfter->SetTitle(
"#eta distribution (after re-calc)");
1454 fDensity(o.fDensity),
1455 fELossVsPoisson(o.fELossVsPoisson),
1456 fDiffELossPoisson(o.fDiffELossPoisson),
1457 fELossVsPoissonOut(o.fELossVsPoissonOut),
1458 fDiffELossPoissonOut(o.fDiffELossPoissonOut),
1459 fOutliers(o.fOutliers),
1460 fPoisson(o.fPoisson),
1462 fELossUsed(o.fELossUsed),
1463 fMultCut(o.fMultCut),
1467 fPhiBefore(o.fPhiBefore),
1468 fPhiAfter(o.fPhiAfter),
1469 fEtaBefore(o.fEtaBefore),
1470 fEtaAfter(o.fEtaAfter)
1493 if (&o ==
this)
return *
this;
1500 if (fCorr)
delete fCorr;
1501 if (fDensity)
delete fDensity;
1502 if (fELossVsPoisson)
delete fELossVsPoisson;
1503 if (fDiffELossPoisson)
delete fDiffELossPoisson;
1504 if (fTotal)
delete fTotal;
1505 if (fGood)
delete fGood;
1506 if (fPhiAcc)
delete fPhiAcc;
1507 if (fPhiBefore)
delete fPhiBefore;
1508 if (fPhiAfter)
delete fPhiAfter;
1509 if (fEtaBefore)
delete fEtaBefore;
1510 if (fEtaAfter)
delete fEtaAfter;
1516 fCorr =
static_cast<TProfile*
>(o.
fCorr->Clone());
1524 fELoss =
static_cast<TH1D*
>(o.
fELoss->Clone());
1526 fTotal =
static_cast<TH1D*
>(o.
fTotal->Clone());
1527 fGood =
static_cast<TH1D*
>(o.
fGood->Clone());
1550 fPoisson.Init(-1,-1);
1551 fTotal =
new TH1D(
"total",
"Total # of strips per #eta",
1552 eAxis.GetNbins(), eAxis.GetXmin(), eAxis.GetXmax());
1553 fTotal->SetDirectory(0);
1554 fTotal->SetXTitle(
"#eta");
1555 fTotal->SetYTitle(
"# of strips");
1556 fGood =
static_cast<TH1D*
>(fTotal->Clone(
"good"));
1557 fGood->SetTitle(
"# of good strips per #eta");
1558 fGood->SetDirectory(0);
1560 fPhiAcc =
new TH2D(
"phiAcc",
"#phi acceptance vs Ip_{z}",
1561 eAxis.GetNbins(), eAxis.GetXmin(), eAxis.GetXmax(),
1563 fPhiAcc->SetXTitle(
"#eta");
1564 fPhiAcc->SetYTitle(
"v_{z} [cm]");
1565 fPhiAcc->SetZTitle(
"#phi acceptance");
1566 fPhiAcc->SetDirectory(0);
1568 if (fList) fList->Add(fPhiAcc);
1581 TList* d = DefineOutputList(dir);
1588 d->Add(fELossVsPoisson);
1589 d->Add(fELossVsPoissonOut);
1590 d->Add(fDiffELossPoisson);
1591 d->Add(fDiffELossPoissonOut);
1594 fPoisson.GetOccupancy()->SetFillColor(Color());
1595 fPoisson.GetMean()->SetFillColor(Color());
1596 fPoisson.GetOccupancy()->SetFillColor(Color());
1604 TAxis x(NStrip(), -.5, NStrip()-.5);
1605 TAxis y(NSector(), -.5, NSector()-.5);
1606 x.SetTitle(
"strip");
1607 y.SetTitle(
"sector");
1608 fPoisson.Define(x, y);
1625 TList* l = GetOutputList(dir);
1628 TH2D* density =
static_cast<TH2D*
>(GetOutputHist(l,
"inclDensity"));
1629 if (density) density->Scale(1./nEvents);
Double_t GetMultCut(UShort_t d, Char_t r, Double_t eta, Bool_t errors=true) const
virtual void SetupForData(const TAxis &etaAxis)
RingHistos & operator=(const RingHistos &o)
void Print(Option_t *option="") const
void CacheMaxWeights(const TAxis &axis)
Int_t GetMaxWeight(UShort_t d, Char_t r, Int_t iEta) const
virtual void Terminate(const TList *dir, TList *output, Int_t nEvents)
const AliFMDCorrDoubleHit * GetDoubleHit() const
void Reset(const TH2D *base)
UShort_t fUsePhiAcceptance
static Bool_t GetEtaPhi(UShort_t det, Char_t ring, UShort_t sec, UShort_t str, const TVector3 &ip, Double_t &eta, Double_t &phi)
const TAxis & GetEtaAxis() const
RingHistos & operator=(const RingHistos &o)
ELossFit * FindFit(UShort_t d, Char_t r, Double_t eta, UShort_t minQ) const
#define DMSG(L, N, F,...)
void SetLumping(UShort_t nx, UShort_t ny)
void Print(Option_t *option="R") const
const char * GetName() const
TH2D * Result(Bool_t correct=true)
void CacheBins(UShort_t minQuality=kDefaultQuality) const
virtual ~AliFMDDensityCalculator()
RingHistos * GetRingHistos(UShort_t d, Char_t r) const
AliForwardUtil::Histos fCache
void SetupForData(const TAxis &eAxis)
TH2D * fELossVsPoissonOut
AliFMDDensityCalculator & operator=(const AliFMDDensityCalculator &o)
void Output(TList *l, const char *name=0) const
Int_t FindEtaBin(Double_t eta) const
static Double_t fgMaxRelError
Cached maximum weight.
Various utilities used in PWGLF/FORWARD.
void Fill(UShort_t strip, UShort_t sec, Bool_t hit, Double_t weight=1)
virtual void CreateOutputObjects(TList *dir)
virtual Float_t NParticles(Float_t mult, UShort_t d, Char_t r, Float_t eta, Bool_t lowFlux) const
const AliFMDCorrELossFit * GetELossFit() const
#define DGUARD(L, N, F,...)
static void PrintTask(const TObject &o)
virtual Bool_t Calculate(const AliESDFMD &fmd, AliForwardUtil::Histos &hists, Bool_t lowFlux, Double_t cent=-1, const TVector3 &ip=TVector3(1024, 1024, 0))
TH2D * Get(UShort_t d, Char_t r) const
static TObject * MakeParameter(const char *name, UShort_t value)
void CreateOutputObjects(TList *dir)
virtual Float_t AcceptanceCorrection(Char_t r, UShort_t t) const
void Terminate(TList *dir, Int_t nEvents)
ClassImp(AliAnalysisTaskCRC) AliAnalysisTaskCRC
void Init(const TAxis &etaAxis)
void FillHistogram(TH2 *h) const
TH1D * fDiffELossPoissonOut
Int_t FindMaxWeight(const AliFMDCorrELossFit *cor, UShort_t d, Char_t r, Int_t iEta) const
static void MakeLogScale(Int_t nBins, Int_t minOrder, Int_t maxOrder, TArrayD &bins)
virtual TH1D * GenerateAcceptanceCorrection(Char_t r) const
TH1D * GetCorrection(UShort_t d, Char_t r) const
AliFMDDensityCalculator()
Double_t EvaluateWeighted(Double_t x, UShort_t maxN=9999) const
virtual Bool_t CheckOutlier(Double_t eloss, Double_t poisson, Double_t cut=0.5) const
static const char * fgkFolderName
virtual Float_t Correction(UShort_t d, Char_t r, UShort_t t, Float_t eta, Bool_t lowFlux) const
void Print(Option_t *option="") const
static Double_t fgLeastWeight
AliPoissonCalculator fPoisson
Int_t FindMaxWeight(Double_t maxRelError=2 *fgMaxRelError, Double_t leastWeight=fgLeastWeight, UShort_t maxN=999) const
static AliForwardCorrectionManager & Instance()