291 lines
12 KiB
C++
291 lines
12 KiB
C++
//Renata Kopecna
|
|
|
|
#include "generatetoys.hh"
|
|
#include <bu2kstarmumu_parameters.hh>
|
|
#include <helpers.hh>
|
|
#include <event.hh>
|
|
#include <paths.hh>
|
|
#include <folder.hh>
|
|
|
|
#include <spdlog.h>
|
|
|
|
//Options to generate toys:
|
|
//Runs: 1, 2 or 1+2
|
|
//Signal only / Bkg only / Both
|
|
//Rare / Jpsi
|
|
//Bins
|
|
//Mass only / Angles only
|
|
//S or P
|
|
|
|
//Values taken from: MCsig, MCref, Bkg (top/bottom/both), Reference
|
|
//Can be also just mass/angle fit
|
|
|
|
//TODO: move this somewhere else
|
|
bool LowMassFit = false;
|
|
bool HighMassFit = true;
|
|
|
|
|
|
int initialize_parameters_from_MCfit(fcnc::bu2kstarmumu_parameters *parameters, bool fromRef, int PDF, int bin, std::vector<std::string> names, basic_params params, fixConstr fixConstrain){
|
|
bool SimFit = true;
|
|
bool onlyAngs = false;
|
|
int nBins = fromRef ? 1 : params.nBins; //When looping over bins, this protects from trying to read from refMC
|
|
std::string fileName_MC = final_result_name_MC(params, nBins, fromRef, false, SimFit, onlyAngs, fromRef);
|
|
parameters->get_param_from_rootfile(fileName_MC, names, PDF, fromRef ? 0 : bin, fixConstrain); //TODO: use the struct fixConstr also in the parameters
|
|
return 0;
|
|
}
|
|
|
|
int initialize_parameters_from_BkgFit(fcnc::bu2kstarmumu_parameters *parameters, bool fromRef, bool LowMassFit, bool HighMassFit, bool fitKpi, int PDF, int bin, std::vector<std::string> names, basic_params params,fixConstr fixConstrain){
|
|
int nBins = fromRef ? 1 : params.nBins;
|
|
std::string fileName_topBkg = final_result_name_bkg(nBins, fromRef, LowMassFit, HighMassFit, fitKpi, params);
|
|
parameters->get_param_from_rootfile(fileName_topBkg, names, PDF,fromRef ? 0 : bin, fixConstrain);
|
|
return 0;
|
|
}
|
|
|
|
int initialize_parameters_from_MassFit(fcnc::bu2kstarmumu_parameters *parameters, bool fromRef, int PDF, int bin, std::vector<std::string> names, basic_params params, fixConstr fixConstrain){
|
|
int nBins = fromRef ? 1 : params.nBins; //When looping over bins, this protects from trying to read from refMC
|
|
bool splitRuns = true; //Get it per run or not
|
|
int b = fromRef ? 0 : bin;
|
|
//If not, use the PDF number form the parameter Run
|
|
std::string fileName_dataMass = final_result_name_mass(fromRef, nBins, params.Run, params, params.Run);
|
|
parameters->get_param_from_rootfile(fileName_dataMass, names, splitRuns ? PDF : params.Run, b, fixConstrain);
|
|
|
|
return 0;
|
|
}
|
|
|
|
int initialize_B_mass(fcnc::bu2kstarmumu_parameters *parameters, bool fromRef, int PDF, int bin, basic_params params){
|
|
int nBins = fromRef ? 1 : params.nBins; //When looping over bins, this protects from trying to read from refMC
|
|
bool splitRuns = true; //Get it per run or not
|
|
int b = fromRef ? 0 : bin;
|
|
//Not part of the other functions as the range needs to be full
|
|
std::string fileName_dataMass = final_result_name_mass(fromRef, nBins, params.Run, params, params.Run);
|
|
parameters->m_b.init(get_param_value_from_rootfile(fileName_dataMass,"m_b", splitRuns ? PDF : params.Run,b),B_MASS_LOW,B_MASS_HIGH,0);
|
|
return 0;
|
|
}
|
|
|
|
|
|
//Take the default values, set in constants.hh and bu2kstarmumu_parameters.cc
|
|
int initialize_default_parameters(fcnc::bu2kstarmumu_parameters *parameters){
|
|
parameters->use_default();
|
|
return 0;
|
|
}
|
|
|
|
//Generates toys identical to the given parameters
|
|
std::vector<fcnc::event> generateToys(basic_params params, int bin, int PDF,
|
|
fcnc::bu2kstarmumu_parameters *toyParameters,
|
|
fcnc::options opts){
|
|
/* These options should not be modified inside here
|
|
// Set options //
|
|
//The options will be taken from the fitter itself
|
|
opts.only_angles = false;
|
|
opts.only_Bmass = false;
|
|
|
|
opts.weighted_fit = true;
|
|
opts.use_weighted_bkg = false;
|
|
opts.always_generate_full_angular = true;
|
|
|
|
opts.swave = false;
|
|
opts.shift_lh = false;
|
|
opts.individual_penalties = false;
|
|
|
|
//Stat. uncertainty determination tool:
|
|
opts.squared_hesse = true;
|
|
opts.minos_errors = false;
|
|
|
|
opts.generate_mkpi = true;
|
|
opts.simple_mkpi = false;
|
|
opts.isobar = false;
|
|
opts.mkpi_full_range_norm = false;
|
|
|
|
opts.flat_bkg = false;
|
|
*/
|
|
//Init the q2 options, to be sure
|
|
opts.q2_min = opts.TheQ2binsmin[bin];
|
|
opts.q2_max = opts.TheQ2binsmax[bin];
|
|
|
|
opts.update_angle_ranges(); //Set angles in options back to defaults
|
|
//opts.update_efficiencies = true; //This ensures the acceptance weights to be taken into account. //TODO
|
|
if (opts.run == 1) opts.year = 2012; //Cause why not :)
|
|
else opts.year = 2017;
|
|
|
|
//Create parameter set
|
|
fcnc::bu2kstarmumu_pdf prob(&opts, toyParameters);
|
|
fcnc::bu2kstarmumu_generator gen(&opts);
|
|
|
|
prob.load_coeffs_eff_phsp_4d();
|
|
prob.update_cached_normalization(toyParameters);
|
|
//And finally generate the events
|
|
//How much events relative to the requedred total number of events?
|
|
double frac = eventsInBin_fraction(bin,opts.run,params.nBins,params.reference);
|
|
int N = std::lround(params.nEvents*frac);
|
|
spdlog::info("Generate {0:d} toy events", N);
|
|
|
|
std::vector<fcnc::event> genToys = gen.generate(N, toyParameters, &prob);
|
|
|
|
//Update cached efficiencies of the angular acceptance correction weights
|
|
prob.update_cached_efficiencies(toyParameters, &genToys);
|
|
|
|
//for folded analysis, fold the angular values of all generated events before returning
|
|
if(!opts.full_angular){
|
|
spdlog::debug("Folding the generated {0:d} events according to fold #{1:d}", genToys.size(), opts.folding);
|
|
fcnc::folder theFolder(&opts);
|
|
for(UInt_t e = 0; e < genToys.size(); e++){
|
|
fcnc::event * evt = &genToys.at(e);
|
|
theFolder.fold(evt);
|
|
spdlog::trace("Folded event: ctk={0:f}\t ctl={1:f}\t phi={2:f}\t m={3:f} \tmkpi={4:f}", evt->costhetak, evt->costhetal, evt->phi, evt->m, evt->mkpi);
|
|
}
|
|
}
|
|
return genToys;
|
|
}
|
|
|
|
std::vector<fcnc::event> generateIndividualToys(basic_params params, int bin, int PDF,
|
|
fcnc::bu2kstarmumu_parameters *toyParameters,
|
|
fcnc::options opts, bool genOnlySig, bool genOnlyBkg){
|
|
|
|
if (genOnlySig && genOnlyBkg){
|
|
spdlog::error("Cannot generate only bkg and only sig in one go!");
|
|
spdlog::error("Check your options.");
|
|
return {{}};
|
|
}
|
|
|
|
bool genReference = params.reference;
|
|
|
|
// Set options //
|
|
//The options will be taken from the fitter itself
|
|
opts.only_angles = false;
|
|
opts.only_Bmass = false;
|
|
|
|
opts.weighted_fit = true;
|
|
opts.use_weighted_bkg = false;
|
|
opts.always_generate_full_angular = true;
|
|
|
|
opts.swave = false;
|
|
opts.shift_lh = false;
|
|
opts.individual_penalties = false;
|
|
|
|
//Stat. uncertainty determination tool:
|
|
opts.squared_hesse = true;
|
|
opts.minos_errors = false;
|
|
|
|
opts.generate_mkpi = true;
|
|
opts.generate_only_bkg = genOnlyBkg;
|
|
opts.simple_mkpi = false;
|
|
opts.isobar = false;
|
|
opts.mkpi_full_range_norm = false;
|
|
|
|
opts.flat_bkg = false;
|
|
|
|
//Init the q2 options, to be sure
|
|
opts.q2_min = opts.TheQ2binsmin[bin];
|
|
opts.q2_max = opts.TheQ2binsmax[bin];
|
|
|
|
opts.run = PDF; //Set proper run to options
|
|
opts.update_angle_ranges(); //Set angles in options back to defaults
|
|
opts.update_efficiencies = true; //This ensures the acceptance weights to be taken into account.
|
|
if (opts.run == 1) opts.year = 2012; //Cause why not :)
|
|
else opts.year = 2017;
|
|
|
|
//Create parameter set
|
|
fcnc::bu2kstarmumu_pdf prob(&opts, toyParameters);
|
|
fcnc::bu2kstarmumu_generator gen(&opts);
|
|
|
|
prob.load_coeffs_eff_phsp_4d();
|
|
prob.update_cached_normalization(toyParameters);
|
|
|
|
// Initialize everything //
|
|
//Note that hte code will crash if the file is not there, so test before submititng pls
|
|
|
|
//Set the f_sig
|
|
if (genOnlySig) toyParameters->f_sig.init_fixed(1.0);
|
|
else if (genOnlyBkg) toyParameters->f_sig.init_fixed(0.0);
|
|
else{ //Or both, in that case load the f_sig from mass only fit
|
|
initialize_parameters_from_MassFit(toyParameters,genReference,PDF,bin,{"f_sig"},params,fixConstr(false,false));
|
|
}
|
|
|
|
//Init angular parameters from MC
|
|
if (genReference) toyParameters->init_ang_parameters_fromRefDavid(bin,1.0,0.01);
|
|
else initialize_parameters_from_MCfit(toyParameters,false,PDF,bin,param_string(opts, true),params,fixConstr(false,false));
|
|
|
|
//Init the ratio of sigmas in signal MC/reference MC
|
|
//As everything is fixed everywhere and not contrained in mass, this is fine, but this should be done properly //TODO
|
|
initialize_parameters_from_MCfit(toyParameters,genReference,PDF,bin,params_string_mass(opts),params,fixConstr(true,false));
|
|
|
|
if (!genReference) toyParameters->m_scale.init_fixed(get_sigmaRatio_fromMC(params,params.nBins,bin, PDF));
|
|
else toyParameters->m_scale.init_fixed(1.0);
|
|
|
|
|
|
//Init the bkg parameters from the BKG fit file
|
|
//First init the background for angles
|
|
initialize_parameters_from_BkgFit(toyParameters, true, LowMassFit, HighMassFit, false, 12, bin,param_string_bkg(),params,fixConstr(false,false));
|
|
//Then init the background for m_Kpi
|
|
initialize_parameters_from_BkgFit(toyParameters, true, LowMassFit, HighMassFit, true, 12, bin,param_string_bkg_mkpi(),params,fixConstr(false,false));
|
|
|
|
//Init the mass background from mass fit to reference for now
|
|
std::vector<std::string> fixFromMassFit; //TODO: set as a proper vector depending on using 2 lambdas or anything
|
|
if (opts.fit_lambda) fixFromMassFit.push_back("m_lambda");
|
|
else fixFromMassFit.push_back("m_tau");
|
|
initialize_parameters_from_MassFit(toyParameters,true,PDF,bin,fixFromMassFit,params,fixConstr(false,false));
|
|
|
|
//Initialize the q2 by hand, as it is the easiest
|
|
toyParameters->eff_q2.init(bin_center_q2(opts,bin), opts.q2_min, opts.q2_max, 0.0);
|
|
|
|
//Set the Bmass separatelly as it's range is important
|
|
initialize_B_mass(toyParameters,true,PDF,bin,params);
|
|
|
|
//Control print of the parameters
|
|
toyParameters->print_parameters(false);
|
|
|
|
//Update the normalisation with the new parameter settings
|
|
prob.update_cached_normalization(toyParameters);
|
|
|
|
//And finally generate the events
|
|
//How much events relative to the requedred total number of events?
|
|
double frac = eventsInBin_fraction(bin,opts.run,params.nBins,params.reference);
|
|
int N = std::lround(params.nEvents*frac);
|
|
spdlog::info("Generate {0:d} toy events", N);
|
|
std::vector<fcnc::event> genToys = gen.generate(N, toyParameters, &prob);
|
|
|
|
//for folded analysis, fold the angular values of all generated events before returning
|
|
if(!opts.full_angular){
|
|
spdlog::debug("Folding the generated {0:d} events according to fold #{1:d}", genToys.size(), opts.folding);
|
|
fcnc::folder theFolder(&opts);
|
|
for(auto evt: genToys){
|
|
theFolder.fold(&evt);
|
|
spdlog::trace("Folded event: ctk={0:f}, ctl={1:f}, phi={2:f}", evt.costhetak, evt.costhetal, evt.phi);
|
|
}
|
|
}
|
|
return genToys;
|
|
}
|
|
|
|
int saveToys(basic_params params, fcnc::options opts, bool genOnlySig, bool genOnlyBkg){
|
|
|
|
std::vector<UInt_t> pdf_idx;
|
|
if (params.Run == 1 || params.Run == 12) pdf_idx.push_back(1);
|
|
if (params.Run == 2 || params.Run == 12) pdf_idx.push_back(2);
|
|
|
|
|
|
const int nBins = params.nBins;
|
|
|
|
std::vector<fcnc::parameters*> toyParams [nBins];
|
|
std::vector<int>tmpRes[nBins]; //instead of fit results
|
|
|
|
//Now just for saving do this
|
|
for (auto idx: pdf_idx){
|
|
std::vector<fcnc::event> events;
|
|
for (int bin = 0; bin < params.nBins; bin++){
|
|
fcnc::bu2kstarmumu_parameters * tmpParams = new fcnc::bu2kstarmumu_parameters (&opts);
|
|
std::vector<fcnc::event> tmp = generateIndividualToys(params, bin, idx, tmpParams, opts,genOnlySig, genOnlyBkg);
|
|
events.insert(events.end(),tmp.begin(),tmp.end());
|
|
toyParams[bin].push_back(tmpParams);
|
|
tmpRes[bin].push_back(0);
|
|
}
|
|
std::string saveFile = get_finalToys_file(params.reference, nBins, true, params, idx);
|
|
fcnc::save_events(saveFile,events);
|
|
}
|
|
std::string paramFile = init_params_name_toys(-1,params.reference, nBins, true, params, params.Run, false, false, genOnlySig, genOnlyBkg, false, false); //TODO: fix the naming, as you actually do take stuff from upper-mass sideband
|
|
|
|
save_results(paramFile,nBins,pdf_idx,tmpRes,toyParams,true,&opts);
|
|
return 0;
|
|
|
|
}
|
|
|