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