19 #include <TStopwatch.h>
20 #include <TParameter.h>
42 fUsePhiAcceptance(kPhiCorrectNch),
56 fRecalculatePhi(false),
68 DGUARD(fDebug, 3,
"Default CTOR of FMD density calculator");
73 :
TNamed(fgkFolderName, title),
80 fUsePhiAcceptance(kPhiCorrectNch),
94 fRecalculatePhi(false),
109 DGUARD(
fDebug, 3,
"Named CTOR of FMD density calculator: %s", title);
116 fWeightedSum =
new TH1D(
"weightedSum",
"Weighted sum of Landau propability",
119 fWeightedSum->SetXTitle(
"#sum_{i} i a_{i} f_{i}(#Delta)");
133 fLowCuts =
new TH2D(
"lowCuts",
"Low cuts used", 1, 0, 1, 1, 0, 1);
144 fSumOfWeights(o.fSumOfWeights),
145 fWeightedSum(o.fWeightedSum),
146 fCorrections(o.fCorrections),
147 fMaxParticles(o.fMaxParticles),
148 fUsePoisson(o.fUsePoisson),
149 fUsePhiAcceptance(o.fUsePhiAcceptance),
152 fFMD1iMax(o.fFMD1iMax),
153 fFMD2iMax(o.fFMD2iMax),
154 fFMD2oMax(o.fFMD2oMax),
155 fFMD3iMax(o.fFMD3iMax),
156 fFMD3oMax(o.fFMD3oMax),
157 fMaxWeights(o.fMaxWeights),
158 fLowCuts(o.fLowCuts),
159 fEtaLumping(o.fEtaLumping),
160 fPhiLumping(o.fPhiLumping),
163 fRecalculatePhi(o.fRecalculatePhi),
164 fMinQuality(o.fMinQuality),
165 fHitThreshold(o.fHitThreshold),
167 fDoTiming(o.fDoTiming),
168 fHTiming(o.fHTiming),
169 fMaxOutliers(o.fMaxOutliers),
170 fOutlierCut(o.fOutlierCut)
178 DGUARD(
fDebug, 3,
"Copy CTOR of FMD density calculator");
207 DGUARD(
fDebug, 3,
"Assignment of FMD density calculator");
208 if (&o ==
this)
return *
this;
209 TNamed::operator=(o);
259 while ((o = static_cast<RingHistos*>(next()))) {
282 case 1: idx = 0;
break;
283 case 2: idx = 1 + (r ==
'I' || r ==
'i' ? 0 : 1);
break;
284 case 3: idx = 3 + (r ==
'I' || r ==
'i' ? 0 : 1);
break;
287 AliWarning(Form(
"Index %d of FMD%d%c out of range", idx, d, r));
298 if (xbin < 1 && xbin > h->GetXaxis()->GetNbins())
return ret;
301 case 1: ybin = 1;
break;
302 case 2: ybin = (r==
'i' || r==
'I') ? 2 : 3;
break;
303 case 3: ybin = (r==
'i' || r==
'I') ? 4 : 5;
break;
306 ret = h->GetBinContent(xbin,ybin);
324 return Rng2Cut(d, r, ieta,
fLowCuts);
342 return Rng2Cut(d, r, ieta,
fLowCuts);
347 # define START_TIMER(T) if (fDoTiming) T.Start(true)
348 # define GET_TIMER(T,V) if (fDoTiming) V = T.CpuTime()
349 # define ADD_TIMER(T,V) if (fDoTiming) V += T.CpuTime()
351 # define START_TIMER(T) do {} while (false)
352 # define GET_TIMER(T,V) do {} while (false)
353 # define ADD_TIMER(T,V) do {} while (false)
375 DGUARD(
fDebug, 1,
"Calculate density in FMD density calculator");
409 Char_t r = (q == 0 ?
'I' :
'O');
415 AliError(Form(
"No ring histogram found for FMD%d%c", d, r));
428 memset(etaCache, 0,
sizeof(
Double_t)*20*512);
429 memset(phiCache, 0,
sizeof(
Double_t)*20*512);
437 Float_t mult = fmd.Multiplicity(d,r,s,t);
438 Double_t phi = fmd.Phi(d,r,s,t) * TMath::DegToRad();
447 TMath::Abs(eta) < 1) {
448 AliWarningF(
"FMD%d%c[%2d,%3d] (%f,%f,%f) eta=%f phi=%f (%f)",
449 d, r, s, t, ip.X(), ip.Y(), ip.Z(), eta,
454 DMSG(
fDebug, 10,
"IP(x,y,z)=%f,%f,%f Eta=%f -> %f Phi=%f -> %f",
455 ip.X(), ip.Y(), ip.Z(), oldEta, eta, oldPhi, phi);
459 etaCache[s*nt+t] = eta;
460 phiCache[s*nt+t] = phi;
464 if (mult == AliESDFMD::kInvalidMult) {
472 AliWarningF(
"Raw multiplicity of FMD%d%c[%02d,%03d] = %f > 20",
475 rh->
fGood->Fill(eta);
492 if (eta != AliESDFMD::kInvalidEta) cut =
GetMultCut(d, r, eta,
false);
493 else AliWarningF(
"Eta for FMD%d%c[%02d,%03d] is invalid: %f",
499 if (cut > 0 && mult > cut) n =
NParticles(mult,d,r,eta,lowFlux);
517 rh->
fCorr->Fill(eta, c);
549 for (
Int_t i = 0; i <= h->GetNbinsX()+1; i++) {
550 for (
Int_t j = 0; j <= h->GetNbinsY()+1; j++) {
551 hclone->SetBinContent(i,j,h->GetBinContent(i,j));
552 hclone->SetBinError(i,j,h->GetBinError(i,j));
563 for (
Int_t t=0; t < poisson->GetNbinsX(); t++) {
564 for (
Int_t s=0; s < poisson->GetNbinsY(); s++) {
566 Double_t poissonV = poisson->GetBinContent(t+1,s+1);
574 h->Fill(eta,phi,poissonV);
575 rh->
fDensity->Fill(eta, phi, poissonV);
578 hclone->Fill(eta,phi,poissonV);
585 Int_t nY = h->GetNbinsY();
588 for (
Int_t ieta=1; ieta <= h->GetNbinsX(); ieta++) {
592 h->SetBinContent(ieta, nY+1, phiAcc);
593 h->SetBinError(ieta, nY+1, phiAccE);
594 Double_t eta = h->GetXaxis()->GetBinCenter(ieta);
595 rh->
fPhiAcc->Fill(eta, ip.Z(), phiAcc);
596 for (
Int_t iphi=1; iphi<= nY; iphi++) {
601 poissonV = h->GetBinContent(ieta,iphi);
602 eLossV = hclone->GetBinContent(ieta,iphi);
605 poissonV = hclone->GetBinContent(ieta,iphi);
606 eLossV = h->GetBinContent(ieta,iphi);
609 if (poissonV < 1e-12 && eLossV < 1e-12)
614 Double_t rel = eLossV < 1e-12 ? 0 : (poissonV - eLossV) / eLossV;
627 Int_t nTotal = (nIn+nOut);
658 if (eloss < 1e-6)
return true;
659 Double_t diff = TMath::Abs(poisson - eloss) / eloss;
676 DGUARD(
fDebug, 10,
"Find maximum weight in FMD density calculator");
702 DGUARD(
fDebug, 10,
"Find maximum weight in FMD density calculator");
722 DGUARD(
fDebug, 2,
"Cache maximum weights in FMD density calculator");
728 TAxis eta(axis.GetNbins(),
736 Int_t nEta = eta.GetNbins();
743 fMaxWeights->SetBins(nEta, eta.GetXmin(), eta.GetXmax(), 5, .5, 5.5);
750 AliInfo(Form(
"Get eta axis with %d bins from %f to %f",
751 nEta, eta.GetXmin(), eta.GetXmax()));
752 fLowCuts->SetBins(nEta, eta.GetXmin(), eta.GetXmax(), 5, .5, 5.5);
753 fLowCuts->GetYaxis()->SetBinLabel(1,
"FMD1i");
754 fLowCuts->GetYaxis()->SetBinLabel(2,
"FMD2i");
755 fLowCuts->GetYaxis()->SetBinLabel(3,
"FMD2o");
756 fLowCuts->GetYaxis()->SetBinLabel(4,
"FMD3i");
757 fLowCuts->GetYaxis()->SetBinLabel(5,
"FMD3o");
759 for (
Int_t i = 0; i < nEta; i++) {
767 for (
Int_t j = 0; j < 5; j++)
768 if (w[j] > 0)
fMaxWeights->SetBinContent(i+1, j+1, w[j]);
791 if (iEta < 0)
return -1;
800 AliWarning(Form(
"No array for FMD%d%c", d, r));
804 if (iEta >= max->fN) {
805 AliWarning(Form(
"Eta bin %3d out of bounds [0,%d]",
810 AliDebug(30,Form(
"Max weight for FMD%d%c eta bin %3d: %d", d, r, iEta,
812 return max->At(iEta);
862 DGUARD(
fDebug, 3,
"Calculate Nch in FMD density calculator");
863 if (lowFlux)
return 1;
868 AliWarning(Form(
"No energy loss fit for FMD%d%c at eta=%f qual=%d",
875 AliWarning(Form(
"No good fits for FMD%d%c at eta=%f", d, r, eta));
883 AliInfo(Form(
"FMD%d%c, eta=%7.4f, %8.5f -> %8.5f", d, r, eta, mult, ret));
919 DGUARD(
fDebug, 10,
"Apply correction in FMD density calculator");
931 Double_t dblC = dblHitCor->GetBinContent(dblHitCor->FindBin(eta));
932 if (dblC > 0) correction *= dblC;
954 DGUARD(
fDebug, 3,
"Make acceptance correction in FMD density calculator");
955 const Double_t ic1[] = { 4.9895, 15.3560 };
956 const Double_t ic2[] = { 1.8007, 17.2000 };
957 const Double_t oc1[] = { 4.2231, 26.6638 };
958 const Double_t oc2[] = { 1.8357, 27.9500 };
959 const Double_t* c1 = (r ==
'I' || r ==
'i' ? ic1 : oc1);
960 const Double_t* c2 = (r ==
'I' || r ==
'i' ? ic2 : oc2);
961 Double_t minR = (r ==
'I' || r ==
'i' ? 4.5213 : 15.4);
962 Double_t maxR = (r ==
'I' || r ==
'i' ? 17.2 : 28.0);
963 Int_t nStrips = (r ==
'I' || r ==
'i' ? 512 : 256);
964 Int_t nSec = (r ==
'I' || r ==
'i' ? 20 : 40);
965 Float_t basearc = 2 * TMath::Pi() / nSec;
967 Float_t segment = rad / nStrips;
968 Float_t cr = TMath::Sqrt(c1[0]*c1[0]+c1[1]*c1[1]);
972 Float_t D = c1[0] * c2[1] - c1[1] * c2[0];
975 Float_t dr = TMath::Sqrt(dx*dx+dy*dy);
977 TH1D* ret =
new TH1D(Form(
"acc%c", r),
978 Form(
"Acceptance correction for FMDx%c", r),
979 nStrips, -.5, nStrips-.5);
980 ret->SetXTitle(
"Strip");
981 ret->SetYTitle(
"#varphi acceptance");
982 ret->SetDirectory(0);
983 ret->SetFillColor(r ==
'I' || r ==
'i' ? kRed+1 : kBlue+1);
984 ret->SetFillStyle(3001);
986 for (
Int_t t = 0; t < nStrips; t++) {
987 Float_t radius = minR + t * segment;
992 ret->SetBinContent(t+1, 1);
1001 Float_t det = radius * radius * dr * dr - D*D;
1006 ret->SetBinContent(t+1, 1);
1011 Float_t x = (+D * dy + dx * TMath::Sqrt(det)) / dr / dr;
1012 Float_t y = (-D * dx + dy * TMath::Sqrt(det)) / dr / dr;
1013 Float_t th = TMath::ATan2(x, y);
1015 ret->SetBinContent(t+1, th / basearc);
1035 return acc->GetBinContent(t+1);
1050 DGUARD(
fDebug, 1,
"Scale histograms in FMD density calculator");
1051 if (nEvents <= 0)
return;
1052 TList* d =
static_cast<TList*
>(dir->FindObject(GetName()));
1056 out->SetName(d->GetName());
1066 THStack* sums =
new THStack(
"sums",
"sums of ring signals");
1067 while ((o = static_cast<RingHistos*>(next()))) {
1070 Warning(
"Terminate",
"No density in %s", o->
GetName());
1075 sum->Scale(1.,
"width");
1077 sum->SetDirectory(0);
1078 sum->SetYTitle(
"#sum N_{ch,incl}");
1095 DGUARD(
fDebug, 1,
"Define output FMD density calculator");
1098 d->SetName(GetName());
1109 nFiles->SetMergeMode(
'+');
1133 while ((o = static_cast<RingHistos*>(next()))) {
1140 fHTiming =
new TProfile(
"timing",
"#LTt_{part}#GT", 8, .5, 8.5);
1142 fHTiming->SetYTitle(
"#LTt_{part}#GT");
1151 xaxis->SetBinLabel(1,
"Re-calculation of #eta");
1152 xaxis->SetBinLabel(2,
"N_{particle}");
1153 xaxis->SetBinLabel(3,
"Correction");
1154 xaxis->SetBinLabel(4,
"Re-calculation of #phi");
1155 xaxis->SetBinLabel(5,
"Copy to cache");
1156 xaxis->SetBinLabel(6,
"Poisson calculation");
1157 xaxis->SetBinLabel(7,
"Diagnostics");
1158 xaxis->SetBinLabel(8,
"Total");
1161 #define PF(N,V,...) \
1162 AliForwardUtil::PrintField(N,V, ## __VA_ARGS__)
1163 #define PFB(N,FLAG) \
1165 AliForwardUtil::PrintName(N); \
1166 std::cout << std::boolalpha << (FLAG) << std::noboolalpha << std::endl; \
1168 #define PFV(N,VALUE) \
1170 AliForwardUtil::PrintName(N); \
1171 std::cout << (VALUE) << std::endl; } while(false)
1184 gROOT->IncreaseDirLevel();
1198 PFB(
"Use phi acceptance", phiM);
1203 PFV(
"Lower cut",
"");
1208 if (!opt.Contains(
"nomax")) {
1209 PFV(
"Max weights",
"");
1212 for (
Int_t i = 0; i < gROOT->GetDirLevel(); i++) ind[i] =
' ';
1213 ind[gROOT->GetDirLevel()] =
'\0';
1217 ind[gROOT->GetDirLevel()] =
' ';
1218 ind[gROOT->GetDirLevel()+1] =
'\0';
1219 Char_t r = (q == 0 ?
'I' :
'O');
1220 std::cout << ind <<
" FMD" << d << r <<
":";
1221 ind[gROOT->GetDirLevel()+1] =
' ';
1222 ind[gROOT->GetDirLevel()+2] =
'\0';
1228 for (
Int_t i = 0; i < a.fN; i++) {
1229 if (a.fArray[i] < 1)
continue;
1230 if (j % 6 == 0) std::cout <<
"\n " << ind;
1232 std::cout <<
" " << std::setw(3) << i <<
": " << a.fArray[i];
1234 std::cout << std::endl;
1238 gROOT->DecreaseDirLevel();
1252 fDiffELossPoisson(0),
1253 fELossVsPoissonOut(0),
1254 fDiffELossPoissonOut(0),
1284 fDiffELossPoisson(0),
1285 fELossVsPoissonOut(0),
1286 fDiffELossPoissonOut(0),
1288 fPoisson(
"ignored"),
1308 fEvsN =
new TH2D(
"elossVsNnocorr",
1309 "#Delta E/#Delta E_{mip} vs uncorrected inclusive N_{ch}",
1310 250, -.5, 24.5, 251, -1.5, 24.5);
1311 fEvsN->SetXTitle(
"#Delta E/#Delta E_{mip}");
1312 fEvsN->SetYTitle(
"Inclusive N_{ch} (uncorrected)");
1314 fEvsN->SetDirectory(0);
1316 fEvsM =
static_cast<TH2D*
>(fEvsN->Clone(
"elossVsNcorr"));
1317 fEvsM->SetTitle(
"#Delta E/#Delta E_{mip} vs corrected inclusive N_{ch}");
1318 fEvsM->SetDirectory(0);
1320 fEtaVsN =
new TProfile(
"etaVsNnocorr",
1321 "Average inclusive N_{ch} vs #eta (uncorrected)",
1323 fEtaVsN->SetXTitle(
"#eta");
1324 fEtaVsN->SetYTitle(
"#LT N_{ch,incl}#GT (uncorrected)");
1325 fEtaVsN->SetDirectory(0);
1326 fEtaVsN->SetLineColor(
Color());
1327 fEtaVsN->SetFillColor(
Color());
1329 fEtaVsM =
static_cast<TProfile*
>(fEtaVsN->Clone(
"etaVsNcorr"));
1330 fEtaVsM->SetTitle(
"Average inclusive N_{ch} vs #eta (corrected)");
1331 fEtaVsM->SetYTitle(
"#LT N_{ch,incl}#GT (corrected)");
1332 fEtaVsM->SetDirectory(0);
1335 fCorr =
new TProfile(
"corr",
"Average correction", 200, -4, 6);
1336 fCorr->SetXTitle(
"#eta");
1337 fCorr->SetYTitle(
"#LT correction#GT");
1338 fCorr->SetDirectory(0);
1342 fDensity =
new TH2D(
"inclDensity",
"Inclusive N_{ch} density",
1343 200, -4, 6, (r ==
'I' || r ==
'i' ? 20 : 40),
1348 fDensity->SetYTitle(
"#phi [radians]");
1349 fDensity->SetZTitle(
"Inclusive N_{ch} density");
1354 const char* nchP =
"N_{ch}^{Poisson}";
1355 const char* nchE =
"N_{ch}^{#Delta}";
1358 "N_{ch} from energy loss vs from Poisson",
1359 bins.GetSize()-1, bins.GetArray(),
1360 bins.GetSize()-1, bins.GetArray());
1367 ->Clone(Form(
"%sOutlier",
1377 Form(
"(%s-%s)/%s", nchP, nchE, nchE),
1397 fOutliers =
new TH1D(
"outliers",
"Fraction of outliers", 100, 0, 1);
1399 fOutliers->SetXTitle(
"N_{outlier}/(N_{outlier}+N_{inside})");
1400 fOutliers->SetYTitle(
"#sum_{events}#sum_{bins}");
1405 fELoss =
new TH1D(
"eloss",
"#Delta/#Delta_{mip} in all strips",
1407 fELoss->SetXTitle(
"#Delta/#Delta_{mip} (selected)");
1408 fELoss->SetYTitle(
"P(#Delta/#Delta_{mip})");
1410 fELoss->SetFillStyle(3003);
1411 fELoss->SetLineColor(kBlack);
1417 fELossUsed->SetTitle(
"#Delta/#Delta_{mip} in used strips");
1422 fPhiBefore =
new TH1D(
"phiBefore",
"#phi distribution (before recalc)",
1423 (r ==
'I' || r ==
'i' ? 20 : 40), 0, 2*TMath::Pi());
1434 fPhiAfter->SetTitle(
"#phi distribution (after re-calc)");
1437 fEtaBefore =
new TH1D(
"etaBefore",
"#eta distribution (before recalc)",
1449 fEtaAfter->SetTitle(
"#eta distribution (after re-calc)");
1462 fDensity(o.fDensity),
1463 fELossVsPoisson(o.fELossVsPoisson),
1464 fDiffELossPoisson(o.fDiffELossPoisson),
1465 fELossVsPoissonOut(o.fELossVsPoissonOut),
1466 fDiffELossPoissonOut(o.fDiffELossPoissonOut),
1467 fOutliers(o.fOutliers),
1468 fPoisson(o.fPoisson),
1470 fELossUsed(o.fELossUsed),
1471 fMultCut(o.fMultCut),
1475 fPhiBefore(o.fPhiBefore),
1476 fPhiAfter(o.fPhiAfter),
1477 fEtaBefore(o.fEtaBefore),
1478 fEtaAfter(o.fEtaAfter)
1501 if (&o ==
this)
return *
this;
1508 if (fCorr)
delete fCorr;
1509 if (fDensity)
delete fDensity;
1510 if (fELossVsPoisson)
delete fELossVsPoisson;
1511 if (fDiffELossPoisson)
delete fDiffELossPoisson;
1512 if (fTotal)
delete fTotal;
1513 if (fGood)
delete fGood;
1514 if (fPhiAcc)
delete fPhiAcc;
1515 if (fPhiBefore)
delete fPhiBefore;
1516 if (fPhiAfter)
delete fPhiAfter;
1517 if (fEtaBefore)
delete fEtaBefore;
1518 if (fEtaAfter)
delete fEtaAfter;
1524 fCorr =
static_cast<TProfile*
>(o.
fCorr->Clone());
1532 fELoss =
static_cast<TH1D*
>(o.
fELoss->Clone());
1534 fTotal =
static_cast<TH1D*
>(o.
fTotal->Clone());
1535 fGood =
static_cast<TH1D*
>(o.
fGood->Clone());
1558 fPoisson.Init(-1,-1);
1559 fTotal =
new TH1D(
"total",
"Total # of strips per #eta",
1560 eAxis.GetNbins(), eAxis.GetXmin(), eAxis.GetXmax());
1561 fTotal->SetDirectory(0);
1562 fTotal->SetXTitle(
"#eta");
1563 fTotal->SetYTitle(
"# of strips");
1564 fGood =
static_cast<TH1D*
>(fTotal->Clone(
"good"));
1565 fGood->SetTitle(
"# of good strips per #eta");
1566 fGood->SetDirectory(0);
1568 fPhiAcc =
new TH2D(
"phiAcc",
"#phi acceptance vs Ip_{z}",
1569 eAxis.GetNbins(), eAxis.GetXmin(), eAxis.GetXmax(),
1571 fPhiAcc->SetXTitle(
"#eta");
1572 fPhiAcc->SetYTitle(
"v_{z} [cm]");
1573 fPhiAcc->SetZTitle(
"#phi acceptance");
1574 fPhiAcc->SetDirectory(0);
1576 if (fList) fList->Add(fPhiAcc);
1589 TList* d = DefineOutputList(dir);
1596 d->Add(fELossVsPoisson);
1597 d->Add(fELossVsPoissonOut);
1598 d->Add(fDiffELossPoisson);
1599 d->Add(fDiffELossPoissonOut);
1602 fPoisson.GetOccupancy()->SetFillColor(Color());
1603 fPoisson.GetMean()->SetFillColor(Color());
1604 fPoisson.GetOccupancy()->SetFillColor(Color());
1612 TAxis x(NStrip(), -.5, NStrip()-.5);
1613 TAxis y(NSector(), -.5, NSector()-.5);
1614 x.SetTitle(
"strip");
1615 y.SetTitle(
"sector");
1616 fPoisson.Define(x, y);
1633 TList* l = GetOutputList(dir);
1636 TH2D* density =
static_cast<TH2D*
>(GetOutputHist(l,
"inclDensity"));
1637 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()