207{
208
209
210 msg << __func__<<
"\n"
211 << std::setiosflags(std::ios::fixed)
212 << " eta rEnd mean(Bz) max(dBz/dR) mean(Bt) max(dBt/dR) "
213 << "min(Bt) max(Bt) reverse-bend(z) integrals: Bt.dR Bl.dR"
214 << " asymm: x y z"
215 << " " << std::endl
216 << " m T T/m T T/m "
217 << " T T m T.m T.m"
218 << " T T T"
219 << "/n";
220
221 double maxR = 1000.*Gaudi::Units::mm;
222 double maxZ = 2650.*Gaudi::Units::mm;
223 int numSteps = 1000;
224
225 MagField::AtlasFieldCache fieldCache;
227
228
230 for (
int i = 0;
i != 31; ++
i)
231 {
235 double rEnd = maxR;
236 if (std::abs(cotTheta) > maxZ/maxR) rEnd = maxZ/
direction.z();
237 double step = rEnd/
static_cast<double>(numSteps);
239 double meanBL = 0.;
240 double meanBT = 0.;
241 double meanBZ = 0.;
242 double maxBT = 0.;
243 double minBT = 9999.;
244 double maxGradBT = 0.;
245 double maxGradBZ = 0.;
246 double prevBT = 0.;
247 double prevBZ = 0.;
248 double reverseZ = 0.;
249
250
251 for (
int j = 0;
j != numSteps; ++
j)
252 {
258 double BZ =
field.z();
260 double BL = std::sqrt(vCrossB.mag2() - BT*BT);
261 meanBL += BL;
262 meanBT += BT;
263 meanBZ += BZ;
264 if (BT > maxBT) maxBT = BT;
265 if (BT < minBT) minBT = BT;
266 if (j > 0)
267 {
269 double grad = std::abs(BT - prevBT);
270 if (grad > maxGradBT) maxGradBT = grad;
271 grad = std::abs(BZ - prevBZ);
272 if (grad > maxGradBZ) maxGradBZ = grad;
273 }
274 prevBT = BT;
275 prevBZ = BZ;
276 }
277
278
279 maxGradBT *= static_cast<double>(numSteps)/step;
280 maxGradBZ *= static_cast<double>(numSteps)/step;
281 meanBL /= static_cast<double>(numSteps);
282 meanBT /= static_cast<double>(numSteps);
283 meanBZ /= static_cast<double>(numSteps);
284 double integralBL = meanBL*rEnd;
285 double integralBT = meanBT*rEnd;
286
287 msg << std::setw(6) << std::setprecision(2) <<
eta
288 << std::setw(8) << std::setprecision(3) << rEnd /Gaudi::Units::meter
289 << std::setw(11) << std::setprecision(4) << meanBZ /Gaudi::Units::tesla
290 << std::setw(12) << std::setprecision(3) << maxGradBZ /Gaudi::Units::tesla
291 << std::setw(13) << std::setprecision(4) << meanBT /Gaudi::Units::tesla
292 << std::setw(12) << std::setprecision(3) << maxGradBT /Gaudi::Units::tesla
293 << std::setw(13) << std::setprecision(4) << minBT /Gaudi::Units::tesla
294 << std::setw(8) << std::setprecision(4) << maxBT /Gaudi::Units::tesla;
295 if (reverseZ > 0.)
296 {
297 msg << std::setw(17) << std::setprecision(2) << reverseZ /Gaudi::Units::meter
298 << std::setw(18) << std::setprecision(4) << integralBT /(Gaudi::Units::tesla*Gaudi::Units::meter)
299 << std::setw(8) << std::setprecision(4) << integralBL /(Gaudi::Units::tesla*Gaudi::Units::meter)
300 << " ";
301 }
302 else
303 {
304 msg << std::setw(35) << std::setprecision(4) << integralBT /(Gaudi::Units::tesla*Gaudi::Units::meter)
305 << std::setw(8) << std::setprecision(4) << integralBL /(Gaudi::Units::tesla*Gaudi::Units::meter)
306 << " ";
307 }
308
309
310 for (
int k = 0;
k != 3; ++
k)
311 {
316 double asymm = 0.;
317
318 for (
int j = 0;
j != numSteps; ++
j)
319 {
326 asymm += BT;
327 }
328 asymm = asymm/static_cast<double>(numSteps) - meanBT;
329 msg << std::setw(9) << std::setprecision(4) << asymm /Gaudi::Units::tesla;
330 }
333 }
334}
Scalar eta() const
pseudorapidity method
float j(const xAOD::IParticle &, const xAOD::TrackMeasurementValidation &hit, const Eigen::Matrix3d &jab_inv)
const Amg::Vector3D & direction() const
Method to retrieve the direction at the Intersection.