25 #include "GaudiKernel/SystemOfUnits.h"
43 declareInterface<IMuidCaloTrackStateOnSurface>(
this);
52 ATH_MSG_DEBUG(
"Initializing CombinedMuonTrackStateOnSurface");
70 return StatusCode::SUCCESS;
78 <<
" completely failed to intersect the calorimeter." <<
endmsg <<
" "
81 return StatusCode::SUCCESS;
86 std::vector<std::unique_ptr<const Trk::TrackStateOnSurface>>
caloTSOS;
89 std::unique_ptr<Trk::TrackStateOnSurface> innerTS, middleTS, outerTS;
90 std::unique_ptr<const Trk::TrackParameters> inParams, midParams;
104 fieldCondObj->getInitializedCache(fieldCache);
107 bool trackOutwards =
true;
112 trackOutwards =
false;
122 middleParams = midParams.get();
128 middleTS =
m_caloEnergyParam->trackStateOnSurface(ctx, *midParams, innerParams, outerParams);
129 if (!middleTS) { middleParams =
nullptr; }
135 std::unique_ptr<const Trk::TrackParameters>
params;
137 if (!middleTS)
break;
151 <<
" correctedEnergy "
166 std::make_unique<Trk::AtaCylinder>(middleParams->
position(),
momentum, middleParams->
charge(), *cylinder);
188 if (!middleTS) {
ATH_MSG_VERBOSE(
" fail tracking outwards: no intersect at middle surface"); }
191 ATH_MSG_VERBOSE(
" fail tracking ouwards: no intersect at inner surface");
199 middleParams = midParams.get();
202 innerParams = inParams.get();
206 middleTS =
m_caloEnergyDeposit->trackStateOnSurface(ctx, *middleParams, inParams.get(), outerParams);
208 middleTS =
m_caloEnergyParam->trackStateOnSurface(ctx, *middleParams, inParams.get(), outerParams);
222 <<
" correctedEnergy "
226 std::unique_ptr<const Trk::TrackParameters>
params;
230 middleParams->covariance() ? std::optional<AmgSymMatrix(5)>(*middleParams->covariance()) : std::nullopt;
246 ATH_MSG_VERBOSE(
" fail tracking inwards: no intersect at inner surface");
249 ATH_MSG_VERBOSE(
" fail tracking inwards: no intersect at middle surface");
255 caloTSOS.push_back(std::move(innerTS));
258 if (middleTS)
caloTSOS.push_back(std::move(middleTS));
260 caloTSOS.push_back(std::move(outerTS));
292 std::unique_ptr<const Trk::TrackParameters> extrapolation =
getExtrapolatedParameters(ctx, middleParams, SurfaceLayer::Middle);
298 std::unique_ptr<Trk::TrackStateOnSurface> TSOS;
300 TSOS =
m_caloEnergyDeposit->trackStateOnSurface(ctx, *extrapolation, innerParams, outerParams);
302 TSOS =
m_caloEnergyParam->trackStateOnSurface(ctx, *extrapolation, innerParams, outerParams);
322 const std::string surf_layer_str =
layer == SurfaceLayer::Inner ?
"Inner" : (
layer == SurfaceLayer::Middle ?
"Middle" :
"Outer");
325 double startingPhi = 0.;
338 if (!surface)
return nullptr;
341 unsigned extrapolations = 0;
344 propDirection = momentumDirection;
346 propDirection = oppositeDirection;
350 std::unique_ptr<const Trk::TrackParameters> extrapolation{
352 if (!extrapolation)
return nullptr;
356 if (std::abs(
deltaPhi) > M_PI_2) {
return nullptr; }
360 double signRZ = (extrapolation->position().perp() -
parameters.position().perp()) *
361 (extrapolation->position().z() -
parameters.position().z());
362 if (signRZ * extrapolation->position().z() < 0.) {
369 bool restart =
false;
375 std::unique_ptr<const Trk::Surface> reset_surface;
376 while (++extrapolations < 5 && extrapolatedSurface != oldSurface) {
380 propDirection = momentumDirection;
382 propDirection = oppositeDirection;
387 std::unique_ptr<const Trk::TrackParameters> oldParameters = std::move(extrapolation);
390 if (!extrapolation) {
398 ATH_MSG_DEBUG(surf_layer_str <<
" Parameters: oscillating => arbitrary solution chosen");
400 extrapolation = std::move(oldParameters);
401 reset_surface.reset(extrapolation->associatedSurface().clone());
402 extrapolatedSurface = reset_surface.get();
403 surface = extrapolatedSurface;
406 ATH_MSG_VERBOSE(surf_layer_str <<
" Parameters: restart extrap after " << extrapolations <<
" extrapolations");
410 surface = oldSurface;
414 ATH_MSG_DEBUG(surf_layer_str <<
" Parameters: Extrapolation succeeded go to next iteration");
415 oldSurface = surface;
416 surface = extrapolatedSurface;
423 if (std::abs(
deltaPhi) > M_PI_2) {
return nullptr; }
425 ATH_MSG_VERBOSE(surf_layer_str <<
" Parameters: success after " << extrapolations <<
" extrapolation step(s). "
426 << std::setiosflags(std::ios::fixed) <<
" Intersection at: r,phi,z " << std::setw(7)
427 << std::setprecision(1) << extrapolation->position().perp() << std::setw(7) << std::setprecision(3)
428 << extrapolation->position().phi() << std::setw(8) << std::setprecision(1)
429 << extrapolation->position().z() <<
" Direction: eta,phi " << std::setw(7) << std::setprecision(3)
430 << extrapolation->momentum().eta() << std::setw(7) << std::setprecision(3)
431 << extrapolation->momentum().phi());
433 return extrapolation;
439 double parameterDistance =
parameters.position().mag();
441 parameterDistance =
parameters.associatedSurface().center().perp();