The input TrackParameters may be anywhere along the track.
85 {
86 std::vector<std::unique_ptr<const Trk::TrackStateOnSurface>>
caloTSOS;
88
89 std::unique_ptr<Trk::TrackStateOnSurface> innerTS, middleTS, outerTS;
90 std::unique_ptr<const Trk::TrackParameters> inParams, midParams;
94
95 MagField::AtlasFieldCache fieldCache;
96
98 const AtlasFieldCacheCondObj* fieldCondObj{*readHandle};
99
100 if (!fieldCondObj) {
103 }
105
106
107 bool trackOutwards = true;
108 if (
dynamic_cast<const Trk::PerigeeSurface*
>(&
parameters.associatedSurface())) {
109 if (
parameters.associatedSurface().center().perp() > 0.5 * Gaudi::Units::meter) trackOutwards =
false;
110 }
else if (std::abs(
parameters.position().z()) > 4.0 * Gaudi::Units::meter ||
111 parameters.position().perp() > 1.2 * Gaudi::Units::meter) {
112 trackOutwards = false;
113 }
114
115 if (trackOutwards)
116 {
118 if (innerTS) {
119 innerParams = innerTS->trackParameters();
122 middleParams = midParams.get();
123 } else {
125 }
126 if (middleParams) {
127
128 middleTS =
m_caloEnergyParam->trackStateOnSurface(ctx, *midParams, innerParams, outerParams);
129 if (!middleTS) { middleParams = nullptr; }
130 }
131
132 if (middleParams) {
133
134
135 std::unique_ptr<const Trk::TrackParameters>
params;
137 if (!middleTS) break;
138
139 const Trk::MaterialEffectsOnTrack* meot =
140 dynamic_cast<const Trk::MaterialEffectsOnTrack*>(middleTS->materialEffectsOnTrack());
142 middleParams = middleTS->trackParameters();
145
146
148 middleTS.reset();
150 << " energyDeposit " << energyDeposit / Gaudi::Units::GeV
151 << " correctedEnergy "
152 << correctedEnergy / Gaudi::Units::GeV << " (GeV units)");
153 break;
154 }
155
158 } else {
160 }
161
162 const Trk::CylinderSurface* cylinder =
164 if (cylinder) {
166 std::make_unique<Trk::AtaCylinder>(middleParams->
position(), momentum, middleParams->
charge(), *cylinder);
167 } else {
168 const Trk::DiscSurface* disc =
dynamic_cast<const Trk::DiscSurface*
>(&middleParams->
associatedSurface());
169 if (disc) {
170 params = std::make_unique<Trk::AtaDisc>(middleParams->
position(), momentum, middleParams->
charge(), *disc);
171 } else {
173 }
174 }
175
176
177
178 if (!params) {
179 middleTS.reset();
181 middleTS =
m_caloEnergyDeposit->trackStateOnSurface(ctx, *params, innerParams, outerParams);
182 } else {
183 middleTS =
m_caloEnergyParam->trackStateOnSurface(ctx, *params, innerParams, outerParams);
184 }
186 if (middleTS) { outerTS =
outerTSOS(ctx, *params); }
187 }
188 if (!middleTS) {
ATH_MSG_VERBOSE(
" fail tracking outwards: no intersect at middle surface"); }
189 }
190 } else {
191 ATH_MSG_VERBOSE(
" fail tracking ouwards: no intersect at inner surface");
192 }
193 } else
194 {
196 if (outerTS) {
197 outerParams = outerTS->trackParameters();
199 middleParams = midParams.get();
200 if (middleParams) {
202 innerParams = inParams.get();
203 if (inParams) {
204
206 middleTS =
m_caloEnergyDeposit->trackStateOnSurface(ctx, *middleParams, inParams.get(), outerParams);
207 } else {
208 middleTS =
m_caloEnergyParam->trackStateOnSurface(ctx, *middleParams, inParams.get(), outerParams);
209 }
210
211 const Trk::MaterialEffectsOnTrack* meot =
212 middleTS ? dynamic_cast<const Trk::MaterialEffectsOnTrack*>(middleTS->materialEffectsOnTrack()) : nullptr;
216
217
218 if (correctedEnergy < 0.5 * Gaudi::Units::GeV) {
219 middleTS.reset();
221 << energyDeposit / Gaudi::Units::GeV
222 << " correctedEnergy "
223 << correctedEnergy / Gaudi::Units::GeV << " (GeV units)");
224 } else {
226 std::unique_ptr<const Trk::TrackParameters>
params;
227 const Trk::CylinderSurface* cylinder =
230 middleParams->covariance() ? std::optional<AmgSymMatrix(5)>(*middleParams->covariance()) : std::nullopt;
231 if (cylinder) {
232 params = std::make_unique<Trk::AtaCylinder>(middleParams->
position(), momentum, middleParams->
charge(),
233 *cylinder, cov);
234 } else {
235 const Trk::DiscSurface* disc =
dynamic_cast<const Trk::DiscSurface*
>(&middleParams->
associatedSurface());
236 if (disc) {
237 params = std::make_unique<Trk::AtaDisc>(middleParams->
position(), momentum, middleParams->
charge(),
238 *disc, cov);
239 } else {
241 }
242 }
243 if (params && middleTS) { innerTS =
innerTSOS(ctx, *params); }
244 }
245 } else {
246 ATH_MSG_VERBOSE(
" fail tracking inwards: no intersect at inner surface");
247 }
248 } else {
249 ATH_MSG_VERBOSE(
" fail tracking inwards: no intersect at middle surface");
250 }
251 }
252 }
253
254 if (innerTS)
255 caloTSOS.push_back(std::move(innerTS));
256 else
258 if (middleTS)
caloTSOS.push_back(std::move(middleTS));
259 if (outerTS)
260 caloTSOS.push_back(std::move(outerTS));
261 else
263
264
266
269 }
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
#define AmgSymMatrix(dim)
void getInitializedCache(MagField::AtlasFieldCache &cache) const
get B field cache for evaluation as a function of 2-d or 3-d position.
std::vector< std::unique_ptr< const Trk::TrackStateOnSurface > > caloTSOS(const EventContext &ctx, const Trk::TrackParameters ¶meters) const override
IMuidCaloTrackStateOnSurface interface: to get the 3 scattering and energy deposit TSOS'es representi...
std::atomic_int m_countInnerFailure
std::unique_ptr< Trk::TrackStateOnSurface > outerTSOS(const EventContext &ctx, const Trk::TrackParameters ¶meters) const override
ToolHandle< Rec::IMuidCaloEnergy > m_caloEnergyDeposit
std::atomic_int m_countCompleteFailure
std::unique_ptr< const Trk::TrackParameters > getExtrapolatedParameters(const EventContext &ctx, const Trk::TrackParameters ¶meters, const short layer) const
std::unique_ptr< Trk::TrackStateOnSurface > innerTSOS(const EventContext &ctx, const Trk::TrackParameters ¶meters) const override
IMuidCaloTrackStateOnSurface interface: to get individually the scattering TSOS'es representing the c...
ToolHandle< Rec::IMuidCaloEnergy > m_caloEnergyParam
std::atomic_int m_countOuterFailure
SG::ReadCondHandleKey< AtlasFieldCacheCondObj > m_fieldCacheCondObjInputKey
double deltaE() const
returns the
const EnergyLoss * energyLoss() const
returns the energy loss object.
const Amg::Vector3D & momentum() const
Access method for the momentum.
const Amg::Vector3D & position() const
Access method for the position.
double charge() const
Returns the charge.
virtual const Surface & associatedSurface() const override=0
Access to the Surface associated to the Parameters.
Eigen::Matrix< double, 3, 1 > Vector3D
iterate(ROOT.TDirectory thisdir, ROOT.TDirectory targetdir, str prefix, typing.Pattern regex, bool excludeTrees)
ParametersBase< TrackParametersDim, Charged > TrackParameters