Angular analysis of B+->K*+(K+pi0)mumu
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

230 lines
9.6 KiB

#include <parameters.hh>
#include <constants.hh>
#include <helpers.hh>
#include <funcs.hh>
#include <fstream>
#include <iomanip>
#include <iostream>
#include <paths.hh>
#include <spdlog.h>
/**
* @file parameters.cc
* @author Renata Kopecna
* @date 2021-03-02
*
*/
void fcnc::parameter::set_values_n_errors(double v, double e){
value = v;
start_value = v;
previous_measurement = v;
error = e;
error_down = e;
error_up = e;
previous_error_low = e;
previous_error_high = e;
//step_size = e; //not correct
}
void fcnc::parameter::reset_correlations(){
correlations.clear();
}
void fcnc::parameter::set_correlation(double corr, unsigned int idx){
while(correlations.size() <= idx) correlations.push_back(0.0);
correlations.at(idx) = corr;
}
void fcnc::parameter::set_correlations(std::vector<double> corrs, unsigned int first, unsigned int last, double scalefactor){
reset_correlations();
assert(first < last);
assert(last < corrs.size());
for(unsigned int idx = first; idx <= last; idx++){
correlations.push_back(scalefactor * corrs.at(idx));
}
}
///set blinding string
void fcnc::parameter::set_blinding_string(std::string s) {
blinding_string = s;
}
void fcnc::parameter::set_blinding(bool b, double b_scale, bool is_angle, std::string b_string) {
blind = b;
blinding_scale = b_scale;
blinding_string = b_string;
//this is new, apparently the shi(f)t needs to be subtracted, who knew?
/* removed by David 18/07/18, as the functions are commented out in funcs.cc anyhow...
if (is_angle)
blinding_delta = -evaluate_unblind_uniform(0.0, blinding_string.c_str(), blinding_scale);
else
blinding_delta = -evaluate_unblind_uniform_angle(0.0, blinding_string.c_str(), blinding_scale);
*/
//new blinding: just add
TRandom3 * rn = new TRandom3(0);
blinding_delta = rn->Gaus(0., 1.);
delete rn;
}
std::string fcnc::parameter::get_root_name() const {
std::string rootstring = get_description();
size_t j;
while ((j = rootstring.find("\\mathrm ")) != std::string::npos) rootstring.replace(j,8,"");
while ((j = rootstring.find("\\")) != std::string::npos) rootstring.replace(j,1,"#");
return rootstring;
}
///The parameters class stores a collection of parameters used in the analysis. Every analysis should implement its own set e.g. bs2jpsiphi_parameters
void fcnc::parameters::add_parameter(parameter* param) {
param->set_index(params.size());
param->set_parent(this);
params.push_back(param);
}
bool fcnc::parameters::is_blind() const {
for (unsigned int i = 0; i<params.size(); i++){
if (params.at(i)->is_blind()) return true;
}
return false;
}
unsigned int fcnc::parameters::nparameters() const{
return params.size();
}
///Methos returns a pointer to parameter with index i
fcnc::parameter* fcnc::parameters::get_parameter(unsigned int i) const{
return params.at(i);
}
///returns parameter with specific name
fcnc::parameter* fcnc::parameters::get_parameter(std::string name) const{
parameter* res=0;
for (unsigned int i =0; i<nparameters();i++)
if (get_parameter(i)->get_name() == name){
res = get_parameter(i);
break;
}
return res;
}
///Resets all parameters to their start values
void fcnc::parameters::reset_parameters(){
for (unsigned int i = 0; i < nparameters(); i++) params.at(i)->reset_start();
}
///Method that prints the parameter set, the current values, errors and the deviation from the start value in sigma
void fcnc::parameters::print_parameters(bool latex_output) const{
std::ofstream myFile;
open_Latex_noteFile(latex_params(), myFile);
if (!latex_output){
if (spdlog_trace()){
std::cout << std::endl << "Parameters" << std::endl;
spdlog::info("Blinded Parameters: ");
for (unsigned int j = 0; j < nparameters(); j++){
if (params[j]->is_blind()) std::cout << params[j]->get_name() << " ";
}
std::cout << std::endl;
spdlog::info("The {0:d} Parameters: ", nparameters());
for (unsigned int j = 0; j < nparameters(); j++) {
std::string parname(params[j]->get_name());//the_minimizer->fCpnam[j]);
std::cout.setf(std::ios::left);
double nsigma = 0.0;
if (params[j]->get_error() > 0.0){
nsigma = (params[j]->get_value() - params[j]->get_start_value())/params[j]->get_error();
}
double value = params[j]->get_value();
// if (params[j]->is_blind())
// value += params[j]->blinding_delta;//todo
double error = params[j]->get_error();
double error_up = params[j]->get_error_up();
double error_down = params[j]->get_error_down();
if (params[j]->is_blind()){
value += params[j]->blinding_delta * (error_up + error_down) / 2.;
}
if (error_up == error_down){
std::cout << std::setw(12) << parname
//<< std::setw(12) << (params[j]->is_blind() ? "(*)" : format_value(value, error))
<< std::setw(12) << (format_value(value, error))
<< std::setw(12) << "+-"
<< std::setw(12) << format_error(error)
<< std::setw(12) << (params[j]->is_blind() ? " (*)": "")
<< " " << (params[j]->is_blind() ? "(*)" : format_double(nsigma)) << " sigma" << std::endl;
}
else {
std::cout << std::setw(12) << parname
//<< std::setw(12) << (params[j]->is_blind() ? "(*)" : format_value(value, error))
<< std::setw(12) << (format_value(value, error))
<< std::setw(12) << " " << format_error(error_down)
<< std::setw(12) << " " << format_error(error_up)
<< std::setw(12) << (params[j]->is_blind() ? "(*)": "")
<< " " << (params[j]->is_blind() ? "(*)" : format_double(nsigma)) << " sigma" << std::endl;
}
}
}
}
else {
if (params[0]->get_error_up() == params[0]->get_error_down()){
myFile << "\\begin{tabular}{|c|c|c|} \\hline" << std::endl;
myFile << "parameter & result & $\\sigma$ from nominal \\\\ \\hline \\hline" << std::endl;
}
else{
myFile << "\\begin{tabular}{|c|c|c|c|c|} \\hline" << std::endl;
myFile << "parameter & result & $\\sigma_\\text{down}$ & $\\sigma_\\text{up}$ & $\\sigma$ from nominal \\\\ \\hline \\hline" << std::endl;
}
for (unsigned int j = 0; j < nparameters(); j++){
std::string pardesc(params[j]->get_description());//the_minimizer->fCpnam[j]);
std::string partex("");
for (std::string::iterator it = pardesc.begin(); it != pardesc.end(); it++){ //Replace the ROOT tex by actual latex //TODO: maybe do this properly
if (*it != '#') partex += *it;
else partex += "\\";
}
double value = params[j]->get_value();
if (params[j]->is_blind()) value += params[j]->blinding_delta;//todo
double error = params[j]->get_error();
if (error == 0.0) continue; //Do not print fixed params into latex
double error_up = params[j]->get_error_up();
double error_down = params[j]->get_error_down();
double nsigma = 0.0;
if (error > 0.0) nsigma = (value - params[j]->get_start_value())/error;
std::cout.setf(std::ios::left);
if (error_up == error_down){
myFile << "$" << std::setw(20) << partex << "$ & $"
//<< std::setw(12) << (params[j]->is_blind() ? "(*)" : format_value(value, error))
<< std::setw(12) << ((params[j]->get_step_size() == 0.0 && params[j]->is_blind()) ? "" : format_value(value, error))
<< "\\pm " << std::setw(12) << format_error(error) << (params[j]->is_blind() ? "(*)": "") << "$ & "
<< (params[j]->is_blind() ? "(*)" : format_double(nsigma)) << "\\\\" << std::endl;
}
else{
myFile << "$" << std::setw(20) << partex << "$ & $"
<< std::setw(12)
//<< (params[j]->is_blind() ? "(*)" : format_value(value, error))
<< (format_value(value, error))
<< "\\pm "
<< std::setw(12) << format_error(error) << (params[j]->is_blind() ? "(*)": "") << "$ & "
<< std::setw(12) << format_error(error_down)<< " & "
<< std::setw(12) << "+" << format_error(error_up) << " & "
<< (params[j]->is_blind() ? "(*)" : format_double(nsigma)) << "\\\\" << std::endl;
}
}
myFile << "\\hline" << std::endl;
myFile << "\\end{tabular}" << std::endl;
}
}
///fix all parameters
void fcnc::parameters::fix_parameters() {
for (unsigned int i = 0; i < params.size(); i++) params.at(i)->set_step_size(0.0);
}
///set all parameters to current values! Careful with this, please.
void fcnc::parameters::take_current_as_start() {
for (unsigned int i = 0; i < params.size(); i++) {
parameter* p = params.at(i);
p->set_start_value(p->get_value());
}
}