9#include "GeoModelKernel/throwExcept.h"
22 std::regex word_regex(
"(.*)Tracks$");
23 std::smatch match_regex;
25 if ( not std::regex_search(tracks, match_regex, word_regex) or match_regex.size() < 2) {
29 return match_regex[1].str();
32#define RECORD_xAOD(key, container, auxContainer, ctx) \
34 SG::WriteHandle handle{key, ctx}; \
35 if (!handle.record(std::move(container), \
36 std::move(auxContainer)).isSuccess()){ \
37 THROW_EXCEPTION("Cannot record "<<key.fullKey()<<" backend"); \
41#define INIT_CHECK(key) \
42 if (!key.initialize().isSuccess()) { \
43 THROW_EXCEPTION("Failed to initialize key "<<key.fullKey()); \
47 const std::string& prefix) {
54 prefix +
"MultiTrajectory";
72 return StatusCode::SUCCESS;
75std::unique_ptr<ActsTrk::MultiTrajectory>
82 auto statesInterface =
84 mmtj.trackStatesAux());
87 auto parametersInterface =
89 mmtj.trackParametersAux());
92 auto jacobiansInterface =
94 mmtj.trackJacobiansAux());
97 auto measurementsInterface =
99 mmtj.trackMeasurementsAux());
106 auto cmtj = std::make_unique<ActsTrk::MultiTrajectory>(
118 cmtj->moveSurfaces(&mmtj);
119 cmtj->moveLinks(&mmtj);
124std::unique_ptr<ActsTrk::PersistentTrackContainer>
129 std::unique_ptr<ActsTrk::MultiTrajectory> constMtj =
130 moveToConst(std::move(
tc.trackStateContainer()), evtContext);
133 if (constMtjHandle.record(std::move(constMtj)).isFailure()) {
134 throw std::runtime_error(
135 "MutableTrackContainerHandlesHelper::moveToConst, can't record "
136 "ConstMultiTrajectory");
139 auto trackSurfacesAux = std::make_unique<xAOD::TrackSurfaceAuxContainer>();
140 tc.container().encodeSurfaces(trackSurfacesAux.get(), geoContext);
142 auto interfaceTrackSummaryContainer =
144 tc.container().m_mutableTrackBackendAux.get());
148 trackSurfacesAux.get());
151 auto constTrackSummary = std::make_unique<ActsTrk::TrackSummaryContainer>(
154 constTrackSummary->restoreDecorations();
155 constTrackSummary->fillFrom(
tc.container());
158 if (constTrackSummaryHandle.record(std::move(constTrackSummary))
160 throw std::runtime_error(
161 "MutableTrackContainerHandlesHelper::moveToConst, can't record "
164 auto constTrack = std::make_unique<ActsTrk::PersistentTrackContainer>(
173 const std::string& prefix) {
179 m_mtjKey = prefix +
"MultiTrajectory";
196 return StatusCode::SUCCESS;
199std::unique_ptr<ActsTrk::MultiTrajectory>
201 const EventContext& evtContext)
const {
205 if (not statesLink.
isValid()) {
206 throw std::runtime_error(
207 "ConstMultiTrajectoryHandle::build, StatesLink is invalid");
217 if (not parametersLink.
isValid()) {
218 throw std::runtime_error(
219 "ConstMultiTrajectoryHandle::build, ParametersLink is invalid");
224 if (not jacobiansLink.
isValid()) {
225 throw std::runtime_error(
226 "ConstMultiTrajectoryHandle::build, JacobiansLink is invalid");
231 if (not measurementsLink.
isValid()) {
232 throw std::runtime_error(
233 "ConstMultiTrajectoryHandle::build, MeasurementsLink is invalid");
238 if (not surfacesLink.
isValid()) {
239 throw std::runtime_error(
240 "ConstMultiTrajectoryHandle::build, SurfacesLink is invalid");
244 auto cmtj = std::make_unique<ActsTrk::MultiTrajectory>(
245 statesLink, parametersLink, jacobiansLink, measurementsLink, surfacesLink);
246 cmtj->fillSurfaces(geo);
250std::unique_ptr<ActsTrk::PersistentTrackContainer>
252 const Acts::GeometryContext& ,
253 const EventContext& evtContext)
const {
255 std::unique_ptr<ActsTrk::MultiTrajectory> mtj =
buildMtj(geo,evtContext);
257 if (mtjHandle.record(std::move(mtj)).isFailure()) {
258 throw std::runtime_error(
259 "ConstTrackContainerHandle<C>::build failed recording MTJ");
263 if (not summaryLink.
isValid()) {
264 throw std::runtime_error(
265 "ConstTrackContainerHandle::build, SummaryLink is invalid");
269 if (not surfacesHandle.isValid()) {
270 throw std::runtime_error(
271 "ConstTrackContainerHandle::build, SurfaceHandle is invalid");
274 auto constTrackSummary = std::make_unique<ActsTrk::TrackSummaryContainer>(summaryLink);
275 constTrackSummary->decodeSurfaces( surfacesHandle.cptr());
278 if (summaryHandle.record(std::move(constTrackSummary)).isFailure()) {
279 throw std::runtime_error(
280 "MutableTrackContainerHandle::build, can't record "
284 auto constTrack = std::make_unique<ActsTrk::PersistentTrackContainer>(
294 template <
typename T>
295 using const_span = std::span<T const>;
298 template <
typename T>
300 const T *data =
static_cast<const T *
>(aux_container.
getData (accessor.auxid()));
301 const_span<T> ret( data, aux_container.
size() );
306 template <
typename T>
308 std::size_t
sz=aux_container.
size();
310 return std::span<T>( data,
sz );
315 std::stringstream
msg;
316 msg <<
"Conflicting values for TrackState.uncalibratedMeasurement. Already set " <<
static_cast<const void *
>(is)
317 <<
" would set " <<
static_cast<const void *
>(should);
318 throw std::runtime_error(
msg.str());
327 const_span<link_t> elementLinks = getElementVector(statesLink, link_accessor);
329 static const SG::AuxElement::Decorator< const xAOD::UncalibratedMeasurement * >
330 decor(
"uncalibratedMeasurement");
332 std::span<const xAOD::UncalibratedMeasurement *> uncalibratedMeasurements
333 = createDecoration( statesLink, decor);
336 const link_t &el = elementLinks[
index];
339 if (uncalibratedMeasurements[
index] !=
nullptr && a_measurement != uncalibratedMeasurements[
index]) {
340 throwConflictingUncalibratedMeasurementPointerValue(uncalibratedMeasurements[
index], a_measurement);
342 uncalibratedMeasurements[
index]=a_measurement;
346 std::cerr <<
"WARNING no uncalibratedMeasurementLink aux data " << std::endl;
Handle class for reading from StoreGate.
Handle class for recording to StoreGate.
#define RECORD_xAOD(key, container, auxContainer, ctx)
#define ATLAS_THREAD_SAFE
SG::ReadHandleKey< xAOD::TrackMeasurementContainer > m_measurementsKey
std::unique_ptr< ActsTrk::PersistentTrackContainer > build(const Acts::TrackingGeometry *geo, const Acts::GeometryContext &geoContext, const EventContext &context) const
SG::ReadHandleKey< xAOD::TrackSurfaceContainer > m_surfacesKey
SG::WriteHandleKey< ActsTrk::MultiTrajectory > m_mtjKey
SG::ReadHandleKey< xAOD::TrackStateContainer > m_statesKey
void restoreUncalibMeasurementPtr(xAOD::TrackStateAuxContainer &statesLink) const
SG::ReadHandleKey< xAOD::TrackJacobianContainer > m_jacobiansKey
SG::WriteHandleKey< ActsTrk::TrackSummaryContainer > m_trackSummaryKey
SG::ReadHandleKey< xAOD::TrackParametersContainer > m_parametersKey
StatusCode initialize(const std::string &prefix)
Sets up the handles.
SG::ReadHandleKey< xAOD::TrackSurfaceContainer > m_trackSurfacesKey
SG::ReadHandleKey< xAOD::TrackSummaryContainer > m_xAODTrackSummaryKey
std::unique_ptr< ActsTrk::MultiTrajectory > buildMtj(const Acts::TrackingGeometry *geo, const EventContext &context) const
Athena implementation of ACTS::MultiTrajectory (ReadWrite version) The data is stored in 4 external b...
SG::WriteHandleKey< xAOD::TrackParametersContainer > m_parametersKey
std::unique_ptr< ActsTrk::PersistentTrackContainer > moveToConst(ActsTrk::MutablePersistentTrackContainer &&tc, const Acts::GeometryContext &geoContext, const EventContext &evtContext) const
produces ActsTrk::ConstTrackContainer with all backends stored in SG
SG::WriteHandleKey< xAOD::TrackMeasurementContainer > m_measurementsKey
SG::WriteHandleKey< xAOD::TrackSurfaceContainer > m_trackSurfacesKey
SG::WriteHandleKey< xAOD::TrackJacobianContainer > m_jacobiansKey
SG::WriteHandleKey< ActsTrk::MultiTrajectory > m_mtjKey
SG::WriteHandleKey< xAOD::TrackSummaryContainer > m_xAODTrackSummaryKey
StatusCode initialize(const std::string &prefix)
Sets up the handles.
SG::WriteHandleKey< ActsTrk::TrackSummaryContainer > m_trackSummaryKey
SG::WriteHandleKey< xAOD::TrackStateContainer > m_statesKey
SG::WriteHandleKey< xAOD::TrackSurfaceContainer > m_surfacesKey
Object reference supporting deferred reading from StoreGate.
const_pointer getDataPtr() const
Return a pointer to the currently-referenced object.
bool isValid() const
Test to see if the link is dereferencable.
Helper class to provide constant type-safe access to aux data.
SG::auxid_t auxid() const
Return the aux id for this variable.
Common base class for the auxiliary containers.
virtual const void * getData(auxid_t auxid) const override
Get a pointer to a given array.
virtual const auxid_set_t & getAuxIDs() const override
Get the types(names) of variables handled by this container.
virtual size_t size() const override
Get the size of the container.
virtual void * getDecoration(auxid_t auxid, size_t size, size_t capacity) override
Get a pointer to a given array, as a decoration.
The AlignStoreProviderAlg loads the rigid alignment corrections and pipes them through the readout ge...
std::string prefixFromTrackContainerName(const std::string &tracks)
Parse TrackContainer name to get the prefix for backends The name has to contain XYZTracks,...
std::unique_ptr< IFACE > makeInterfaceContainer(const AUX *aux)
helper to construct interface container for already filled Aux container TODO maybe should be moved t...
SG::Decorator< T, ALLOC > Decorator
Helper class to provide type-safe access to aux data, specialized for JaggedVecElt.
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
TrackStateAuxContainer_v1 TrackStateAuxContainer
UncalibratedMeasurement_v1 UncalibratedMeasurement
Define the version of the uncalibrated measurement class.