17 #include <initializer_list>
22 #include "art/Framework/Core/EDProducer.h"
23 #include "art/Framework/Principal/Event.h"
24 #include "fhiclcpp/types/Name.h"
25 #include "fhiclcpp/types/Comment.h"
26 #include "fhiclcpp/types/Atom.h"
27 #include "fhiclcpp/types/OptionalAtom.h"
28 #include "fhiclcpp/types/Sequence.h"
29 #include "art/Framework/Services/Registry/ServiceHandle.h"
30 #include "art/Framework/Core/ModuleMacros.h"
31 #include "messagefacility/MessageLogger/MessageLogger.h"
32 #include "cetlib_except/exception.h"
33 #include "cetlib/filesystem.h"
34 #include "cetlib/search_path.h"
37 #include "nurandom/RandomUtils/NuRandomService.h"
40 #include "nusimdata/SimulationBase/MCTruth.h"
41 #include "nusimdata/SimulationBase/MCParticle.h"
44 #include "TDatabasePDG.h"
49 #include "CLHEP/Random/RandFlat.h"
50 #include "CLHEP/Random/RandGaussQ.h"
64 Name(
"ParticleSelectionMode"),
69 Name(
"PadOutVectors"),
70 Comment(
"if true, all per-PDG-ID quantities must contain only one value, which is then used for all PDG IDs")
73 fhicl::Sequence<int>
PDG{
75 Comment(
"PDG ID of the particles to be generated; this is the key for the other options marked as \"per PDG ID\"")
84 fhicl::Sequence<double>
P0{
86 Comment(
"central momentum (GeV/c) to generate"),
92 Comment(
"variation in momenta (GeV/c)"),
96 fhicl::Sequence<double>
X0{
98 Comment(
"central x position (cm) in world coordinates [per PDG ID]")
101 fhicl::Sequence<double>
Y0{
103 Comment(
"central y position (cm) in world coordinates [per PDG ID]")
106 fhicl::Sequence<double>
Z0{
108 Comment(
"central z position (cm) in world coordinates [per PDG ID]")
111 fhicl::Sequence<double>
T0{
113 Comment(
"central time (s) [per PDG ID]")
118 Comment(
"variation (radius or RMS) in x position (cm) [per PDG ID]")
123 Comment(
"variation (radius or RMS) in y position (cm) [per PDG ID]")
128 Comment(
"variation (radius or RMS) in z position (cm) [per PDG ID]")
133 Comment(
"variation (semi-interval or RMS) in time (s) [per PDG ID]")
147 Name(
"SingleVertex"),
148 Comment(
"if true, all particles are produced at the same location"),
154 Comment(
"angle from Z axis on world X-Z plane (degrees)")
159 Comment(
"angle from Z axis on world Y-Z plane (degrees)")
163 Name(
"SigmaThetaXZ"),
164 Comment(
"variation in angle in X-Z plane (degrees)")
168 Name(
"SigmaThetaYZ"),
169 Comment(
"variation in angle in Y-Z plane (degrees)")
179 Name(
"HistogramFile"),
180 Comment(
"ROOT file containing the required distributions for the generation"),
186 Comment(
"name of the histograms of momentum distributions"),
191 Name(
"ThetaXzYzHist"),
192 Comment(
"name of the histograms of angular (X-Z and Y-Z) distribution"),
196 fhicl::OptionalAtom<rndm::NuRandomService::seed_t>
Seed{
198 Comment(
"override the random number generator seed")
228 void Sample(simb::MCTruth &mct);
230 bool PadVector(std::vector<double> &vec);
280 std::vector<std::unique_ptr<TH1>>
hPHist ;
297 void beginRun(art::Run& run)
override;
325 template <
typename OptionList>
327 (std::string Option, OptionList
const& allowedOptions) -> decltype(
auto);
342 template <
typename OptionList>
344 OptionList
const& allowedOptions,
bool printKey,
345 std::initializer_list<typename OptionList::value_type::first_type>
exclude
348 template <
typename OptionList>
350 (OptionList
const& allowedOptions,
bool printKey =
true)
355 template <
typename OptionList>
357 typename OptionList::value_type::first_type optionKey,
358 OptionList
const& allowedOptions,
359 std::string defName =
"<unknown>"
368 std::map<int, std::string>
names;
375 std::map<int, std::string>
names;
376 names[int(
kUNIF)] =
"uniform";
377 names[int(
kGAUS)] =
"Gaussian";
378 names[int(
kHIST)] =
"histograms";
388 template <
typename OptionList>
390 (std::string Option, OptionList
const& allowedOptions) -> decltype(
auto)
392 using key_type =
typename OptionList::value_type::first_type;
393 using tolower_type = int(*)(int);
394 auto toLower = [](
auto const&
S)
399 (tolower_type) &std::tolower);
402 auto option = toLower(Option);
403 for (
auto const& candidate: allowedOptions) {
404 if (toLower(candidate.second) ==
option)
return candidate.first;
408 key_type num = std::stoi(Option, &end);
409 if (allowedOptions.count(num) && (end == Option.length()))
return num;
411 catch (std::invalid_argument
const&) {}
412 throw std::runtime_error(
"Option '" + Option +
"' not supported.");
416 template <
typename OptionList>
418 OptionList
const& allowedOptions,
bool printKey ,
419 std::initializer_list<typename OptionList::value_type::first_type>
exclude
424 for (
auto const&
option: allowedOptions) {
425 auto const& key =
option.first;
426 if (std::find(exclude.begin(), exclude.end(), key) != exclude.end())
428 if (n++ > 0) msg +=
", ";
429 msg +=
'\"' + std::string(
option.second) +
'\"';
437 template <
typename OptionList>
439 typename OptionList::value_type::first_type optionKey,
440 OptionList
const& allowedOptions,
443 auto iOption = allowedOptions.find(optionKey);
444 return (iOption != allowedOptions.end())? iOption->second: defName;
456 ,
fMode (selectOption(config().ParticleSelectionMode(), ParticleSelectionModeNames))
459 , fP0 (config().
P0())
460 , fSigmaP (config().
SigmaP())
461 , fPDist (selectOption(config().
PDist(), DistributionNames))
462 , fX0 (config().
X0())
463 ,
fY0 (config().
Y0())
464 ,
fZ0 (config().
Z0())
465 ,
fT0 (config().
T0())
466 , fSigmaX (config().
SigmaX())
467 , fSigmaY (config().
SigmaY())
468 , fSigmaZ (config().
SigmaZ())
470 , fPosDist (selectOption(config().
PosDist(), DistributionNames))
471 ,
fTDist (selectOption(config().
TDist(), DistributionNames))
472 , fSingleVertex (config().SingleVertex())
477 , fAngleDist (selectOption(config().
AngleDist(), DistributionNames))
478 , fHistFileName (config().HistogramFile())
479 , fPHist (config().PHist())
480 , fThetaXzYzHist(config().ThetaXzYzHist())
481 ,
fEngine(art::ServiceHandle<rndm::NuRandomService>()->createEngine(*
this))
484 rndm::NuRandomService::seed_t
seed;
485 if (config().Seed(seed)) {
489 produces< std::vector<simb::MCTruth> >();
507 std::vector<std::string> vlist(15);
517 vlist[9] =
"Theta0XZ";
518 vlist[10] =
"Theta0YZ";
519 vlist[11] =
"SigmaThetaXZ";
520 vlist[12] =
"SigmaThetaYZ";
522 vlist[14] =
"SigmaT";
527 if( !this->
PadVector(
fP0 ) ){ list.append(vlist[1].append(
", \n")); }
530 if( !this->
PadVector(
fX0 ) ){ list.append(vlist[3].append(
", \n")); }
531 if( !this->
PadVector(
fY0 ) ){ list.append(vlist[4].append(
", \n")); }
532 if( !this->
PadVector(
fZ0 ) ){ list.append(vlist[5].append(
", \n")); }
540 if( !this->
PadVector(
fT0 ) ){ list.append(vlist[13].append(
", \n")); }
546 throw cet::exception(
"larg4SingleGen") <<
"The "<< list
547 <<
"\n vector(s) defined in the fhicl files has/have "
548 <<
"a different size than the PDG vector "
549 <<
"\n and it has (they have) more than one value, "
550 <<
"\n disallowing sensible padding "
551 <<
" and/or you have set fPadOutVectors to false. \n";
556 TFile* histFile =
nullptr;
562 if (!histFile || histFile->IsZombie() || !histFile->IsOpen()) {
565 throw art::Exception(art::errors::NotFound) <<
"Cannot open ROOT file specified in parameter HistogramFile: \"" <<
fHistFileName <<
"\"";
569 throw art::Exception(art::errors::NotFound) <<
"ROOT file specified in parameter HistogramFile: \"" <<
fHistFileName <<
"\" does not exist!";
574 std::string relative_filename{
"./"};
576 if (cet::file_exists(relative_filename)) {
577 histFile =
new TFile(relative_filename.c_str());
578 if (!histFile || histFile->IsZombie() || !histFile->IsOpen()) {
581 throw art::Exception(art::errors::NotFound) <<
"Cannot open ROOT file found using relative path and originally specified in parameter HistogramFile: \"" << relative_filename <<
'"';
585 cet::search_path sp{
"FW_SEARCH_PATH"};
586 std::string found_filename;
589 throw art::Exception(art::errors::NotFound) <<
"Cannot find ROOT file in current directory nor on FW_SEARCH_PATH specified in parameter HistogramFile: \"" <<
fHistFileName <<
'"';
591 histFile =
new TFile(found_filename.c_str());
592 if (!histFile || histFile->IsZombie() || !histFile->IsOpen()) {
595 throw art::Exception(art::errors::NotFound) <<
"Cannot open ROOT file found on FW_SEARCH_PATH and originally specified in parameter HistogramFile: \"" << found_filename <<
'"';
607 throw art::Exception(art::errors::Configuration)
608 <<
"Position distribution of type '"
619 throw art::Exception(art::errors::Configuration)
620 <<
"Time distribution of type '"
631 throw art::Exception(art::errors::Configuration)
632 <<
fPHist.size() <<
" momentum histograms to describe " <<
fPDG.size() <<
" particle types...";
635 for (
auto const& histName:
fPHist) {
636 TH1* pHist =
dynamic_cast<TH1*
>(histFile->Get(histName.c_str()));
638 throw art::Exception(art::errors::NotFound)
639 <<
"Failed to read momentum histogram '" << histName <<
"' from '" << histFile->GetPath() <<
"\'";
641 pHist->SetDirectory(
nullptr);
642 hPHist.emplace_back(pHist);
652 throw art::Exception(art::errors::Configuration)
653 <<
fThetaXzYzHist.size() <<
" direction histograms to describe " <<
fPDG.size() <<
" particle types...";
657 TH2* pHist =
dynamic_cast<TH2*
>(histFile->Get(histName.c_str()));
659 throw art::Exception(art::errors::NotFound)
660 <<
"Failed to read direction histogram '" << histName <<
"' from '" << histFile->GetPath() <<
"\'";
662 pHist->SetDirectory(
nullptr);
677 if( vec.size() !=
fPDG.size() ){
689 if(vec.size() != 1)
return false;
692 vec.resize(
fPDG.size(), vec[0]);
705 std::unique_ptr< std::vector<simb::MCTruth> > truthcol(
new std::vector<simb::MCTruth>);
708 truth.SetOrigin(simb::kSingleParticle);
711 MF_LOG_DEBUG(
"larg4SingleGen") << truth;
713 truthcol->push_back(truth);
715 evt.put(std::move(truthcol));
726 CLHEP::RandGaussQ gauss(
fEngine);
738 p =
fP0[i] +
fSigmaP[i]*(2.0*flat.fire()-1.0);
742 static TDatabasePDG pdgt;
743 TParticlePDG* pdgp = pdgt.GetParticle(
fPDG[i]);
744 if (pdgp) m = pdgp->Mass();
754 x[0] =
fX0[i] +
fSigmaX[i]*(2.0*flat.fire()-1.0);
755 x[1] =
fY0[i] +
fSigmaY[i]*(2.0*flat.fire()-1.0);
756 x[2] =
fZ0[i] +
fSigmaZ[i]*(2.0*flat.fire()-1.0);
764 t =
fT0[i] +
fSigmaT[i]*(2.0*flat.fire()-1.0);
767 TLorentzVector pos(x[0], x[1], x[2], t);
774 double thyzradsplussigma = 0;
775 double thyzradsminussigma = 0;
785 thxz = (180./M_PI)*thetaxz;
786 thyz = (180./M_PI)*thetayz;
795 thyzrads = std::asin(std::sin((M_PI/180.)*(
fTheta0YZ[i])));
802 double sinthyzmin = std::sin(thyzradsminussigma);
803 double sinthyzmax = std::sin(thyzradsplussigma);
804 double sinthyz = sinthyzmin + flat.fire() * (sinthyzmax - sinthyzmin);
805 thyz = (180. / M_PI) * std::asin(sinthyz);
808 double thxzrad=thxz*M_PI/180.0;
809 double thyzrad=thyz*M_PI/180.0;
811 TLorentzVector pvec(p*std::cos(thyzrad)*std::sin(thxzrad),
813 p*std::cos(thxzrad)*std::cos(thyzrad),
817 int trackid = -1*(i+1);
818 std::string primary(
"primary");
820 simb::MCParticle part(trackid,
fPDG[i], primary);
821 part.AddTrajectoryPoint(pos, pvec);
837 CLHEP::RandGaussQ gauss(
fEngine);
847 x[0] =
fX0[0] +
fSigmaX[0]*(2.0*flat.fire()-1.0);
848 x[1] =
fY0[0] +
fSigmaY[0]*(2.0*flat.fire()-1.0);
849 x[2] =
fZ0[0] +
fSigmaZ[0]*(2.0*flat.fire()-1.0);
857 t =
fT0[0] +
fSigmaT[0]*(2.0*flat.fire()-1.0);
860 TLorentzVector pos(x[0], x[1], x[2], t);
863 for (
unsigned int i(0); i<
fPDG.size(); ++i){
874 p =
fP0[i] +
fSigmaP[i]*(2.0*flat.fire()-1.0);
877 static TDatabasePDG pdgt;
878 TParticlePDG* pdgp = pdgt.GetParticle(
fPDG[i]);
879 if (pdgp) m = pdgp->Mass();
887 double thyzradsplussigma = 0;
888 double thyzradsminussigma = 0;
898 thxz = (180./M_PI)*thetaxz;
899 thyz = (180./M_PI)*thetayz;
908 thyzrads = std::asin(std::sin((M_PI/180.)*(
fTheta0YZ[i])));
915 double sinthyzmin = std::sin(thyzradsminussigma);
916 double sinthyzmax = std::sin(thyzradsplussigma);
917 double sinthyz = sinthyzmin + flat.fire() * (sinthyzmax - sinthyzmin);
918 thyz = (180. / M_PI) * std::asin(sinthyz);
921 double thxzrad=thxz*M_PI/180.0;
922 double thyzrad=thyz*M_PI/180.0;
924 TLorentzVector pvec(p*std::cos(thyzrad)*std::sin(thxzrad),
926 p*std::cos(thxzrad)*std::cos(thyzrad),
930 int trackid = -1*(i+1);
931 std::string primary(
"primary");
933 simb::MCParticle part(trackid,
fPDG[i], primary);
934 part.AddTrajectoryPoint(pos, pvec);
955 for (
unsigned int i=0; i<
fPDG.size(); ++i) {
965 unsigned int i=flat.fireInt(
fPDG.size());
970 mf::LogWarning(
"UnrecognizeOption") <<
"larg4SingleGen does not recognize ParticleSelectionMode "
982 mf::LogInfo(
"larg4SingleGen") <<
" You are using vector values for larg4SingleGen configuration.\n "
983 <<
" Some of the configuration vectors may have been padded out ,"
984 <<
" because they (weren't) as long as the pdg vector"
985 <<
" in your configuration. \n"
986 <<
" The new input particle configuration is:\n" ;
989 for(
size_t i = 0; i <=1; ++i){
991 values.append(list[i]);
992 values.append(
": [ ");
994 for(
size_t e = 0;
e <
fPDG.size(); ++
e){
995 std::stringstream buf;
997 if(i == 0 ) buf <<
fPDG[
e] <<
", ";
999 if(i == 1 ) buf <<
fP0[
e] <<
", ";
1000 if(i == 2 ) buf <<
fSigmaP[
e] <<
", ";
1001 if(i == 3 ) buf <<
fX0[
e] <<
", ";
1002 if(i == 4 ) buf <<
fY0[
e] <<
", ";
1003 if(i == 5 ) buf <<
fZ0[
e] <<
", ";
1004 if(i == 6 ) buf <<
fSigmaX[
e] <<
", ";
1005 if(i == 7 ) buf <<
fSigmaY[
e] <<
", ";
1006 if(i == 8 ) buf <<
fSigmaZ[
e] <<
", ";
1011 if(i == 13) buf <<
fT0[
e] <<
", ";
1012 if(i == 14) buf <<
fSigmaT[
e] <<
", ";
1013 values.append(buf.str());
1016 values.erase(values.find_last_of(
","));
1017 values.append(
" ] \n");
1021 mf::LogInfo(
"larg4SingleGen") <<
values;
1030 CLHEP::RandFlat flat(
fEngine);
1032 double throw_value = h.Integral() * flat.fire();
1033 double cum_value(0);
1034 for (
int i(0); i < h.GetNbinsX()+1; ++i){
1035 cum_value += h.GetBinContent(i);
1036 if (throw_value < cum_value){
1037 return flat.fire()*h.GetBinWidth(i) + h.GetBinLowEdge(i);
1045 CLHEP::RandFlat flat(
fEngine);
1047 double throw_value = h.Integral() * flat.fire();
1048 double cum_value(0);
1049 for (
int i(0); i < h.GetNbinsX()+1; ++i){
1050 for (
int j(0); j < h.GetNbinsY()+1; ++j){
1051 cum_value += h.GetBinContent(i, j);
1052 if (throw_value < cum_value){
1053 x = flat.fire()*h.GetXaxis()->GetBinWidth(i) + h.GetXaxis()->GetBinLowEdge(i);
1054 y = flat.fire()*h.GetYaxis()->GetBinWidth(j) + h.GetYaxis()->GetBinLowEdge(j);
1068 DEFINE_ART_MODULE(larg4SingleGen)
static constexpr int kHIST
int fTDist
How to distribute t (gaus, or uniform)
void setup()
Performs checks and initialization based on the current configuration.
process_name physics producers generator physics producers generator SigmaZ
process_name opdaq physics producers generator physics producers generator physics producers generator physics producers generator physics producers generator physics producers generator physics producers generator physics producers generator physics producers generator physics producers generator physics producers generator Theta0XZ
fhicl::Sequence< double > SigmaThetaYZ
std::vector< double > fSigmaZ
Variation in z position (cm)
process_name physics producers generator PDist
static std::string presentOptions(OptionList const &allowedOptions, bool printKey, std::initializer_list< typename OptionList::value_type::first_type > exclude)
Returns a string describing all options in the list.
process_name stream1 can override from command line with o or output services DetectorPropertiesService services DetectorPropertiesService services DetectorPropertiesService services DetectorPropertiesService physics analyzers pmtresponse NeutronTrackingCut services LArG4Parameters gaussian physics producers generator PDG
then source grid fermiapp products dune setup_dune_fermiapp sh exit else echo No setup file found exit fi setup
see a below echo S(symbol in a section other than those above)
std::vector< std::unique_ptr< TH2 > > hThetaXzYzHist
actual TH1 for momentum distributions
process_name physics producers generator hPHist_pi physics producers generator physics producers generator physics producers generator physics producers generator physics producers generator physics producers generator Theta0YZ
createEngine fPadOutVectors
process_name opflash particleana ie x
fhicl::Atom< bool > SingleVertex
std::vector< double > fSigmaP
Variation in momenta (GeV/c)
process_name opdaq physics producers generator PosDist
fhicl::Atom< std::string > PDist
static constexpr int kSelectAllParts
One particle per entry is generated.
fhicl::Sequence< double > Theta0YZ
process_name opdaq physics producers generator physics producers generator physics producers generator physics producers generator physics producers generator physics producers generator physics producers generator physics producers generator physics producers generator physics producers generator SigmaP
process_name opdaq physics producers generator physics producers generator physics producers generator Z0
fhicl::Sequence< double > SigmaT
std::vector< double > fSigmaThetaYZ
Variation in angle in YZ plane.
fhicl::Sequence< double > SigmaZ
process_name physics producers generator hPHist_pi physics producers generator physics producers generator SigmaX
process_name opdaq physics producers generator physics producers generator Y0
static constexpr int kSelectOneRandPart
fhicl::Sequence< double > SigmaX
tuple m
now if test mode generate materials, CRT shell, world, gdml header else just generate CRT shell for u...
double SelectFromHist(const TH1 &h)
process_name physics producers generator hPHist_pi physics producers generator physics producers generator physics producers generator physics producers generator physics producers generator AngleDist
static std::map< int, std::string > makeDistributionNames()
Returns a vector with the name of distribution keywords.
CLHEP::HepRandomEngine & fEngine
actual TH2 for angle distributions - Xz on x axis .
larg4SingleGen(Parameters const &config)
standard_singlep gaussian distribution ie ie ie gaussian TDist
std::vector< int > fPDG
PDG code of particles to generate.
fhicl::Sequence< double > X0
void SampleOne(unsigned int i, simb::MCTruth &mct)
static std::map< int, std::string > makeParticleSelectionModeNames()
Returns a vector with the name of particle selection mode keywords.
fhicl::Atom< std::string > TDist
standard_singlep gaussian distribution X0
process_name opflash particleana ie ie y
std::vector< double > fSigmaT
Variation in t position (s)
static const std::map< int, std::string > DistributionNames
Names of all distribution modes.
std::vector< double > fZ0
Central z position (cm) in world coordinates.
std::vector< double > fT0
Central t position (s) in world coordinates.
bool PadVector(std::vector< double > &vec)
bool fSingleVertex
if true - all particles produced at the same location
auto end(FixedBins< T, C > const &) noexcept
fEngine(art::ServiceHandle< rndm::NuRandomService >() ->createEngine(*this, pset,"Seed"))
fhicl::Atom< bool > PadOutVectors
fhicl::Sequence< int > PDG
BEGIN_PROLOG vertical distance to the surface Name
bool fromHistogram(std::string const &key) const
Returns whether the specified mode is an histogram distribution.
art::EDProducer::Table< Config > Parameters
fhicl::Atom< std::string > HistogramFile
process_name physics producers generator physics producers generator physics producers generator SigmaT
fhicl::Atom< std::string > PosDist
fhicl::OptionalAtom< rndm::NuRandomService::seed_t > Seed
void beginRun(art::Run &run) override
Act on begin of run: write "RunData" information (sumdata::RunData).
fhicl::Sequence< double > P0
std::vector< double > fTheta0XZ
Angle in XZ plane (degrees)
static auto selectOption(std::string Option, OptionList const &allowedOptions) -> decltype(auto)
Parses an option string and returns the corresponding option number.
static const std::vector< std::string > names
void SampleMany(simb::MCTruth &mct)
fhicl::Sequence< double > SigmaThetaXZ
fhicl::Sequence< std::string > PHist
std::string fHistFileName
Filename containing histogram of momenta.
int fAngleDist
How to distribute angles (gaus, uniform)
fhicl::Atom< std::string > ParticleSelectionMode
std::vector< double > fX0
Central x position (cm) in world coordinates.
void produce(art::Event &evt) override
std::string to_string(WindowPattern const &pattern)
then echo File list $list not found else cat $list while read file do echo $file sed s
module to produce single or multiple specified particles in the detector
std::vector< double > fSigmaY
Variation in y position (cm)
static constexpr int kUNIF
Uniform distribution.
std::vector< double > fY0
Central y position (cm) in world coordinates.
fhicl::Sequence< std::string > ThetaXzYzHist
std::vector< double > fSigmaX
Variation in x position (cm)
physics producers generator PadOutVectors
process_name physics producers generator hPHist_pi physics producers generator P0
void Sample(simb::MCTruth &mct)
process_name opdaq physics producers generator physics producers generator physics producers generator physics producers generator physics producers generator physics producers generator physics producers generator physics producers generator physics producers generator physics producers generator physics producers generator physics producers generator physics producers generator physics producers generator SigmaThetaYZ
std::vector< std::string > fThetaXzYzHist
name of histogram for thetaxz/thetayz distribution
fhicl::Sequence< double > Theta0XZ
fhicl::Sequence< double > Y0
std::vector< std::string > fPHist
name of histogram of momenta
process_name physics producers generator SigmaY
fhicl::Sequence< double > Z0
std::vector< double > fTheta0YZ
Angle in YZ plane (degrees)
static constexpr int kGAUS
Gaussian distribution.
std::vector< std::unique_ptr< TH1 > > hPHist
static std::string optionName(typename OptionList::value_type::first_type optionKey, OptionList const &allowedOptions, std::string defName="<unknown>")
Returns the name of the specified option key, or defName if not known.
std::vector< double > fP0
Central momentum (GeV/c) to generate.
std::vector< double > fSigmaThetaXZ
Variation in angle in XZ plane.
process_name opdaq physics producers generator physics producers generator physics producers generator physics producers generator physics producers generator physics producers generator physics producers generator physics producers generator physics producers generator physics producers generator physics producers generator physics producers generator physics producers generator SigmaThetaXZ
fhicl::Sequence< double > T0
int fPDist
How to distribute momenta (gaus or uniform)
process_name opdaq physics producers generator physics producers generator physics producers generator physics producers generator physics producers generator physics producers generator physics producers generator physics producers generator T0
int fPosDist
How to distribute xyz (gaus, or uniform)
fhicl::Sequence< double > SigmaP
static const std::map< int, std::string > ParticleSelectionModeNames
Names of all particle selection modes.
fhicl::Atom< std::string > AngleDist
void printVecs(std::vector< std::string > const &list)
fhicl::Sequence< double > SigmaY