5 #include <Acts/Geometry/GeometryIdentifier.hpp>
16 "chi2",
"pathLength",
"typeFlags",
"previous",
"next",
"predicted",
"filtered",
"smoothed",
"jacobian",
"calibrated",
"measDim",
17 "uncalibratedMeasurement",
"uncalibratedMeasurementLink" ,
"geometryId",
"surfaceIndex"
21 constexpr std::optional<bool> has_impl(
24 using namespace Acts::HashedStringLiteral;
25 using Acts::MultiTrajectoryTraits::kInvalid;
30 return trackStates->
previous[istate] < kInvalid;
35 case "pathLength"_hash:{
39 case "typeFlags"_hash:{
43 case "predicted"_hash:{
45 return trackStates->
predicted[istate] < kInvalid;
47 case "filtered"_hash:{
49 return trackStates->
filtered[istate] < kInvalid;
51 case "smoothed"_hash:{
53 return trackStates->
smoothed[istate] < kInvalid;
55 case "jacobian"_hash:{
57 return trackStates->
jacobian[istate] < kInvalid;
59 case "projector"_hash:{
61 return trackStates->
calibrated[istate] < kInvalid;
63 case "calibrated"_hash:{
65 return trackStates->
measDim[istate] < kInvalid;
67 case "calibratedCov"_hash: {
69 return trackStates->
measDim[istate] < kInvalid;
71 case "measdim"_hash: {
75 case "referenceSurface"_hash: {
83 INSPECTCALL(
key <<
" " << istate <<
" not a predefined component");
84 return std::optional<bool>();
130 return m_trackStatesAux !=
nullptr and m_trackParametersAux !=
nullptr and
131 m_trackJacobiansAux !=
nullptr and m_trackMeasurementsAux !=
nullptr
132 and m_surfacesBackend !=
nullptr;
136 template<
typename CONT>
137 void stepResize( CONT* auxPtr,
const size_t realSize,
const size_t sizeStep = 20) {
138 if( realSize >= auxPtr->size() ) auxPtr->resize(auxPtr->size()+sizeStep);
143 Acts::TrackStatePropMask
mask,
145 using namespace Acts::HashedStringLiteral;
147 assert(m_trackStatesAux &&
"Missing Track States backend");
148 stepResize(&m_trackStatesIface, m_trackStatesSize);
149 m_surfaces.push_back(
nullptr);
152 using Acts::MultiTrajectoryTraits::kInvalid;
156 m_trackStatesAux->previous[m_trackStatesSize] =
previous;
157 using namespace Acts;
160 stepResize(m_trackParametersAux.get(), m_trackParametersSize, 60);
162 m_trackParametersAux->params[m_trackParametersSize].resize(Acts::eBoundSize);
163 m_trackParametersAux->covMatrix[m_trackParametersSize].resize(Acts::eBoundSize*Acts::eBoundSize);
164 m_trackParametersSize++;
165 return m_trackParametersSize-1;
169 stepResize(m_trackJacobiansAux.get(), m_trackJacobiansSize);
170 m_trackJacobiansAux->jac[m_trackJacobiansSize].resize(Acts::eBoundSize*Acts::eBoundSize);
171 m_trackJacobiansSize++;
172 return m_trackJacobiansSize-1;
176 stepResize(m_trackMeasurementsAux.get(), m_trackMeasurementsSize );
177 m_trackMeasurementsAux->meas[m_trackMeasurementsSize].resize(Acts::eBoundSize);
178 m_trackMeasurementsAux->covMatrix[m_trackMeasurementsSize].resize(Acts::eBoundSize*Acts::eBoundSize);
179 m_trackMeasurementsSize++;
180 return m_trackMeasurementsSize-1;
183 m_trackStatesAux->predicted[m_trackStatesSize] = kInvalid;
184 if (ACTS_CHECK_BIT(
mask, TrackStatePropMask::Predicted)) {
185 m_trackStatesAux->predicted[m_trackStatesSize] = addParam();
188 m_trackStatesAux->filtered[m_trackStatesSize] = kInvalid;
189 if (ACTS_CHECK_BIT(
mask, TrackStatePropMask::Filtered)) {
190 m_trackStatesAux->filtered[m_trackStatesSize] = addParam();
193 m_trackStatesAux->smoothed[m_trackStatesSize] = kInvalid;
194 if (ACTS_CHECK_BIT(
mask, TrackStatePropMask::Smoothed)) {
195 m_trackStatesAux->smoothed[m_trackStatesSize] = addParam();
198 m_trackStatesAux->jacobian[m_trackStatesSize] = kInvalid;
199 if (ACTS_CHECK_BIT(
mask, TrackStatePropMask::Jacobian)) {
200 m_trackStatesAux->jacobian[m_trackStatesSize] = addJacobian();
203 m_uncalibratedSourceLinks.emplace_back(std::nullopt);
204 m_trackStatesAux->calibrated[m_trackStatesSize] = kInvalid;
205 m_trackStatesAux->measDim[m_trackStatesSize] = kInvalid;
207 if (ACTS_CHECK_BIT(
mask, TrackStatePropMask::Calibrated)) {
208 m_trackStatesAux->calibrated.at(m_trackStatesSize) = addMeasurement();
209 m_calibratedSourceLinks.emplace_back(std::nullopt);
212 m_trackStatesAux->geometryId[m_trackStatesSize] =
InvalidGeoID;
214 return m_trackStatesSize-1;
220 Acts::TrackStatePropMask
mask) {
221 using namespace Acts::HashedStringLiteral;
222 INSPECTCALL(
this <<
" " <<
mask <<
" " << m_trackStatesIface.size() <<
" " << istate);
224 assert(m_trackStatesAux &&
"Missing Track States backend");
227 using Acts::MultiTrajectoryTraits::kInvalid;
229 using namespace Acts;
232 stepResize(m_trackParametersAux.get(), m_trackParametersSize, 60);
234 m_trackParametersAux->params[m_trackParametersSize].resize(Acts::eBoundSize);
235 m_trackParametersAux->covMatrix[m_trackParametersSize].resize(Acts::eBoundSize*Acts::eBoundSize);
236 m_trackParametersSize++;
237 return m_trackParametersSize-1;
241 stepResize(m_trackJacobiansAux.get(), m_trackJacobiansSize);
242 m_trackJacobiansAux->jac[m_trackJacobiansSize].resize(Acts::eBoundSize*Acts::eBoundSize);
243 m_trackJacobiansSize++;
244 return m_trackJacobiansSize-1;
248 stepResize(m_trackMeasurementsAux.get(), m_trackMeasurementsSize );
249 m_trackMeasurementsAux->meas[m_trackMeasurementsSize].resize(Acts::eBoundSize);
250 m_trackMeasurementsAux->covMatrix[m_trackMeasurementsSize].resize(Acts::eBoundSize*Acts::eBoundSize);
251 m_trackMeasurementsSize++;
252 return m_trackMeasurementsSize-1;
255 if ((m_trackStatesAux->predicted[istate] == kInvalid) &&
256 ACTS_CHECK_BIT(
mask, TrackStatePropMask::Predicted)) {
257 m_trackStatesAux->predicted[istate] = addParam();
260 if ((m_trackStatesAux->filtered[istate] == kInvalid) &&
261 ACTS_CHECK_BIT(
mask, TrackStatePropMask::Filtered)) {
262 m_trackStatesAux->filtered[istate] = addParam();
265 if ((m_trackStatesAux->smoothed[istate] == kInvalid) &&
266 ACTS_CHECK_BIT(
mask, TrackStatePropMask::Smoothed)) {
267 m_trackStatesAux->smoothed[istate] = addParam();
270 if ((m_trackStatesAux->jacobian[istate] == kInvalid) &&
271 ACTS_CHECK_BIT(
mask, TrackStatePropMask::Jacobian)) {
272 m_trackStatesAux->jacobian[istate] = addJacobian();
275 if ((m_trackStatesAux->calibrated[istate] == kInvalid) &&
276 ACTS_CHECK_BIT(
mask, TrackStatePropMask::Calibrated)) {
277 m_trackStatesAux->calibrated[istate] = addMeasurement();
278 m_calibratedSourceLinks.emplace_back(std::nullopt);
286 Acts::TrackStatePropMask shareSource,
287 Acts::TrackStatePropMask shareTarget) {
289 assert(ACTS_CHECK_BIT(this->getTrackState(iother).getMask(), shareSource) &&
290 "Source has incompatible allocation");
292 using PM = Acts::TrackStatePropMask;
294 using Acts::MultiTrajectoryTraits::kInvalid;
297 switch (shareSource) {
299 sourceIndex = m_trackStatesAux->predicted[iother];
302 sourceIndex = m_trackStatesAux->filtered[iother];
305 sourceIndex = m_trackStatesAux->smoothed[iother];
308 sourceIndex = m_trackStatesAux->jacobian[iother];
311 throw std::domain_error{
"MutableMultiTrajectory Unable to share this component"};
314 assert(sourceIndex != kInvalid);
316 switch (shareTarget) {
318 assert(shareSource != PM::Jacobian);
319 m_trackStatesAux->predicted[iself] = sourceIndex;
322 assert(shareSource != PM::Jacobian);
323 m_trackStatesAux->filtered[iself] = sourceIndex;
326 assert(shareSource != PM::Jacobian);
327 m_trackStatesAux->smoothed[iself] = sourceIndex;
330 assert(shareSource == PM::Jacobian);
331 m_trackStatesAux->jacobian[iself] = sourceIndex;
334 throw std::domain_error{
"MutableMultiTrajectory Unable to share this component"};
340 Acts::TrackStatePropMask
target,
343 using PM = Acts::TrackStatePropMask;
345 using Acts::MultiTrajectoryTraits::kInvalid;
349 m_trackStatesAux->predicted[istate] = kInvalid;
352 m_trackStatesAux->filtered[istate] = kInvalid;
356 m_trackStatesAux->smoothed[istate] = kInvalid;
359 m_trackStatesAux->jacobian[istate] = kInvalid;
363 m_trackStatesAux->measDim[istate] = kInvalid;
369 throw std::domain_error{
"MutableMultiTrajectory Unable to unset this component"};
375 using namespace Acts::HashedStringLiteral;
376 assert(istate < m_trackStatesIface.size() &&
377 "Attempt to reach beyond the Track States container size");
381 case "previous"_hash:
382 return &(m_trackStatesAux->previous[istate]);
384 return &(m_trackStatesAux->next[istate]);
386 return &(m_trackStatesAux->chi2[istate]);
387 case "pathLength"_hash:
388 return &(m_trackStatesAux->pathLength[istate]);
389 case "predicted"_hash:
390 return &(m_trackStatesAux->predicted[istate]);
391 case "filtered"_hash:
392 return &(m_trackStatesAux->filtered[istate]);
393 case "smoothed"_hash:
394 return &(m_trackStatesAux->smoothed[istate]);
395 case "projector"_hash: {
396 auto idx = m_trackStatesAux->calibrated[istate];
397 return &(m_trackMeasurementsAux->projector[
idx]);
400 return &(m_trackStatesAux->measDim[istate]);
401 case "typeFlags"_hash:
402 return &(m_trackStatesAux->typeFlags[istate]);
405 for (
auto&
d : m_decorations) {
407 return d.setter(m_trackStatesAux.get(), istate,
d.auxid);
410 throw std::runtime_error(
"MutableMultiTrajectory::component_impl no such component " +
std::to_string(
key));
417 Acts::HashedString
key,
419 using namespace Acts::HashedStringLiteral;
420 assert(istate < m_trackStatesIface.size() &&
421 "Attempt to reach beyond the Track States container size");
424 case "previous"_hash:
425 return &(
to_const_ptr(m_trackStatesAux)->previous[istate]);
430 case "pathLength"_hash:
431 return &(
to_const_ptr(m_trackStatesAux)->pathLength[istate]);
432 case "predicted"_hash:
433 return &(
to_const_ptr(m_trackStatesAux)->predicted[istate]);
434 case "filtered"_hash:
435 return &(
to_const_ptr(m_trackStatesAux)->filtered[istate]);
436 case "smoothed"_hash:
437 return &(
to_const_ptr(m_trackStatesAux)->smoothed[istate]);
438 case "jacobian"_hash:
439 return &(
to_const_ptr(m_trackStatesAux)->jacobian[istate]);
440 case "projector"_hash:{
444 case "calibrated"_hash: {
445 return &(
to_const_ptr(m_trackStatesAux)->calibrated[istate]);
447 case "calibratedCov"_hash: {
448 return &(
to_const_ptr(m_trackStatesAux)->calibrated[istate]);
451 return &(
to_const_ptr(m_trackStatesAux)->measDim[istate]);
452 case "typeFlags"_hash:
453 return &(
to_const_ptr(m_trackStatesAux)->typeFlags[istate]);
455 for (
auto&
d : m_decorations) {
457 INSPECTCALL(
"getting dynamic variable " <<
d.name <<
" " << istate);
458 return d.getter(m_trackStatesAux.get(), istate,
d.auxid);
461 throw std::runtime_error(
"MutableMultiTrajectory::component_impl const no such component " +
std::to_string(
key));
468 std::optional<bool> inTrackState = ::has_impl(m_trackStatesAux.get(),
key, istate);
469 if (inTrackState.has_value())
470 return inTrackState.value();
473 using namespace Acts::HashedStringLiteral;
474 if (
key ==
"uncalibratedSourceLink"_hash){
477 if (
acc.isAvailable (m_trackStatesIface)) {
478 if (
acc(m_trackStatesIface, istate) !=
nullptr)
return true;
481 return (istate < m_uncalibratedSourceLinks.size() && m_uncalibratedSourceLinks[istate].has_value());
484 for (
auto&
d : m_decorations) {
496 m_trackStatesIface.resize(0);
497 m_trackStatesSize = 0;
499 m_trackParametersAux->resize(0);
500 m_trackParametersSize = 0;
502 m_trackJacobiansAux->resize(0);
503 m_trackJacobiansSize = 0;
505 m_trackMeasurementsAux->resize(0);
506 m_trackMeasurementsSize = 0;
508 m_surfacesBackend->clear();
510 m_calibratedSourceLinks.clear();
511 m_uncalibratedSourceLinks.clear();
518 return m_trackStatesAux->measDim[istate];
523 const Acts::SourceLink& sourceLink) {
527 static const Decor_t decor{
"uncalibratedMeasurement"};
528 if (istate>= m_trackStatesIface.size()) {
529 throw std::range_error(
"istate out of range on TrackStates when attempting to access uncalibrated measurements");
531 Decor_t::span uncalibratedMeasurements = decor.getDecorationSpan(m_trackStatesIface);
542 catch (std::bad_any_cast &
err) {
543 assert( istate < m_uncalibratedSourceLinks.size());
544 m_uncalibratedSourceLinks[istate] = sourceLink;
549 std::shared_ptr<const Acts::Surface> surface) {
550 if ( istate >= m_surfaces.size() )
551 m_surfaces.resize(istate+1,
nullptr);
553 m_trackStatesAux->geometryId[istate] = surface->geometryId().value();
554 if (surface->geometryId().value() == 0) {
556 encodeSurface(m_surfacesBackendAux.get(), m_surfacesBackendAux->size()-1, surface.get(), m_geoContext.context());
557 m_trackStatesAux->surfaceIndex[istate] = m_surfacesBackend->size()-1;
558 m_surfaces[istate] = std::move(surface);
561 m_surfaces[istate] = surface.get();
568 if ( std::holds_alternative<const Acts::Surface*>(surfaceVariant))
569 return std::get<const Acts::Surface*>(surfaceVariant);
570 return std::get<std::shared_ptr<const Acts::Surface>>(surfaceVariant).
get();
575 if ( istate >= m_surfaces.size() )
throw std::out_of_range(
"MutableMultiTrajectory index " +
std::to_string(istate) +
" out of range " +
std::to_string(m_surfaces.size()) +
" when accessing reference surface");
576 return toSurfacePtr(m_surfaces[istate]);
580 Acts::HashedString
key,
581 const std::any& src_ptr) {
582 INSPECTCALL(
"copy dynamic decoration of key " <<
key <<
" destination MTJ has " << m_decorations.size() <<
" decorations");
584 INSPECTCALL(
"checking for destination of dynamic decoration " <<
d.name <<
" hash " <<
d.hash <<
" while looking for the key " <<
key);
586 d.copier(m_trackStatesAux.get(), istate,
d.auxid, src_ptr);
590 throw std::invalid_argument(
"MultiTrajectory::copyDynamicFrom_impl no such decoration in destination MTJ " +
std::to_string(
key));
594 std::vector<Acts::HashedString>
keys;
596 keys.push_back(
d.hash);
597 INSPECTCALL(
"collecting dynamic decoration " <<
d.name <<
" hash " <<
d.hash);
604 m_trackStatesIface.resize(m_trackStatesSize);
606 if (m_trackStatesSize > 0) {
609 m_trackMeasurementsAux->resize(m_trackMeasurementsSize);
610 m_trackJacobiansAux->resize(m_trackJacobiansSize);
611 m_trackParametersAux->resize(m_trackParametersSize);
622 : m_trackStatesAux(trackStates),
623 m_trackParametersAux(trackParameters),
624 m_trackJacobiansAux(trackJacobians),
625 m_trackMeasurementsAux(trackMeasurements),
626 m_trackSurfacesAux(trackSurfaces),
627 m_trackStatesIface (trackStates->
size()) {
634 : m_trackStatesAux(
other.m_trackStatesAux.
get()),
635 m_trackParametersAux(
other.m_trackParametersAux.
get()),
636 m_trackJacobiansAux(
other.m_trackJacobiansAux.
get()),
637 m_trackMeasurementsAux(
other.m_trackMeasurementsAux.
get()),
638 m_trackSurfacesAux(
other.m_surfacesBackendAux.
get()),
639 m_surfaces(
other.m_surfaces) {
649 std::optional<bool> inTrackState = ::has_impl(m_trackStatesAux,
key, istate);
650 if (inTrackState.has_value())
651 return inTrackState.value();
653 using namespace Acts::HashedStringLiteral;
654 if (
key ==
"uncalibratedSourceLink"_hash) {
656 if (
acc.isAvailable (m_trackStatesIface)) {
657 return acc(m_trackStatesIface, istate) !=
nullptr;
660 return (istate < m_uncalibratedSourceLinks.size() && m_uncalibratedSourceLinks[istate].has_value());
668 using namespace Acts::HashedStringLiteral;
670 case "previous"_hash:
671 return &(m_trackStatesAux->previous[istate]);
673 return &(m_trackStatesAux->next[istate]);
675 return &(m_trackStatesAux->chi2[istate]);
676 case "pathLength"_hash:
677 return &(m_trackStatesAux->pathLength[istate]);
678 case "predicted"_hash:
679 return &(m_trackStatesAux->predicted[istate]);
680 case "filtered"_hash:
681 return &(m_trackStatesAux->filtered[istate]);
682 case "smoothed"_hash:
683 return &(m_trackStatesAux->smoothed[istate]);
684 case "jacobian"_hash:
685 return &(m_trackStatesAux->jacobian[istate]);
686 case "projector"_hash: {
687 return &(m_trackMeasurementsAux->projector.at(m_trackStatesAux->calibrated[istate]));
689 case "calibrated"_hash: {
690 return &(m_trackStatesAux->calibrated[istate]);
692 case "calibratedCov"_hash: {
693 return &(m_trackStatesAux->calibrated[istate]);
696 return &(m_trackStatesAux->measDim[istate]);
697 case "typeFlags"_hash:
698 return &(m_trackStatesAux->typeFlags[istate]);
700 for (
auto&
d : m_decorations) {
703 return d.getter(m_trackStatesAux.cptr(), istate,
d.auxid);
706 throw std::runtime_error(
"MultiTrajectory::component_impl no such component " +
std::to_string(
key));
712 Acts::HashedString
key)
const {
713 using namespace Acts::HashedStringLiteral;
716 case "previous"_hash:
719 case "pathLength"_hash:
720 case "predicted"_hash:
721 case "filtered"_hash:
722 case "smoothed"_hash:
723 case "jacobian"_hash:
724 case "projector"_hash:
725 case "uncalibratedSourceLink"_hash:
726 case "calibrated"_hash:
727 case "calibratedCov"_hash:
729 case "typeFlags"_hash:
732 for (
auto&
d : m_decorations) {
742 return m_trackStatesAux->measDim[istate];
756 std::vector<Acts::HashedString>
keys;
758 keys.push_back(
d.hash);
765 if ( not m_surfaces.empty() )
767 m_surfaces.resize(m_trackStatesIface.size(),
nullptr);
768 for (
IndexType i = 0;
i < m_trackStatesIface.size();
i++ ) {
769 auto geoID = m_trackStatesAux->geometryId[
i];
771 m_surfaces[
i] =
nullptr;
775 m_surfaces[
i] =
geo->findSurface(Acts::GeometryIdentifier{geoID});
777 unsigned int backendIndex = m_trackStatesAux->surfaceIndex[
i];
778 std::shared_ptr<const Acts::Surface> surface =
decodeSurface( m_trackSurfacesAux, backendIndex, geoContext);
779 m_surfaces[
i] = surface;
787 INSPECTCALL(
this <<
" " << istate <<
" " << m_trackStatesIface.size() <<
" " << m_surfaces.size() <<
" surf ptr " << toSurfacePtr(m_surfaces[istate]));
788 if ( istate >= m_surfaces.size() )
throw std::out_of_range(
"MultiTrajectory index " +
std::to_string(istate) +
" out of range " +
std::to_string(m_surfaces.size()) +
" when accessing reference surface");
789 return toSurfacePtr(m_surfaces[istate]);
792 typename Acts::SourceLink
795 assert(istate < m_trackStatesIface.size());
804 return Acts::SourceLink(
ptr );
806 return m_uncalibratedSourceLinks[istate].value();
809 typename Acts::SourceLink
812 assert(istate < m_trackStatesIface.size());
821 return Acts::SourceLink(
ptr );
823 return m_uncalibratedSourceLinks[istate].value();