MaCh3  2.4.2
Reference Guide
OscillationHandler.cpp
Go to the documentation of this file.
1 #include "OscillationHandler.h"
2 
4 #include "Oscillator/OscillatorFactory.h"
5 #include "Constants/OscillatorConstants.h"
7 
8 // ************************************************
9 OscillationHandler::OscillationHandler(const std::string& NuOscillatorConfigFile, bool BinningPerOscChannel_,
10  std::vector<const double*> OscParams_, const int SubChannels) {
11 // ************************************************
12  EqualBinningPerOscChannel = BinningPerOscChannel_;
13  OscParams = OscParams_;
14  // Add first sample
15  NuOscProbCalcers.resize(1);
16 
17  auto OscillFactory = std::make_unique<OscillatorFactory>();
18  //DB's explanation of EqualBinningPerOscChannel:
19  //In the situation where we are applying binning oscillation probabilities to a SampleHandler object, it maybe the case that there is identical binning per oscillation channel
20  //In which case, and remembering that each NuOscillator::Oscillator object calculate the oscillation probabilities for all channels, we just have to create one Oscillator object and use the results from that
21  //This means that we can get up to a factor of 12 reduction in the calculation time of the oscillation probabilities, because we don't need to repeat the operation per oscillation channel
22 
24  NuOscProbCalcers[0].resize(1);
25  LoggerPrint("NuOscillator",
26  [](const std::string& message) { MACH3LOG_INFO("{}", message); },
27  [this, &OscillFactory, &NuOscillatorConfigFile]() {
28  this->NuOscProbCalcers[0][0] = std::unique_ptr<OscillatorBase>(OscillFactory->CreateOscillator(NuOscillatorConfigFile));
29  });
30 
31  if (!NuOscProbCalcers[0][0]->EvalPointsSetInConstructor()) {
32  MACH3LOG_ERROR("Attempted to use equal binning per oscillation channel, but not binning has been set in the NuOscillator::Oscillator object");
33  throw MaCh3Exception(__FILE__, __LINE__);
34  }
35  NuOscProbCalcers[0][0]->Setup();
36  } else {
37  NuOscProbCalcers[0].resize(SubChannels);
38  for (int iChannel = 0; iChannel < SubChannels; iChannel++) {
39  MACH3LOG_INFO("Setting up NuOscillator::Oscillator object in OscillationChannel: {}/{}", iChannel, SubChannels);
40 
41  LoggerPrint("NuOscillator",
42  [](const std::string& message) { MACH3LOG_INFO("{}", message); },
43  [this, iChannel, &OscillFactory, &NuOscillatorConfigFile]() {
44  this->NuOscProbCalcers[0][iChannel] = std::unique_ptr<OscillatorBase>(
45  OscillFactory->CreateOscillator(NuOscillatorConfigFile));
46  });
47  }
48  }
49 }
50 
51 // ************************************************
53 // ************************************************
54 }
55 
56 // ************************************************
57 void OscillationHandler::AddSample(const std::string& NuOscillatorConfigFile, const int SubChannels) {
58 // ************************************************
60  MACH3LOG_ERROR("Trying to add sample while EqualBinningPerOscChannel is enabled. This will not work...");
61  throw MaCh3Exception(__FILE__, __LINE__);
62  }
63  auto OscillFactory = std::make_unique<OscillatorFactory>();
64 
65  std::vector<std::unique_ptr<OscillatorBase>> OscProbCalcersTemp(SubChannels);
66 
67  for (int iChannel = 0; iChannel < SubChannels; iChannel++) {
68  MACH3LOG_INFO("Setting up NuOscillator::Oscillator object in OscillationChannel: {}/{}", iChannel, SubChannels);
69 
70  LoggerPrint("NuOscillator",
71  [](const std::string& message) { MACH3LOG_INFO("{}", message); },
72  [&OscProbCalcersTemp, iChannel, &OscillFactory, &NuOscillatorConfigFile]() {
73  OscProbCalcersTemp[iChannel] = std::unique_ptr<OscillatorBase>(
74  OscillFactory->CreateOscillator(NuOscillatorConfigFile));
75  });
76  }
77  NuOscProbCalcers.push_back(std::move(OscProbCalcersTemp));
78 }
79 
80 // ************************************************
82 // ************************************************
83  std::vector<M3::float_t> OscVec(OscParams.size());
84  for (size_t iPar = 0; iPar < OscParams.size(); ++iPar) {
85  #pragma GCC diagnostic push
86  #pragma GCC diagnostic ignored "-Wuseless-cast"
87  OscVec[iPar] = static_cast<M3::float_t>(*OscParams[iPar]);
88  #pragma GCC diagnostic pop
89  }
90 
92  NuOscProbCalcers[0][0]->CalculateProbabilities(OscVec);
93  } else {
94  for (size_t iSample = 0; iSample < NuOscProbCalcers.size(); iSample++) {
95  for (size_t iChannel = 0; iChannel < NuOscProbCalcers[iSample].size(); iChannel++) {
96  NuOscProbCalcers[iSample][iChannel]->CalculateProbabilities(OscVec);
97  }
98  }
99  }
100 }
101 
102 
103 // ************************************************
104 const M3::float_t* OscillationHandler::GetNuOscillatorPointers(const int Sample, const int Channel, const int InitFlav,
105  const int FinalFlav, const FLOAT_T TrueEnu, const FLOAT_T TrueCosZenith) {
106 // ************************************************
107  int IndexSample = 0;
108  int IndexChannel = 0;
110  IndexSample = Sample;
111  IndexChannel = Channel;
112  }
113 
114  if(TrueCosZenith != -999) {
115  return NuOscProbCalcers[IndexSample][IndexChannel]->ReturnWeightPointer(InitFlav ,FinalFlav, TrueEnu, TrueCosZenith);
116  } else {
117  return NuOscProbCalcers[IndexSample][IndexChannel]->ReturnWeightPointer(InitFlav ,FinalFlav, TrueEnu);
118  }
119 }
120 
121 
122 // ************************************************
123 void OscillationHandler::SetOscillatorBinning(const int Sample, const int Channel, const std::vector<M3::float_t>& EnergyArray,
124  const std::vector<M3::float_t>& CosineZArray) {
125 // ************************************************
126  if (!NuOscProbCalcers[Sample][Channel]->EvalPointsSetInConstructor()) {
127  NuOscProbCalcers[Sample][Channel]->SetEnergyArrayInCalcer(EnergyArray);
128  if(CosineZArray.size() != 0) NuOscProbCalcers[Sample][Channel]->SetCosineZArrayInCalcer(CosineZArray);
129  }
130  NuOscProbCalcers[Sample][Channel]->Setup();
131 }
#define _MaCh3_Safe_Include_Start_
KS: Avoiding warning checking for headers.
Definition: Core.h:126
#define _MaCh3_Safe_Include_End_
KS: Restore warning checking after including external headers.
Definition: Core.h:140
#define MACH3LOG_ERROR
Definition: MaCh3Logger.h:37
#define MACH3LOG_INFO
Definition: MaCh3Logger.h:35
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...
Definition: MaCh3Logger.h:100
Custom exception class used throughout MaCh3.
void AddSample(const std::string &NuOscillatorConfigFile, const int SubChannels)
Add different oscillator for sample.
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.
OscillationHandler(const std::string &ConfigFile, bool EqualBinningPerChannel, std::vector< const double * > OscParams_, const int SubChannels)
Constructor.
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< const double * > OscParams
pointer to osc params, since not all params affect every sample, we perform some operations before ha...
bool EqualBinningPerOscChannel
flag used to define whether all oscillation channels have a probability calculated using the same bin...
double float_t
Definition: Core.h:37