19 double yOffset,
double zOffset)
29 ifstream file(filename);
33 EXCEPTION_RAISE(
"FileDNE",
"The field map file '" + std::string(filename) +
38 <<
"-----------------------------------------------------------";
39 ldmx_log(trace) <<
" Magnetic Field Map 3D";
41 <<
"-----------------------------------------------------------";
43 ldmx_log(trace) <<
"Reading the field grid from " << filename <<
" ... ";
44 ldmx_log(trace) <<
" Offsets: " << xOffset <<
" " << yOffset <<
" "
49 file.getline(buffer, 256);
52 file >> nx_ >> ny_ >> nz_;
54 ldmx_log(trace) <<
" Number of values: " << nx_ <<
" " << ny_ <<
" " << nz_;
61 for (ix = 0; ix < nx_; ix++) {
62 x_field_[ix].resize(ny_);
63 y_field_[ix].resize(ny_);
64 z_field_[ix].resize(ny_);
65 for (iy = 0; iy < ny_; iy++) {
66 x_field_[ix][iy].resize(nz_);
67 y_field_[ix][iy].resize(nz_);
68 z_field_[ix][iy].resize(nz_);
76 file.getline(buffer, 256);
77 }
while (buffer[1] !=
'0');
80 double xval, yval, zval, bx, by, bz;
81 for (ix = 0; ix < nx_; ix++) {
82 for (iy = 0; iy < ny_; iy++) {
83 for (iz = 0; iz < nz_; iz++) {
84 file >> xval >> yval >> zval >> bx >> by >> bz;
85 if (ix == 0 && iy == 0 && iz == 0) {
90 x_field_[ix][iy][iz] = bx;
91 y_field_[ix][iy][iz] = by;
92 z_field_[ix][iy][iz] = bz;
102 ldmx_log(trace) <<
" ... done reading ";
103 ldmx_log(trace) <<
"Read values of field from file " << filename;
104 ldmx_log(trace) <<
" Assumed the order: x_, y_, z_, Bx, By, Bz";
105 ldmx_log(trace) <<
" Min values: " << minx_ <<
" " << miny_ <<
" " << minz_
107 ldmx_log(trace) <<
" Max values: " << maxx_ <<
" " << maxy_ <<
" " << maxz_
109 ldmx_log(trace) <<
" Field offsets: " << x_offset_ <<
" " << y_offset_ <<
" "
110 << z_offset_ <<
" mm ";
126 ldmx_log(trace) <<
"After reordering if necessary";
127 ldmx_log(trace) <<
" Min values: " << minx_ <<
" " << miny_ <<
" " << minz_
129 ldmx_log(trace) <<
" Max values: " << maxx_ <<
" " << maxy_ <<
" " << maxz_
137 ldmx_log(trace) <<
" Range of values: " << dx_ <<
" " << dy_ <<
" " << dz_
139 ldmx_log(trace) <<
"Done loading field map";
141 <<
"-----------------------------------------------------------";
145 double* bfield)
const {
146 double x = point[0] - x_offset_;
147 double y = point[1] - y_offset_;
148 double z = point[2] - z_offset_;
152 if ((x >= minx_ && (x < maxx_ - eps)) && (y >= miny_ && (y < maxy_ - eps)) &&
153 (z >= minz_ && (z < maxz_ - eps))) {
156 double xfraction = (x - minx_) / dx_;
157 double yfraction = (y - miny_) / dy_;
158 double zfraction = (z - minz_) / dz_;
161 xfraction = 1 - xfraction;
164 yfraction = 1 - yfraction;
167 zfraction = 1 - zfraction;
172 double xdindex, ydindex, zdindex;
176 double xlocal = (std::modf(xfraction * (nx_ - 1), &xdindex));
177 double ylocal = (std::modf(yfraction * (ny_ - 1), &ydindex));
178 double zlocal = (std::modf(zfraction * (nz_ - 1), &zdindex));
182 int xindex =
static_cast<int>(xdindex);
183 int yindex =
static_cast<int>(ydindex);
184 int zindex =
static_cast<int>(zdindex);
186#ifdef DEBUG_INTERPOLATING_FIELD
187 ldmx_log(trace) <<
"Local x_,y_,z_: " << xlocal <<
" " << ylocal <<
" "
189 ldmx_log(trace) <<
"Index x_,y_,z_: " << xindex <<
" " << yindex <<
" "
191 double valx0z0, mulx0z0, valx1z0, mulx1z0;
192 double valx0z1, mulx0z1, valx1z1, mulx1z1;
193 valx0z0 = table[xindex][0][zindex];
194 mulx0z0 = (1 - xlocal) * (1 - zlocal);
195 valx1z0 = table[xindex + 1][0][zindex];
196 mulx1z0 = xlocal * (1 - zlocal);
197 valx0z1 = table[xindex][0][zindex + 1];
198 mulx0z1 = (1 - xlocal) * zlocal;
199 valx1z1 = table[xindex + 1][0][zindex + 1];
200 mulx1z1 = xlocal * zlocal;
205 x_field_[xindex][yindex][zindex] * (1 - xlocal) * (1 - ylocal) *
207 x_field_[xindex][yindex][zindex + 1] * (1 - xlocal) * (1 - ylocal) *
209 x_field_[xindex][yindex + 1][zindex] * (1 - xlocal) * ylocal *
211 x_field_[xindex][yindex + 1][zindex + 1] * (1 - xlocal) * ylocal *
213 x_field_[xindex + 1][yindex][zindex] * xlocal * (1 - ylocal) *
215 x_field_[xindex + 1][yindex][zindex + 1] * xlocal * (1 - ylocal) *
217 x_field_[xindex + 1][yindex + 1][zindex] * xlocal * ylocal *
219 x_field_[xindex + 1][yindex + 1][zindex + 1] * xlocal * ylocal * zlocal;
221 y_field_[xindex][yindex][zindex] * (1 - xlocal) * (1 - ylocal) *
223 y_field_[xindex][yindex][zindex + 1] * (1 - xlocal) * (1 - ylocal) *
225 y_field_[xindex][yindex + 1][zindex] * (1 - xlocal) * ylocal *
227 y_field_[xindex][yindex + 1][zindex + 1] * (1 - xlocal) * ylocal *
229 y_field_[xindex + 1][yindex][zindex] * xlocal * (1 - ylocal) *
231 y_field_[xindex + 1][yindex][zindex + 1] * xlocal * (1 - ylocal) *
233 y_field_[xindex + 1][yindex + 1][zindex] * xlocal * ylocal *
235 y_field_[xindex + 1][yindex + 1][zindex + 1] * xlocal * ylocal * zlocal;
237 z_field_[xindex][yindex][zindex] * (1 - xlocal) * (1 - ylocal) *
239 z_field_[xindex][yindex][zindex + 1] * (1 - xlocal) * (1 - ylocal) *
241 z_field_[xindex][yindex + 1][zindex] * (1 - xlocal) * ylocal *
243 z_field_[xindex][yindex + 1][zindex + 1] * (1 - xlocal) * ylocal *
245 z_field_[xindex + 1][yindex][zindex] * xlocal * (1 - ylocal) *
247 z_field_[xindex + 1][yindex][zindex + 1] * xlocal * (1 - ylocal) *
249 z_field_[xindex + 1][yindex + 1][zindex] * xlocal * ylocal *
251 z_field_[xindex + 1][yindex + 1][zindex + 1] * xlocal * ylocal * zlocal;