Adding electric field to selected logic volume

_Geant4 Version:_11.3.1
_Operating System:_Windows 11
_Compiler/Version:_Visual Studio 2022 17.13.5
_CMake Version:_4.0.0

Dear forum members,
I would like to know if there is a way to define an electric field inside a specific volume. As shown further below, I created an electric field and added it to the logicDetector volume. However, the SetFieldType function only affects the global field (non existing in this case) and not the local field.

As shown below, the global field is set to electromagnetic, however the local field is still magnetic.

The code is the following (in DetectorConstruction.cc) :

    //Adding electric field to the detector
    G4FieldBuilder *fieldBuilder = G4FieldBuilder::Instance();
    fieldBuilder->SetVerboseLevel(2);
    //Defining the field value
    G4UniformElectricField *eField = new G4UniformElectricField(G4ThreeVector(0.0, 20*kilovolt/cm, 0.0));
    fieldBuilder->SetLocalField(eField, logicDetector);
    
    fieldBuilder->SetFieldType(kElectroMagnetic);
    fieldBuilder->ConstructFieldSetup();

The verbose output is the following :

G4FieldBuilder::ConstructLocalFields()
Construct local field in volume: logicDetector
Local (in logicDetector) field created with stepper DormandPrince745
Magnetic field parameters:
  volume name = logicDetector
  field type = Magnetic
  equation type = EqMagnetic
  stepper type = DormandPrince745
  minStep = 0.01 mm
  constDistance = 0 mm
  deltaChord = 0.25 mm
  deltaOneStep = 0.01 mm
  deltaIntersection = 0.001 mm
  epsMin = 5e-05
  epsMax=  0.001
G4FieldBuilder::UpdateFieldSetups
Global field updated with stepper ClassicalRK4
Magnetic field parameters:
  field type = ElectroMagnetic
  equation type = EqElectroMagnetic
  stepper type = ClassicalRK4
  minStep = 0.01 mm
  constDistance = 0 mm
  deltaChord = 0.25 mm
  deltaOneStep = 0.01 mm
  deltaIntersection = 0.001 mm
  epsMin = 5e-05
  epsMax=  0.001

Indeed, SetFieldType function sets the field type for the global field.

To do this for a local field, please, add the following code in your DetectorConstruction constructor:

  G4FieldBuilder* fieldBuilder = G4FieldBuilder::Instance();
  // fieldBuilder->SetVerboseLevel(2);

  auto localFieldParameters = fieldBuilder->CreateFieldParameters("yourFieldVolume");
  localFieldParameters->SetFieldType(kElectroMagnetic);

Best regards,

Excellent, thank you for your time !
Have a nice day.

Last message if anyone needs the solution, i also had to change the equation type for the local field, as follows :

    G4FieldBuilder *fieldBuilder = G4FieldBuilder::Instance();
    //Defining local field parameters
    auto localFieldParameters = fieldBuilder->CreateFieldParameters("logicDetector");
    localFieldParameters->SetFieldType(kElectroMagnetic);
    localFieldParameters->SetEquationType(kEqElectroMagnetic);
    //Using field builder to set up the field
    fieldBuilder->SetLocalField(elField, logicDetector);

Thank you @ivana for your tip !

Thank you for pointing at this.

When the field type is changed by G4FieldBuilder for global field, the equation is changed automatically to kEqElectroMagnetic), but this is not done when setting field type directly via G4FieldParameters.

1 Like