4 #include "Oscillator/OscillatorFactory.h"
5 #include "Constants/OscillatorConstants.h"
10 std::vector<const M3::float_t*> OscParams_, std::vector<std::string> NuOscNames_,
const int SubChannels) {
16 #pragma GCC diagnostic push
17 #pragma GCC diagnostic ignored "-Wuseless-cast"
19 #pragma GCC diagnostic pop
23 auto OscillFactory = std::make_unique<OscillatorFactory>();
32 [](
const std::string& message) {
MACH3LOG_INFO(
"{}", message); },
33 [
this, &OscillFactory, &NuOscillatorConfigFile]() {
34 this->
NuOscProbCalcers[0][0] = std::unique_ptr<OscillatorBase>(OscillFactory->CreateOscillator(NuOscillatorConfigFile));
37 for (
size_t i = 0; i <
OscParams.size(); i++) {
41 MACH3LOG_ERROR(
"Attempted to use equal binning per oscillation channel, but not binning has been set in the NuOscillator::Oscillator object");
45 [](
const std::string& message) {
MACH3LOG_INFO(
"{}", message); },
51 for (
int iChannel = 0; iChannel < SubChannels; iChannel++) {
52 MACH3LOG_INFO(
"Setting up NuOscillator::Oscillator object in OscillationChannel: {}/{}", iChannel, SubChannels);
55 [](
const std::string& message) {
MACH3LOG_INFO(
"{}", message); },
56 [
this, iChannel, &OscillFactory, &NuOscillatorConfigFile]() {
58 OscillFactory->CreateOscillator(NuOscillatorConfigFile));
60 for (
size_t i = 0; i <
OscParams.size(); i++) {
76 MACH3LOG_ERROR(
"Trying to add sample while EqualBinningPerOscChannel is enabled. This will not work...");
79 auto OscillFactory = std::make_unique<OscillatorFactory>();
81 std::vector<std::unique_ptr<OscillatorBase>> OscProbCalcersTemp(SubChannels);
83 for (
int iChannel = 0; iChannel < SubChannels; iChannel++) {
84 MACH3LOG_INFO(
"Setting up NuOscillator::Oscillator object in OscillationChannel: {}/{}", iChannel, SubChannels);
87 [](
const std::string& message) {
MACH3LOG_INFO(
"{}", message); },
88 [&OscProbCalcersTemp, iChannel, &OscillFactory, &NuOscillatorConfigFile]() {
89 OscProbCalcersTemp[iChannel] = std::unique_ptr<OscillatorBase>(
90 OscillFactory->CreateOscillator(NuOscillatorConfigFile));
92 for (
size_t i = 0; i <
OscParams.size(); i++) {
105 for (
size_t iPar = 0; iPar <
OscParams.size(); ++iPar) {
106 #pragma GCC diagnostic push
107 #pragma GCC diagnostic ignored "-Wuseless-cast"
109 #pragma GCC diagnostic pop
116 for (
size_t iChannel = 0; iChannel <
NuOscProbCalcers[iSample].size(); iChannel++) {
126 const int FinalFlav,
const FLOAT_T TrueEnu,
const FLOAT_T TrueCosZenith) {
129 int IndexChannel = 0;
131 IndexSample = Sample;
132 IndexChannel = Channel;
135 if(TrueCosZenith != -999) {
136 return NuOscProbCalcers[IndexSample][IndexChannel]->ReturnWeightPointer(InitFlav ,FinalFlav, TrueEnu, TrueCosZenith);
138 return NuOscProbCalcers[IndexSample][IndexChannel]->ReturnWeightPointer(InitFlav ,FinalFlav, TrueEnu);
145 const std::vector<M3::float_t>& CosineZArray) {
149 if(CosineZArray.size() != 0)
NuOscProbCalcers[Sample][Channel]->SetCosineZArrayInCalcer(CosineZArray);
152 [](
const std::string& message) {
MACH3LOG_INFO(
"{}", message); },
153 [
this, Sample, Channel]() {
#define _MaCh3_Safe_Include_Start_
KS: Avoiding warning checking for headers.
#define _MaCh3_Safe_Include_End_
void LoggerPrint(const std::string &LibName, LogFunc logFunction, Func &&func, Args &&... args)
KS: This is bit convoluted but this is to allow redirecting cout and errors from external library int...
Custom exception class used throughout MaCh3.
void AddSample(const std::string &NuOscillatorConfigFile, const int SubChannels)
Add different oscillator for sample.
std::vector< std::string > NuOscNames
Names used to match MaCh3 params with NuOsc params.
std::vector< std::vector< std::unique_ptr< OscillatorBase > > > NuOscProbCalcers
DB Variables required for oscillation.
void Evaluate()
DB Evaluate oscillation weights for each defined event/bin.
virtual ~OscillationHandler()
Destructor.
const M3::float_t * GetNuOscillatorPointers(const int Sample, const int Channel, const int InitFlav, const int FinalFlav, const FLOAT_T TrueEnu, const FLOAT_T TrueCosZenith=-999)
Get pointer to oscillation weight.
std::vector< const M3::float_t * > OscParams
pointer to osc params, since not all params affect every sample, we perform some operations before ha...
void SetOscillatorBinning(const int Sample, const int Channel, const std::vector< M3::float_t > &EnergyArray, const std::vector< M3::float_t > &CosineZArray)
Setup binning, arrays correspond to events and their energy bins.
std::vector< FLOAT_T > OscParamsNuOsc
Values to which NuOsc has pointer.
bool EqualBinningPerOscChannel
flag used to define whether all oscillation channels have a probability calculated using the same bin...
OscillationHandler(const std::string &ConfigFile, bool EqualBinningPerChannel, std::vector< const M3::float_t * > OscParams_, std::vector< std::string > NuOscOscNames_, const int SubChannels)
Constructor.
constexpr static const double _BAD_DOUBLE_
Default value used for double initialisation.