CMS 3D CMS Logo

FieldBuilder.cc
Go to the documentation of this file.
3 
6 
12 
13 #include "G4Mag_UsualEqRhs.hh"
14 #include "G4ClassicalRK4.hh"
15 #include "G4PropagatorInField.hh"
16 #include "G4FieldManager.hh"
17 #include "G4ChordFinder.hh"
18 #include "G4LogicalVolumeStore.hh"
19 #include "CLHEP/Units/GlobalSystemOfUnits.h"
20 
21 using namespace sim;
22 
24  : theTopVolume(nullptr),thePSet(p)
25 {
26  theDelta = p.getParameter<double>("delta")*CLHEP::mm;
27  theField = new Field(f, theDelta);
28  theFieldEquation = new G4Mag_UsualEqRhs(theField);
29 }
30 
32 {}
33 
34 void FieldBuilder::build( CMSFieldManager* fM, G4PropagatorInField* fP)
35 {
36  edm::ParameterSet thePSetForGMFM =
37  thePSet.getParameter<edm::ParameterSet>("ConfGlobalMFM");
38  std::string volName = thePSetForGMFM.getParameter< std::string >("Volume");
39  edm::ParameterSet volPSet =
40  thePSetForGMFM.getParameter< edm::ParameterSet >( volName );
41 
42  configureForVolume( volName, volPSet, fM, fP);
43 
44  edm::LogVerbatim("SimG4CoreMagneticField")
45  << " FieldBuilder::build: Global magnetic field is used";
46 }
47 
49  edm::ParameterSet& volPSet,
50  CMSFieldManager * fM,
51  G4PropagatorInField * fP)
52 {
53  G4LogicalVolumeStore* theStore = G4LogicalVolumeStore::GetInstance();
54  for (auto vol : *theStore) {
55  if ( (std::string)vol->GetName() == volName ) {
56  theTopVolume = vol;
57  break;
58  }
59  }
60 
61  std::string fieldType = volPSet.getParameter<std::string>("Type");
62  std::string stepper = volPSet.getParameter<std::string>("Stepper");
63 
64  edm::ParameterSet stpPSet = volPSet.getParameter<edm::ParameterSet>("StepperParam");
65  double minStep = stpPSet.getParameter<double>("MinStep")*CLHEP::mm;
66 
67  FieldStepper* dStepper = new FieldStepper(theFieldEquation, theDelta, stepper);
68  G4ChordFinder* cf = new G4ChordFinder(theField,minStep,dStepper);
69 
70  MonopoleEquation* monopoleEquation = new MonopoleEquation(theField);
71  G4MagIntegratorStepper* mStepper = new G4ClassicalRK4(monopoleEquation,8);
72  G4ChordFinder* cfmon = new G4ChordFinder(theField, minStep, mStepper);
73 
74  fM->InitialiseForVolume(stpPSet, theField, cf, cfmon, volName,
75  fieldType, stepper, theDelta, fP);
76 }
T getParameter(std::string const &) const
#define nullptr
G4LogicalVolume * theTopVolume
Definition: FieldBuilder.h:34
double f[11][100]
FieldBuilder(const MagneticField *, const edm::ParameterSet &)
Definition: FieldBuilder.cc:23
void build(CMSFieldManager *fM, G4PropagatorInField *fP)
Definition: FieldBuilder.cc:34
G4Mag_UsualEqRhs * theFieldEquation
Definition: FieldBuilder.h:33
void InitialiseForVolume(const edm::ParameterSet &, sim::Field *, G4ChordFinder *cfDefault, G4ChordFinder *cfMonopole, const std::string &vol, const std::string &fieldType, const std::string &stepperName, double delta, G4PropagatorInField *)
edm::ParameterSet thePSet
Definition: FieldBuilder.h:35
void configureForVolume(const std::string &volName, edm::ParameterSet &volPSet, CMSFieldManager *fM, G4PropagatorInField *fP)
Definition: FieldBuilder.cc:48