11 #include <geometry/bfieldmap/GeoMagneticField.h>
12 #include <geometry/bfieldmap/BFieldMap.h>
14 #include <geometry/bfieldmap/BFieldComponentConstant.h>
15 #include <geometry/bfieldmap/BFieldComponentRadial.h>
16 #include <geometry/bfieldmap/BFieldComponentQuad.h>
17 #include <geometry/bfieldmap/BFieldComponentBeamline.h>
18 #include <geometry/bfieldmap/BFieldComponentKlm1.h>
19 #include <geometry/bfieldmap/BFieldComponent3d.h>
20 #include <geometry/dbobjects/MagneticFieldComponent3D.h>
21 #include <geometry/CreatorFactory.h>
22 #include <framework/database/DBImportObjPtr.h>
23 #include <framework/dbobjects/MagneticFieldComponentConstant.h>
25 #include <framework/logging/Logger.h>
26 #include <framework/gearbox/GearDir.h>
27 #include <framework/gearbox/Unit.h>
28 #include <framework/utilities/FileSystem.h>
30 #include <boost/iostreams/filtering_stream.hpp>
31 #include <boost/iostreams/device/file.hpp>
32 #include <boost/iostreams/filter/gzip.hpp>
33 #include <boost/bind.hpp>
36 using namespace boost;
43 geometry::CreatorFactory<GeoMagneticField> GeoMagneticFieldFactory(
"GeoMagneticField");
67 for (
const GearDir& component : content.getNodes(
"Components/Component")) {
69 string compType = component.getString(
"attribute::type");
70 B2DEBUG(10,
"GeoMagneticField creator: Loading the parameters for the component type'" << compType <<
"'");
71 if (compType ==
"3d")
add3dBField(component, fieldmap);
73 else B2ERROR(
"The magnetic field type " << compType <<
" can not yet be stored in the database");
80 double xValue = component.getWithUnit(
"X");
81 double yValue = component.getWithUnit(
"Y");
82 double zValue = component.getWithUnit(
"Z");
83 double RminValue = component.getLength(
"MinR", 0);
84 double RmaxValue = component.getLength(
"MaxR");
85 double ZminValue = component.getLength(
"MinZ");
86 double ZmaxValue = component.getLength(
"MaxZ");
88 RminValue, RmaxValue, ZminValue, ZmaxValue);
94 string mapFilename = component.getString(
"MapFilename");
95 int mapSizeR = component.getInt(
"NumberGridPointsR");
96 int mapSizeZ = component.getInt(
"NumberGridPointsZ");
97 int mapSizePhi = component.getInt(
"NumberGridPointsPhi");
99 double minZ = component.getLength(
"ZMin");
100 double maxZ = component.getLength(
"ZMax");
101 double minR = component.getLength(
"RadiusMin");
102 double maxR = component.getLength(
"RadiusMax");
106 B2ERROR(
"The 3d magnetic field map file '" << mapFilename <<
"' could not be found !");
110 std::vector<B2Vector3F> bmap;
111 bmap.reserve(mapSizeR * mapSizeZ * mapSizePhi);
113 iostreams::filtering_istream fieldMapFile;
114 fieldMapFile.push(iostreams::gzip_decompressor());
115 fieldMapFile.push(iostreams::file_source(fullPath));
118 for (
int k = 0; k < mapSizeZ; k++) {
119 for (
int i = 0; i < mapSizeR; i++) {
120 for (
int j = 0; j < mapSizePhi; j++) {
123 fieldMapFile.getline(tmp, 256);
126 Br = strtod(tmp + 33, &next);
127 Bphi = strtod(next, &next);
128 Bz = strtod(next,
nullptr);
134 minR, maxR, minZ, maxZ,
135 mapSizeR, mapSizePhi, mapSizeZ,
154 CompTypeMap::iterator findIter;
155 for (
const GearDir& component : content.getNodes(
"Components/Component")) {
157 string compType = component.getString(
"attribute::type");
158 B2DEBUG(10,
"GeoMagneticField creator: Loading the parameters for the component type'" << compType <<
"'");
162 findIter->second(component);
164 B2ERROR(
"The magnetic field component type '" << compType <<
"' is unknown !");
178 double xValue = component.getDouble(
"X");
179 double yValue = component.getDouble(
"Y");
180 double zValue = component.getDouble(
"Z");
181 double RmaxValue = component.getLength(
"MaxR");
182 double ZminValue = component.getLength(
"MinZ");
183 double ZmaxValue = component.getLength(
"MaxZ");
192 string mapFilename = component.getString(
"MapFilename");
193 int mapSizeR = component.getInt(
"NumberGridPointsR");
194 int mapSizeZ = component.getInt(
"NumberGridPointsZ");
196 double mapRegionMinZ = component.getLength(
"ZMin");
197 double mapRegionMaxZ = component.getLength(
"ZMax");
198 double mapOffset = component.getLength(
"ZOffset");
200 double mapRegionMinR = component.getLength(
"RadiusMin");
201 double mapRegionMaxR = component.getLength(
"RadiusMax");
203 double gridPitchR = component.getLength(
"GridPitchR");
204 double gridPitchZ = component.getLength(
"GridPitchZ");
206 double slotRMin = component.getLength(
"SlotRMin");
207 double endyokeZMin = component.getLength(
"EndyokeZMin");
208 double gapHeight = component.getLength(
"GapHeight");
209 double ironThickness = component.getLength(
"IronPlateThickness");
213 bComp.setMapSize(mapSizeR, mapSizeZ);
214 bComp.setMapRegionZ(mapRegionMinZ, mapRegionMaxZ, mapOffset);
215 bComp.setMapRegionR(mapRegionMinR, mapRegionMaxR);
216 bComp.setGridPitch(gridPitchR, gridPitchZ);
217 bComp.setKlmParameters(slotRMin, endyokeZMin, gapHeight, ironThickness);
222 string mapFilenameHER = component.getString(
"MapFilenameHER");
223 string mapFilenameLER = component.getString(
"MapFilenameLER");
224 string mapFilenameHERleak = component.getString(
"MapFilenameHERleak");
225 string apertFilenameHER = component.getString(
"ApertFilenameHER");
226 string apertFilenameLER = component.getString(
"ApertFilenameLER");
228 int mapSizeHER = component.getInt(
"MapSizeHER");
229 int mapSizeLER = component.getInt(
"MapSizeLER");
230 int mapSizeHERleak = component.getInt(
"MapSizeHERleak");
231 int apertSizeHER = component.getInt(
"ApertSizeHER");
232 int apertSizeLER = component.getInt(
"ApertSizeLER");
235 bComp.
setMapFilename(mapFilenameHER, mapFilenameLER, mapFilenameHERleak);
236 bComp.setApertFilename(apertFilenameHER, apertFilenameLER);
237 bComp.setMapSize(mapSizeHER, mapSizeLER, mapSizeHERleak);
238 bComp.setApertSize(apertSizeHER, apertSizeLER);
243 string mapFilenameHER = component.getString(
"MapFilenameHER");
244 string mapFilenameLER = component.getString(
"MapFilenameLER");
245 string interFilenameHER = component.getString(
"InterFilenameHER");
246 string interFilenameLER = component.getString(
"InterFilenameLER");
248 double mapRegionMinZ = component.getLength(
"ZMin");
249 double mapRegionMaxZ = component.getLength(
"ZMax");
251 double mapRegionMinR = component.getLength(
"RadiusMin");
252 double mapRegionMaxR = component.getLength(
"RadiusMax");
254 double beamAngle = component.getLength(
"BeamAngle");
258 bComp.setInterpolateFilename(interFilenameHER, interFilenameLER);
259 bComp.setMapRegionZ(mapRegionMinZ, mapRegionMaxZ);
260 bComp.setMapRegionR(mapRegionMinR, mapRegionMaxR);
261 bComp.setBeamAngle(beamAngle);
266 string mapFilename = component.getString(
"MapFilename");
268 int nBarrelLayers = component.getInt(
"NumberBarrelLayers");
269 int nEndcapLayers = component.getInt(
"NumberEndcapLayers");
271 double barrelRMin = component.getLength(
"BarrelRadiusMin");
272 double barrelZMax = component.getLength(
"BarrelZMax");
273 double mapOffset = component.getLength(
"ZOffset");
275 double endcapRMin = component.getLength(
"EdncapRadiusMin");
276 double endcapZMin = component.getLength(
"EndcapZMin");
278 double barrelGapHeightLayer0 = component.getLength(
"BarrelGapHeightLayer0");
279 double barrelIronThickness = component.getLength(
"BarrelIronThickness");
280 double endcapGapHeight = component.getLength(
"EndcapGapHeight");
281 double dLayer = component.getLength(
"DLayer");
286 bComp.setNLayers(nBarrelLayers, nEndcapLayers);
287 bComp.setBarrelRegion(barrelRMin, barrelZMax, mapOffset);
288 bComp.setEndcapRegion(endcapRMin, endcapZMin);
289 bComp.setLayerParam(barrelGapHeightLayer0, barrelIronThickness, endcapGapHeight, dLayer);
294 string mapFilename = component.getString(
"MapFilename");
295 int mapSizeR = component.getInt(
"NumberGridPointsR");
296 int mapSizeZ = component.getInt(
"NumberGridPointsZ");
297 int mapSizePhi = component.getInt(
"NumberGridPointsPhi");
299 double mapRegionMinZ = component.getLength(
"ZMin");
300 double mapRegionMaxZ = component.getLength(
"ZMax");
301 double mapOffset = component.getLength(
"ZOffset");
303 double mapRegionMinR = component.getLength(
"RadiusMin");
304 double mapRegionMaxR = component.getLength(
"RadiusMax");
306 double gridPitchR = component.getLength(
"GridPitchR");
307 double gridPitchZ = component.getLength(
"GridPitchZ");
308 double gridPitchPhi = component.getLength(
"GridPitchPhi");
309 bool mirrorPhi = bool(component.getInt(
"MirrorPhi"));
311 double excludeRegionMinZ = component.getLength(
"ExcludeZMin");
312 double excludeRegionMaxZ = component.getLength(
"ExcludeZMax");
313 double excludeRegionMinR = component.getLength(
"ExcludeRadiusMin");
314 double excludeRegionMaxR = component.getLength(
"ExcludeRadiusMax");
316 double errorRegionMinR = component.getLength(
"BiasRadiusMin");
317 double errorRegionMaxR = component.getLength(
"BiasRadiusMax");
318 double errorBr = component.getDouble(
"BiasBr");
319 double errorBphi = component.getDouble(
"BiasBphi");
320 double errorBz = component.getDouble(
"BiasBz");
322 bool doInterpolation = bool(component.getInt(
"enableInterpolation"));
323 string enableCoordinate = component.getString(
"EnableCoordinate");
327 bComp.setMapSize(mapSizeR, mapSizePhi, mapSizeZ);
328 bComp.setMapRegionZ(mapRegionMinZ, mapRegionMaxZ, mapOffset);
329 bComp.setMapRegionR(mapRegionMinR, mapRegionMaxR);
330 bComp.setGridPitch(gridPitchR, gridPitchPhi, gridPitchZ);
331 bComp.setExcludeRegionZ(excludeRegionMinZ, excludeRegionMaxZ);
332 bComp.setExcludeRegionR(excludeRegionMinR, excludeRegionMaxR);
333 bComp.setErrorRegionR(errorRegionMinR, errorRegionMaxR, errorBr, errorBphi, errorBz);
334 bComp.mirrorPhi(mirrorPhi);
335 bComp.doInterpolation(doInterpolation);
336 bComp.enableCoordinate(enableCoordinate);