165def addVMCFields(shipGeo, controlFile: str = "", verbose: bool = False, withVirtualMC: bool = True):
166 """
167 Define VMC B fields, e.g. global field, field maps, local or local+global fields
168 """
169 print("Calling addVMCFields")
170
171 fieldMaker = ROOT.ShipFieldMaker(verbose)
172
173
174
175 if controlFile != "":
176 fieldMaker.readInputFile(controlFile)
177
178
179 if hasattr(shipGeo, "Bfield"):
180 fieldsList = []
181 fieldMaker.defineFieldMap("MainSpecMap", shipGeo.Bfield.fieldMap, ROOT.TVector3(0.0, 0.0, shipGeo.Bfield.z))
182 fieldsList.append("MainSpecMap")
183
184 if not shipGeo.muShield.WithConstField:
185 offset = shipGeo.muShield.Entrance[0]
186 quadSymm = True
187 file_name = f"files/{shipGeo.shieldName}.root"
188 fieldMaker.defineFieldMap(
189 "muonShieldField", file_name, ROOT.TVector3(0.0, 0.0, offset), ROOT.TVector3(0.0, 0.0, 0.0), quadSymm
190 )
191 fieldsList.append("muonShieldField")
192
193 elif not shipGeo.hadronAbsorber.WithConstField:
194 fieldMaker.defineFieldMap(
195 "HadronAbsorberMap",
196 "files/FieldHadronStopper_raised_20190411.root",
197 ROOT.TVector3(0.0, 0.0, shipGeo.hadronAbsorber.z),
198 )
199 fieldsList.append("HadronAbsorberMap")
200
201
202 if len(fieldsList) > 1:
203 fieldMaker.defineComposite("TotalField", *fieldsList)
204 fieldMaker.defineGlobalField("TotalField")
205 else:
206 fieldMaker.defineGlobalField("MainSpecMap")
207 if withVirtualMC:
208
209
210 geom = ROOT.TG4GeometryManager.Instance()
211
212 geom.SetUserPostDetConstruction(fieldMaker)
213
214 geom.ConstructSDandField()
215
216
217
218 return fieldMaker
219
220