LDMX Software
APrimePhysics.cxx
Go to the documentation of this file.
1
9
10namespace simcore {
11
12const std::string APrimePhysics::NAME = "APrime";
13
24static void storeElementZ(const G4Element& element) {
25 static_cast<UserEventInformation*>(
26 G4EventManager::GetEventManager()->GetUserInformation())
27 ->setDarkBremMaterialZ(element.GetZ());
28}
29
31 : G4VPhysicsConstructor(APrimePhysics::NAME),
32 parameters_{params},
33 process_{nullptr} {
34 ap_mass_ = parameters_.get<double>("ap_mass", 0.) * MeV;
35 enable_ = parameters_.get<bool>("enable", false);
36}
37
39 auto model{parameters_.get<framework::config::Parameters>("model")};
40 static const std::map<std::string, G4APrime::DecayMode> decay_lut = {
41 {"no_decay", G4APrime::DecayMode::NoDecay},
42 {"flat_decay", G4APrime::DecayMode::FlatDecay},
43 {"geant_decay", G4APrime::DecayMode::GeantDecay}};
44 auto decay_it{
45 decay_lut.find(model.get<std::string>("decay_mode", "no_decay"))};
46 if (decay_it == decay_lut.end()) {
47 EXCEPTION_RAISE(
48 "BadConf",
49 "Unrecognized decay mode '" + model.get<std::string>("decay_mode") +
50 "',"
51 " options are 'no_decay', 'flat_decay', or 'geant_decay'.");
52 }
53
54 double ap_tau = model.get<double>("ap_tau", -1.0);
55
63 G4APrime::Initialize(ap_mass_, 622, ap_tau, decay_it->second);
64}
65
67 // add process to electron if we are enabled
68 if (enable_) {
69 auto model{parameters_.get<framework::config::Parameters>("model")};
70 auto model_name{model.get<std::string>("name")};
71 if (model_name == "vertex_library" or model_name == "g4db") {
72 static const std::map<std::string, g4db::G4DarkBreMModel::ScalingMethod>
73 method_lut = {
74 {"forward_only",
75 g4db::G4DarkBreMModel::ScalingMethod::ForwardOnly},
76 {"cm_scaling", g4db::G4DarkBreMModel::ScalingMethod::CMScaling},
77 {"undefined", g4db::G4DarkBreMModel::ScalingMethod::Undefined}};
78 auto scaling_method_it{method_lut.find(model.get<std::string>("method"))};
79 if (scaling_method_it == method_lut.end()) {
80 EXCEPTION_RAISE(
81 "BadConf",
82 "Unrecognized scaling method '" + model.get<std::string>("method") +
83 "',"
84 " options are 'forward_only', 'cm_scaling', or 'undefined'.");
85 }
86 // Note: The process variable isn't used here, but creating the
87 // G4DarkBremsstahlung object has side-effects
88 process_ = std::make_unique<G4DarkBremsstrahlung>(
89 std::make_shared<g4db::G4DarkBreMModel>(
90 model.get<std::string>("library_path"),
91 false /* dark brem off muons instead of electrons - we
92 always DB off electrons here */
93 ,
94 model.get<double>("threshold"), model.get<double>("epsilon"),
95 scaling_method_it->second,
96 g4db::G4DarkBreMModel::XsecMethod::Auto,
97 model.get<double>("max_R_for_full", 50.0),
98 model.get<int>("aprime_lhe_id", 1023),
99 true, // always load the library
100 model.get<bool>("scale_APrime", false),
101 model.get<double>("dist_decay_min", 0.0),
102 model.get<double>("dist_decay_max", 1.0)),
103 parameters_.get<bool>("only_one_per_event"),
104 1., /* global bias - should use bias operator instead */
105 parameters_.get<bool>("cache_xsec"));
106 process_->RegisterStorageMechanism(storeElementZ);
107 } else {
108 EXCEPTION_RAISE("BadConf",
109 "Unrecognized model name '" + model_name + "'.");
110 }
111 ldmx_log(trace) << "Initialization of dark brem complete";
112 }
113}
114
115} // namespace simcore
Class which defines basic APrime physics.
Class encapsulating parameters for configuring a processor.
Definition Parameters.h:29
const T & get(const std::string &name) const
Retrieve the parameter of the given name.
Definition Parameters.h:78
Defines basic APrime physics.
framework::config::Parameters parameters_
Dark brem parameters to pass to the process (if enabled)
void ConstructParticle()
Construct particle.
G4double ap_mass_
the mass of the A' for this run
static const std::string NAME
The name of this physics constructor.
APrimePhysics(const framework::config::Parameters &params)
Class constructor.
bool enable_
is dark brem enabled for this run?
void ConstructProcess()
Construct the process.
Encapsulates user defined information associated with a Geant4 event.
Dynamically loadable photonuclear models either from SimCore or external libraries implementing this ...
static void storeElementZ(const G4Element &element)
Store the atomic Z for the element in which the dark brem occurred.