gfields
Loading...
Searching...
No Matches
gfield_options.cc
Go to the documentation of this file.
1#include "gfield_options.h"
2#include "gfieldConventions.h"
3
4// gemc
5#include "gutilities.h"
6#include "gfactory_options.h"
7
8// namespace to define options
9namespace gfields {
10
11// Build field definitions by reading the option tree and translating each entry into a GFieldDefinition (non-Doxygen summary).
12std::vector<GFieldDefinition> get_GFieldDefinition(const std::shared_ptr<GOptions>& gopts) {
13 std::vector<GFieldDefinition> gfield_defs;
14
15 // Multipoles:
16 // Each "gmultipoles" entry becomes one independently named field definition.
17 auto gmultipoles_node = gopts->getOptionNode("gmultipoles");
18 for (auto gmultipoles_item : gmultipoles_node) {
20
21 // Core identity and integration configuration.
22 gfield_def.name = gopts->get_variable_in_option<std::string>(gmultipoles_item, "name", goptions::NODFLT);
23 gfield_def.integration_stepper = gopts->get_variable_in_option<std::string>(gmultipoles_item, "integration_stepper", GFIELD_DEFAULT_INTEGRATION_STEPPER);
24 gfield_def.minimum_step = gutilities::getG4Number(gopts->get_variable_in_option<std::string>(gmultipoles_item, "minimum_step", GFIELD_DEFAULT_MINIMUM_STEP));
25
26 // Multipole parameters:
27 // Values are stored as strings to preserve unit expressions and are parsed later by the concrete field.
28 gfield_def.add_map_parameter("pole_number", gopts->get_variable_in_option<std::string>(gmultipoles_item, "pole_number", goptions::NODFLT));
29 gfield_def.add_map_parameter("vx", gopts->get_variable_in_option<std::string>(gmultipoles_item, "vx", GFIELD_DEFAULT_VERTEX));
30 gfield_def.add_map_parameter("vy", gopts->get_variable_in_option<std::string>(gmultipoles_item, "vy", GFIELD_DEFAULT_VERTEX));
31 gfield_def.add_map_parameter("vz", gopts->get_variable_in_option<std::string>(gmultipoles_item, "vz", GFIELD_DEFAULT_VERTEX));
32 gfield_def.add_map_parameter("rotation_angle", gopts->get_variable_in_option<std::string>(gmultipoles_item, "rotation_angle", GFIELD_DEFAULT_ROTANGLE));
33 gfield_def.add_map_parameter("rotaxis", gopts->get_variable_in_option<std::string>(gmultipoles_item, "rotaxis", goptions::NODFLT));
34 gfield_def.add_map_parameter("strength", gopts->get_variable_in_option<std::string>(gmultipoles_item, "strength", goptions::NODFLT));
35 gfield_def.add_map_parameter("longitudinal", gopts->get_variable_in_option<std::string>(gmultipoles_item, "longitudinal", "false"));
36
37 // The type field controls the shared-library plugin name through GFieldDefinition::gfieldPluginName().
38 gfield_def.type = "multipoles";
39
40 gfield_defs.push_back(gfield_def);
41 }
42
43 return gfield_defs;
44}
45
46
47// Define all options for this module, including plugin fields and logger integration (non-Doxygen summary).
52
53 std::string help;
54 help = "Adds gmultipoles field(s) to the simulation \n ";
55 std::vector<GVariable> gmultipoles = {
56 {"name", goptions::NODFLT, "Field name (unique key used by GMagneto maps)"},
57 {"integration_stepper", GFIELD_DEFAULT_INTEGRATION_STEPPER, "Geant4 integration stepper name (string)"},
58 {"minimum_step", GFIELD_DEFAULT_MINIMUM_STEP, "Minimum step for the G4ChordFinder (Geant4 length units)"},
59 {"pole_number", goptions::NODFLT, "Pole number (even integer >= 2): 2=dipole, 4=quadrupole, ..."},
60 {"vx", GFIELD_DEFAULT_VERTEX, "Origin X component (Geant4 length units)"},
61 {"vy", GFIELD_DEFAULT_VERTEX, "Origin Y component (Geant4 length units)"},
62 {"vz", GFIELD_DEFAULT_VERTEX, "Origin Z component (Geant4 length units)"},
63 {"rotation_angle", GFIELD_DEFAULT_ROTANGLE, "Roll rotation angle about rotaxis (Geant4 angle units)"},
64 {"rotaxis", goptions::NODFLT, "Rotation/longitudinal axis: one of X, Y, Z"},
65 {"strength", goptions::NODFLT, "Field strength in Tesla (defined at 1 m reference radius for multipoles)"},
66 {"longitudinal", "false", "If true, return a uniform field aligned with rotaxis (solenoid-like)"}
67 };
68 goptions.defineOption("gmultipoles", "define the e.m. gmultipoles", gmultipoles, help);
69
70 return goptions;
71}
72}
constexpr const char * PLUGIN_LOGGER
constexpr const char * GFIELD_LOGGER
Definition gfield.h:12
constexpr const char * GMAGNETO_LOGGER
Definition gfield.h:13
#define GFIELD_DEFAULT_ROTANGLE
Default multipole roll rotation angle (string with Geant4 units).
#define GFIELD_DEFAULT_VERTEX
Default origin coordinate component for multipole fields (string with Geant4 units).
#define GFIELD_DEFAULT_INTEGRATION_STEPPER
Default integration stepper name used when the requested stepper is unsupported.
#define GFIELD_DEFAULT_MINIMUM_STEP
Default minimum step for the chord finder (string with Geant4 units).
std::vector< GFieldDefinition > get_GFieldDefinition(const std::shared_ptr< GOptions > &gopts)
Build the list of field definitions from the provided options.
GOptions defineOptions()
Define all options used by the GField module and its built-in field factories.
const std::string NODFLT
double getG4Number(const string &v, bool warnIfNotUnit=false)
Lightweight configuration carrier used to load and configure a GField plugin.
Definition gfield.h:26
double minimum_step
Minimum step size used when constructing the G4ChordFinder (Geant4 length units).
Definition gfield.h:39
std::string name
Field name key used by GMagneto maps.
Definition gfield.h:33
void add_map_parameter(const std::string &key, const std::string &value)
Add or overwrite a parameter in the field-parameter map.
Definition gfield.h:52
std::string integration_stepper
Integration stepper name (string) used when creating the G4ChordFinder.
Definition gfield.h:36
std::string type
Field type discriminator used to derive the plugin factory name (e.g. "multipoles").
Definition gfield.h:42