15 #include <TClonesArray.h>
16 #include <TFitResult.h>
27 const char* fgkEDistFormat =
"%s_etabin%03d";
45 fUseIncreasingBins(true),
50 fResidualMethod(kNoResiduals),
52 fRegularizationCut(3e6)
63 :
TNamed(
"fmdEnergyFitter", title),
72 fCentralityAxis(0,0,0),
75 fUseIncreasingBins(true),
80 fResidualMethod(kNoResiduals),
82 fRegularizationCut(3e6)
130 case 1: idx = 0;
break;
131 case 2: idx = 1 + (r ==
'I' || r ==
'i' ? 0 : 1);
break;
132 case 3: idx = 3 + (r ==
'I' || r ==
'i' ? 0 : 1);
break;
134 if (idx < 0 || idx >=
fRingHistos.GetEntries())
return 0;
146 DGUARD(1,
fDebug,
"Creating histogram caches for each ring");
154 while ((o = static_cast<RingHistos*>(next()))) {
171 DGUARD(
fDebug, 1,
"Define output in AliFMDEnergyFitter");
173 d->SetName(GetName());
179 if (
fEtaAxis.GetXbins()->GetArray())
185 hEta->SetXTitle(
"#eta");
186 hEta->SetYTitle(
"Nothing");
187 hEta->SetDirectory(0);
207 AliFatal(
"No ring histograms where defined - giving up!");
212 while ((o = static_cast<RingHistos*>(next()))) {
245 Double_t bins[] = { 0., 5., 10., 15., 20., 30.,
246 40., 50., 60., 70., 80., 100. };
251 while ((o = static_cast<RingHistos*>(next())))
269 SetEtaAxis(eAxis.GetNbins(),eAxis.GetXmin(),eAxis.GetXmax());
318 DGUARD(
fDebug, 5,
"Accumulate statistics in AliFMDEnergyFitter - cholm");
324 Int_t nRings = (d == 1 ? 1 : 2);
325 for (
UShort_t q = 0; q < nRings; q++) {
326 Char_t r = (q == 0 ?
'I' :
'O');
328 UShort_t nstr = (q == 0 ? 512 : 256);
332 AliWarningF(
"No histograms for FMD%d%c", d, r);
336 for(
UShort_t s = 0; s < nsec; s++) {
337 for(
UShort_t t = 0; t < nstr; t++) {
338 Float_t mult = input.Multiplicity(d,r,s,t);
341 if (mult == AliESDFMD::kInvalidMult || mult > 10 || mult <= 0) {
342 DMSG(
fDebug,4,
"FMD%d%c[%2d,%3d]=%f is invalid, too large, or <0",
354 histos->
Fill(empty, eta1, icent, mult);
361 DMSG(
fDebug, 3,
"Found a total of %d signals for c=%f, and %sempty event",
362 nFills, cent, (empty ?
"" :
"non-"));
376 DGUARD(
fDebug, 1,
"Fit distributions in AliFMDEnergyFitter");
378 AliInfo(
"Not asked to do fits, returning");
382 TList* d =
static_cast<TList*
>(dir->FindObject(GetName()));
384 AliWarningF(
"No list named %s found in %s", GetName(), dir->GetName());
393 THStack*
stack[nStack];
394 stack[0] =
new THStack(
"chi2",
"#chi^{2}/#nu");
395 stack[
kC +1] =
new THStack(
"c",
"Constant");
396 stack[
kDelta +1] =
new THStack(
"delta",
"#Delta_{p}");
397 stack[
kXi +1] =
new THStack(
"xi",
"#xi");
398 stack[
kSigma +1] =
new THStack(
"sigma",
"#sigma");
399 stack[
kSigmaN+1] =
new THStack(
"sigman",
"#sigma_{n}");
400 stack[
kN +1] =
new THStack(
"n",
"# Particles");
402 stack[
kN+i] =
new THStack(Form(
"a%d", i), Form(
"a_{%d}", i));
403 for (
Int_t i = 0; i < nStack; i++)
409 AliInfoF(
"Will do fits for %d rings",
fRingHistos.GetEntries());
412 while ((o = static_cast<RingHistos*>(next()))) {
413 AliInfoF(
"Fill fit for FMD%d%c", o->
fDet, o->
fRing);
415 AliWarningF(
"Skipping FMD%d%c for fitting", o->
fDet, o->
fRing);
425 for (
Int_t i = 0; i < l->GetEntriesFast()-1; i++) {
426 stack[i % nStack]->Add(static_cast<TH1*>(l->At(i)));
445 DGUARD(
fDebug, 1,
"Make the correction objec in AliFMDEnergyFitter");
455 while ((o = static_cast<RingHistos*>(next()))) {
457 AliWarningF(
"Skipping FMD%d%c for correction object", o->
fDet, o->
fRing);
464 d->Add(obj,
"elossFits");
480 while ((o = static_cast<RingHistos*>(next())))
486 template <
typename T>
490 TObject* o = col->FindObject(name);
508 if (!col)
return false;
510 TH1* hist =
static_cast<TH1*
>(col->FindObject(
"etaAxis"));
511 if (!hist) ret =
false;
513 TAxis* axis = hist->GetXaxis();
514 if (axis->GetXbins()->GetArray())
515 fEtaAxis.Set(axis->GetNbins(), axis->GetXbins()->GetArray());
517 fEtaAxis.Set(axis->GetNbins(), axis->GetXmin(), axis->GetXmax());
541 UShort_t q = (r ==
'I' || r ==
'i' ? 0 : 1);
545 return (t & skips) == t;
548 #define PF(N,V,...) \
549 AliForwardUtil::PrintField(N,V, ## __VA_ARGS__)
550 #define PFB(N,FLAG) \
552 AliForwardUtil::PrintName(N); \
553 std::cout << std::boolalpha << (FLAG) << std::noboolalpha << std::endl; \
555 #define PFV(N,VALUE) \
557 AliForwardUtil::PrintName(N); \
558 std::cout << (VALUE) << std::endl; } while(false)
572 gROOT->IncreaseDirLevel();
594 gROOT->DecreaseDirLevel();
606 fFits(
"AliFMDCorrELossFit::ELossFit", 200),
612 DGUARD(
fDebug, 3,
"Default CTOR AliFMDEnergyFitter::RingHistos");
625 fFits(
"AliFMDCorrELossFit::ELossFit", 200),
635 DGUARD(
fDebug, 3,
"Named CTOR AliFMDEnergyFitter::RingHistos: FMD%d%c",
645 DGUARD(
fDebug, 3,
"DTOR of AliFMDEnergyFitter::RingHistos");
670 for (i = 1; i < n+1; i++) {
672 Double_t next = bins[i-1] + dx + dI * dI * dx;
674 if (next > max)
break;
700 TArrayD deAxis = MakeIncreasingAxis(nDeBins, 0, deMax);
701 mAxis.Set(deAxis.GetSize()-1, deAxis.GetArray());
704 mAxis.Set(nDeBins, 0, deMax);
706 if (mAxis.GetXbins()->GetArray()) {
708 if (eAxis.GetXbins()->GetArray()) {
710 h =
new TH2D(name, title,
711 eAxis.GetNbins(), eAxis.GetXbins()->GetArray(),
712 mAxis.GetNbins(), mAxis.GetXbins()->GetArray());
716 h =
new TH2D(name, title,
717 eAxis.GetNbins(), eAxis.GetXmin(), eAxis.GetXmax(),
718 mAxis.GetNbins(), mAxis.GetXbins()->GetArray());
723 if (eAxis.GetXbins()->GetArray()) {
725 h =
new TH2D(name, title,
726 eAxis.GetNbins(), eAxis.GetXbins()->GetArray(),
727 mAxis.GetNbins(), mAxis.GetXmin(), mAxis.GetXmax());
731 h =
new TH2D(name, title,
732 eAxis.GetNbins(), eAxis.GetXmin(), eAxis.GetXmax(),
733 mAxis.GetNbins(), mAxis.GetXmin(), mAxis.GetXmax());
737 h->SetYTitle(
"#sum#DeltaE/#DeltaE_{mip}");
738 h->SetXTitle(
"#eta");
739 h->SetFillColor(Color());
740 h->SetMarkerColor(Color());
741 h->SetLineColor(Color());
742 h->SetFillStyle(3001);
743 h->SetMarkerStyle(20);
758 DGUARD(
fDebug, 2,
"Define output in AliFMDEnergyFitter::RingHistos");
759 fList = DefineOutputList(dir);
784 DGUARD(
fDebug, 2,
"Initialize in AliFMDEnergyFitter::RingHistos");
785 fEDist =
new TH1D(Form(
"%s_edist", fName.Data()),
786 Form(
"#sum#DeltaE/#DeltaE_{mip} for %s", fName.Data()),
788 fEDist->SetXTitle(
"#sum#Delta/#Delta_{mip}");
789 fEDist->SetFillColor(Color());
790 fEDist->SetLineColor(Color());
791 fEDist->SetMarkerColor(Color());
792 fEDist->SetFillStyle(3001);
793 fEDist->SetMarkerStyle(20);
795 fEDist->SetDirectory(0);
797 fEmpty =
static_cast<TH1D*
>(fEDist->Clone(Form(
"%s_empty", fName.Data())));
798 fEmpty->SetTitle(Form(
"#sum#DeltaE/#DeltaE_{mip} for %s (empty events)",
800 fEmpty->SetDirectory(0);
804 fHist =
Make(
"eloss",
"#sum#Delta/#Delta_{mip}", eAxis,
805 maxDE, nDEbins, useIncrBin);
827 DGUARD(
fDebug, 10,
"Filling in AliFMDEnergyFitter::RingHistos");
836 Warning(
"Fill",
"No list of E dists defined");
839 fHist->Fill(eta, mult);
855 const TAxis& eta)
const
868 TH1D* h =
new TH1D(Form(
"%s_%s", fName.Data(), name),
869 Form(
"%s for %s", title, fName.Data()),
870 eta.GetNbins(), eta.GetXmin(), eta.GetXmax());
871 h->SetXTitle(
"#eta");
874 h->SetFillColor(Color());
875 h->SetMarkerColor(Color());
876 h->SetLineColor(Color());
877 h->SetFillStyle(3001);
907 Double_t xlow = eta.GetBinLowEdge(low);
908 Double_t xhigh = eta.GetBinUpEdge(high);
909 TH1D* h =
new TH1D(Form(
"%s_%s", fName.Data(), name),
910 Form(
"%s for %s", title, fName.Data()),
912 h->SetBinContent(1, val);
913 h->SetBinError(1, err);
914 h->SetXTitle(
"#eta");
918 h->SetMarkerColor(Color());
919 h->SetLineColor(Color());
940 return FitSlices(dir,
"eloss", lowCut, nParticles, minEntries,
941 minusBins, relErrorCut, chi2nuCut, minWeight, regCut,
942 residuals,
true, &fBest);
978 DGUARD(
fDebug, 2,
"Fit in AliFMDEnergyFitter::RingHistos");
981 TList* l = GetOutputList(dir);
986 TH2* h =
static_cast<TH2*
>(l->FindObject(name));
988 AliWarningF(
"Didn't find 2D histogram '%s' in %s", name, l->GetName());
990 dists =
static_cast<TList*
>(l->FindObject(
"EDists"));
992 AliWarningF(
"Didn't find EtaEDists (%s) in %s",
993 fName.Data(), l->GetName());
998 if (!h && !dists)
return 0;
1000 const TAxis* pEta = (h ? h->GetXaxis() :
1001 static_cast<TAxis*
>(dir->FindObject(
"etaAxis")));
1003 AliWarningF(
"Didn't find the eta axis - either from histogram %p or "
1004 "list %p (%s)", h, dir, (dir ? dir->GetName() :
"-"));
1007 const TAxis& eta = *pEta;
1012 out->SetName(Form(
"%sDists", name));
1019 resi->SetName(Form(
"%sResiduals", name));
1026 pars->SetName(Form(
"%sResults", name));
1037 TH1* hA[nParticles-1];
1038 pars->Add(hChi2 = MakePar(
"chi2",
"#chi^{2}/#nu", eta));
1039 pars->Add(hC = MakePar(
"c",
"Constant", eta));
1040 pars->Add(hDelta = MakePar(
"delta",
"#Delta_{p}", eta));
1041 pars->Add(hXi = MakePar(
"xi",
"#xi", eta));
1042 pars->Add(hSigma = MakePar(
"sigma",
"#sigma", eta));
1043 pars->Add(hSigmaN = MakePar(
"sigman",
"#sigma_{n}", eta));
1044 pars->Add(hN = MakePar(
"n",
"N", eta));
1045 for (
UShort_t i = 1; i < nParticles; i++)
1046 pars->Add(hA[i-1] = MakePar(Form(
"a%d",i+1), Form(
"a_{%d}",i+1), eta));
1049 Int_t nDists = h ? h->GetNbinsX() : dists->GetEntries();
1056 best->Expand(nDists+1);
1058 best->SetOwner(
false);
1060 for (
Int_t i = 0; i < nDists; i++) {
1063 TH1D* dist = (h ? h->ProjectionY(Form(fgkEDistFormat,GetName(),b),b,b,
"e")
1064 :
static_cast<TH1D*
>(dists->At(i)));
1071 dist->SetDirectory(0);
1073 dist->SetTitle(Form(
"#Delta/#Delta_{mip} for %s in %6.2f<#eta<%6.2f",
1074 GetName(), eta.GetBinLowEdge(b),
1075 eta.GetBinUpEdge(b)));
1092 case 1: nEmpty++;
break;
1093 case 2: nLow++;
break;
1104 if (best) best->AddAt(res, b);
1111 CalculateResiduals(residuals, lowCut, dist, res, resi);
1114 low = TMath::Min(low,b);
1115 high = TMath::Max(high,b);
1123 hChi2 ->SetBinContent(b, ndf > 0 ? chi2 / ndf : 0);
1124 hC ->SetBinContent(b, res->
fC);
1125 hDelta ->SetBinContent(b, res->
fDelta);
1126 hXi ->SetBinContent(b, res->
fXi);
1127 hSigma ->SetBinContent(b, res->
fSigma);
1128 hSigmaN ->SetBinContent(b, res->
fSigmaN);
1129 hN ->SetBinContent(b, res->
fN);
1131 hC ->SetBinError(b, res->
fEC);
1132 hDelta ->SetBinError(b, res->
fEDelta);
1133 hXi ->SetBinError(b, res->
fEXi);
1134 hSigma ->SetBinError(b, res->
fESigma);
1135 hSigmaN->SetBinError(b, res->
fESigmaN);
1138 for (
UShort_t j = 0; j < nParticles-1; j++) {
1139 hA[j]->SetBinContent(b, res->
fA[j]);
1140 hA[j]->SetBinError(b, res->
fEA[j]);
1143 printf(
"%s: Out of %d histograms, %d where empty, %d had too little data,"
1144 "leaving %d to be fitted, of which %d succeeded\n",
1145 GetName(), nDists, nEmpty, nLow, nDists-nEmpty-nLow, nFitted);
1148 TH1* total = GetOutputHist(l, Form(
"%s_edist", fName.Data()));
1166 pars->Add(MakeTotal(
"t_chi2",
"#chi^{2}/#nu", eta, low, high,
1167 ndf > 0 ? chi2/ndf : 0, 0));
1168 pars->Add(MakeTotal(
"t_c",
"Constant", eta, low, high,
1170 pars->Add(MakeTotal(
"t_delta",
"#Delta_{p}", eta, low, high,
1172 pars->Add(MakeTotal(
"t_xi",
"#xi", eta, low, high,
1174 pars->Add(MakeTotal(
"t_sigma",
"#sigma", eta, low, high,
1176 pars->Add(MakeTotal(
"t_sigman",
"#sigma_{n}", eta, low, high,
1178 pars->Add(MakeTotal(
"t_n",
"N", eta, low, high,
1180 for (
UShort_t j = 0; j < nParticles-1; j++)
1181 pars->Add(MakeTotal(Form(
"t_a%d",j+2),
1182 Form(
"a_{%d}",j+2), eta, low, high,
1187 TH1* status =
new TH1I(Form(
"%sStatus",name),
"Status of Fits", 5, 0, 5);
1188 status->GetXaxis()->SetBinLabel(1,
"Total");
1189 status->GetXaxis()->SetBinLabel(2,
"Empty");
1190 status->GetXaxis()->SetBinLabel(3, Form(
"<%d", minEntries));
1191 status->GetXaxis()->SetBinLabel(4,
"Candidates");
1192 status->GetXaxis()->SetBinLabel(5,
"Fitted");
1193 status->SetXTitle(
"Status");
1194 status->SetYTitle(
"# of #Delta distributions");
1195 status->SetBinContent(1, nDists);
1196 status->SetBinContent(2, nEmpty);
1197 status->SetBinContent(3, nLow);
1198 status->SetBinContent(4, nDists-nLow-nEmpty);
1199 status->SetBinContent(5, nFitted);
1200 status->SetFillColor(Color());
1201 status->SetFillStyle(3001);
1202 status->SetLineColor(Color());
1203 status->SetDirectory(0);
1204 status->SetStats(0);
1215 dist->Scale(1.,
"width");
1258 DGUARD(
fDebug, 2,
"Fit histogram in AliFMDEnergyFitter::RingHistos: %s",
1263 if (dist->GetEntries() <= 0) {
1270 Int_t cutBin = TMath::Max(dist->GetXaxis()->FindBin(lowCut),3);
1271 Int_t maxBin = TMath::Min(dist->GetXaxis()->FindBin(10),
1273 dist->GetXaxis()->SetRange(cutBin, maxBin);
1276 Int_t peakBin = dist->GetMaximumBin();
1280 Double_t max = dist->GetBinContent(peakBin);
1285 if (scaleToPeak) dist->Scale(1/max);
1286 DMSG(
fDebug,5,
"max(%s) -> %f", dist->GetName(), max);
1289 Double_t nEntries = dist->GetEntries();
1290 if (nEntries <= minEntries) {
1291 AliWarning(Form(
"Histogram at %s has too few entries (%f <= %d)",
1292 dist->GetName(), nEntries, minEntries));
1303 if (dist->GetEntries() > regCut) {
1305 Double_t s = TMath::Sqrt(dist->GetEntries() / regCut);
1306 if (
fDebug > 2) printf(
"Error scale: %f ", s);
1307 for (
Int_t i = 1; i <= dist->GetNbinsX(); i++) {
1309 dist->SetBinError(i, e * s);
1314 if (nParticles == 1) {
1320 TF1* ff =
new TF1(*r);
1321 dist->GetListOfFunctions()->Add(ff);
1333 for (
Int_t i = nFits-1; i >= 0; i--) {
1336 dist->GetListOfFunctions()->Add(
new TF1(*ff));
1342 ELossFit_t* ret = FindBestFit(dist, relErrorCut, chi2nuCut, minWeight);
1343 if (!ret) status = 3;
1369 TList* funcs = dist->GetListOfFunctions();
1375 if (
fDebug) printf(
"Find best fit for %s ... ", dist->GetName());
1376 if (
fDebug > 2) printf(
"\n");
1380 while ((func = static_cast<TF1*>(next()))) {
1387 Printf(
"%10s: %3d (chi^2/nu: %6.3f)",
1394 if (
fDebug > 2) fFits.Print(
"s");
1399 AliWarningF(
"No fit found for %s", GetName());
1403 if (
fDebug > 1) printf(
" %d: ", i-1);
1421 TH1* resi =
static_cast<TH1*
>(dist->Clone());
1422 TString tit(resi->GetTitle());
1423 tit.ReplaceAll(
"#DeltaE/#DeltaE_{mip}",
"Residuals");
1424 resi->SetTitle(tit);
1425 resi->SetDirectory(0);
1430 resi->SetYTitle(
"h_{i}-f(#Delta_{i}) #pm #delta_{i}");
1433 resi->SetYTitle(
"[h_{i}-f(#Delta_{i})]/#delta_{i}");
break;
1435 resi->SetYTitle(
"#chi_{i}^{2}=[h_{i}-f(#Delta_{i})]^{2}/#delta^{2}_{i}");
1438 resi->SetYTitle(
"Unknown");
1444 Double_t highCut = dist->GetXaxis()->GetXmax();
1446 if (fit->
GetN() > 1)
1447 funcName = Form(
"nlandau%d", fit->
GetN());
1448 TF1* func = dist->GetFunction(funcName);
1449 if (func) func->GetRange(lowCut, highCut);
1450 resi->Reset(
"ICES");
1451 resi->GetListOfFunctions()->Clear();
1452 resi->SetUniqueID(mode);
1455 Int_t nX = resi->GetNbinsX();
1456 for (
Int_t i = 1; i <= nX; i++) {
1457 Double_t x = dist->GetBinCenter(i);
1458 if (x < lowCut)
continue;
1459 if (x > highCut)
break;
1461 Double_t h = dist->GetBinContent(i);
1465 if (h > 0 && e > 0) {
1473 default: r = 0;
break;
1477 resi->SetBinContent(i, r);
1478 resi->SetBinError(i, er);
1504 TList* l = GetOutputList(d);
1508 TList* dists =
static_cast<TList*
>(l->FindObject(
"elossDists"));
1510 AliWarningF(
"Didn't find elossDists in %s", l->GetName());
1514 Int_t nBin = eta.GetNbins();
1515 if (fBest.GetEntriesFast() <= 0) {
1516 AliWarningF(
"No fits found for %s", GetName());
1520 for (
Int_t b = 1; b <= nBin; b++) {
1528 best->
fRing = fRing;
1531 printf(
"Bin # %3d: ", b);
1535 obj.
SetFit(fDet, fRing, b, best);
void SetEnableDeltaShift(Bool_t use=true)
Double_t GetSigma() const
void SetLowCut(Double_t cut)
virtual TArrayD MakeIncreasingAxis(Int_t n, Double_t min, Double_t max) const
Bool_t SetFit(UShort_t d, Char_t r, Double_t eta, Int_t quality, const TF1 &f)
EResidualMethod fResidualMethod
virtual void CreateOutputObjects(TList *dir)
Bool_t fUseIncreasingBins
virtual void Fill(Bool_t empty, Double_t eta, Int_t icent, Double_t mult)
virtual void SetupForData(const TAxis &eAxis, const TAxis &cAxis, Double_t maxDE=10, Int_t nDEbins=300, Bool_t useIncrBin=true)
virtual Bool_t Accumulate(const AliESDFMD &input, Double_t cent, Bool_t empty)
virtual void Scale(TH1 *dist) const
TParameter< double > * GetParam(TCollection *c, const char *name, Bool_t verb=false)
#define DMSG(L, N, F,...)
Double_t GetESigma() const
void CalculateQuality(Double_t maxChi2nu=fgMaxChi2nu, Double_t maxRelError=fgMaxRelError, Double_t leastWeight=fgLeastWeight)
virtual void Fit(const TList *dir)
const TObjArray & GetFitResults() const
virtual void FindBestFits(const TList *d, AliFMDCorrELossFit &obj, const TAxis &eta)
void SetCentralityAxis(UShort_t nBins, Double_t *bins)
Double_t fRegularizationCut
Double_t Evaluate(Double_t x, UShort_t maxN=999) const
virtual ELossFit_t * FitHist(TH1 *dist, Double_t lowCut, UShort_t nParticles, UShort_t minEntries, UShort_t minusBins, Double_t relErrorCut, Double_t chi2nuCut, Double_t minWeight, Double_t regCut, Bool_t scaleToPeak, UShort_t &status) const
UShort_t T(UShort_t m, UShort_t t)
Bool_t ReadParameters(const TCollection *list)
TH2 * Make(const char *name, const char *title, const TAxis &eAxis, Double_t deMax=12, Int_t nDeBins=300, Bool_t incr=true)
virtual ELossFit_t * FindBestFit(const TH1 *dist, Double_t relErrorCut, Double_t chi2nuCut, Double_t minWeightCut) const
virtual void CreateOutputObjects(TList *dir)
TH1 * MakePar(const char *name, const char *title, const TAxis &eta) const
const TObjArray & GetFunctions() const
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)
Double_t GetESigmaN() const
void Print(Option_t *option) const
virtual ~AliFMDEnergyFitter()
Various utilities used in PWGLF/FORWARD.
Double_t GetEDelta() const
TH1 * MakeTotal(const char *name, const char *title, const TAxis &eta, Int_t low, Int_t high, Double_t val, Double_t err) const
Double_t GetSigmaN() const
static void GetParameter(TObject *o, UShort_t &value)
virtual TObjArray * Fit(TList *dir, Double_t lowCut, UShort_t nParticles, UShort_t minEntries, UShort_t minusBins, Double_t relErrorCut, Double_t chi2nuCut, Double_t minWeight, Double_t regCut, EResidualMethod residuals) const
Double_t GetA(UShort_t i) const
virtual void CalculateResiduals(EResidualMethod mode, Double_t lowCut, TH1 *dist, ELossFit_t *fit, TCollection *out) const
void MakeCorrectionsObject(TList *dir)
#define DGUARD(L, N, F,...)
void SetEtaAxis(const TAxis &axis)
static void PrintTask(const TObject &o)
static TObject * MakeParameter(const char *name, UShort_t value)
TF1 * Fit1Particle(TH1 *dist, Double_t sigman=-1)
TH1 * Make(UShort_t d, Char_t r)
UShort_t fFitRangeBinWidth
void SetEtaAxis(Int_t nBins, Double_t etaMin, Double_t etaMax)
static Bool_t CheckSkip(UShort_t d, Char_t r, UShort_t skips)
static Bool_t EnableSigmaShift(Short_t val=-1)
TH2 * Scale(TH2 *h, TH1 *g)
TF1 * FitNParticle(TH1 *dist, UShort_t n, Double_t sigman=-1)
void SetDebug(Int_t dbg=1)
RingHistos * GetRingHistos(UShort_t d, Char_t r) const
virtual TObjArray * FitSlices(TList *dir, const char *name, Double_t lowCut, UShort_t nParticles, UShort_t minEntries, UShort_t minusBins, Double_t relErrorCut, Double_t chi2nuCut, Double_t minWeight, Double_t regCut, EResidualMethod residuals, Bool_t scaleToPeak=true, TObjArray *best=0) const
Double_t GetEA(UShort_t i) const
virtual RingHistos * CreateRingHistos(UShort_t d, Char_t r) const
void Print(Option_t *option="") const
void SetDebug(Bool_t debug=true)
Double_t GetDelta() const
Declaration and implementation of fitter of Landau-Gauss distributions to energy loss spectra...
virtual void SetupForData(const TAxis &etaAxis, UShort_t sys=0)