MARLEY (Model of Argon Reaction Low Energy Yields)  v1.2.0
A Monte Carlo event generator for tens-of-MeV neutrino interactions
NeutrinoSource.hh
1 //
5 // This file is part of MARLEY (Model of Argon Reaction Low Energy Yields)
6 //
7 // MARLEY is free software: you can redistribute it and/or modify it under the
8 // terms of version 3 of the GNU General Public License as published by the
9 // Free Software Foundation.
10 //
11 // For the full text of the license please see COPYING or
12 // visit http://opensource.org/licenses/GPL-3.0
13 //
14 // Please respect the MCnet academic usage guidelines. See GUIDELINES
15 // or visit https://www.montecarlonet.org/GUIDELINES for details.
16 
17 #pragma once
18 #include <functional>
19 #include <set>
20 
21 #include "marley/marley_utils.hh"
22 #include "marley/InterpolationGrid.hh"
23 
24 namespace marley {
25 
26  class Generator;
27 
39  public:
40 
43  NeutrinoSource(int particle_id);
44 
45  virtual ~NeutrinoSource() = default;
46 
49  virtual double get_Emax() const = 0;
50 
53  virtual double get_Emin() const = 0;
54 
57  inline virtual int get_pid() const;
58 
66  virtual double pdf(double E) const = 0;
67 
71  static inline bool pdg_is_allowed(const int pdg);
72 
83  virtual double sample_incident_neutrino(int& pdg,
84  marley::Generator& gen) const;
85 
86  protected:
87 
88  int pid_;
89 
90  private:
95  static const std::set<int> pids_;
96  };
97 
100  public:
103  inline MonoNeutrinoSource(int particle_id =
104  marley_utils::ELECTRON_NEUTRINO, double E = 10.);
105 
106  inline virtual double get_Emax() const override;
107 
108  inline virtual double get_Emin() const override;
109 
110  inline virtual double pdf(double E) const override;
111 
112  protected:
113  double energy_;
114  };
115 
125  public:
126 
133  FermiDiracNeutrinoSource(int particle_id
134  = marley_utils::ELECTRON_NEUTRINO, double Emin = 0.,
135  double Emax = 50., double temp = 3.5, double eta = 0.);
136 
137  inline virtual double get_Emin() const override;
138 
139  inline virtual double get_Emax() const override;
140 
141  virtual double pdf(double E) const override;
142 
143  protected:
144 
145  double Emin_;
146  double Emax_;
147  double temperature_;
148  double eta_;
149  double C_;
150  };
151 
162  public:
169  BetaFitNeutrinoSource(int particle_id
170  = marley_utils::ELECTRON_NEUTRINO, double Emin = 0.,
171  double Emax = 50., double Emean = 13., double beta = 4.5);
172 
173  inline virtual double get_Emin() const override;
174  inline virtual double get_Emax() const override;
175 
176  virtual double pdf(double E) const override;
177 
178  protected:
179  double Emin_;
180  double Emax_;
185  double Emean_;
186  double beta_;
187  double C_;
188  };
189 
193  public:
200  FunctionNeutrinoSource(int particle_id
201  = marley_utils::ELECTRON_NEUTRINO, double Emin = 0., double Emax = 50.,
202  std::function<double(double)> prob_dens_func
203  = [](double) -> double { return 1.; });
204 
205  inline virtual double get_Emax() const override;
206 
207  inline virtual double get_Emin() const override;
208 
209  inline virtual double pdf(double E) const override;
210 
211  private:
212  double Emin_;
213  double Emax_;
215  std::function<double(double)> probability_density_;
216  };
217 
227  public:
230  DecayAtRestNeutrinoSource(int particle_id
231  = marley_utils::ELECTRON_NEUTRINO);
232 
233  inline virtual double get_Emax() const override;
234 
235  inline virtual double get_Emin() const override;
236 
237  virtual double pdf(double E) const override;
238 
239  private:
240  // Muon mass stuff (m_mu^(-4) pre-computed for speed)
241  static constexpr double m_mu_ = marley_utils::m_mu
242  * marley_utils::micro_amu; // MeV
243  static constexpr double m_mu_to_the_minus_four_
244  = 1. / (m_mu_ * m_mu_ * m_mu_ * m_mu_);
245  static constexpr double Emin_ = 0.; // MeV
246  static constexpr double Emax_ = m_mu_ / 2.; // MeV
247  };
248 
251  public:
253  using Method = Grid::InterpolationMethod;
254 
259  inline GridNeutrinoSource(const Grid& g, int particle_id
260  = marley_utils::ELECTRON_NEUTRINO);
261 
268  inline GridNeutrinoSource(const std::vector<double>& Es,
269  const std::vector<double>& PDs, int particle_id
270  = marley_utils::ELECTRON_NEUTRINO, Method method
271  = Method::LinearLinear);
272 
273  inline virtual double get_Emax() const override;
274 
275  inline virtual double get_Emin() const override;
276 
277  inline virtual double pdf(double E) const override;
278 
279  protected:
280  Grid grid_;
281 
282  private:
285  void check_for_errors();
286  };
287 
288  // Inline function definitions
289  inline int NeutrinoSource::get_pid() const { return pid_; }
290  inline bool NeutrinoSource::pdg_is_allowed(const int pdg)
291  { return (pids_.count(pdg) > 0); }
292 
293  inline MonoNeutrinoSource::MonoNeutrinoSource(int particle_id, double E)
294  : NeutrinoSource(particle_id), energy_(E) {}
295  inline double MonoNeutrinoSource::get_Emax() const { return energy_; }
296  inline double MonoNeutrinoSource::get_Emin() const { return energy_; }
297  inline double MonoNeutrinoSource::pdf(double E) const
298  { if (energy_ == E) return 1.; else return 0.; }
299 
300  inline double FermiDiracNeutrinoSource::get_Emax() const { return Emax_; }
301  inline double FermiDiracNeutrinoSource::get_Emin() const { return Emin_; }
302 
303  inline double BetaFitNeutrinoSource::get_Emax() const { return Emax_; }
304  inline double BetaFitNeutrinoSource::get_Emin() const { return Emin_; }
305 
306  inline double FunctionNeutrinoSource::get_Emax() const { return Emax_; }
307  inline double FunctionNeutrinoSource::get_Emin() const { return Emin_; }
308  inline double FunctionNeutrinoSource::pdf(double E) const {
309  if (E < Emin_ || E > Emax_) return 0.;
310  else return probability_density_(E);
311  }
312 
313  inline double DecayAtRestNeutrinoSource::get_Emax() const { return Emax_; }
314  inline double DecayAtRestNeutrinoSource::get_Emin() const { return Emin_; }
315 
316  inline double GridNeutrinoSource::get_Emax() const
317  { return grid_.back().first; }
318  inline double GridNeutrinoSource::get_Emin() const
319  { return grid_.front().first; }
320  inline double GridNeutrinoSource::pdf(double E) const
321  { return grid_.interpolate(E); }
322 
323  inline GridNeutrinoSource::GridNeutrinoSource(const Grid& g, int particle_id)
324  : NeutrinoSource(particle_id), grid_(g) { check_for_errors(); }
325 
326  inline GridNeutrinoSource::GridNeutrinoSource(const std::vector<double>& Es,
327  const std::vector<double>& prob_densities, int particle_id, Method method)
328  : NeutrinoSource(particle_id), grid_(Es, prob_densities, method)
329  { check_for_errors(); }
330 }
"Beta-fit" neutrino source
Definition: NeutrinoSource.hh:161
virtual double pdf(double E) const override
Probability density function describing the incident neutrino energy distribution.
Definition: NeutrinoSource.cc:95
double C_
dimensionless normalization constant
Definition: NeutrinoSource.hh:187
double Emax_
Definition: NeutrinoSource.hh:180
virtual double get_Emax() const override
Get the maximum neutrino energy (MeV) that can be sampled by this source.
Definition: NeutrinoSource.hh:303
double Emean_
mean neutrino energy
Definition: NeutrinoSource.hh:185
virtual double get_Emin() const override
Get the minimum neutrino energy (MeV) that can be sampled by this source.
Definition: NeutrinoSource.hh:304
double Emin_
minimum neutrino energy (MeV)
Definition: NeutrinoSource.hh:179
BetaFitNeutrinoSource(int particle_id=marley_utils::ELECTRON_NEUTRINO, double Emin=0., double Emax=50., double Emean=13., double beta=4.5)
Definition: NeutrinoSource.cc:72
double beta_
pinching parameter
Definition: NeutrinoSource.hh:186
Muon decay-at-rest neutrino source.
Definition: NeutrinoSource.hh:226
virtual double get_Emax() const override
Get the maximum neutrino energy (MeV) that can be sampled by this source.
Definition: NeutrinoSource.hh:313
DecayAtRestNeutrinoSource(int particle_id=marley_utils::ELECTRON_NEUTRINO)
Definition: NeutrinoSource.cc:115
virtual double pdf(double E) const override
Probability density function describing the incident neutrino energy distribution.
Definition: NeutrinoSource.cc:128
virtual double get_Emin() const override
Get the minimum neutrino energy (MeV) that can be sampled by this source.
Definition: NeutrinoSource.hh:314
Supernova cooling neutrino source approximated using a Fermi-Dirac distribution.
Definition: NeutrinoSource.hh:124
FermiDiracNeutrinoSource(int particle_id=marley_utils::ELECTRON_NEUTRINO, double Emin=0., double Emax=50., double temp=3.5, double eta=0.)
Definition: NeutrinoSource.cc:50
double eta_
dimensionless pinching parameter
Definition: NeutrinoSource.hh:148
double Emin_
minimum neutrino energy (MeV)
Definition: NeutrinoSource.hh:145
virtual double get_Emax() const override
Get the maximum neutrino energy (MeV) that can be sampled by this source.
Definition: NeutrinoSource.hh:300
double C_
normalization constant (MeV2)
Definition: NeutrinoSource.hh:149
double Emax_
maximum neutrino energy (MeV)
Definition: NeutrinoSource.hh:146
virtual double pdf(double E) const override
Probability density function describing the incident neutrino energy distribution.
Definition: NeutrinoSource.cc:66
double temperature_
temperature (MeV)
Definition: NeutrinoSource.hh:147
virtual double get_Emin() const override
Get the minimum neutrino energy (MeV) that can be sampled by this source.
Definition: NeutrinoSource.hh:301
Neutrino source with an arbitrary energy spectrum described by a std::function<double(double)> object...
Definition: NeutrinoSource.hh:192
virtual double pdf(double E) const override
Probability density function describing the incident neutrino energy distribution.
Definition: NeutrinoSource.hh:308
virtual double get_Emax() const override
Get the maximum neutrino energy (MeV) that can be sampled by this source.
Definition: NeutrinoSource.hh:306
FunctionNeutrinoSource(int particle_id=marley_utils::ELECTRON_NEUTRINO, double Emin=0., double Emax=50., std::function< double(double)> prob_dens_func=[](double) -> double { return 1.;})
Definition: NeutrinoSource.cc:103
virtual double get_Emin() const override
Get the minimum neutrino energy (MeV) that can be sampled by this source.
Definition: NeutrinoSource.hh:307
The MARLEY Event generator.
Definition: Generator.hh:42
Neutrino source that uses a tabulated energy spectrum.
Definition: NeutrinoSource.hh:250
virtual double pdf(double E) const override
Probability density function describing the incident neutrino energy distribution.
Definition: NeutrinoSource.hh:320
virtual double get_Emin() const override
Get the minimum neutrino energy (MeV) that can be sampled by this source.
Definition: NeutrinoSource.hh:318
virtual double get_Emax() const override
Get the maximum neutrino energy (MeV) that can be sampled by this source.
Definition: NeutrinoSource.hh:316
GridNeutrinoSource(const Grid &g, int particle_id=marley_utils::ELECTRON_NEUTRINO)
Definition: NeutrinoSource.hh:323
const OrderedPair & back() const
Returns a reference to the last ordered pair.
Definition: InterpolationGrid.hh:192
SecondNumericType interpolate(FirstNumericType x) const
Compute y(x) using the current InterpolationMethod.
Definition: InterpolationGrid.hh:273
InterpolationMethod
Method to use for interpolating between (x,y) grid points.
Definition: InterpolationGrid.hh:63
const OrderedPair & front() const
Returns a reference to the first ordered pair.
Definition: InterpolationGrid.hh:189
Monoenergetic neutrino source.
Definition: NeutrinoSource.hh:99
double energy_
neutrino energy (MeV)
Definition: NeutrinoSource.hh:113
virtual double pdf(double E) const override
Probability density function describing the incident neutrino energy distribution.
Definition: NeutrinoSource.hh:297
virtual double get_Emax() const override
Get the maximum neutrino energy (MeV) that can be sampled by this source.
Definition: NeutrinoSource.hh:295
virtual double get_Emin() const override
Get the minimum neutrino energy (MeV) that can be sampled by this source.
Definition: NeutrinoSource.hh:296
MonoNeutrinoSource(int particle_id=marley_utils::ELECTRON_NEUTRINO, double E=10.)
Definition: NeutrinoSource.hh:293
Abstract base class for all objects that describe the incident neutrino energy distribution.
Definition: NeutrinoSource.hh:38
virtual double get_Emax() const =0
Get the maximum neutrino energy (MeV) that can be sampled by this source.
NeutrinoSource(int particle_id)
Definition: NeutrinoSource.cc:22
int pid_
PDG particle ID for the neutrinos produced by this source.
Definition: NeutrinoSource.hh:88
virtual double get_Emin() const =0
Get the minimum neutrino energy (MeV) that can be sampled by this source.
virtual double pdf(double E) const =0
Probability density function describing the incident neutrino energy distribution.
virtual double sample_incident_neutrino(int &pdg, marley::Generator &gen) const
Samples an incident neutrino energy and loads pdg with the PDG code of the appropriate neutrino type.
Definition: NeutrinoSource.cc:41
virtual int get_pid() const
Get the PDG particle ID for the neutrino type produced by this source.
Definition: NeutrinoSource.hh:289
static bool pdg_is_allowed(const int pdg)
Definition: NeutrinoSource.hh:290