9 #include "GeoModelKernel/throwExcept.h"
22 std::smatch match_regex;
24 if ( not std::regex_search(tracks, match_regex, word_regex) or match_regex.size() < 2) {
25 throw std::runtime_error(
26 std::string(
"prefixFromTrackContainerName: key does not contain "
27 "Tracks in the name ") + tracks);
30 return match_regex[1].str();
33 #define RECORD_xAOD(key, container, auxContainer, ctx) \
35 SG::WriteHandle handle{key, ctx}; \
36 if (!handle.record(std::move(container), \
37 std::move(auxContainer)).isSuccess()){ \
38 THROW_EXCEPTION("Cannot record "<<key.fullKey()<<" backend"); \
42 #define INIT_CHECK(key) \
43 if (!key.initialize().isSuccess()) { \
44 THROW_EXCEPTION("Failed to initialize key "<<key.fullKey()); \
48 const std::string&
prefix) {
55 prefix +
"MultiTrajectory";
73 return StatusCode::SUCCESS;
76 std::unique_ptr<ActsTrk::MultiTrajectory>
83 auto statesInterface =
84 ActsTrk::makeInterfaceContainer<xAOD::TrackStateContainer>(
85 mmtj.trackStatesAux());
88 auto parametersInterface =
89 ActsTrk::makeInterfaceContainer<xAOD::TrackParametersContainer>(
90 mmtj.trackParametersAux());
93 auto jacobiansInterface =
94 ActsTrk::makeInterfaceContainer<xAOD::TrackJacobianContainer>(
95 mmtj.trackJacobiansAux());
98 auto measurementsInterface =
99 ActsTrk::makeInterfaceContainer<xAOD::TrackMeasurementContainer>(
100 mmtj.trackMeasurementsAux());
107 auto cmtj = std::make_unique<ActsTrk::MultiTrajectory>(
119 cmtj->moveSurfaces(&mmtj);
120 cmtj->moveLinks(&mmtj);
125 std::unique_ptr<ActsTrk::PersistentTrackContainer>
130 std::unique_ptr<ActsTrk::MultiTrajectory> constMtj =
131 moveToConst(std::move(tc.trackStateContainer()), evtContext);
134 if (constMtjHandle.record(std::move(constMtj)).isFailure()) {
135 throw std::runtime_error(
136 "MutableTrackContainerHandlesHelper::moveToConst, can't record "
137 "ConstMultiTrajectory");
140 auto trackSurfacesAux = std::make_unique<xAOD::TrackSurfaceAuxContainer>();
141 tc.container().encodeSurfaces(trackSurfacesAux.get(), geoContext);
143 auto interfaceTrackSummaryContainer =
144 ActsTrk::makeInterfaceContainer<xAOD::TrackSummaryContainer>(
145 tc.container().m_mutableTrackBackendAux.get());
148 auto trackSurfaces = ActsTrk::makeInterfaceContainer<xAOD::TrackSurfaceContainer>(
149 trackSurfacesAux.get());
152 auto constTrackSummary = std::make_unique<ActsTrk::TrackSummaryContainer>(
155 constTrackSummary->restoreDecorations();
156 constTrackSummary->fillFrom(tc.container());
159 if (constTrackSummaryHandle.record(std::move(constTrackSummary))
161 throw std::runtime_error(
162 "MutableTrackContainerHandlesHelper::moveToConst, can't record "
165 auto constTrack = std::make_unique<ActsTrk::PersistentTrackContainer>(
174 const std::string&
prefix) {
197 return StatusCode::SUCCESS;
200 std::unique_ptr<ActsTrk::MultiTrajectory>
202 const EventContext& evtContext)
const {
206 if (not statesLink.
isValid()) {
207 throw std::runtime_error(
208 "ConstMultiTrajectoryHandle::build, StatesLink is invalid");
218 if (not parametersLink.
isValid()) {
219 throw std::runtime_error(
220 "ConstMultiTrajectoryHandle::build, ParametersLink is invalid");
225 if (not jacobiansLink.
isValid()) {
226 throw std::runtime_error(
227 "ConstMultiTrajectoryHandle::build, JacobiansLink is invalid");
232 if (not measurementsLink.
isValid()) {
233 throw std::runtime_error(
234 "ConstMultiTrajectoryHandle::build, MeasurementsLink is invalid");
239 if (not surfacesLink.
isValid()) {
240 throw std::runtime_error(
241 "ConstMultiTrajectoryHandle::build, SurfacesLink is invalid");
245 auto cmtj = std::make_unique<ActsTrk::MultiTrajectory>(
246 statesLink, parametersLink, jacobiansLink, measurementsLink, surfacesLink);
247 cmtj->fillSurfaces(
geo);
251 std::unique_ptr<ActsTrk::PersistentTrackContainer>
253 const Acts::GeometryContext& ,
254 const EventContext& evtContext)
const {
256 std::unique_ptr<ActsTrk::MultiTrajectory> mtj =
buildMtj(
geo,evtContext);
258 if (mtjHandle.record(std::move(mtj)).isFailure()) {
259 throw std::runtime_error(
260 "ConstTrackContainerHandle<C>::build failed recording MTJ");
264 if (not summaryLink.
isValid()) {
265 throw std::runtime_error(
266 "ConstTrackContainerHandle::build, SummaryLink is invalid");
270 if (not surfacesHandle.isValid()) {
271 throw std::runtime_error(
272 "ConstTrackContainerHandle::build, SurfaceHandle is invalid");
275 auto constTrackSummary = std::make_unique<ActsTrk::TrackSummaryContainer>(summaryLink);
276 constTrackSummary->decodeSurfaces( surfacesHandle.cptr());
279 if (summaryHandle.record(std::move(constTrackSummary)).isFailure()) {
280 throw std::runtime_error(
281 "MutableTrackContainerHandle::build, can't record "
285 auto constTrack = std::make_unique<ActsTrk::PersistentTrackContainer>(
295 template <
typename T>
296 using const_span = std::span<T const>;
299 template <
typename T>
302 const_span<T> ret(
data, aux_container.
size() );
307 template <
typename T>
309 std::size_t
sz=aux_container.
size();
311 return std::span<T>(
data,
sz );
316 std::stringstream
msg;
317 msg <<
"Conflicting values for TrackState.uncalibratedMeasurement. Already set " <<
static_cast<const void *
>(is)
318 <<
" would set " <<
static_cast<const void *
>(should);
319 throw std::runtime_error(
msg.str());
328 const_span<link_t> elementLinks = getElementVector(statesLink, link_accessor);
331 decor(
"uncalibratedMeasurement");
333 std::span<const xAOD::UncalibratedMeasurement *> uncalibratedMeasurements
334 = createDecoration( statesLink, decor);
337 const link_t &
el = elementLinks[
index];
340 if (uncalibratedMeasurements[
index] !=
nullptr && a_measurement != uncalibratedMeasurements[
index]) {
341 throwConflictingUncalibratedMeasurementPointerValue(uncalibratedMeasurements[
index], a_measurement);
343 uncalibratedMeasurements[
index]=a_measurement;
347 std::cerr <<
"WARNING no uncalibratedMeasurementLink aux data " << std::endl;