#include #include #include #include #include #include #include "TFile.h" #include "TH1F.h" #include "TMath.h" #include "Math/Minimizer.h" #include "Math/Factory.h" #include "Math/Functor.h" // Number of experimental spectra to fit and number of components int global_num_histograms_to_fit; int global_num_components; // Global variables for experiment and simulation TH1F* exp_histogram; std::vector sim_histograms; // Global chi2 value and number of bins double global_chi2; double global_nBins; double calculate_chi2(TH1F* data, std::vector components, const double* parameters, double& bin_count){ double chi2 = 0; bin_count = 0; // [1, NbinsX] inclusive to avoid underflow/overflow bins for (int i=1; i<=data->GetNbinsX(); i++){ double obs = data->GetBinContent(i); double exp = 0; if (obs > 0){ for (int j=0; jGetBinContent(i)); } chi2 += (obs - exp) * (obs - exp) / obs; ++ bin_count; } } return chi2; } // The function that will be minimized double fitting_function(const double* parameters){ std::vector bins(global_num_histograms_to_fit); std::vector chi2_values(global_num_histograms_to_fit); // Find the local chi2 for each experimental spectrum being fit for (int i=0; iGet("experimental_histogram"); TFile* fInSim = TFile::Open("simulation_histograms.root","READ"); // The simulation component histograms for (int i=0; iGet(Form("component_%03d",i))); } // Initialize the minimizer and algorithm ROOT::Math::Minimizer* minimizer = ROOT::Math::Factory::CreateMinimizer(minimizer_name, algorithm_name); ROOT::Math::Functor minimization_function(&fitting_function, global_num_components); // Set minimizer properties minimizer->SetPrintLevel(print_level); minimizer->SetMaxIterations(num_max_iterations); minimizer->SetMaxFunctionCalls(num_max_function_calls); minimizer->SetTolerance(tolerance); minimizer->SetErrorDef(error_definition); minimizer->SetFunction(minimization_function); // Parameters for the minimizer std::vector parameter_names; std::vector start_values; std::vector step_sizes; std::vector lower_bounds; std::vector upper_bounds; // Set parameter values for (int i=0; iSetLimitedVariable(i, parameter_names[i].c_str(), start_values[i], step_sizes[i], lower_bounds[i], upper_bounds[i]); } // Minimize minimizer->Minimize(); // Get results and save them const double* minimum_parameters = minimizer->X(); // Pointer to the parameters at the minimum const double* minimum_errors = minimizer->Errors(); // Pointer to the errors at the minimum // Normalize parameters double minimum_parameters_sum = 0.0; for (int i=0; i normalized_minimum_parameters; for (int i=0; iClear(); fInData->Close(); delete fInData; fInSim->Close(); delete fInSim; return 0; }