MaCh3  2.8.0
Reference Guide
Public Member Functions | Private Attributes | List of all members
OscillationHandler Class Reference

Interface between NuOscillator and MaCh3, meant to compute oscillation weights for events/bin. More...

#include <Samples/OscillationHandler.h>

Collaboration diagram for OscillationHandler:
[legend]

Public Member Functions

 OscillationHandler (const std::string &ConfigFile, bool EqualBinningPerChannel, std::vector< const M3::float_t * > OscParams_, std::vector< std::string > NuOscOscNames_, const int SubChannels)
 Constructor. More...
 
virtual ~OscillationHandler ()
 Destructor. More...
 
void AddSample (const std::string &NuOscillatorConfigFile, const int SubChannels)
 Add different oscillator for sample. More...
 
bool isEqualBinningPerOscChannel ()
 check if same binning is used for multiple oscillation channels More...
 
void Evaluate ()
 DB Evaluate oscillation weights for each defined event/bin. More...
 
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. More...
 
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. More...
 
unsigned int GetOscParamsSize () const
 return size of oscillation parameter pointer vector More...
 

Private Attributes

bool EqualBinningPerOscChannel
 flag used to define whether all oscillation channels have a probability calculated using the same binning More...
 
std::vector< std::vector< std::unique_ptr< OscillatorBase > > > NuOscProbCalcers
 DB Variables required for oscillation. More...
 
std::vector< const M3::float_t * > OscParams
 pointer to osc params, since not all params affect every sample, we perform some operations before hand for speed More...
 
std::vector< FLOAT_T > OscParamsNuOsc
 Values to which NuOsc has pointer. More...
 
std::vector< std::string > NuOscNames
 Names used to match MaCh3 params with NuOsc params. More...
 

Detailed Description

Interface between NuOscillator and MaCh3, meant to compute oscillation weights for events/bin.

Author
Dan Barrow

Definition at line 11 of file OscillationHandler.h.

Constructor & Destructor Documentation

◆ OscillationHandler()

_MaCh3_Safe_Include_Start_ _MaCh3_Safe_Include_End_ OscillationHandler::OscillationHandler ( const std::string &  ConfigFile,
bool  EqualBinningPerChannel,
std::vector< const M3::float_t * >  OscParams_,
std::vector< std::string >  NuOscOscNames_,
const int  SubChannels 
)

Constructor.

Parameters
ConfigFilename/path to NuOscillator Config
EqualBinningPerChannelwhether to use same binning per each oscillation channel
OscParams_Pointers to values of oscillation parameters
SubChannelsNumber of oscillation channels
Warning
If EqualBinningPerChannel is true then argument SubChannels makes no difference

Definition at line 9 of file OscillationHandler.cpp.

