11 #include <geometry/bfieldmap/BFieldComponentKlm1.h>
13 #include <framework/utilities/FileSystem.h>
14 #include <framework/logging/Logger.h>
16 #include <boost/iostreams/filtering_stream.hpp>
17 #include <boost/iostreams/device/file.hpp>
23 namespace io = boost::iostreams;
25 void BFieldComponentKlm1::initialize()
27 if (m_mapFilename.empty()) {
28 B2ERROR(
"The filename for the magnetic field Component is empty !");
32 string fullPath = FileSystem::findFile(
"/data/" + m_mapFilename);
34 if (!FileSystem::fileExists(fullPath)) {
35 B2ERROR(
"The magnetic field map file '" << m_mapFilename <<
"' could not be found !");
40 io::filtering_istream fieldMapFile;
41 fieldMapFile.push(io::file_source(fullPath));
44 B2DEBUG(10,
"Loading the magnetic field from file '" << m_mapFilename <<
"' in to the memory...");
49 fieldMapFile.getline(dummy,
sizeof(dummy));
50 for (
int layer = 0; layer < m_nBarrelLayers; ++layer) {
52 fieldMapFile >> l >> m_barrelZBreakpoint[layer] >> m_barrelRBreakpoint[layer]
53 >> m_barrelFieldZSlope1[layer]
54 >> m_barrelFieldZIntercept1[layer]
55 >> m_barrelFieldZSlope2[layer]
56 >> m_barrelFieldZIntercept2[layer]
57 >> m_barrelFieldRSlope1[layer]
58 >> m_barrelFieldRIntercept1[layer]
59 >> m_barrelFieldRSlope2[layer]
60 >> m_barrelFieldRIntercept2[layer];
63 B2ERROR(
"Barrel Parameter file is something wrong ! " << layer <<
" " << l);
67 fieldMapFile.getline(dummy,
sizeof(dummy));
68 fieldMapFile.getline(dummy,
sizeof(dummy));
69 for (
int GapIron = 0; GapIron < 2; GapIron++) {
70 for (
int layer = 0; layer < m_nEndcapLayers + 1; layer++) {
71 for (
int j = 0; j < 5; j++) {
73 fieldMapFile >> g >> l >> jj
74 >> m_endcapZBreakpoint[GapIron][layer][j] >> m_endcapRBreakpoint[GapIron][layer][j]
75 >> m_endcapFieldZSlope[GapIron][layer][j]
76 >> m_endcapFieldZIntercept[GapIron][layer][j]
77 >> m_endcapFieldRSlope[GapIron][layer][j]
78 >> m_endcapFieldRIntercept[GapIron][layer][j];
79 if (GapIron != g || layer != l || jj != j)
80 B2ERROR(
"Endcap Parameter file is something wrong ! " << g <<
" " << l <<
" " << jj);
85 B2DEBUG(10,
"... loaded ");
92 double r = point.
Perp();
95 double z = point.
Z() - m_mapOffset;
96 double absZ = std::abs(z);
101 if (absZ < m_barrelZMax) {
106 double cosphi = std::abs(x) / r;
107 double d = ((cosphi < m_cospi8) ? ((cosphi < m_cos3pi8) ? std::abs(y)
108 : (std::abs(x) + std::abs(y)) * m_cospi4)
109 : std::abs(x)) - m_barrelRMin - m_barrelGapHeightLayer0;
112 int layer =
static_cast<int>(floor(d / m_dLayer));
115 if (layer < 0 || layer > m_nBarrelLayers)
return bField;
116 if (layer == m_nBarrelLayers) {
117 layer = m_nBarrelLayers - 1;
118 d = layer * m_dLayer;
120 if ((d - layer * m_dLayer) < m_barrelIronThickness) {
121 double br = ((absZ > m_barrelRBreakpoint[layer]) ?
122 m_barrelFieldRIntercept2[layer] + m_barrelFieldRSlope2[layer] * absZ :
123 m_barrelFieldRIntercept1[layer] + m_barrelFieldRSlope1[layer] * absZ);
124 if (z < 0.0) { br = -br; }
125 bField.
SetXYZ(br * x / r, br * y / r,
126 ((absZ > m_barrelZBreakpoint[layer]) ?
127 m_barrelFieldZIntercept2[layer] + m_barrelFieldZSlope2[layer] * absZ :
128 m_barrelFieldZIntercept1[layer] + m_barrelFieldZSlope1[layer] * absZ));
131 }
else if (absZ > m_endcapZMin) {
133 if (r <= m_endcapRMin)
return bField;
138 double dz = absZ - (m_endcapZMin - m_endcapGapHeight);
139 int layer =
static_cast<int>(floor(dz / m_dLayer));
141 if (layer < 0 || layer >= m_nEndcapLayers)
return bField;
144 if ((dz - m_dLayer * layer) > m_endcapGapHeight) GapIron = 1;
145 for (
int j = 0; j < 5; j++) {
146 if (r < m_endcapRBreakpoint[GapIron][layer][j]) {
147 double br = m_endcapFieldRIntercept[GapIron][layer][j] + m_endcapFieldRSlope[GapIron][layer][j] * r;
148 if (z < 0.0) { br = -br; }
149 bField.
SetX(br * x / r);
150 bField.
SetY(br * y / r);
154 for (
int j = 0; j < 5; j++) {
155 if (r < m_endcapZBreakpoint[GapIron][layer][j]) {
156 bField.
SetZ(m_endcapFieldZIntercept[GapIron][layer][j] + m_endcapFieldZSlope[GapIron][layer][j] * r);
166 void BFieldComponentKlm1::terminate()