@@ -99,6 +99,8 @@ int runMassFitter(const TString& configFileName)
9999 std ::vector < double > massMin ;
100100 std ::vector < double > massMax ;
101101 std ::vector < double > fixSigmaManual ;
102+ std ::vector < double > fixSecondSigmaManual ;
103+ std ::vector < double > fixMeanManual ;
102104 std ::vector < int > nRebin ;
103105 std ::vector < int > bkgFuncConfig ;
104106 std ::vector < int > sgnFuncConfig ;
@@ -121,15 +123,24 @@ int runMassFitter(const TString& configFileName)
121123 const Value & fdSecPeakHistoNameValue = config ["FDSecPeakHistoName" ];
122124 parseStringArray (fdSecPeakHistoNameValue , fdSecPeakHistoName );
123125
124- bool fixSigma = config ["FixSigma" ].GetBool ();
125- std ::string sigmaFile = config ["SigmaFile" ].GetString ();
126+ const bool fixSigma = config ["FixSigma" ].GetBool ();
127+ const std ::string sigmaFile = config ["SigmaFile" ].GetString ();
126128
127- bool fixMean = config ["FixMean" ].GetBool ();
128- std ::string meanFile = config ["MeanFile" ].GetString ();
129+ const bool fixMean = config ["FixMean" ].GetBool ();
130+ const std ::string meanFile = config ["MeanFile" ].GetString ();
129131
130132 const Value & fixSigmaManualValue = config ["FixSigmaManual" ];
131133 readArray (fixSigmaManualValue , fixSigmaManual );
132134
135+ const bool fixSecondSigma = config ["FixSecondSigma" ].GetBool ();
136+ const std ::string secondSigmaFile = config ["SecondSigmaFile" ].GetString ();
137+
138+ const Value & fixSecondSigmaManualValue = config ["FixSecondSigmaManual" ];
139+ readArray (fixSecondSigmaManualValue , fixSecondSigmaManual );
140+
141+ const Value & fixMeanManualValue = config ["FixMeanManual" ];
142+ readArray (fixMeanManualValue , fixMeanManual );
143+
133144 sliceVarName = config ["SliceVarName" ].GetString ();
134145 sliceVarUnit = config ["SliceVarUnit" ].GetString ();
135146
@@ -295,35 +306,29 @@ int runMassFitter(const TString& configFileName)
295306 setHistoStyle (hRawYieldsChiSquareTotal );
296307 setHistoStyle (hReflectionOverSignal , kRed + 1 );
297308
298- TH1 * hSigmaToFix = nullptr ;
299- if (fixSigma ) {
300- if (fixSigmaManual .empty ()) {
301- auto inputFileSigma = TFile ::Open (sigmaFile .data ());
302- if (!inputFileSigma ) {
303- return -2 ;
304- }
305- hSigmaToFix = inputFileSigma -> Get < TH1 > ("hRawYieldsSigma" );
306- hSigmaToFix -> SetDirectory (0 );
307- if (static_cast < unsigned int > (hSigmaToFix -> GetNbinsX ()) != nSliceVarBins ) {
308- printf ("WARNING: Different number of bins for this analysis and histo for fix sigma!\n" );
309+ auto getHistToFix = [& nSliceVarBins ](bool const & isFix , std ::vector < double > const & fixManual , std ::string const & fixFileName , std ::string const & var ) -> TH1 * {
310+ TH1 * histToFix = nullptr ;
311+ if (isFix ) {
312+ if (fixManual .empty ()) {
313+ auto fixInputFile = TFile ::Open (fixFileName .data ());
314+ if (!fixInputFile ) {
315+ throw std ::runtime_error ("Cannot open file for fixed " + var );
316+ }
317+ const std ::string histName = "hRawYields" + var ;
318+ histToFix = fixInputFile -> Get < TH1 > (histName .data ());
319+ histToFix -> SetDirectory (nullptr );
320+ if (static_cast < unsigned int > (histToFix -> GetNbinsX ()) != nSliceVarBins ) {
321+ throw std ::runtime_error ("Different number of bins for this analysis and histo for fixed " + var );
322+ }
323+ fixInputFile -> Close ();
309324 }
310- inputFileSigma -> Close ();
311325 }
312- }
326+ return histToFix ;
327+ };
313328
314- TH1 * hMeanToFix = nullptr ;
315- if (fixMean ) {
316- auto inputFileMean = TFile ::Open (meanFile .data ());
317- if (!inputFileMean ) {
318- return -3 ;
319- }
320- hMeanToFix = inputFileMean -> Get < TH1 > ("hRawYieldsMean" );
321- hMeanToFix -> SetDirectory (0 );
322- if (static_cast < unsigned int > (hMeanToFix -> GetNbinsX ()) != nSliceVarBins ) {
323- printf ("WARNING: Different number of bins for this analysis and histo for fix mean\n" );
324- }
325- inputFileMean -> Close ();
326- }
329+ TH1 * hSigmaToFix = getHistToFix (fixSigma , fixSigmaManual , sigmaFile , "Sigma" );
330+ TH1 * hMeanToFix = getHistToFix (fixMean , fixMeanManual , meanFile , "Mean" );
331+ TH1 * hSecondSigmaToFix = getHistToFix (fixSecondSigma , fixSecondSigmaManual , secondSigmaFile , "Sigma" );
327332
328333 // fit histograms
329334
@@ -433,24 +438,26 @@ int runMassFitter(const TString& configFileName)
433438 if (useLikelihood ) {
434439 massFitter -> setUseLikelihoodFit ();
435440 }
436- if (fixMean ) {
437- massFitter -> setFixGaussianMean (hMeanToFix -> GetBinContent (iSliceVar + 1 ));
438- }
439- if (fixSigma ) {
440- if (fixSigmaManual .empty ()) {
441- massFitter -> setFixGaussianSigma (hSigmaToFix -> GetBinContent (iSliceVar + 1 ));
442- printf ("*****************************\n" );
443- printf ("FIXED SIGMA: %f\n" , hSigmaToFix -> GetBinContent (iSliceVar + 1 ));
444- printf ("*****************************\n" );
445- } else if (!fixSigmaManual .empty ()) {
446- massFitter -> setFixGaussianSigma (fixSigmaManual [iSliceVar ]);
447- printf ("*****************************\n" );
448- printf ("FIXED SIGMA: %f\n" , fixSigmaManual [iSliceVar ]);
449- printf ("*****************************\n" );
450- } else {
451- printf ("WARNING: impossible to fix sigma! Wrong fix sigma file or value!\n" );
441+
442+ auto setFixedValue = [& massFitter , & iSliceVar ](bool const & isFix , std ::vector < double > const & fixManual , const TH1 * histToFix , std ::function < void (Double_t )> setFunc , std ::string const & var ) -> void {
443+ if (isFix ) {
444+ if (fixManual .empty ()) {
445+ setFunc (histToFix -> GetBinContent (iSliceVar + 1 ));
446+ printf ("*****************************\n" );
447+ printf ("FIXED %s: %f\n" , var .data (), histToFix -> GetBinContent (iSliceVar + 1 ));
448+ printf ("*****************************\n" );
449+ } else {
450+ setFunc (fixManual [iSliceVar ]);
451+ printf ("*****************************\n" );
452+ printf ("FIXED %s: %f\n" , var .data (), fixManual [iSliceVar ]);
453+ printf ("*****************************\n" );
454+ }
452455 }
453- }
456+ };
457+
458+ setFixedValue (fixMean , fixMeanManual , hMeanToFix , std ::bind (& HFInvMassFitter ::setFixGaussianMean , massFitter , std ::placeholders ::_1 ), "MEAN" );
459+ setFixedValue (fixSigma , fixSigmaManual , hSigmaToFix , std ::bind (& HFInvMassFitter ::setFixGaussianSigma , massFitter , std ::placeholders ::_1 ), "SIGMA" );
460+ setFixedValue (fixSecondSigma , fixSecondSigmaManual , hSecondSigmaToFix , std ::bind (& HFInvMassFitter ::setFixSecondGaussianSigma , massFitter , std ::placeholders ::_1 ), "SECOND SIGMA" );
454461
455462 if (enableRefl ) {
456463 reflOverSgn = hMassForSgn [iSliceVar ]-> Integral (hMassForSgn [iSliceVar ]-> FindBin (massMin [iSliceVar ] * 1.0001 ), hMassForSgn [iSliceVar ]-> FindBin (massMax [iSliceVar ] * 0.999 ));
0 commit comments