Skip to content

Commit 5aee216

Browse files
committed
fix estimate and ranging of BG and SIG integral
1 parent 5e8e9ec commit 5aee216

2 files changed

Lines changed: 42 additions & 17 deletions

File tree

PWGHF/D2H/Macros/HFInvMassFitter.cxx

Lines changed: 41 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,6 @@ HFInvMassFitter::~HFInvMassFitter()
191191

192192
void HFInvMassFitter::doFit()
193193
{
194-
const double integralHisto = mHistoInvMass->Integral(mHistoInvMass->FindBin(mMinMass), mHistoInvMass->FindBin(mMaxMass));
195194
mWorkspace = new RooWorkspace("mWorkspace");
196195
fillWorkspace(*mWorkspace);
197196
RooRealVar* mass = mWorkspace->var("mass");
@@ -221,7 +220,8 @@ void HFInvMassFitter::doFit()
221220

222221
// fit MC or Data
223222
if (mTypeOfBkgPdf == NoBkg) { // MC
224-
const ParameterRanges rooNSgnParamRanges{0., 1.2 * integralHisto, 0.3 * integralHisto};
223+
const double integralHisto = integrateHistoInvMassOverWorkspaceRanges({"full"});
224+
const ParameterRanges rooNSgnParamRanges{0.5 * integralHisto, 1.5 * integralHisto, integralHisto};
225225
mRooNSgn = new RooRealVar("mRooNSig", "number of signal", randomizeInitialParameter(rooNSgnParamRanges), rooNSgnParamRanges.lower, rooNSgnParamRanges.upper); // signal yield
226226
mTotalPdf = new RooAddPdf("mMCFunc", "MC fit function", RooArgList(*sgnPdf), RooArgList(*mRooNSgn)); // create total pdf
227227
if (strcmp(mFitOption.c_str(), "Chi2") == 0) {
@@ -238,24 +238,23 @@ void HFInvMassFitter::doFit()
238238
mRatioFrame = mass->frame(Title(Form("%s", mHistoInvMass->GetTitle())));
239239
calculateFitToDataRatio();
240240
} else { // data
241-
const ParameterRanges rooNBkgParamRanges{0., 1.2 * integralHisto, 0.3 * integralHisto};
241+
const double integralSidebands = integrateHistoInvMassOverWorkspaceRanges({"SBL", "SBR"});
242+
const ParameterRanges rooNBkgParamRanges{0.5 * integralSidebands, 1.5 * integralSidebands, integralSidebands};
243+
std::cout << "integralSidebands = " << integralSidebands << "\n";
244+
std::cout << "rooNBkgParamRanges:\n";
242245
mRooNBkg = new RooRealVar("mRooNBkg", "number of background", randomizeInitialParameter(rooNBkgParamRanges), rooNBkgParamRanges.lower, rooNBkgParamRanges.upper); // background yield
243246
mBkgPdf = new RooAddPdf("mBkgPdf", "background fit function", RooArgList(*bkgPdf), RooArgList(*mRooNBkg));
244247
std::string sbRanges{"SBL,SBR"};
245248
if (mTypeOfSgnPdf == GausSec) { // two peak fit
246249
sbRanges.append(",SEC");
247-
if (strcmp(mFitOption.c_str(), "Chi2") == 0) {
248-
mBkgPdf->chi2FitTo(dataHistogram, Range(sbRanges.c_str()), Save());
249-
} else {
250-
mBkgPdf->fitTo(dataHistogram, Range(sbRanges.c_str()), Save());
251-
}
252-
} else { // single peak fit
253-
if (strcmp(mFitOption.c_str(), "Chi2") == 0) {
254-
mBkgPdf->chi2FitTo(dataHistogram, Range(sbRanges.c_str()), Save());
255-
} else {
256-
mBkgPdf->fitTo(dataHistogram, Range(sbRanges.c_str()), Save());
257-
}
258250
}
251+
if (strcmp(mFitOption.c_str(), "Chi2") == 0) {
252+
mBkgPdf->chi2FitTo(dataHistogram, Range(sbRanges.c_str()), Save());
253+
} else {
254+
mBkgPdf->fitTo(dataHistogram, Range(sbRanges.c_str()), Save());
255+
}
256+
257+
std::cout << "mRooNBkg->getVal() = " << mRooNBkg->getVal() << "\n";
259258
// define the frame to evaluate background sidebands chi2 (bg pdf needs to be plotted within sideband ranges)
260259
RooPlot* frameTemporary = mass->frame(Title(Form("%s_temp", mHistoInvMass->GetTitle())));
261260
dataHistogram.plotOn(frameTemporary, Name("data_for_bkgchi2"));
@@ -275,7 +274,8 @@ void HFInvMassFitter::doFit()
275274
checkForSignal(estimatedSignal); // SIG's absolute integral in "bkg" range
276275
calculateBackground(mBkgYield, mBkgYieldErr); // BG's absolute integral in "bkg" range
277276

278-
const ParameterRanges rooNSgnParamRanges{0., 1.2 * estimatedSignal, 0.3 * estimatedSignal};
277+
std::cout << "estimatedSignal = " << estimatedSignal << "\n";
278+
const ParameterRanges rooNSgnParamRanges{0.5 * estimatedSignal, 1.5 * estimatedSignal, estimatedSignal};
279279
mRooNSgn = new RooRealVar("mNSgn", "number of signal", randomizeInitialParameter(rooNSgnParamRanges), rooNSgnParamRanges.lower, rooNSgnParamRanges.upper); // estimated signal yield
280280
if (mFixedRawYield > 0) {
281281
mRooNSgn->setVal(mFixedRawYield); // fixed signal yield
@@ -328,6 +328,8 @@ void HFInvMassFitter::doFit()
328328
} else {
329329
mTotalPdf->fitTo(dataHistogram);
330330
}
331+
std::cout << "mRooNBkg->getVal() = " << mRooNBkg->getVal() << "\n";
332+
std::cout << "mRooNSgn->getVal() = " << mRooNSgn->getVal() << "\n";
331333
plotBkg(mTotalPdf);
332334
mTotalPdf->plotOn(mInvMassFrame, Name("Tot_c"), LineColor(kBlue));
333335
mSgnPdf->plotOn(mInvMassFrame, Normalization(1.0, RooAbsReal::RelativeExpected), DrawOption("F"), FillColor(TColor::GetColorTransparent(kBlue, 0.2)), VLines());
@@ -744,13 +746,15 @@ void HFInvMassFitter::calculateSignal(double& signal, double& errSignal) const
744746
// calculate background yield
745747
void HFInvMassFitter::calculateBackground(double& bkg, double& errBkg) const
746748
{
749+
std::cout << "calculateBackground()\n";
747750
if (mTypeOfBkgPdf == NoBkg) {
748751
bkg = 0.;
749752
errBkg = 0.;
750753
return;
751754
}
752-
bkg = mRooNBkg->getVal() * mIntegralBkg;
753-
errBkg = mRooNBkg->getError() * mIntegralBkg;
755+
const double bgCoefficient = mTypeOfSgnPdf == DoubleSidedCrystalBall ? 1. : mIntegralBkg;
756+
bkg = mRooNBkg->getVal() * bgCoefficient;
757+
errBkg = mRooNBkg->getError() * bgCoefficient;
754758
}
755759

756760
// calculate significance
@@ -770,6 +774,7 @@ void HFInvMassFitter::calculateSignificance(double& significance, double& errSig
770774
// estimate Signal
771775
void HFInvMassFitter::checkForSignal(double& estimatedSignal)
772776
{
777+
std::cout << "checkForSignal()\n";
773778
auto const [minForSgn, maxForSgn] = getRangesOfSignal();
774779
int const binForMinSgn = mHistoInvMass->FindBin(minForSgn);
775780
int const binForMaxSgn = mHistoInvMass->FindBin(maxForSgn);
@@ -780,6 +785,7 @@ void HFInvMassFitter::checkForSignal(double& estimatedSignal)
780785
}
781786
double bkg{}, errBkg{};
782787
calculateBackground(bkg, errBkg);
788+
std::cout << "sum = " << sum << ", bkg = " << bkg << "\n";
783789
estimatedSignal = sum - bkg;
784790
}
785791

@@ -1148,5 +1154,23 @@ double HFInvMassFitter::randomizeInitialParameter(const ParameterRanges& paramet
11481154
}
11491155
} while (result < parameterRanges.lower || result > parameterRanges.upper);
11501156

1157+
std::cout << "randomizeInitialParameter():\nfrom " << parameterRanges.lower << "\nto " << parameterRanges.upper << "\ninitial " << parameterRanges.initial << "\nsigma " << sigma << "\n";
1158+
std::cout << "randomized to " << result << "\n";
1159+
11511160
return result;
11521161
}
1162+
1163+
double HFInvMassFitter::integrateHistoInvMassOverWorkspaceRanges(const std::vector<std::string>& ranges) const
1164+
{
1165+
double sumEntries{0.};
1166+
double sumLengths{0.};
1167+
for (const auto& range : ranges) {
1168+
const auto [lo, hi] = mWorkspace->var("mass")->getRange(range.c_str());
1169+
sumEntries += mHistoInvMass->Integral(mHistoInvMass->FindBin(lo), mHistoInvMass->FindBin(hi));
1170+
sumLengths += (hi - lo);
1171+
}
1172+
const auto [fullLo, fullHi] = mWorkspace->var("mass")->getRange("full");
1173+
const double fullLength = fullHi - fullLo;
1174+
1175+
return sumEntries / sumLengths * fullLength;
1176+
}

PWGHF/D2H/Macros/HFInvMassFitter.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,7 @@ class HFInvMassFitter : public TNamed
179179
void highlightPeakRegion(const RooPlot* plot, Color_t color = kGray + 1, Width_t width = 1, Style_t style = 2) const;
180180
[[nodiscard]] double randomizeInitialParameter(const ParameterRanges& parameterRanges) const;
181181
[[nodiscard]] std::pair<double, double> getRangesOfSignal() const;
182+
[[nodiscard]] double integrateHistoInvMassOverWorkspaceRanges(const std::vector<std::string>& ranges) const;
182183

183184
TH1* mHistoInvMass; // histogram to fit
184185
std::string mFitOption;

0 commit comments

Comments
 (0)