10  {
11 // ************************************************
12  EqualBinningPerOscChannel = BinningPerOscChannel_;
13  OscParams = OscParams_;
14  NuOscNames = NuOscNames_;
15  // KS: Be aware we might be running with double on M3 but float in NuOsc
16  #pragma GCC diagnostic push
17  #pragma GCC diagnostic ignored "-Wuseless-cast"
18  OscParamsNuOsc.resize(OscParams.size(), static_cast<FLOAT_T>(M3::_BAD_DOUBLE_));
19  #pragma GCC diagnostic pop
20  // Add first sample
21  NuOscProbCalcers.resize(1);
22 
23  auto OscillFactory = std::make_unique<OscillatorFactory>();
24  //DB's explanation of EqualBinningPerOscChannel:
25  //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
26  //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
27  //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
28 
30  NuOscProbCalcers[0].resize(1);
31  LoggerPrint("NuOscillator",
32  [](const std::string& message) { MACH3LOG_INFO("{}", message); },
33  [this, &OscillFactory, &NuOscillatorConfigFile]() {
34  this->NuOscProbCalcers[0][0] = std::unique_ptr<OscillatorBase>(OscillFactory->CreateOscillator(NuOscillatorConfigFile));
35  });
36 
37  for (size_t i = 0; i < OscParams.size(); i++) {
38  NuOscProbCalcers[0][0]->DefineParameter(NuOscNames[i], &OscParamsNuOsc[i]);
39  }
40  if (!NuOscProbCalcers[0][0]->EvalPointsSetInConstructor()) {
41  MACH3LOG_ERROR("Attempted to use equal binning per oscillation channel, but not binning has been set in the NuOscillator::Oscillator object");
42  throw MaCh3Exception(__FILE__, __LINE__);
43  }
44  LoggerPrint("NuOscillator",
45  [](const std::string& message) { MACH3LOG_INFO("{}", message); },
46  [this]() {
47  NuOscProbCalcers[0][0]->Setup();
48  });
49  } else {
50  NuOscProbCalcers[0].resize(SubChannels);
51  for (int iChannel = 0; iChannel < SubChannels; iChannel++) {
52  MACH3LOG_INFO("Setting up NuOscillator::Oscillator object in OscillationChannel: {}/{}", iChannel, SubChannels);
53 
54  LoggerPrint("NuOscillator",
55  [](const std::string& message) { MACH3LOG_INFO("{}", message); },
56  [this, iChannel, &OscillFactory, &NuOscillatorConfigFile]() {
57  this->NuOscProbCalcers[0][iChannel] = std::unique_ptr<OscillatorBase>(
58  OscillFactory->CreateOscillator(NuOscillatorConfigFile));
59  });
60  for (size_t i = 0; i < OscParams.size(); i++) {
61  NuOscProbCalcers[0][iChannel]->DefineParameter(NuOscNames[i], &OscParamsNuOsc[i]);
62  }
63  }
64  }
65 }
#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:99
Custom exception class used throughout MaCh3.
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.
std::vector< const M3::float_t * > OscParams
pointer to osc params, since not all params affect every sample, we perform some operations before ha...
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...
constexpr static const double _BAD_DOUBLE_
Default value used for double initialisation.
Definition: Core.h:53

◆ ~OscillationHandler()

OscillationHandler::~OscillationHandler ( )
virtual

Destructor.

Definition at line 68 of file OscillationHandler.cpp.

68  {
69 // ************************************************
70 }

Member Function Documentation

◆ AddSample()

void OscillationHandler::AddSample ( const std::string &  NuOscillatorConfigFile,
const int  SubChannels 
)

Add different oscillator for sample.

Definition at line 73 of file OscillationHandler.cpp.

73  {
74 // ************************************************
76  MACH3LOG_ERROR("Trying to add sample while EqualBinningPerOscChannel is enabled. This will not work...");
77  throw MaCh3Exception(__FILE__, __LINE__);
78  }
79  auto OscillFactory = std::make_unique<OscillatorFactory>();
80 
81  std::vector<std::unique_ptr<OscillatorBase>> OscProbCalcersTemp(SubChannels);
82 
83  for (int iChannel = 0; iChannel < SubChannels; iChannel++) {
84  MACH3LOG_INFO("Setting up NuOscillator::Oscillator object in OscillationChannel: {}/{}", iChannel, SubChannels);
85 
86  LoggerPrint("NuOscillator",
87  [](const std::string& message) { MACH3LOG_INFO("{}", message); },
88  [&OscProbCalcersTemp, iChannel, &OscillFactory, &NuOscillatorConfigFile]() {
89  OscProbCalcersTemp[iChannel] = std::unique_ptr<OscillatorBase>(
90  OscillFactory->CreateOscillator(NuOscillatorConfigFile));
91  });
92  for (size_t i = 0; i < OscParams.size(); i++) {
93  OscProbCalcersTemp[iChannel]->DefineParameter(NuOscNames[i], &OscParamsNuOsc[i]);
94  }
95  }
96  NuOscProbCalcers.push_back(std::move(OscProbCalcersTemp));
97 }

◆ Evaluate()

void OscillationHandler::Evaluate ( )

DB Evaluate oscillation weights for each defined event/bin.

Definition at line 100 of file OscillationHandler.cpp.

