#include "ParamValues.hpp" using namespace std; using namespace RooFit; using namespace RooStats; void ParamValues::printProperties(){ coutDebug("Name\t\t\t" + name); coutDebug("LaTeX name\t\t" + latexName); coutDebug("Fixed\t\t\t" + string(fix ? "yes" : "no")); coutDebug("Constrained\t\t" + string(constrain ? "yes" : "no")); coutDebug("val\t\t\t" + to_string(value)); coutDebug("valError\t\t" + to_string(error)); coutDebug("lowRange\t\t" + to_string(ranges[0])); coutDebug("upRange\t\t\t" + to_string(ranges[1])); } void ParamValues::SetParamValues(string s_string, bool fitRef){ if (s_string == "mean"){ name = "sig_mean"; latexName = "B^{+} #mu"; value = PDGMASS.B_PLUS; error = 0.5; constrain = KshortChannel ? false : false; fix = KshortChannel ? false : false; ranges[0] = 5250.0; ranges[1] = 5320.0; } else if (s_string == "sigma"){ name = "sig_sigma"; latexName = "B^{+} #sigma_{1}"; value = OneCB ? 30.0 : 15.0; error = 1.0; constrain = KshortChannel ? false : false; fix = KshortChannel ? true : !fitRef; ranges[0] = 5.0; ranges[1] = 150.; } else if (s_string == "sigma2"){ name = "sig_sigma2"; latexName = "B^{+} #sigma_{2}"; value = anyGaussain ? 18.0 : 12.0; error = 1.0; constrain = KshortChannel ? false : false; fix = KshortChannel ? anyGaussain : anyGaussain; ranges[0] = 5.0; ranges[1] = DoubleGaussian ? 150. : 100.; } else if (s_string == "alpha"){ name = "sig_alpha"; latexName = "B^{+} #alphaCB_{1}"; value = (RightCB || OneCB) ? 1.5 : -1.5; error = 0.1; constrain = KshortChannel ? false : false; fix = KshortChannel ? true : true; ranges[0] = (RightCB || OneCB) ? 0.01 : -3.5; ranges[1] = (RightCB || OneCB) ? 3.5 : -0.01; } else if (s_string == "alpha2"){ name = "sig_alpha2"; latexName = "B^{+} #alphaCB_{2}"; value = 1.5; error = 1.0; constrain = KshortChannel ? false : false; fix = KshortChannel ? true : true; ranges[0] = 0.01; ranges[1] = 3.5; } else if (s_string == "n"){ name = "sig_n"; latexName = "B^{+} #nCB_{1}"; value = 3.1; error = 0.1; constrain = KshortChannel ? false : false; fix = KshortChannel ? true : true; ranges[0] = 2.1; ranges[1] = 4.0; } else if (s_string == "n2"){ name = "sig_n2"; latexName =" B^{+} #nCB_{2}"; value = 4.0; error = 0.1; constrain = KshortChannel ? false : false; fix = KshortChannel ? true : true; ranges[0] = 1.0; ranges[1] = 6.0; } else if (s_string == "f"){ name = "sig_f"; latexName = "f__{B^{+}}"; if (DoubleGaussian) value = 0.5; else if (DoubleCB) value = 0.55; //0.5; CB_left >= CB_right else value = 0.0; error = 0.02; constrain = KshortChannel ? DoubleCB : DoubleCB; fix = KshortChannel ? false : false; ranges[0] = KshortChannel ? 0.05 : 0.15; ranges[1] = KshortChannel ? 0.95 : (DoubleGaussian ? 0.95 : 0.55); } else if (s_string == "exp_par1"){ name = "exp_par1"; latexName = "#lambda_{1}"; value = -0.0015; error = 0.0001; constrain = false; fix = false; ranges[0] = -0.02; ranges[1] = 0.0; } else if (s_string == "exp_par2"){ name = "exp_par2"; latexName = "#lambda_{0}"; value = -0.0016; error = 0.0001; constrain = false; fix = false; ranges[0] = -0.016; ranges[1] = 0.0; } else if (s_string == "bkg_mean"){ //ExpGaus mean name = "bkg_mean"; latexName = "B^{+} #mu"; value = ExpGaus? 5144.0 : PDGMASS.B_PLUS; error = 30.0; constrain = true; fix = false; ranges[0] = ExpGaus ? 5115.0 : PDGMASS.B_PLUS-10; ranges[1] = ExpGaus ? 5175.0 : PDGMASS.B_PLUS+10; } else if (s_string == "bkg_sigma"){ name = "bkg_sigma"; latexName = "B^{+} #sigma_{bkg}"; value = 11.0; error = 1.0; constrain = ExpGaus; fix = !ExpGaus; ranges[0] = 2.0; ranges[1] = 50.; } else if (s_string == "bkg_decay"){ name = "bkg_decay"; latexName = "B^{+} decay coeff"; value = 5140; error = 0.1; constrain = false; fix = false; ranges[0] = 5000.0; ranges[1] = 5150.0; } else if (s_string == "bkg_alpha1"){ name = "bkg_alpha1"; latexName = "B^{+} #alphaCB_{1}^{bkg}"; value = 1.5; error = 1.0; constrain = false; fix = true; ranges[0] = 0.01; ranges[1] = 3.5; } else if (s_string == "bkg_alpha2"){ name = "bkg_alpha2"; latexName = "B^{+} #alphaCB_{2}^{bkg}"; value = 1.5; error = 1.0; constrain = false; fix = true; ranges[0] = 0.01; ranges[1] = 3.5; } else if (s_string == "bkg_n1"){ name = "bkg_n1"; latexName = "B^{+} #nCB_{1}^{bkg}"; value = 5.1; error = 0.1; constrain = false; fix = true; ranges[0] = 0.1; ranges[1] = 20.; } else if (s_string == "bkg_n2"){ name = "bkg_n2"; latexName =" B^{+} #nCB_{2}^{bkg}"; value = 1.4; error = 0.1; constrain = false; fix = true; ranges[0] = 0.1; ranges[1] = 30.; } else if (s_string == "bkg_f"){ name = "bkg_f"; latexName = "f^{bckgnd}_{B^{+}}"; value = 0.5; error = 0.01; constrain = false; fix = false; ranges[0] = 0.15; ranges[1] = 0.99; } if (verboseLevel<3) printProperties(); }; FitValuesWithName getSignalSavedFitValue(string s_name){ //This would have been so much nicer in Python if (s_name == "sig_mean") return FitValuesSignal.sig_mean ; else if (s_name == "sig_sigma") return FitValuesSignal.sig_sigma ; else if (s_name == "sig_sigma2") return FitValuesSignal.sig_sigma2; else if (s_name == "sig_alpha") return FitValuesSignal.sig_alpha ; else if (s_name == "sig_alpha2") return FitValuesSignal.sig_alpha2; else if (s_name == "sig_n") return FitValuesSignal.sig_n ; else if (s_name == "sig_n2") return FitValuesSignal.sig_n2 ; else if (s_name == "sig_f") return FitValuesSignal.sig_f ; else{ coutERROR("Parameter " + s_name + " was not found in the FitValuesSignal vector!"); coutERROR("Returning 0."); return FitValuesWithName("",0.0,0.0); } } FitValuesWithName getBackgroundSavedFitValue(string s_name){ //This would have been so much nicer in Python if (s_name == "bkg_mean") return FitValuesBackground.bkg_mean ; else if (s_name == "bkg_sigma") return FitValuesBackground.bkg_sigma ; else if (s_name == "bkg_decay") return FitValuesBackground.bkg_decay ; else if (s_name == "bkg_alpha1") return FitValuesBackground.bkg_alpha ; else if (s_name == "bkg_alpha2") return FitValuesBackground.bkg_alpha2; else if (s_name == "bkg_n1") return FitValuesBackground.bkg_n ; else if (s_name == "bkg_n2") return FitValuesBackground.bkg_n2 ; else if (s_name == "bkg_f") return FitValuesBackground.bkg_f ; else{ coutERROR("Parameter " + s_name + " was not found in the FitValuesBackground vector!"); coutERROR("Returning 0."); return FitValuesWithName("",0.0,0.0); } } RooRealVar *ParamValues::getRooRealVar(string s_name, bool sig, bool fitRef){ SetParamValues(s_name, fitRef); RooRealVar *variable = new RooRealVar(name.c_str(), latexName.c_str(), value, ranges[0], ranges[1]); if (fix && (sig ? FixParameters : FixBkgParameters)){ coutDebug("Fixing parameter " + string(variable->GetName())); sig ? variable->setVal(getSignalSavedFitValue(variable->GetName()).val) : variable->setVal(getBackgroundSavedFitValue(variable->GetName()).val); variable->setConstant("kTrue"); } if (constrain && (sig ? ConstrParameters: ConstrBkgParameters)){ coutDebug("Adding constrain to " + string(variable->GetName())); if (fix) coutWarning("Cannot constrain parameter " + string(variable->GetName()) + " which is already fixed. Ignore constraining!"); else{ string ConstrName = name + "Constr"; RooGaussian *gauss_contrain_sig = sig ? new RooGaussian(ConstrName.c_str(), ConstrName.c_str(), *variable, RooConst(getSignalSavedFitValue(variable->GetName()).val), RooConst(getSignalSavedFitValue(variable->GetName()).err)) : new RooGaussian(); if (verboseLevel<2 && sig) gauss_contrain_sig->Print(); RooGaussian *gauss_contrain_bkg = sig ? new RooGaussian() : new RooGaussian(ConstrName.c_str(), ConstrName.c_str(), *variable, RooConst(getBackgroundSavedFitValue(variable->GetName()).val), RooConst(getBackgroundSavedFitValue(variable->GetName()).err)); if (verboseLevel<2 && !sig) gauss_contrain_bkg->Print(); sig ? ConsPDF->add(*gauss_contrain_sig) : BkgConsPDF->add(*gauss_contrain_bkg); sig ? ConsParameter->add(*variable) : BkgConsParameter->add(*variable); sig ? AtLeastOneConstrainFound = true : BkgAtLeastOneConstrainFound = true; if (verboseLevel<2) sig ? ConsPDF->Print() : BkgConsPDF->Print() ; } } coutDebug("Created variable: "); if (verboseLevel<2) variable->Print(); return variable; } void setSignalSavedFitValue(string s_name, double d_val, double d_err){ //This would have been so much nicer in Python coutDebug("Setting " + s_name +" to " + to_string(d_val) + " +- " + to_string(d_err)); if (s_name == "sig_mean") { FitValuesSignal.sig_mean.val = d_val; FitValuesSignal.sig_mean.err = d_err;} else if (s_name == "sig_sigma") { FitValuesSignal.sig_sigma.val = d_val; FitValuesSignal.sig_sigma.err = d_err;} else if (s_name == "sig_sigma2") { FitValuesSignal.sig_sigma2.val = d_val; FitValuesSignal.sig_sigma2.err = d_err;} else if (s_name == "sig_alpha") { FitValuesSignal.sig_alpha.val = d_val; FitValuesSignal.sig_alpha.err = d_err;} else if (s_name == "sig_alpha2") { FitValuesSignal.sig_alpha2.val = d_val; FitValuesSignal.sig_alpha2.err = d_err;} else if (s_name == "sig_n") { FitValuesSignal.sig_n.val = d_val; FitValuesSignal.sig_n.err = d_err;} else if (s_name == "sig_n2") { FitValuesSignal.sig_n2.val = d_val; FitValuesSignal.sig_n2.err = d_err;} else if (s_name == "sig_f") { FitValuesSignal.sig_f.val = d_val; FitValuesSignal.sig_f.err = d_err;} else if (s_name == "sig_effSigma"){ FitValuesSignal.sig_effSigma.val = d_val; FitValuesSignal.sig_effSigma.err = d_err;} else{ coutWarning("Parameter " + s_name + " was not found in the FitValuesSignal vector!"); coutWarning("Cannot set anything!"); } return; } void setBackgroundSavedFitValue(string s_name, double d_val, double d_err){ //This would have been so much nicer in Python coutDebug("Setting " + s_name +" to " + to_string(d_val) + " +- " + to_string(d_err)); if (s_name == "bkg_mean") { FitValuesBackground.bkg_mean.val = d_val; FitValuesBackground.bkg_mean.err = d_err;} else if (s_name == "bkg_sigma") { FitValuesBackground.bkg_sigma.val = d_val; FitValuesBackground.bkg_sigma.err = d_err;} else if (s_name == "bkg_alpha1") { FitValuesBackground.bkg_alpha.val = d_val; FitValuesBackground.bkg_alpha.err = d_err;} else if (s_name == "bkg_alpha2") { FitValuesBackground.bkg_alpha2.val = d_val; FitValuesBackground.bkg_alpha2.err = d_err;} else if (s_name == "bkg_n1") { FitValuesBackground.bkg_n.val = d_val; FitValuesBackground.bkg_n.err = d_err;} else if (s_name == "bkg_n2") { FitValuesBackground.bkg_n2.val = d_val; FitValuesBackground.bkg_n2.err = d_err;} else if (s_name == "bkg_f") { FitValuesBackground.bkg_f.val = d_val; FitValuesBackground.bkg_f.err = d_err;} else{ coutWarning("Parameter " + s_name + " was not found in the FitValuesBackground vector!"); coutWarning("Cannot set anything!"); } return; } //Set parameters to get the values needed by the constrained fit void ParamValues::setValuesAndErrors(bool sig){ for (auto var : (sig ? SigRooVars : BkgRooVars)){ coutDebug("Setting " + string(var->GetName())); if (verboseLevel < 3) var->Print(); sig ? setSignalSavedFitValue(var->GetName(),var->getVal(),var->getError()) : setBackgroundSavedFitValue(var->GetName(),var->getVal(),var->getError()); } if (sig) setSignalSavedFitValue("sig_effSigma",getEffSigmaFromResult(),0.04); return; }