@@ -191,7 +191,6 @@ HFInvMassFitter::~HFInvMassFitter()
191191
192192void 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
745747void 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
771775void 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():\n from " << parameterRanges.lower << " \n to " << parameterRanges.upper << " \n initial " << parameterRanges.initial << " \n sigma " << 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+ }
0 commit comments