100  {
101 // ************************************************
102  // NuOscillator is using FLOAT_T while MaCh3 M3::float_t
103  // Moslty they are same however it is possible to have double on M3
104  // but float on NuOsc hence we need conversion
105  for (size_t iPar = 0; iPar < OscParams.size(); ++iPar) {
106  #pragma GCC diagnostic push
107  #pragma GCC diagnostic ignored "-Wuseless-cast"
108  OscParamsNuOsc[iPar] = static_cast<FLOAT_T>(*OscParams[iPar]);
109  #pragma GCC diagnostic pop
110  }
111 
113  NuOscProbCalcers[0][0]->CalculateProbabilities();
114  } else {
115  for (size_t iSample = 0; iSample < NuOscProbCalcers.size(); iSample++) {
116  for (size_t iChannel = 0; iChannel < NuOscProbCalcers[iSample].size(); iChannel++) {
117  NuOscProbCalcers[iSample][iChannel]->CalculateProbabilities();
118  }
119  }
120  }
121 }

◆ GetNuOscillatorPointers()

const M3::float_t * OscillationHandler::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.

Definition at line 125 of file OscillationHandler.cpp.

126  {
127 // ************************************************
128  int IndexSample = 0;
129  int IndexChannel = 0;
131  IndexSample = Sample;
132  IndexChannel = Channel;
133  }
134 
135  if(TrueCosZenith != -999) {
136  return NuOscProbCalcers[IndexSample][IndexChannel]->ReturnWeightPointer(InitFlav ,FinalFlav, TrueEnu, TrueCosZenith);
137  } else {
138  return NuOscProbCalcers[IndexSample][IndexChannel]->ReturnWeightPointer(InitFlav ,FinalFlav, TrueEnu);
139  }
140 }

◆ GetOscParamsSize()

unsigned int OscillationHandler::GetOscParamsSize ( ) const
inline

return size of oscillation parameter pointer vector

Definition at line 41 of file OscillationHandler.h.

41 {return static_cast<unsigned int>(OscParams.size());};

◆ isEqualBinningPerOscChannel()

bool OscillationHandler::isEqualBinningPerOscChannel ( )
inline

check if same binning is used for multiple oscillation channels

Definition at line 29 of file OscillationHandler.h.

◆ SetOscillatorBinning()

void OscillationHandler::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.

Definition at line 144 of file OscillationHandler.cpp.

145  {
146 // ************************************************
147  if (!NuOscProbCalcers[Sample][Channel]->EvalPointsSetInConstructor()) {
148  NuOscProbCalcers[Sample][Channel]->SetEnergyArrayInCalcer(EnergyArray);
149  if(CosineZArray.size() != 0) NuOscProbCalcers[Sample][Channel]->SetCosineZArrayInCalcer(CosineZArray);
150  }
151  LoggerPrint("NuOscillator",
152  [](const std::string& message) { MACH3LOG_INFO("{}", message); },
153  [this, Sample, Channel]() {
154  NuOscProbCalcers[Sample][Channel]->Setup();
155  });
156 }

Member Data Documentation

◆ EqualBinningPerOscChannel

bool OscillationHandler::EqualBinningPerOscChannel
private

flag used to define whether all oscillation channels have a probability calculated using the same binning

Definition at line 44 of file OscillationHandler.h.

◆ NuOscNames

std::vector<std::string> OscillationHandler::NuOscNames
private

Names used to match MaCh3 params with NuOsc params.

Definition at line 54 of file OscillationHandler.h.

◆ NuOscProbCalcers

std::vector<std::vector<std::unique_ptr<OscillatorBase> > > OscillationHandler::NuOscProbCalcers
private

DB Variables required for oscillation.

Definition at line 47 of file OscillationHandler.h.

◆ OscParams

std::vector<const M3::float_t*> OscillationHandler::OscParams
private

pointer to osc params, since not all params affect every sample, we perform some operations before hand for speed

Definition at line 50 of file OscillationHandler.h.

◆ OscParamsNuOsc

std::vector<FLOAT_T> OscillationHandler::OscParamsNuOsc
private

Values to which NuOsc has pointer.

Definition at line 52 of file OscillationHandler.h.


The documentation for this class was generated from the following files: