5454#include < cstring>
5555#include < stdexcept>
5656#include < string>
57+ #include < utility>
5758#include < vector>
5859
5960using namespace RooFit ;
@@ -202,14 +203,14 @@ void HFInvMassFitter::doFit()
202203 mass->setRange (" SBL" , mMinMass , mMass - mNSigmaForSidebands * mSigmaSgn );
203204 mass->setRange (" SBR" , mMass + mNSigmaForSidebands * mSigmaSgn , mSecMass - mNSigmaForSidebands * mSecSigma );
204205 mass->setRange (" SEC" , mSecMass + mNSigmaForSidebands * mSecSigma , mMaxMass );
205- mass->setRange (" signal" , mSecMass - mNSigmaForSidebands * mSecSigma , mSecMass + mNSigmaForSidebands * mSecSigma );
206+ mass->setRange (" signal" , mSecMass - mNSigmaForSgn * mSecSigma , mSecMass + mNSigmaForSgn * mSecSigma );
206207 } else { // Single Peak fit range
207208 mass->setRange (" SBL" , mMinMass , mMass - mNSigmaForSidebands * mSigmaSgn );
208209 mass->setRange (" SBR" , mMass + mNSigmaForSidebands * mSigmaSgn , mMaxMass );
209210 mass->setRange (" signal" , mMass - mNSigmaForSgn * mSigmaSgn , mMass + mNSigmaForSgn * mSigmaSgn );
210211 }
211212 }
212- mass->setRange (" bkg" , mMass - 4 * mSigmaSgn , mMass + 4 * mSigmaSgn );
213+ mass->setRange (" bkg" , mMass - mNSigmaForSgn * mSigmaSgn , mMass + mNSigmaForSgn * mSigmaSgn );
213214 mass->setRange (" full" , mMinMass , mMaxMass );
214215 mInvMassFrame = mass->frame (Title (Form (" %s" , mHistoInvMass ->GetTitle ()))); // define the frame to plot
215216 dataHistogram.plotOn (mInvMassFrame , Name (" data_c" )); // plot data histogram on the frame
@@ -226,13 +227,14 @@ void HFInvMassFitter::doFit()
226227 mRooNSgn = new RooRealVar (" mRooNSig" , " number of signal" , randomizeInitialParameter (rooNSgnParamRanges), rooNSgnParamRanges.lower , rooNSgnParamRanges.upper ); // signal yield
227228 mTotalPdf = new RooAddPdf (" mMCFunc" , " MC fit function" , RooArgList (*sgnPdf), RooArgList (*mRooNSgn )); // create total pdf
228229 if (strcmp (mFitOption .c_str (), " Chi2" ) == 0 ) {
229- mTotalPdf ->chi2FitTo (dataHistogram, Range (" signal " ));
230+ mTotalPdf ->chi2FitTo (dataHistogram, Range (" full " ));
230231 } else {
231- mTotalPdf ->fitTo (dataHistogram, Range (" signal " ));
232+ mTotalPdf ->fitTo (dataHistogram, Range (" full " ));
232233 }
233234 RooAbsReal* signalIntegralMc = mTotalPdf ->createIntegral (*mass, NormSet (*mass), Range (" signal" )); // sig yield from fit
234235 mIntegralSgn = signalIntegralMc->getValV ();
235- calculateSignal (mRawYield , mRawYieldErr ); // calculate signal and signal error
236+ calculateSignal (mRawYield , mRawYieldErr ); // calculate signal and signal error
237+ countSignal (mRawYieldCounted , mRawYieldCountedErr );
236238 mTotalPdf ->plotOn (mInvMassFrame , Name (" Tot_c" )); // plot total function
237239 // Fit to data ratio
238240 mRatioFrame = mass->frame (Title (Form (" %s" , mHistoInvMass ->GetTitle ())));
@@ -702,10 +704,7 @@ void HFInvMassFitter::drawReflection(TVirtualPad* pad)
702704// calculate signal yield via bin counting
703705void HFInvMassFitter::countSignal (double & signal, double & signalErr) const
704706{
705- const double mean = mRooMeanSgn ->getVal ();
706- const double sigma = mRooSecSigmaSgn ->getVal ();
707- const double minForSgn = mean - mNSigmaForSidebands * sigma;
708- const double maxForSgn = mean + mNSigmaForSidebands * sigma;
707+ const auto [minForSgn, maxForSgn] = getRangesOfSignal ();
709708 const int binForMinSgn = mHistoInvMass ->FindBin (minForSgn);
710709 const int binForMaxSgn = mHistoInvMass ->FindBin (maxForSgn);
711710 const double binForMinSgnUpperEdge = mHistoInvMass ->GetBinLowEdge (binForMinSgn + 1 );
@@ -758,8 +757,7 @@ void HFInvMassFitter::calculateSignificance(double& significance, double& errSig
758757// estimate Signal
759758void HFInvMassFitter::checkForSignal (double & estimatedSignal)
760759{
761- double const minForSgn = mMass - 4 * mSigmaSgn ;
762- double const maxForSgn = mMass + 4 * mSigmaSgn ;
760+ auto const [minForSgn, maxForSgn] = getRangesOfSignal ();
763761 int const binForMinSgn = mHistoInvMass ->FindBin (minForSgn);
764762 int const binForMaxSgn = mHistoInvMass ->FindBin (maxForSgn);
765763
@@ -772,6 +770,19 @@ void HFInvMassFitter::checkForSignal(double& estimatedSignal)
772770 estimatedSignal = sum - bkg;
773771}
774772
773+ // Estimate ranges where signal is located to be used in countSignal() and checkForSignal()
774+ // It is mu +- n*sigma for Gaussian, and the entire mInv histogram for DoubleSidedCrystalBall (due to heavy tails)
775+ std::pair<double , double > HFInvMassFitter::getRangesOfSignal () const
776+ {
777+ if (mTypeOfSgnPdf == DoubleSidedCrystalBall) {
778+ return std::make_pair (mMinMass , mMaxMass );
779+ } else {
780+ const double mean = mRooMeanSgn ->getVal ();
781+ const double sigma = mRooSigmaSgn ->getVal ();
782+ return std::make_pair (mean - mNSigmaForSgn * sigma, mean + mNSigmaForSgn * sigma);
783+ }
784+ }
785+
775786// Create Background Fit Function
776787RooAbsPdf* HFInvMassFitter::createBackgroundFitFunction (RooWorkspace* workspace) const
777788{
0 commit comments