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()))) {
244 Double_t bins[] = { 0., 5., 10., 15., 20., 30.,
245 40., 50., 60., 70., 80., 100. };
250 while ((o = static_cast<RingHistos*>(next())))
268 SetEtaAxis(eAxis.GetNbins(),eAxis.GetXmin(),eAxis.GetXmax());
317 DGUARD(
fDebug, 5,
"Accumulate statistics in AliFMDEnergyFitter - cholm");
323 Int_t nRings = (d == 1 ? 1 : 2);
324 for (
UShort_t q = 0; q < nRings; q++) {
325 Char_t r = (q == 0 ?
'I' :
'O');
327 UShort_t nstr = (q == 0 ? 512 : 256);
331 AliWarningF(
"No histograms for FMD%d%c", d, r);
335 for(
UShort_t s = 0; s < nsec; s++) {
336 for(
UShort_t t = 0; t < nstr; t++) {
337 Float_t mult = input.Multiplicity(d,r,s,t);
340 if (mult == AliESDFMD::kInvalidMult || mult > 10 || mult <= 0) {
341 DMSG(
fDebug,4,
"FMD%d%c[%2d,%3d]=%f is invalid, too large, or <0",
353 histos->
Fill(empty, eta1, icent, mult);
360 DMSG(
fDebug, 3,
"Found a total of %d signals for c=%f, and %sempty event",
361 nFills, cent, (empty ?
"" :
"non-"));
375 DGUARD(
fDebug, 1,
"Fit distributions in AliFMDEnergyFitter");
377 AliInfo(
"Not asked to do fits, returning");
381 TList* d =
static_cast<TList*
>(dir->FindObject(GetName()));
383 AliWarningF(
"No list named %s found in %s", GetName(), dir->GetName());
392 THStack* stack[nStack];
393 stack[0] =
new THStack(
"chi2",
"#chi^{2}/#nu");
394 stack[
kC +1] =
new THStack(
"c",
"Constant");
395 stack[
kDelta +1] =
new THStack(
"delta",
"#Delta_{p}");
396 stack[
kXi +1] =
new THStack(
"xi",
"#xi");
397 stack[
kSigma +1] =
new THStack(
"sigma",
"#sigma");
398 stack[
kSigmaN+1] =
new THStack(
"sigman",
"#sigma_{n}");
399 stack[
kN +1] =
new THStack(
"n",
"# Particles");
401 stack[
kN+i] =
new THStack(Form(
"a%d", i), Form(
"a_{%d}", i));
402 for (
Int_t i = 0; i < nStack; i++)
408 AliInfoF(
"Will do fits for %d rings",
fRingHistos.GetEntries());
411 while ((o = static_cast<RingHistos*>(next()))) {
412 AliInfoF(
"Fill fit for FMD%d%c", o->
fDet, o->
fRing);
414 AliWarningF(
"Skipping FMD%d%c for fitting", o->
fDet, o->
fRing);
424 for (
Int_t i = 0; i < l->GetEntriesFast()-1; i++) {
425 stack[i % nStack]->Add(static_cast<TH1*>(l->At(i)));
444 DGUARD(
fDebug, 1,
"Make the correction objec in AliFMDEnergyFitter");
454 while ((o = static_cast<RingHistos*>(next()))) {
456 AliWarningF(
"Skipping FMD%d%c for correction object", o->
fDet, o->
fRing);
463 d->Add(obj,
"elossFits");
479 while ((o = static_cast<RingHistos*>(next())))
485 template <
typename T>
489 TObject* o = col->FindObject(name);
507 if (!col)
return false;
509 TH1* hist =
static_cast<TH1*
>(col->FindObject(
"etaAxis"));
510 if (!hist) ret =
false;
512 TAxis* axis = hist->GetXaxis();
513 if (axis->GetXbins()->GetArray())
514 fEtaAxis.Set(axis->GetNbins(), axis->GetXbins()->GetArray());
516 fEtaAxis.Set(axis->GetNbins(), axis->GetXmin(), axis->GetXmax());
540 UShort_t q = (r ==
'I' || r ==
'i' ? 0 : 1);
544 return (t & skips) == t;
547 #define PF(N,V,...) \
548 AliForwardUtil::PrintField(N,V, ## __VA_ARGS__)
549 #define PFB(N,FLAG) \
551 AliForwardUtil::PrintName(N); \
552 std::cout << std::boolalpha << (FLAG) << std::noboolalpha << std::endl; \
554 #define PFV(N,VALUE) \
556 AliForwardUtil::PrintName(N); \
557 std::cout << (VALUE) << std::endl; } while(false)
571 gROOT->IncreaseDirLevel();
593 gROOT->DecreaseDirLevel();
605 fFits(
"AliFMDCorrELossFit::ELossFit", 200),
611 DGUARD(
fDebug, 3,
"Default CTOR AliFMDEnergyFitter::RingHistos");
624 fFits(
"AliFMDCorrELossFit::ELossFit", 200),
634 DGUARD(
fDebug, 3,
"Named CTOR AliFMDEnergyFitter::RingHistos: FMD%d%c",
644 DGUARD(
fDebug, 3,
"DTOR of AliFMDEnergyFitter::RingHistos");
669 for (i = 1; i < n+1; i++) {
671 Double_t next = bins[i-1] + dx + dI * dI * dx;
673 if (next > max)
break;
699 TArrayD deAxis = MakeIncreasingAxis(nDeBins, 0, deMax);
700 mAxis.Set(deAxis.GetSize()-1, deAxis.GetArray());
703 mAxis.Set(nDeBins, 0, deMax);
705 if (mAxis.GetXbins()->GetArray()) {
707 if (eAxis.GetXbins()->GetArray()) {
709 h =
new TH2D(name, title,
710 eAxis.GetNbins(), eAxis.GetXbins()->GetArray(),
711 mAxis.GetNbins(), mAxis.GetXbins()->GetArray());
715 h =
new TH2D(name, title,
716 eAxis.GetNbins(), eAxis.GetXmin(), eAxis.GetXmax(),
717 mAxis.GetNbins(), mAxis.GetXbins()->GetArray());
722 if (eAxis.GetXbins()->GetArray()) {
724 h =
new TH2D(name, title,
725 eAxis.GetNbins(), eAxis.GetXbins()->GetArray(),
726 mAxis.GetNbins(), mAxis.GetXmin(), mAxis.GetXmax());
730 h =
new TH2D(name, title,
731 eAxis.GetNbins(), eAxis.GetXmin(), eAxis.GetXmax(),
732 mAxis.GetNbins(), mAxis.GetXmin(), mAxis.GetXmax());
736 h->SetYTitle(
"#sum#DeltaE/#DeltaE_{mip}");
737 h->SetXTitle(
"#eta");
738 h->SetFillColor(Color());
739 h->SetMarkerColor(Color());
740 h->SetLineColor(Color());
741 h->SetFillStyle(3001);
742 h->SetMarkerStyle(20);
757 DGUARD(
fDebug, 2,
"Define output in AliFMDEnergyFitter::RingHistos");
758 fList = DefineOutputList(dir);
783 DGUARD(
fDebug, 2,
"Initialize in AliFMDEnergyFitter::RingHistos");
784 fEDist =
new TH1D(Form(
"%s_edist", fName.Data()),
785 Form(
"#sum#DeltaE/#DeltaE_{mip} for %s", fName.Data()),
787 fEDist->SetXTitle(
"#sum#Delta/#Delta_{mip}");
788 fEDist->SetFillColor(Color());
789 fEDist->SetLineColor(Color());
790 fEDist->SetMarkerColor(Color());
791 fEDist->SetFillStyle(3001);
792 fEDist->SetMarkerStyle(20);
794 fEDist->SetDirectory(0);
796 fEmpty =
static_cast<TH1D*
>(fEDist->Clone(Form(
"%s_empty", fName.Data())));
797 fEmpty->SetTitle(Form(
"#sum#DeltaE/#DeltaE_{mip} for %s (empty events)",
799 fEmpty->SetDirectory(0);
803 fHist =
Make(
"eloss",
"#sum#Delta/#Delta_{mip}", eAxis,
804 maxDE, nDEbins, useIncrBin);
826 DGUARD(
fDebug, 10,
"Filling in AliFMDEnergyFitter::RingHistos");
835 Warning(
"Fill",
"No list of E dists defined");
838 fHist->Fill(eta, mult);
854 const TAxis& eta)
const
867 TH1D* h =
new TH1D(Form(
"%s_%s", fName.Data(), name),
868 Form(
"%s for %s", title, fName.Data()),
869 eta.GetNbins(), eta.GetXmin(), eta.GetXmax());
870 h->SetXTitle(
"#eta");
873 h->SetFillColor(Color());
874 h->SetMarkerColor(Color());
875 h->SetLineColor(Color());
876 h->SetFillStyle(3001);
906 Double_t xlow = eta.GetBinLowEdge(low);
907 Double_t xhigh = eta.GetBinUpEdge(high);
908 TH1D* h =
new TH1D(Form(
"%s_%s", fName.Data(), name),
909 Form(
"%s for %s", title, fName.Data()),
911 h->SetBinContent(1, val);
912 h->SetBinError(1, err);
913 h->SetXTitle(
"#eta");
917 h->SetMarkerColor(Color());
918 h->SetLineColor(Color());
939 return FitSlices(dir,
"eloss", lowCut, nParticles, minEntries,
940 minusBins, relErrorCut, chi2nuCut, minWeight, regCut,
941 residuals,
true, &fBest);
977 DGUARD(
fDebug, 2,
"Fit in AliFMDEnergyFitter::RingHistos");
980 TList* l = GetOutputList(dir);
985 TH2* h =
static_cast<TH2*
>(l->FindObject(name));
987 AliWarningF(
"Didn't find 2D histogram '%s' in %s", name, l->GetName());
989 dists =
static_cast<TList*
>(l->FindObject(
"EDists"));
991 AliWarningF(
"Didn't find EtaEDists (%s) in %s",
992 fName.Data(), l->GetName());
997 if (!h && !dists)
return 0;
999 const TAxis* pEta = (h ? h->GetXaxis() :
1000 static_cast<TAxis*
>(dir->FindObject(
"etaAxis")));
1002 AliWarningF(
"Didn't find the eta axis - either from histogram %p or "
1003 "list %p (%s)", h, dir, (dir ? dir->GetName() :
"-"));
1006 const TAxis& eta = *pEta;
1011 out->SetName(Form(
"%sDists", name));
1018 resi->SetName(Form(
"%sResiduals", name));
1025 pars->SetName(Form(
"%sResults", name));
1036 TH1* hA[nParticles-1];
1037 pars->Add(hChi2 = MakePar(
"chi2",
"#chi^{2}/#nu", eta));
1038 pars->Add(hC = MakePar(
"c",
"Constant", eta));
1039 pars->Add(hDelta = MakePar(
"delta",
"#Delta_{p}", eta));
1040 pars->Add(hXi = MakePar(
"xi",
"#xi", eta));
1041 pars->Add(hSigma = MakePar(
"sigma",
"#sigma", eta));
1042 pars->Add(hSigmaN = MakePar(
"sigman",
"#sigma_{n}", eta));
1043 pars->Add(hN = MakePar(
"n",
"N", eta));
1044 for (
UShort_t i = 1; i < nParticles; i++)
1045 pars->Add(hA[i-1] = MakePar(Form(
"a%d",i+1), Form(
"a_{%d}",i+1), eta));
1048 Int_t nDists = h ? h->GetNbinsX() : dists->GetEntries();
1055 best->Expand(nDists+1);
1057 best->SetOwner(
false);
1059 for (
Int_t i = 0; i < nDists; i++) {
1062 TH1D* dist = (h ? h->ProjectionY(Form(fgkEDistFormat,GetName(),b),b,b,
"e")
1063 :
static_cast<TH1D*
>(dists->At(i)));
1070 dist->SetDirectory(0);
1072 dist->SetTitle(Form(
"#Delta/#Delta_{mip} for %s in %6.2f<#eta<%6.2f",
1073 GetName(), eta.GetBinLowEdge(b),
1074 eta.GetBinUpEdge(b)));
1091 case 1: nEmpty++;
break;
1092 case 2: nLow++;
break;
1103 if (best) best->AddAt(res, b);
1110 CalculateResiduals(residuals, lowCut, dist, res, resi);
1113 low = TMath::Min(low,b);
1114 high = TMath::Max(high,b);
1122 hChi2 ->SetBinContent(b, ndf > 0 ? chi2 / ndf : 0);
1123 hC ->SetBinContent(b, res->
fC);
1124 hDelta ->SetBinContent(b, res->
fDelta);
1125 hXi ->SetBinContent(b, res->
fXi);
1126 hSigma ->SetBinContent(b, res->
fSigma);
1127 hSigmaN ->SetBinContent(b, res->
fSigmaN);
1128 hN ->SetBinContent(b, res->
fN);
1130 hC ->SetBinError(b, res->
fEC);
1131 hDelta ->SetBinError(b, res->
fEDelta);
1132 hXi ->SetBinError(b, res->
fEXi);
1133 hSigma ->SetBinError(b, res->
fESigma);
1134 hSigmaN->SetBinError(b, res->
fESigmaN);
1137 for (
UShort_t j = 0; j < nParticles-1; j++) {
1138 hA[j]->SetBinContent(b, res->
fA[j]);
1139 hA[j]->SetBinError(b, res->
fEA[j]);
1142 printf(
"%s: Out of %d histograms, %d where empty, %d had too little data,"
1143 "leaving %d to be fitted, of which %d succeeded\n",
1144 GetName(), nDists, nEmpty, nLow, nDists-nEmpty-nLow, nFitted);
1147 TH1* total = GetOutputHist(l, Form(
"%s_edist", fName.Data()));
1165 pars->Add(MakeTotal(
"t_chi2",
"#chi^{2}/#nu", eta, low, high,
1166 ndf > 0 ? chi2/ndf : 0, 0));
1167 pars->Add(MakeTotal(
"t_c",
"Constant", eta, low, high,
1169 pars->Add(MakeTotal(
"t_delta",
"#Delta_{p}", eta, low, high,
1171 pars->Add(MakeTotal(
"t_xi",
"#xi", eta, low, high,
1173 pars->Add(MakeTotal(
"t_sigma",
"#sigma", eta, low, high,
1175 pars->Add(MakeTotal(
"t_sigman",
"#sigma_{n}", eta, low, high,
1177 pars->Add(MakeTotal(
"t_n",
"N", eta, low, high,
1179 for (
UShort_t j = 0; j < nParticles-1; j++)
1180 pars->Add(MakeTotal(Form(
"t_a%d",j+2),
1181 Form(
"a_{%d}",j+2), eta, low, high,
1186 TH1* status =
new TH1I(Form(
"%sStatus",name),
"Status of Fits", 5, 0, 5);
1187 status->GetXaxis()->SetBinLabel(1,
"Total");
1188 status->GetXaxis()->SetBinLabel(2,
"Empty");
1189 status->GetXaxis()->SetBinLabel(3, Form(
"<%d", minEntries));
1190 status->GetXaxis()->SetBinLabel(4,
"Candidates");
1191 status->GetXaxis()->SetBinLabel(5,
"Fitted");
1192 status->SetXTitle(
"Status");
1193 status->SetYTitle(
"# of #Delta distributions");
1194 status->SetBinContent(1, nDists);
1195 status->SetBinContent(2, nEmpty);
1196 status->SetBinContent(3, nLow);
1197 status->SetBinContent(4, nDists-nLow-nEmpty);
1198 status->SetBinContent(5, nFitted);
1199 status->SetFillColor(Color());
1200 status->SetFillStyle(3001);
1201 status->SetLineColor(Color());
1202 status->SetDirectory(0);
1203 status->SetStats(0);
1214 dist->Scale(1.,
"width");
1257 DGUARD(
fDebug, 2,
"Fit histogram in AliFMDEnergyFitter::RingHistos: %s",
1262 if (dist->GetEntries() <= 0) {
1269 Int_t cutBin = TMath::Max(dist->GetXaxis()->FindBin(lowCut),3);
1270 Int_t maxBin = TMath::Min(dist->GetXaxis()->FindBin(10),
1272 dist->GetXaxis()->SetRange(cutBin, maxBin);
1275 Int_t peakBin = dist->GetMaximumBin();
1279 Double_t max = dist->GetBinContent(peakBin);
1284 if (scaleToPeak) dist->Scale(1/max);
1285 DMSG(
fDebug,5,
"max(%s) -> %f", dist->GetName(), max);
1288 Double_t nEntries = dist->GetEntries();
1289 if (nEntries <= minEntries) {
1290 AliWarning(Form(
"Histogram at %s has too few entries (%f <= %d)",
1291 dist->GetName(), nEntries, minEntries));
1302 if (dist->GetEntries() > regCut) {
1304 Double_t s = TMath::Sqrt(dist->GetEntries() / regCut);
1305 if (
fDebug > 2) printf(
"Error scale: %f ", s);
1306 for (
Int_t i = 1; i <= dist->GetNbinsX(); i++) {
1308 dist->SetBinError(i, e * s);
1313 if (nParticles == 1) {
1319 TF1* ff =
new TF1(*r);
1320 dist->GetListOfFunctions()->Add(ff);
1332 for (
Int_t i = nFits-1; i >= 0; i--) {
1335 dist->GetListOfFunctions()->Add(
new TF1(*ff));
1341 ELossFit_t* ret = FindBestFit(dist, relErrorCut, chi2nuCut, minWeight);
1342 if (!ret) status = 3;
1368 TList* funcs = dist->GetListOfFunctions();
1374 if (
fDebug) printf(
"Find best fit for %s ... ", dist->GetName());
1375 if (
fDebug > 2) printf(
"\n");
1379 while ((func = static_cast<TF1*>(next()))) {
1386 Printf(
"%10s: %3d (chi^2/nu: %6.3f)",
1393 if (
fDebug > 2) fFits.Print(
"s");
1398 AliWarningF(
"No fit found for %s", GetName());
1402 if (
fDebug > 1) printf(
" %d: ", i-1);
1420 TH1* resi =
static_cast<TH1*
>(dist->Clone());
1421 TString tit(resi->GetTitle());
1422 tit.ReplaceAll(
"#DeltaE/#DeltaE_{mip}",
"Residuals");
1423 resi->SetTitle(tit);
1424 resi->SetDirectory(0);
1429 resi->SetYTitle(
"h_{i}-f(#Delta_{i}) #pm #delta_{i}");
1432 resi->SetYTitle(
"[h_{i}-f(#Delta_{i})]/#delta_{i}");
break;
1434 resi->SetYTitle(
"#chi_{i}^{2}=[h_{i}-f(#Delta_{i})]^{2}/#delta^{2}_{i}");
1437 resi->SetYTitle(
"Unknown");
1443 Double_t highCut = dist->GetXaxis()->GetXmax();
1445 if (fit->
GetN() > 1)
1446 funcName = Form(
"nlandau%d", fit->
GetN());
1447 TF1* func = dist->GetFunction(funcName);
1448 if (func) func->GetRange(lowCut, highCut);
1449 resi->Reset(
"ICES");
1450 resi->GetListOfFunctions()->Clear();
1451 resi->SetUniqueID(mode);
1454 Int_t nX = resi->GetNbinsX();
1455 for (
Int_t i = 1; i <= nX; i++) {
1456 Double_t x = dist->GetBinCenter(i);
1457 if (x < lowCut)
continue;
1458 if (x > highCut)
break;
1460 Double_t h = dist->GetBinContent(i);
1464 if (h > 0 && e > 0) {
1472 default: r = 0;
break;
1476 resi->SetBinContent(i, r);
1477 resi->SetBinError(i, er);
1503 TList* l = GetOutputList(d);
1507 TList* dists =
static_cast<TList*
>(l->FindObject(
"elossDists"));
1509 AliWarningF(
"Didn't find elossDists in %s", l->GetName());
1513 Int_t nBin = eta.GetNbins();
1514 if (fBest.GetEntriesFast() <= 0) {
1515 AliWarningF(
"No fits found for %s", GetName());
1519 for (
Int_t b = 1; b <= nBin; b++) {
1527 best->
fRing = fRing;
1530 printf(
"Bin # %3d: ", b);
1534 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)
ClassImp(AliFMDEnergyFitter) namespace
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)