22 #include "art_root_io/TFileService.h" 23 #include "art_root_io/TFileDirectory.h" 25 #include "cetlib_except/exception.h" 33 #include "nurandom/RandomUtils/NuRandomService.h" 50 #include "marley/marley_root.hh" 51 #include "marley/marley_utils.hh" 52 #include "marley/Integrator.hh" 59 constexpr
int MAX_UNIFORM_ENERGY_ITERATIONS = 1000;
63 constexpr
double ONE = 1.;
67 constexpr
int NUM_INTEGRATION_SAMPLING_POINTS = 100;
71 constexpr
double MeV_to_erg = 1.6021766208e-6;
74 constexpr std::array<int, 4> NU_X_PDG_CODES
76 marley_utils::MUON_NEUTRINO, marley_utils::MUON_ANTINEUTRINO,
77 marley_utils::TAU_NEUTRINO, marley_utils::TAU_ANTINEUTRINO,
82 bool is_nux(
int pdg_code) {
88 const std::regex rx_comment_or_empty = std::regex(
"\\s*(#.*)?");
92 double flux_averaged_total_xs(marley::NeutrinoSource& nu_source,
93 marley::Generator&
gen);
98 double flux_averaged_total_xs(marley::NeutrinoSource& nu_source,
99 marley::Generator&
gen,
double& source_integ,
double& tot_xs_integ);
103 double integrate(
const std::function<
double(
double)>&
f,
double x_min,
123 return {
"marley_parameters" };
132 Comment(
"Configuration for selecting the vertex location(s)")
142 Name(
"sampling_mode"),
143 Comment(
"Technique to use when sampling times and energies. Valid" 144 " options are \"histogram\", \"uniform time\"," 145 " and \"uniform energy\""),
150 Name(
"nu_per_event"),
151 Comment(
"The number of neutrino vertices to generate in" 157 Name(
"spectrum_file_format"),
158 Comment(
"Format to assume for the neutrino spectrum file." 159 " Valid options are \"th2d\" (a ROOT file containing a " 160 " TH2D object) and \"fit\" (an ASCII text file containing" 161 " fit parameters for each time bin). This parameter is not" 167 Name(
"spectrum_file"),
168 Comment(
"Name of a file that contains a representation" 169 " of the incident (not cross section weighted) neutrino spectrum" 170 " as a function of time and energy.")
174 Name(
"pinching_parameter_type"),
175 Comment(
"Type of pinching parameter to assume when parsing" 176 " the time-dependent fit parameters for the incident neutrino" 177 " spectrum. Valid options are \"alpha\" and \"beta\". This" 178 " parameter is not case-sensitive."),
180 auto spectrum_file_format
181 = marley_utils::to_lowercase(spectrum_file_format_());
182 return (spectrum_file_format ==
"fit");
188 Comment(
"Name of the TH2D object to use to represent the" 189 " incident neutrino spectrum. This value should match the" 190 " name of the TH2D as given in the ROOT file specified" 191 " in the \"spectrum_file\" parameter. The TH2D should use " 192 " time bins on the X axis (seconds) and energy bins on the " 195 auto spectrum_file_format
196 = marley_utils::to_lowercase(spectrum_file_format_());
197 return (spectrum_file_format ==
"th2d");
203 Comment(
"Minimum allowed neutrino energy (MeV) for a \"fit\" format" 206 auto spectrum_file_format
207 = marley_utils::to_lowercase(spectrum_file_format_());
208 return (spectrum_file_format ==
"fit");
214 Comment(
"Maximum allowed neutrino energy (MeV) for a \"fit\" format" 217 auto spectrum_file_format
218 = marley_utils::to_lowercase(spectrum_file_format_());
219 return (spectrum_file_format ==
"fit");
244 : fEmean(Emean), fAlpha(alpha), fLuminosity(luminosity) {}
247 double Emean()
const {
return fEmean; }
249 double Alpha()
const {
return fAlpha; }
266 template<
typename It>
static marley::IteratorToMember<It, double>
269 return marley::IteratorToMember<It, double>(
284 double lum_nue,
double Emean_nuebar,
double alpha_nuebar,
285 double lum_nuebar,
double Emean_nux,
double alpha_nux,
286 double lum_nux) : fTime(time),
287 fNueFitParams(Emean_nue, alpha_nue, lum_nue),
288 fNuebarFitParams(Emean_nuebar, alpha_nuebar, lum_nuebar),
289 fNuxFitParams(Emean_nux, alpha_nux, lum_nux) {}
294 double Time()
const {
return fTime; }
304 if (pdg_code == marley_utils::ELECTRON_NEUTRINO) {
307 else if (pdg_code == marley_utils::ELECTRON_ANTINEUTRINO) {
310 else if ( is_nux(pdg_code) )
316 <<
" PDG code " << pdg_code <<
" encountered in MARLEYTimeGen" 317 <<
"::TimeFit::GetFitParametersMemberPointer()";
327 return this->*GetFitParametersMemberPointer(pdg_code);
340 template<
typename It>
static marley::IteratorToMember<It,
344 return marley::IteratorToMember<It, FitParameters>(
345 iterator, GetFitParametersMemberPointer(pdg_code) );
370 double& E_nu,
const TLorentzVector& vertex_pos);
538 fEventTree = tfs->make<TTree>(
"MARLEY_event_tree",
539 "Neutrino events generated by MARLEY");
551 produces< std::vector<simb::MCTruth> >();
552 produces< std::vector<sim::SupernovaTruth> >();
553 produces< art::Assns<simb::MCTruth, sim::SupernovaTruth> >();
554 produces< sumdata::RunData, art::InRun >();
579 double E_nu =
fEvent->projectile().total_energy();
581 TH1D* t_hist =
fSpectrumHist->ProjectionX(
"dummy_time_hist", E_bin_index,
583 double* time_bin_weights = t_hist->GetArray();
586 std::discrete_distribution<int> time_dist;
587 std::discrete_distribution<int>::param_type time_params(time_bin_weights,
588 &(time_bin_weights[t_hist->GetNbinsX() + 1]));
589 int time_bin_index = gen.sample_from_distribution(time_dist, time_params);
592 double t_min = t_hist->GetBinLowEdge(time_bin_index);
593 double t_max = t_min + t_hist->GetBinWidth(time_bin_index);
595 fTNu = gen.uniform_random_double(t_min, t_max,
false);
614 double t_min = time_axis->GetBinLowEdge(1);
615 double t_max = time_axis->GetBinLowEdge(time_axis->GetNbins() + 1);
617 fTNu = gen.uniform_random_double(t_min, t_max,
false);
622 double E_nu =
fEvent->projectile().total_energy();
624 TH1D* t_hist =
fSpectrumHist->ProjectionX(
"dummy_time_hist", E_bin_index,
626 int t_bin_index = t_hist->FindBin(
fTNu);
627 double weight_bias = t_hist->GetBinContent(t_bin_index) * (t_max - t_min)
628 / ( t_hist->Integral() * t_hist->GetBinWidth(t_bin_index) );
639 TH1D* t_hist =
fSpectrumHist->ProjectionX(
"dummy_time_hist");
640 double* time_bin_weights = t_hist->GetArray();
643 std::discrete_distribution<int> time_dist;
644 std::discrete_distribution<int>::param_type time_params(time_bin_weights,
645 &(time_bin_weights[t_hist->GetNbinsX() + 1]));
646 int time_bin_index = gen.sample_from_distribution(time_dist, time_params);
649 double t_min = t_hist->GetBinLowEdge(time_bin_index);
650 double t_max = t_min + t_hist->GetBinWidth(time_bin_index);
652 fTNu = gen.uniform_random_double(t_min, t_max,
false);
657 double E_min = energy_axis->GetBinLowEdge(1);
658 double E_max = energy_axis->GetBinLowEdge(energy_axis->GetNbins() + 1);
660 double E_nu = std::numeric_limits<double>::lowest();
670 TH1D* energy_spect =
fSpectrumHist->ProjectionY(
"energy_spect",
671 time_bin_index, time_bin_index);
676 auto nu_source = marley_root::make_root_neutrino_source(
677 marley_utils::ELECTRON_NEUTRINO, energy_spect);
678 double new_source_E_min = nu_source->get_Emin();
679 double new_source_E_max = nu_source->get_Emax();
683 double E_pdf_integ = integrate([&gen](
double E_nu)
684 ->
double {
return gen.E_pdf(E_nu); }, new_source_E_min,
689 double weight_bias = (gen.E_pdf(E_nu) / E_pdf_integ) * (E_max - E_min);
698 throw cet::exception(
"MARLEYTimeGen") <<
"Unrecognized sampling mode" 699 <<
" encountered in evgen::MarleyTimeGen::produce()";
716 std::unique_ptr< std::vector<simb::MCTruth> >
717 truthcol(
new std::vector<simb::MCTruth>);
719 std::unique_ptr< std::vector<sim::SupernovaTruth> >
720 sn_truthcol(
new std::vector<sim::SupernovaTruth>);
722 std::unique_ptr< art::Assns<simb::MCTruth, sim::SupernovaTruth> >
732 TLorentzVector vertex_pos =
fVertexSampler->sample_vertex_pos(*geo);
735 fTNu = std::numeric_limits<double>::lowest();
745 <<
" format encountered in evgen::MarleyTimeGen::produce()";
752 truthcol->push_back(truth);
754 sn_truthcol->push_back(sn_truth);
779 fVertexSampler = std::make_unique<evgen::ActiveVolumeVertexSampler>(
780 p().vertex_, *seed_service, *geom_service,
"MARLEY_Vertex_Sampler");
786 *seed_service,
"MARLEY" );
792 const std::string& samp_mode_str =
p().sampling_mode_();
793 if (samp_mode_str ==
"histogram")
795 else if (samp_mode_str ==
"uniform time")
797 else if (samp_mode_str ==
"uniform energy")
800 <<
"Invalid sampling mode \"" << samp_mode_str <<
"\"" 801 <<
" specified for the MARLEYTimeGen module.";
803 MF_LOG_INFO(
"MARLEYTimeGen") << fNeutrinosPerEvent <<
" neutrino vertices" 804 <<
" will be generated for each art::Event using the \"" << samp_mode_str
805 <<
"\" sampling mode.";
809 std::string spectrum_file_format = marley_utils::to_lowercase(
810 p().spectrum_file_format_());
812 if (spectrum_file_format ==
"th2d")
814 else if (spectrum_file_format ==
"fit") {
818 if ( !
p().pinching_parameter_type_(pinch_type) ) {
819 throw cet::exception(
"MARLEYTimeGen") <<
"Missing pinching parameter" 820 <<
" type for a \"fit\" format spectrum file";
823 marley_utils::to_lowercase_inplace(pinch_type);
827 <<
"Invalid pinching parameter type \"" << pinch_type
828 <<
"\" specified for the MARLEYTimeGen module.";
831 <<
"Missing minimum energy for a \"fit\" format spectrum" 832 <<
" used by the MARLEYTimeGen module.";
835 <<
"Missing maximum energy for a \"fit\" format spectrum" 836 <<
" used by the MARLEYTimeGen module.";
839 <<
"Maximum energy is less than the minimum energy for" 840 <<
" a \"fit\" format spectrum used by the MARLEYTimeGen module.";
843 <<
"Invalid spectrum file format \"" <<
p().spectrum_file_format_()
844 <<
"\" specified for the MARLEYTimeGen module.";
848 = fMarleyHelper->find_file(
p().spectrum_file_(),
"spectrum");
850 marley::Generator&
gen = fMarleyHelper->get_generator();
855 std::unique_ptr<TFile> spectrum_file
856 = std::make_unique<TFile>(full_spectrum_file_name.c_str(),
"read");
857 TH2D* temp_h2 =
nullptr;
859 if ( !
p().namecycle_(namecycle) ) {
861 <<
" a TH2D spectrum file";
864 spectrum_file->GetObject(namecycle.c_str(), temp_h2);
876 TH1D* energy_spect =
fSpectrumHist->ProjectionY(
"energy_spect");
882 std::unique_ptr<marley::NeutrinoSource> nu_source
883 = marley_root::make_root_neutrino_source(marley_utils::ELECTRON_NEUTRINO,
888 * flux_averaged_total_xs(*nu_source, gen);
906 std::ifstream fit_file(full_spectrum_file_name);
909 bool found_end =
false;
914 int lines_checked = 0;
916 double old_time = std::numeric_limits<double>::lowest();
918 while ( line = marley_utils::get_next_line(fit_file, rx_comment_or_empty,
919 false, lines_checked), line_num += lines_checked, !line.empty() )
922 MF_LOG_WARNING(
"MARLEYTimeGen") <<
"Trailing content after last time" 923 <<
" bin found on line " << line_num <<
" of the spectrum file " 924 << full_spectrum_file_name;
928 double Emean_nue, alpha_nue, luminosity_nue;
929 double Emean_nuebar, alpha_nuebar, luminosity_nuebar;
930 double Emean_nux, alpha_nux, luminosity_nux;
931 std::istringstream iss(line);
932 bool ok_first =
static_cast<bool>( iss >> time );
935 <<
"Time bin left edges given in the spectrum file must be" 936 <<
" strictly increasing. Invalid time bin value found on line " 937 << line_num <<
" of the spectrum file " << full_spectrum_file_name;
938 else old_time = time;
940 bool ok_rest =
static_cast<bool>( iss >> Emean_nue >> alpha_nue
941 >> luminosity_nue >> Emean_nuebar >> alpha_nuebar >> luminosity_nuebar
942 >> Emean_nux >> alpha_nux >> luminosity_nux
949 fTimeFits.emplace_back(time, Emean_nue, alpha_nue, luminosity_nue,
950 Emean_nuebar, alpha_nuebar, luminosity_nuebar, Emean_nux,
951 alpha_nux, luminosity_nux);
958 else throw cet::exception(
"MARLEYTimeGen") <<
"Parse error on line " 959 << line_num <<
" of the spectrum file " << full_spectrum_file_name;
966 <<
"Missing right edge for the final time bin in the spectrum file " 967 << full_spectrum_file_name <<
". Unable to guess a bin width for the " 972 double delta_t_bin =
fTimeFits.back().Time()
973 -
fTimeFits.at(num_time_bins - 2).Time();
975 double last_bin_right_edge =
fTimeFits.back().Time() + delta_t_bin;
980 <<
" edge for the final time bin in the spectrum file " 981 << full_spectrum_file_name <<
". Assuming a width of " 982 << delta_t_bin <<
" s for the final bin.";
988 std::vector< std::unique_ptr< marley::NeutrinoSource > > fit_sources;
995 auto temp_source = std::make_unique<marley::FunctionNeutrinoSource>(
997 [&fit_sources,
this](
double E_nu) ->
double {
999 for (
size_t s = 0;
s < fit_sources.
size(); ++
s) {
1001 const TimeFit& current_fit = this->fTimeFits.at(
s);
1002 const auto& current_source = fit_sources.at(
s);
1004 current_source->get_pid() );
1011 if (lum <= 0.)
continue;
1013 flux += lum * current_source->pdf(E_nu);
1019 double flux_integ = 0.;
1020 double tot_xs_integ = 0.;
1021 flux_averaged_total_xs(*temp_source, gen, flux_integ, tot_xs_integ);
1025 * tot_xs_integ / flux_integ;
1032 throw cet::exception(
"MARLEYTimeGen") <<
"Unrecognized neutrino spectrum" 1033 <<
" file format \"" <<
p().spectrum_file_format_() <<
"\" encountered" 1034 <<
" in evgen::MarleyTimeGen::reconfigure()";
1037 MF_LOG_INFO(
"MARLEYTimeGen") <<
"The flux-averaged total cross section" 1038 <<
" predicted by MARLEY for the current supernova spectrum is " 1060 int source_pdg_code = gen.get_source().get_pid();
1072 std::discrete_distribution<size_t> time_dist(lum_begin, lum_end);
1077 time_bin_index = gen.sample_from_distribution(time_dist);
1081 int last_time_index = 0;
1083 std::uniform_int_distribution<size_t> uid(0, last_time_index);
1085 time_bin_index = gen.sample_from_distribution(uid);
1089 throw cet::exception(
"MARLEYTimeGen") <<
"Unrecognized sampling mode" 1090 <<
" encountered in evgen::MarleyTimeGen::produce()";
1099 double t_min =
fTimeFits.at(time_bin_index).Time();
1100 double t_max =
fTimeFits.at(time_bin_index + 1).Time();
1102 fTNu = gen.uniform_random_double(t_min, t_max,
false);
1108 const auto& fit =
fTimeFits.at(time_bin_index);
1132 double weight_bias = time_dist.probabilities().at(time_bin_index)
1133 / (t_max - t_min) * (
fTimeFits.back().Time()
1144 double E_nu = std::numeric_limits<double>::lowest();
1156 double nu_source_E_min = nu_source->get_Emin();
1157 double nu_source_E_max = nu_source->get_Emax();
1162 double E_pdf_integ = integrate([&gen](
double E_nu)
1163 ->
double {
return gen.E_pdf(E_nu); }, nu_source_E_min,
1168 double weight_bias = (gen.E_pdf(E_nu) / E_pdf_integ)
1177 throw cet::exception(
"MARLEYTimeGen") <<
"Unrecognized sampling mode" 1178 <<
" encountered in evgen::MarleyTimeGen::produce()";
1184 std::unique_ptr<marley::NeutrinoSource>
1198 throw cet::exception(
"MARLEYTimeGen") <<
"Unreognized pinching parameter" 1199 <<
" type encountered in evgen::MarleyTimeGen::source_from_time_fit()";
1203 std::unique_ptr<marley::NeutrinoSource> nu_source
1204 = std::make_unique<marley::BetaFitNeutrinoSource>(
1213 double E_max,
double& E_nu,
const TLorentzVector& vertex_pos)
1227 if (j >= MAX_UNIFORM_ENERGY_ITERATIONS) {
1228 throw cet::exception(
"MARLEYTimeGen") <<
"Exceeded the maximum of " 1229 << MAX_UNIFORM_ENERGY_ITERATIONS <<
" while attempting to sample" 1230 <<
" a neutrino energy uniformly.";
1233 E_nu = gen.uniform_random_double(E_min, E_max,
false);
1238 for (
const auto& react : gen.get_reactions()) {
1239 total_xs += react->total_xs(marley_utils::ELECTRON_NEUTRINO, E_nu);
1243 }
while (total_xs <= 0.);
1247 std::unique_ptr<marley::NeutrinoSource> nu_source
1248 = std::make_unique<marley::MonoNeutrinoSource>(
1249 marley_utils::ELECTRON_NEUTRINO, E_nu);
1264 fTimeFits.emplace_back(time, 0., 0., 0., 0., 0., 0., 0., 0., 0.);
1274 std::vector<double> temp_times;
1275 for (
const auto& fit :
fTimeFits) temp_times.push_back(fit.Time());
1280 if (temp_times.size() < 2)
return;
1283 int num_bins = temp_times.size() - 1;
1288 TH1D* nue_hist = tfs->make<TH1D>(
"NueEmission",
1289 "Number of emitted #nu_{e}; time (s); number of neutrinos in time bin",
1290 num_bins, temp_times.data());
1291 TH1D* nuebar_hist = tfs->make<TH1D>(
"NuebarEmission",
1292 "Number of emitted #bar{#nu}_{e}; time (s); number of neutrinos in" 1293 " time bin", num_bins, temp_times.data());
1294 TH1D* nux_hist = tfs->make<TH1D>(
"NuxEmission",
1295 "Number of emitted #nu_{x}; time (s); number of neutrinos in time bin",
1296 num_bins, temp_times.data());
1299 for (
size_t b = 1;
b < temp_times.size(); ++
b) {
1300 const TimeFit& current_fit = fTimeFits.at(
b - 1);
1301 const TimeFit& next_fit = fTimeFits.at(
b);
1302 double bin_deltaT = next_fit.
Time() - current_fit.
Time();
1305 marley_utils::ELECTRON_NEUTRINO);
1307 marley_utils::ELECTRON_ANTINEUTRINO);
1309 marley_utils::MUON_NEUTRINO);
1314 double num_nue = 0.;
1315 double num_nuebar = 0.;
1316 double num_nux = 0.;
1317 if (nue_params.Emean() != 0.) num_nue = nue_params.
Luminosity()
1318 * bin_deltaT / (nue_params.Emean() * MeV_to_erg);
1319 if (nuebar_params.Emean() != 0.) num_nuebar = nuebar_params.Luminosity()
1320 * bin_deltaT / (nuebar_params.Emean() * MeV_to_erg);
1321 if (nux_params.Emean() != 0.) num_nux = nux_params.Luminosity()
1322 * bin_deltaT / (nux_params.Emean() * MeV_to_erg);
1324 nue_hist->SetBinContent(
b, num_nue);
1325 nuebar_hist->SetBinContent(
b, num_nuebar);
1326 nux_hist->SetBinContent(
b, num_nux);
1336 double flux_averaged_total_xs(marley::NeutrinoSource& nu_source,
1337 marley::Generator&
gen,
double& source_integ,
double& tot_xs_integ)
1340 source_integ = integrate(
1341 [&nu_source](
double E_nu) ->
double {
return nu_source.pdf(E_nu); },
1342 nu_source.get_Emin(), nu_source.get_Emax()
1345 tot_xs_integ = integrate(
1346 [&nu_source, &gen](
double E_nu) ->
double 1349 for (
const auto& react : gen.get_reactions()) {
1350 xs += react->total_xs(marley_utils::ELECTRON_NEUTRINO, E_nu);
1352 return xs * nu_source.pdf(E_nu);
1353 }, nu_source.get_Emin(), nu_source.get_Emax()
1356 return tot_xs_integ / source_integ;
1359 double flux_averaged_total_xs(marley::NeutrinoSource& nu_source,
1360 marley::Generator& gen)
1362 double dummy1, dummy2;
1363 return flux_averaged_total_xs(nu_source, gen, dummy1, dummy2);
1366 double integrate(
const std::function<
double(
double)>&
f,
double x_min,
1369 static marley::Integrator integrator(NUM_INTEGRATION_SAMPLING_POINTS);
1370 return integrator.num_integrate(
f, x_min, x_max);
end
while True: pbar.update(maxval-len(onlies[E][S])) #print iS, "/", len(onlies[E][S]) found = False for...
double fLuminosity
Luminosity (erg / s)
SpectrumFileFormat
Enumerated type that defines the allowed neutrino spectrum input file formats.
EventNumber_t event() const
virtual void produce(art::Event &e) override
LArSoft interface to the MARLEY (Model of Argon Reaction Low Energy Yields) supernova neutrino event ...
FitParameters fNuebarFitParams
Fitting parameters for electron antineutrinos in this time bin.
double beta(double KE, const simb::MCParticle *part)
SpectrumFileFormat fSpectrumFileFormat
Format to assume for the neutrino spectrum input file.
uint_fast32_t fEventNumber
Event number from the art::Event being processed.
double Alpha() const
Pinching parameter (dimensionless)
Stores fitting parameters for all neutrino types from a single time bin in a "fit"-format spectrum fi...
TimeFit(double time, double Emean_nue, double alpha_nue, double lum_nue, double Emean_nuebar, double alpha_nuebar, double lum_nuebar, double Emean_nux, double alpha_nux, double lum_nux)
double fTime
Time bin low edge (s)
void create_truths_time_fit(simb::MCTruth &mc_truth, sim::SupernovaTruth &sn_truth, const TLorentzVector &vertex_pos)
Create simb::MCTruth and sim::SupernovaTruth objects using a neutrino spectrum described by a previou...
void set_Alpha(double alpha)
Set the pinching parameter.
virtual void reconfigure(const Parameters &p)
EDProducer(fhicl::ParameterSet const &pset)
ChannelGroupService::Name Name
PinchParamType fPinchType
The pinching parameter convention to use when interpreting the time-dependent fits.
double fEmean
Mean neutrino energy (MeV)
FitParameters fNueFitParams
Fitting parameters for electron neutrinos in this time bin.
Stores parsed fit parameters from a single time bin and neutrino type in a "fit"-format spectrum file...
std::unique_ptr< evgen::ActiveVolumeVertexSampler > fVertexSampler
Algorithm that allows us to sample vertex locations within the active volume(s) of the detector...
std::unique_ptr< evgen::MARLEYHelper > fMarleyHelper
Object that provides an interface to the MARLEY event generator.
art framework interface to geometry description
double fFluxAveragedCrossSection
Flux-averaged total cross section (fm2, average is taken over all energies and times for all defined ...
double fWeight
Statistical weight for the current MARLEY neutrino vertex.
TTree * fEventTree
The event TTree created by MARLEY.
double Time() const
Returns the low edge (in s) of the time bin that uses these fit parameters.
void set_Luminosity(double lum)
Set the luminosity (erg / s)
uint_fast32_t fSubRunNumber
Subrun number from the art::Event being processed.
Arrival times were sampled uniformly.
Algorithm that samples vertex locations uniformly within the active volume of a detector. It is fully experiment-agnostic and multi-TPC aware.
uint_fast32_t fRunNumber
Run number from the art::Event being processed.
std::unique_ptr< marley::NeutrinoSource > source_from_time_fit(const TimeFit &fit)
Create a MARLEY neutrino source object using a set of fit parameters for a particular time bin...
double fAlpha
Pinching parameter.
FitParameters fNuxFitParams
Fitting parameters for non-electron-flavor neutrinos in this time bin.
#define DEFINE_ART_MODULE(klass)
TimeGenSamplingMode
Enumerated type that defines the allowed ways that a neutrino's energy and arrival time may be sample...
std::string DetectorName() const
Returns a string with the name of the detector, as configured.
static marley::IteratorToMember< It, double > make_luminosity_iterator(It it)
Converts an iterator that points to a FitParameters object into an iterator that points to that objec...
void create_truths_th2d(simb::MCTruth &mc_truth, sim::SupernovaTruth &sn_truth, const TLorentzVector &vertex_pos)
Create simb::MCTruth and sim::SupernovaTruth objects using spectrum information from a ROOT TH2D...
double fTNu
Time since the supernova core bounce for the current MARLEY neutrino vertex.
PinchParamType
Enumerated type that defines the pinching parameter conventions that are understood by this module...
void set_Emean(double Emean)
Set the mean neutrino energy (MeV)
virtual void beginRun(art::Run &run) override
static FitParameters TimeFit::* GetFitParametersMemberPointer(int pdg_code)
Helper function that returns a pointer-to-member for the FitParameters object appropriate for a given...
simb::MCTruth make_uniform_energy_mctruth(double E_min, double E_max, double &E_nu, const TLorentzVector &vertex_pos)
Creates a simb::MCTruth object using a uniformly-sampled neutrino energy.
SubRunNumber_t subRun() const
ProductID put(std::unique_ptr< PROD > &&edp, std::string const &instance={})
double fFitEmax
Maximum neutrino energy to consider when using a "fit"-format spectrum file.
static marley::IteratorToMember< It, FitParameters > make_FitParameters_iterator(int pdg_code, It iterator)
Converts an iterator that points to a TimeFit object into an iterator that points to the appropriate ...
MarleyTimeGen(const Parameters &p)
static int max(int a, int b)
const FitParameters & GetFitParameters(int pdg_code) const
Retrieves fit parameters for a specific neutrino type for this time bin.
FitParameters(double Emean, double alpha, double luminosity)
auto const & get_PSet() const
#define MF_LOG_INFO(category)
double Luminosity() const
Luminosity (erg / s)
std::unique_ptr< TH2D > fSpectrumHist
ROOT TH2D that contains the time-dependent spectrum to use when sampling neutrino times and energies...
std::unique_ptr< marley::Event > fEvent
unique_ptr to the current event created by MARLEY
unsigned int fNeutrinosPerEvent
The number of MARLEY neutrino vertices to generate in each art::Event.
Stores extra MC truth information that is recorded when generating events using a time-dependent supe...
void line(double t, double *p, double &x, double &y, double &z)
Collection of configuration parameters for the module.
Sample directly from cross-section weighted spectrum.
TimeGenSamplingMode fSamplingMode
Represents the sampling mode to use when selecting neutrino times and energies.
double fFitEmin
Minimum neutrino energy to consider when using a "fit"-format spectrum file.
void make_final_timefit(double time)
Helper function that makes a final dummy TimeFit object so that the final real time bin can have a ri...
decltype(auto) constexpr begin(T &&obj)
ADL-aware version of std::begin.
std::vector< TimeFit > fTimeFits
Vector that contains the fit parameter information for each time bin when using a "fit"-format spectr...
Event generator information.
#define MF_LOG_WARNING(category)
std::set< std::string > operator()()
void make_nu_emission_histograms() const
Makes ROOT histograms showing the emitted neutrinos in each time bin when using a "fit"-format spectr...
LArSoft geometry interface.
void function(int client, int *resource, int parblock, int *test, int p)
Event Generation using GENIE, cosmics or single particles.
Neutrino energies were sampled uniformly.
cet::coded_exception< error, detail::translate > exception
double Emean() const
Mean neutrino energy (MeV)