18 double yOffset,
double zOffset)
28 ifstream file(filename);
32 EXCEPTION_RAISE(
"FileDNE",
"The field map file '" + std::string(filename) +
37 <<
"-----------------------------------------------------------";
38 ldmx_log(trace) <<
" Magnetic Field Map 3D";
40 <<
"-----------------------------------------------------------";
42 ldmx_log(trace) <<
"Reading the field grid from " << filename <<
" ... ";
43 ldmx_log(trace) <<
" Offsets: " << xOffset <<
" " << yOffset <<
" "
48 file.getline(buffer, 256);
51 file >> nx_ >> ny_ >> nz_;
53 ldmx_log(trace) <<
" Number of values: " << nx_ <<
" " << ny_ <<
" " << nz_;
60 for (ix = 0; ix < nx_; ix++) {
61 x_field_[ix].resize(ny_);
62 y_field_[ix].resize(ny_);
63 z_field_[ix].resize(ny_);
64 for (iy = 0; iy < ny_; iy++) {
65 x_field_[ix][iy].resize(nz_);
66 y_field_[ix][iy].resize(nz_);
67 z_field_[ix][iy].resize(nz_);
75 file.getline(buffer, 256);
76 }
while (buffer[1] !=
'0');
79 double xval, yval, zval, bx, by, bz;
80 for (ix = 0; ix < nx_; ix++) {
81 for (iy = 0; iy < ny_; iy++) {
82 for (iz = 0; iz < nz_; iz++) {
83 file >> xval >> yval >> zval >> bx >> by >> bz;
84 if (ix == 0 && iy == 0 && iz == 0) {
89 x_field_[ix][iy][iz] = bx;
90 y_field_[ix][iy][iz] = by;
91 z_field_[ix][iy][iz] = bz;
101 ldmx_log(trace) <<
" ... done reading ";
102 ldmx_log(trace) <<
"Read values of field from file " << filename;
103 ldmx_log(trace) <<
" Assumed the order: x_, y_, z_, Bx, By, Bz";
104 ldmx_log(trace) <<
" Min values: " << minx_ <<
" " << miny_ <<
" " << minz_
106 ldmx_log(trace) <<
" Max values: " << maxx_ <<
" " << maxy_ <<
" " << maxz_
108 ldmx_log(trace) <<
" Field offsets: " << x_offset_ <<
" " << y_offset_ <<
" "
109 << z_offset_ <<
" mm ";
125 ldmx_log(trace) <<
"After reordering if necessary";
126 ldmx_log(trace) <<
" Min values: " << minx_ <<
" " << miny_ <<
" " << minz_
128 ldmx_log(trace) <<
" Max values: " << maxx_ <<
" " << maxy_ <<
" " << maxz_
136 ldmx_log(trace) <<
" Range of values: " << dx_ <<
" " << dy_ <<
" " << dz_
138 ldmx_log(trace) <<
"Done loading field map";
140 <<
"-----------------------------------------------------------";
144 double* bfield)
const {
145 double x = point[0] - x_offset_;
146 double y = point[1] - y_offset_;
147 double z = point[2] - z_offset_;
151 if ((x >= minx_ && (x < maxx_ - eps)) && (y >= miny_ && (y < maxy_ - eps)) &&
152 (z >= minz_ && (z < maxz_ - eps))) {
155 double xfraction = (x - minx_) / dx_;
156 double yfraction = (y - miny_) / dy_;
157 double zfraction = (z - minz_) / dz_;
160 xfraction = 1 - xfraction;
163 yfraction = 1 - yfraction;
166 zfraction = 1 - zfraction;
171 double xdindex, ydindex, zdindex;
175 double xlocal = (std::modf(xfraction * (nx_ - 1), &xdindex));
176 double ylocal = (std::modf(yfraction * (ny_ - 1), &ydindex));
177 double zlocal = (std::modf(zfraction * (nz_ - 1), &zdindex));
181 int xindex =
static_cast<int>(xdindex);
182 int yindex =
static_cast<int>(ydindex);
183 int zindex =
static_cast<int>(zdindex);
185#ifdef DEBUG_INTERPOLATING_FIELD
186 ldmx_log(trace) <<
"Local x_,y_,z_: " << xlocal <<
" " << ylocal <<
" "
188 ldmx_log(trace) <<
"Index x_,y_,z_: " << xindex <<
" " << yindex <<
" "
190 double valx0z0, mulx0z0, valx1z0, mulx1z0;
191 double valx0z1, mulx0z1, valx1z1, mulx1z1;
192 valx0z0 = table[xindex][0][zindex];
193 mulx0z0 = (1 - xlocal) * (1 - zlocal);
194 valx1z0 = table[xindex + 1][0][zindex];
195 mulx1z0 = xlocal * (1 - zlocal);
196 valx0z1 = table[xindex][0][zindex + 1];
197 mulx0z1 = (1 - xlocal) * zlocal;
198 valx1z1 = table[xindex + 1][0][zindex + 1];
199 mulx1z1 = xlocal * zlocal;
204 x_field_[xindex][yindex][zindex] * (1 - xlocal) * (1 - ylocal) *
206 x_field_[xindex][yindex][zindex + 1] * (1 - xlocal) * (1 - ylocal) *
208 x_field_[xindex][yindex + 1][zindex] * (1 - xlocal) * ylocal *
210 x_field_[xindex][yindex + 1][zindex + 1] * (1 - xlocal) * ylocal *
212 x_field_[xindex + 1][yindex][zindex] * xlocal * (1 - ylocal) *
214 x_field_[xindex + 1][yindex][zindex + 1] * xlocal * (1 - ylocal) *
216 x_field_[xindex + 1][yindex + 1][zindex] * xlocal * ylocal *
218 x_field_[xindex + 1][yindex + 1][zindex + 1] * xlocal * ylocal * zlocal;
220 y_field_[xindex][yindex][zindex] * (1 - xlocal) * (1 - ylocal) *
222 y_field_[xindex][yindex][zindex + 1] * (1 - xlocal) * (1 - ylocal) *
224 y_field_[xindex][yindex + 1][zindex] * (1 - xlocal) * ylocal *
226 y_field_[xindex][yindex + 1][zindex + 1] * (1 - xlocal) * ylocal *
228 y_field_[xindex + 1][yindex][zindex] * xlocal * (1 - ylocal) *
230 y_field_[xindex + 1][yindex][zindex + 1] * xlocal * (1 - ylocal) *
232 y_field_[xindex + 1][yindex + 1][zindex] * xlocal * ylocal *
234 y_field_[xindex + 1][yindex + 1][zindex + 1] * xlocal * ylocal * zlocal;
236 z_field_[xindex][yindex][zindex] * (1 - xlocal) * (1 - ylocal) *
238 z_field_[xindex][yindex][zindex + 1] * (1 - xlocal) * (1 - ylocal) *
240 z_field_[xindex][yindex + 1][zindex] * (1 - xlocal) * ylocal *
242 z_field_[xindex][yindex + 1][zindex + 1] * (1 - xlocal) * ylocal *
244 z_field_[xindex + 1][yindex][zindex] * xlocal * (1 - ylocal) *
246 z_field_[xindex + 1][yindex][zindex + 1] * xlocal * (1 - ylocal) *
248 z_field_[xindex + 1][yindex + 1][zindex] * xlocal * ylocal *
250 z_field_[xindex + 1][yindex + 1][zindex + 1] * xlocal * ylocal * zlocal;