69 for (
auto parameters : fFieldParameters)
74 for (
auto setup : GetFieldSetups())
101 fVerboseLevel = value;
112 for (
auto fieldParameters : fFieldParameters)
114 if (fieldParameters->GetVolumeName() == volumeName)
116 return fieldParameters;
121 auto fieldParameters =
new G4FieldParameters(volumeName);
122 fFieldParameters.push_back(fieldParameters);
123 return fieldParameters;
132 for (
auto fieldSetup : GetFieldSetups())
134 if (fieldSetup->GetLogicalVolume() == lv)
144void G4FieldBuilder::CreateFieldSetup(
G4Field* field,
149 auto fieldSetup =
new G4FieldSetup(*fieldParameters, field, lv);
150 fieldSetup->PrintInfo(fVerboseLevel);
152 if (fFieldSetups.Get() ==
nullptr)
154 auto fieldSetups =
new std::vector<G4FieldSetup*>();
155 fFieldSetups.Put(fieldSetups);
158 GetFieldSetups().push_back(fieldSetup);
162void G4FieldBuilder::ConstructGlobalField()
166 if (fVerboseLevel > 1)
168 G4cout <<
"G4FieldBuilder::ConstructGlobalField " <<
G4endl;
171 CreateFieldSetup(fGlobalField, fFieldParameters[0],
nullptr);
175void G4FieldBuilder::ConstructLocalFields()
179 if (fLocalFields.Get() ==
nullptr) {
return; }
181 if (fVerboseLevel > 1)
183 G4cout <<
"G4FieldBuilder::ConstructLocalFields()" <<
G4endl;
187 for (
auto [lv, field] : GetLocalFields())
190 const auto& volumeName = lv->
GetName();
193 G4FieldParameters* fieldParameters =
194 GetOrCreateFieldParameters(volumeName);
196 if (fVerboseLevel > 1)
198 G4cout <<
"Construct local field in volume: " << volumeName <<
G4endl;
202 CreateFieldSetup(field, fieldParameters, lv);
207void G4FieldBuilder::UpdateFieldSetups()
211 if (fVerboseLevel > 1)
213 G4cout <<
"G4FieldBuilder::UpdateFieldSetups " <<
G4endl;
216 for (
auto fieldSetup : GetFieldSetups())
218 fieldSetup->Update();
220 if (fVerboseLevel > 1)
222 fieldSetup->PrintInfo(fVerboseLevel,
"updated");
241 fFieldParameters.push_back(fieldParameters);
243 return fieldParameters;
251 if (fVerboseLevel > 1)
259 "G4FieldBuilder::ConstructField:",
"GeomFieldParameters0001",
264 ConstructGlobalField();
265 ConstructLocalFields();
269 fIsConstructed =
true;
279 if (fFieldSetups.Get() ==
nullptr)
282 "G4FieldBuilder::UpdateField",
"GeomFieldParameters0001",
287 if (fVerboseLevel > 1)
302 if (fVerboseLevel > 1)
309 fGlobalField =
nullptr;
312 if (fLocalFields.Get() !=
nullptr)
314 for (
auto vectorElement : GetLocalFields())
316 delete vectorElement.second;
319 GetLocalFields().clear();
323 if (fFieldSetups.Get() !=
nullptr)
325 for (
auto fieldSetup : GetFieldSetups())
327 fieldSetup->SetG4Field(
nullptr);
332 fIsConstructed =
false;
334 if (fVerboseLevel > 1)
336 G4cout <<
"End of G4FieldBuilder::Reinitialize" <<
G4endl;
350 "G4FieldBuilder::SetFieldType:",
"GeomFieldParameters0001",
355 fFieldParameters[0]->SetFieldType(fieldType);
372 if (fGlobalField !=
nullptr && warn)
375 "G4FieldBuilder::SetGlobalField:",
"GeomFieldParameters0001",
376 JustWarning,
"The global field already exists, it will be deleted.");
379 fGlobalField = field;
384 GetFieldSetups()[0]->SetG4Field(field);
385 GetFieldSetups()[0]->Update();
399 G4cerr <<
"Cannot register local field without Logical volume." <<
G4endl;
403 if (fLocalFields.Get() ==
nullptr)
405 auto localFields =
new std::vector<std::pair<G4LogicalVolume*, G4Field*>>();
406 fLocalFields.Put(localFields);
409 auto it = GetLocalFields().begin();
410 for (it = GetLocalFields().begin(); it != GetLocalFields().end(); ++it)
412 if (it->first == lv) {
break; }
415 if (it != GetLocalFields().end())
421 descr <<
"Logical volume " << lv->
GetName() <<
" has already field."
422 " It will be deleted.";
424 "G4FieldBuilder::SetLocalField:",
"GeomFieldParameters0001",
433 GetLocalFields().emplace_back(lv,field);
436 if (fIsConstructed) {
438 auto fieldSetup = GetFieldSetup(lv);
439 if (fieldSetup ==
nullptr)
442 "G4FieldBuilder::SetLocalField:",
"GeomFieldParameters0001",
443 JustWarning,
"Cannot get field setup for a local field.");
446 fieldSetup->SetG4Field(field);
447 fieldSetup->Update();
457 if (volumeName.empty())
460 fFieldParameters[0]->SetUserEquationOfMotion(equation);
467 GetOrCreateFieldParameters(volumeName);
478 if (volumeName.empty())
481 fFieldParameters[0]->SetUserStepper(stepper);
488 GetOrCreateFieldParameters(volumeName);
501 for (
auto fieldParameters : fFieldParameters)
505 return fieldParameters;
510 "G4FieldBuilder::GetFieldParameters:",
"GeomFieldParameters0001",
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
std::ostringstream G4ExceptionDescription
G4FieldType
G4FieldType defines the available fields in Geant4.
@ kElectroMagnetic
electromagnetic field
@ kClassicalRK4
G4ClassicalRK4.
G4TemplateRNGHelper< G4long > * G4TemplateRNGHelper< G4long >::instance
G4GLOB_DLL std::ostream G4cerr
G4GLOB_DLL std::ostream G4cout
G4EquationOfMotion is the abstract base class for the right hand size of the equation of motion of a ...
G4FieldBuilderMessenger is messenger class that defines commands for G4FieldBuilder.
G4FieldParameters * CreateFieldParameters(const G4String &fieldVolName)
void SetUserEquationOfMotion(G4EquationOfMotion *equation, const G4String &volumeName="")
void SetUserStepper(G4MagIntegratorStepper *stepper, const G4String &volumeName="")
void ConstructFieldSetup()
G4FieldParameters * GetFieldParameters(const G4String &volumeName="") const
void SetLocalField(G4Field *field, G4LogicalVolume *lv, G4bool warn=false)
static G4bool IsInstance()
static G4FieldBuilder * Instance()
G4FieldBuilder(const G4FieldBuilder &right)=delete
void SetFieldType(G4FieldType fieldType)
void SetVerboseLevel(G4int value)
void SetGlobalField(G4Field *field, G4bool warn=false)
G4FieldParameters defines the type of equation of motion of a particle in a field and the integration...
void SetUserStepper(G4MagIntegratorStepper *stepper)
void SetUserEquationOfMotion(G4EquationOfMotion *equation)
const G4String & GetVolumeName() const
G4FieldSetup is a class for constructing magnetic, electromagnetic and gravity fields which strength ...
G4Field is the abstract class for any kind of field. It allows any kind of field (vector,...
G4LogicalVolume represents a leaf node or unpositioned subtree in the geometry hierarchy....
const G4String & GetName() const
G4MagIntegratorStepper is an abstract base class for integrator of particle's equation of motion,...