Implementation of primary virtual method from G4MagneticField interface.
144 {
145 double x = point[0] - x_offset_;
146 double y = point[1] - y_offset_;
147 double z = point[2] - z_offset_;
148 double eps = 1E-6;
149
150
151 if ((x >= minx_ && (x < maxx_ - eps)) && (y >= miny_ && (y < maxy_ - eps)) &&
152 (z >= minz_ && (z < maxz_ - eps))) {
153
154
155 double xfraction = (x - minx_) / dx_;
156 double yfraction = (y - miny_) / dy_;
157 double zfraction = (z - minz_) / dz_;
158
159 if (invert_x_) {
160 xfraction = 1 - xfraction;
161 }
162 if (invert_y_) {
163 yfraction = 1 - yfraction;
164 }
165 if (invert_z_) {
166 zfraction = 1 - zfraction;
167 }
168
169
170
171 double xdindex, ydindex, zdindex;
172
173
174
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));
178
179
180
181 int xindex = static_cast<int>(xdindex);
182 int yindex = static_cast<int>(ydindex);
183 int zindex = static_cast<int>(zdindex);
184
185#ifdef DEBUG_INTERPOLATING_FIELD
186 ldmx_log(trace) << "Local x_,y_,z_: " << xlocal << " " << ylocal << " "
187 << zlocal;
188 ldmx_log(trace) << "Index x_,y_,z_: " << xindex << " " << yindex << " "
189 << zindex;
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;
200#endif
201
202
203 bfield[0] =
204 x_field_[xindex][yindex][zindex] * (1 - xlocal) * (1 - ylocal) *
205 (1 - zlocal) +
206 x_field_[xindex][yindex][zindex + 1] * (1 - xlocal) * (1 - ylocal) *
207 zlocal +
208 x_field_[xindex][yindex + 1][zindex] * (1 - xlocal) * ylocal *
209 (1 - zlocal) +
210 x_field_[xindex][yindex + 1][zindex + 1] * (1 - xlocal) * ylocal *
211 zlocal +
212 x_field_[xindex + 1][yindex][zindex] * xlocal * (1 - ylocal) *
213 (1 - zlocal) +
214 x_field_[xindex + 1][yindex][zindex + 1] * xlocal * (1 - ylocal) *
215 zlocal +
216 x_field_[xindex + 1][yindex + 1][zindex] * xlocal * ylocal *
217 (1 - zlocal) +
218 x_field_[xindex + 1][yindex + 1][zindex + 1] * xlocal * ylocal * zlocal;
219 bfield[1] =
220 y_field_[xindex][yindex][zindex] * (1 - xlocal) * (1 - ylocal) *
221 (1 - zlocal) +
222 y_field_[xindex][yindex][zindex + 1] * (1 - xlocal) * (1 - ylocal) *
223 zlocal +
224 y_field_[xindex][yindex + 1][zindex] * (1 - xlocal) * ylocal *
225 (1 - zlocal) +
226 y_field_[xindex][yindex + 1][zindex + 1] * (1 - xlocal) * ylocal *
227 zlocal +
228 y_field_[xindex + 1][yindex][zindex] * xlocal * (1 - ylocal) *
229 (1 - zlocal) +
230 y_field_[xindex + 1][yindex][zindex + 1] * xlocal * (1 - ylocal) *
231 zlocal +
232 y_field_[xindex + 1][yindex + 1][zindex] * xlocal * ylocal *
233 (1 - zlocal) +
234 y_field_[xindex + 1][yindex + 1][zindex + 1] * xlocal * ylocal * zlocal;
235 bfield[2] =
236 z_field_[xindex][yindex][zindex] * (1 - xlocal) * (1 - ylocal) *
237 (1 - zlocal) +
238 z_field_[xindex][yindex][zindex + 1] * (1 - xlocal) * (1 - ylocal) *
239 zlocal +
240 z_field_[xindex][yindex + 1][zindex] * (1 - xlocal) * ylocal *
241 (1 - zlocal) +
242 z_field_[xindex][yindex + 1][zindex + 1] * (1 - xlocal) * ylocal *
243 zlocal +
244 z_field_[xindex + 1][yindex][zindex] * xlocal * (1 - ylocal) *
245 (1 - zlocal) +
246 z_field_[xindex + 1][yindex][zindex + 1] * xlocal * (1 - ylocal) *
247 zlocal +
248 z_field_[xindex + 1][yindex + 1][zindex] * xlocal * ylocal *
249 (1 - zlocal) +
250 z_field_[xindex + 1][yindex + 1][zindex + 1] * xlocal * ylocal * zlocal;
251
252 } else {
253 bfield[0] = 0.0;
254 bfield[1] = 0.0;
255 bfield[2] = 0.0;
256 }
257}