 |
ATLAS Offline Software
|
Go to the documentation of this file.
10 #include "Acts/Definitions/Units.hpp"
11 #include "Acts/Propagator/detail/JacobianEngine.hpp"
19 #include "GaudiKernel/PhysicalConstants.h"
25 #include <Acts/Definitions/TrackParametrization.hpp>
37 template <
typename T,
class T_SquareMatrix>
38 inline void lowerTriangleToVector(
const T_SquareMatrix&
covMatrix,
39 std::vector<T>&
vec,
unsigned int n_rows_max) {
42 unsigned int n_rows =
std::min(n_rows_max,
static_cast<unsigned int>(
covMatrix.rows()));
43 vec.reserve((n_rows+1)*n_rows/2);
44 for (
unsigned int i = 0;
i < n_rows; ++
i) {
45 for (
unsigned int j = 0; j <=
i; ++j) {
60 template <
typename T,
class T_SquareMatrix>
61 inline void lowerTriangleToVectorScaleLastRow(
const T_SquareMatrix&
covMatrix,
62 std::vector<T>&
vec,
unsigned int n_rows_max,
63 typename T_SquareMatrix::Scalar last_element_scale) {
66 unsigned int n_rows =
std::min(n_rows_max,
static_cast<unsigned int>(
covMatrix.rows()));
67 vec.reserve((n_rows+1)*n_rows/2);
68 for (
unsigned int i = 0;
i < n_rows; ++
i) {
69 for (
unsigned int j = 0; j <=
i; ++j) {
75 *cov_iter *= last_element_scale;
76 for (
unsigned int i=0;
i<n_rows_max; ++
i) {
77 *cov_iter *= last_element_scale;
97 for (
unsigned short &elm : ret) {
108 std::vector<std::pair<Acts::PdgParticle, xAOD::ParticleHypothesis> > TrackToTrackParticleCnvAlg::s_actsHypothesisToxAOD;
111 if (s_actsHypothesisToxAOD.empty()) {
112 s_actsHypothesisToxAOD.reserve(7);
113 s_actsHypothesisToxAOD.push_back( std::make_pair( Acts::eElectron ,
xAOD::electron) );
114 s_actsHypothesisToxAOD.push_back( std::make_pair( Acts::eMuon ,
xAOD::muon) );
115 s_actsHypothesisToxAOD.push_back( std::make_pair( Acts::ePionPlus ,
xAOD::pion) );
116 s_actsHypothesisToxAOD.push_back( std::make_pair( Acts::eProton ,
xAOD::proton) );
117 s_actsHypothesisToxAOD.push_back( std::make_pair( Acts::ePionZero ,
xAOD::pi0) );
118 s_actsHypothesisToxAOD.push_back( std::make_pair( Acts::eNeutron ,
xAOD::neutron) );
119 s_actsHypothesisToxAOD.push_back( std::make_pair( Acts::eGamma ,
xAOD::photon) );
125 ISvcLocator *pSvcLocator)
132 std::vector<std::string> supportedStrategies {
"BeamLine",
"Vertex"};
133 bool isAllowedStrategy =
false;
134 for (
const std::string&
strategy : supportedStrategies) {
136 isAllowedStrategy =
true;
140 if (not isAllowedStrategy) {
141 ATH_MSG_ERROR(
"Wrong configuration of the Track to Track Particle Cnv algorithm: perigeeExpression is not supported");
142 return StatusCode::FAILURE;
148 else return StatusCode::FAILURE;
167 cfg.resolvePassive =
false;
168 cfg.resolveMaterial =
true;
169 cfg.resolveSensitive =
true;
170 auto navigtor_logger =
logger->cloneWithSuffix(
"Navigator");
171 m_propagator = std::make_unique<Propagator>(
Stepper(std::make_shared<ATLASMagneticFieldWrapper>()),
179 unsigned int collection_idx=0;
181 if (type <1 || type >2) {
182 ATH_MSG_ERROR(
"Invalid measurement type (" <<
type <<
") given for collection " << collection_idx <<
" : "
184 <<
". Expected 1 for pixel, 2 for strips.");
185 return StatusCode::FAILURE;
191 ATH_MSG_ERROR(
"Expected exactly one value in SiDetEleCollToMeasurementType per SiDetectorElementCollection. But got "
193 return StatusCode::FAILURE;
198 return StatusCode::SUCCESS;
204 if (wh_track_particles.
record(std::make_unique<xAOD::TrackParticleContainer>(),
205 std::make_unique<xAOD::TrackParticleAuxContainer>()).isFailure()) {
207 return StatusCode::FAILURE;
221 beamspot_data = beamSpotHandle.
cptr();
227 vertexContainer = vertexHandle.
cptr();
228 if (vertexContainer->size() == 0) {
229 ATH_MSG_ERROR(
"Retrieved an empty vertex container. This is totally wrong!");
230 return StatusCode::FAILURE;
240 if (not primaryVertex) {
241 ATH_MSG_WARNING(
"Requested to compute track particles wrt primary vertex, but no primary vertex is found. Using dummy vertex");
242 primaryVertex = vertexContainer->front();
246 std::size_t nTracks = 0
ul;
247 std::vector<const ActsTrk::TrackContainer *> trackContainers;
251 trackContainers.push_back( handle.
cptr() );
252 nTracks += trackContainers.back()->size();
256 std::vector<xAOD::TrackParticle*> toAddParticles;
257 toAddParticles.reserve(nTracks);
258 for (std::size_t
i(0);
i<nTracks; ++
i) {
261 track_particles->
insert(track_particles->
end(),
262 toAddParticles.begin(),
263 toAddParticles.end());
272 std::shared_ptr<Acts::PerigeeSurface> perigee_surface {
nullptr};
292 std::vector<float> tmp_cov_vector;
293 std::vector<ActsTrk::TrackStateBackend::ConstTrackStateProxy::IndexType > tmp_param_state_idx;
294 tmp_param_state_idx.reserve(30);
296 std::vector<std::vector<float>> parametersVec;
299 unsigned int converted_track_states=0;
301 std::size_t particleCounter = 0
ul;
302 using namespace Acts::UnitLiterals;
307 for (
const typename ActsTrk::TrackContainer::ConstTrackProxy
track : *tracksContainer) {
312 Acts::BoundTrackParameters perigeeParam = [&] {
317 return track.createParametersAtReference();
324 Acts::BoundVector boundParams = perigeeParam.parameters();
326 boundParams[Acts::eBoundLoc1],
327 boundParams[Acts::eBoundPhi],
328 boundParams[Acts::eBoundTheta],
329 boundParams[Acts::eBoundQOverP] * 1_MeV);
331 if (perigeeParam.covariance().has_value()) {
333 lowerTriangleToVectorScaleLastRow(perigeeParam.covariance().value(),tmp_cov_vector,5, 1_MeV);
349 constexpr
float inv_1_MeV = 1/1_MeV;
361 measurementToSummaryType,
375 std::array< std::tuple< uint8_t, uint8_t, uint8_t, bool >, 4> copy_summary {
396 for (
auto [src_region, dest_xaod_summary_layer, dest_xaod_summary_hits, add_outlier] : copy_summary ) {
397 setSummaryValue(*track_particle,
400 setSummaryValue(*track_particle,
407 setSummaryValue(*track_particle,
411 setSummaryValue(*track_particle,
414 setSummaryValue(*track_particle,
420 setSummaryValue(*track_particle,
424 setSummaryValue(*track_particle,
427 setSummaryValue(*track_particle,
430 setSummaryValue(*track_particle,
433 setSummaryValue(*track_particle,
437 setSummaryValue(*track_particle,
442 std::array<unsigned int,4> expect_layer_pattern{};
443 if (precalculatedLayerPattern) {
457 : std::array<unsigned int,4> {0
u,0
u, 0
u,0
u} );
461 setSummaryValue(*track_particle,
462 static_cast<uint8_t>((expect_layer_pattern[0] & (1<<0)) != 0 ),
464 setSummaryValue(*track_particle,
465 static_cast<uint8_t>((expect_layer_pattern[0] & (1<<1)) != 0 ),
467 setSummaryValue(*track_particle,
470 setSummaryValue(*track_particle,
473 setSummaryValue(*track_particle,
476 setSummaryValue(*track_particle,
479 setSummaryValue(*track_particle,
482 setSummaryValue(*track_particle,
487 setSummaryValue(*track_particle,
490 setSummaryValue(*track_particle,
493 setSummaryValue(*track_particle,
496 setSummaryValue(*track_particle,
501 setSummaryValue(*track_particle,
502 static_cast<uint8_t> (biased_chi2_variance>0.
503 ?
std::min(
static_cast<unsigned int>(std::sqrt(biased_chi2_variance) * 100),255
u)
507 setSummaryValue(*track_particle,
515 tmp_param_state_idx[1]=tmp_param_state_idx.back();
516 tmp_param_state_idx.erase(tmp_param_state_idx.begin()+2,tmp_param_state_idx.end());
520 parametersVec.clear();
521 parametersVec.reserve(tmp_param_state_idx.size());
523 for(std::vector<ActsTrk::TrackStateBackend::ConstTrackStateProxy::IndexType>::const_reverse_iterator
524 idx_iter = tmp_param_state_idx.rbegin();
525 idx_iter != tmp_param_state_idx.rend();
528 ActsTrk::TrackStateBackend::ConstTrackStateProxy
529 state = tracksContainer->trackStateContainer().getTrackState(*idx_iter);
530 const Acts::BoundTrackParameters actsParam =
track.createParametersFromState(state);
532 Acts::Vector3 position = actsParam.position(gctx.
context());
533 Acts::Vector3
momentum = actsParam.momentum();
541 if (actsParam.covariance()) {
543 Acts::GeometryContext tgContext = gctx.
context();
545 magnFieldVect.setZero();
546 fieldCache.
getField(position.data(), magnFieldVect.data());
549 using namespace Acts::UnitLiterals;
550 magnFieldVect *= 1000_T;
554 if (curvilinear_cov_result.has_value()) {
555 Acts::BoundSquareMatrix &curvilinear_cov = curvilinear_cov_result.value();
558 for (
unsigned int col_i=0; col_i<4; ++col_i) {
559 curvilinear_cov(col_i,4) *= 1_MeV;
560 curvilinear_cov(4,col_i) *= 1_MeV;
562 curvilinear_cov(4,4) *= (1_MeV * 1_MeV);
564 std::size_t param_idx = parametersVec.size();
566 lowerTriangleToVector(curvilinear_cov,tmp_cov_vector,5);
567 if (tmp_cov_vector.size() != 15) {
568 ATH_MSG_ERROR(
"Invalid size of lower triangle cov " << tmp_cov_vector.size() <<
" != 15"
569 <<
" input matrix : " << curvilinear_cov.rows() <<
" x " << curvilinear_cov.cols() );
574 parametersVec.emplace_back(std::vector<float>{
575 static_cast<float>(position[0]),
static_cast<float>(position[1]),
static_cast<float>(position[2]),
577 ++converted_track_states;
581 for (
const std::vector<float> ¶m : parametersVec) {
582 if (param.size() != 6) {
583 ATH_MSG_ERROR(
"Invalid size of param element " << param.size() <<
" != 6" );
590 trackLink(*track_particle)
596 ATH_MSG_DEBUG(
"Converted " << nTracks <<
" acts tracks into " << track_particles->
size()
597 <<
" track particles with parameters for " << converted_track_states <<
" track states.");
599 return StatusCode::SUCCESS;
604 Acts::Vector3 beamspot(0., 0., 0.);
612 Acts::Translation3 translation(beamspot);
613 Acts::Transform3
transform( translation * Acts::RotationMatrix3::Identity() );
614 transform *= Acts::AngleAxis3(tilty, Acts::Vector3(0.,1.,0.));
615 transform *= Acts::AngleAxis3(tiltx, Acts::Vector3(1.,0.,0.));
616 return Acts::Surface::makeShared<Acts::PerigeeSurface>(
transform);
620 Acts::Translation3 translation(Acts::Vector3(
vertex.position()));
621 Acts::Transform3
transform( translation * Acts::RotationMatrix3::Identity() );
622 return Acts::Surface::makeShared<Acts::PerigeeSurface>(
transform);
626 const typename ActsTrk::TrackContainer::ConstTrackProxy &
track,
627 const Acts::PerigeeSurface &perigee_surface)
const {
628 const Acts::BoundTrackParameters trackParam =
track.createParametersAtReference();
630 std::optional<const Acts::BoundTrackParameters>
634 Acts::Direction::Backward(),
636 if (!perigeeParam.has_value()) {
637 ATH_MSG_WARNING(
"Failed to extrapolate to perigee, started from \n" << trackParam <<
" " << trackParam.referenceSurface().name() );
643 return perigeeParam.value();
JetConstituentVector::iterator iterator
@ neutron
for Fatras usage
@ numberOfPixelHoles
number of pixel layers on track with absence of hits [unit8_t].
void setTrackFitter(const TrackFitter fitter)
Method for setting the fitter, using the TrackFitter enum.
static std::shared_ptr< Acts::PerigeeSurface > makePerigeeSurface(const InDet::BeamSpotData *beamspotptr)
std::optional< Acts::BoundMatrix > convertActsBoundCovToCurvilinearParam(const Acts::GeometryContext &tgContext, const Acts::BoundTrackParameters ¶m, const Acts::Vector3 &magnFieldVect, const Acts::ParticleHypothesis &particle_hypothesis)
Convert the covariance of the given Acts track parameters into curvilinear parameterisation.
Gaudi::Property< bool > m_expectIfPixelContributes
Helper class to gather statistics and compute the biased variance.
@ numberOfSCTSharedHits
number of SCT hits shared by several tracks [unit8_t].
void gatherTrackSummaryData(const ActsTrk::TrackContainer &tracksContainer, const typename ActsTrk::TrackContainer::ConstTrackProxy &track, const std::array< const InDetDD::SiDetectorElementCollection *, to_underlying(xAOD::UncalibMeasType::nTypes)> &siDetEleColl, const std::array< unsigned short, to_underlying(xAOD::UncalibMeasType::nTypes)> &measurement_to_summary_type, SumOfValues &chi2_stat_out, HitSummaryData &hit_info_out, std::vector< ActsTrk::TrackStateBackend::ConstTrackStateProxy::IndexType > ¶m_state_idx_out, std::array< std::array< uint8_t, to_underlying(HitCategory::N)>, to_underlying(xAOD::UncalibMeasType::nTypes)> &special_hit_counts_out)
Helper to gather track summary information from the track states of the specified track.
virtual StatusCode initialize() override
uint8_t contributingHits(DetectorRegion region) const
return the number of hits in a certain detector region.
const_pointer_type cptr()
Dereference the pointer.
void setTrackParameters(std::vector< std::vector< float > > ¶meters)
Set the parameters via the passed vector of vectors.
virtual StatusCode execute(const EventContext &ctx) const override
constexpr std::underlying_type< T_EnumClass >::type to_underlying(T_EnumClass an_enum)
Helper to convert class enum into an integer.
@ numberOfContribPixelBarrelInclinedLayers
number of contributing barrel inclined layers of the pixel detector [unit8_t].
@ numberOfInnermostPixelLayerSharedEndcapHits
number of Pixel 0th layer endcap hits shared by several tracks.
PublicToolHandle< ActsTrk::ITrackingGeometryTool > m_trackingGeometryTool
Gaudi::Property< bool > m_firstAndLastParamOnly
expressionStrategy m_expression_strategy
uint8_t contributingSharedHits(DetectorRegion region) const
return the number of shared hits in a certain detector region.
Acts::BoundTrackParameters parametersAtPerigee(const EventContext &ctx, const typename ActsTrk::TrackContainer::ConstTrackProxy &track, const Acts::PerigeeSurface &perigee_surface) const
@ numberOfContribPixelBarrelFlatLayers
number of contributing barrel flat layers of the pixel detector [unit8_t].
void setDefiningParameters(float d0, float z0, float phi0, float theta, float qOverP)
Set the defining parameters.
@ numberOfPixelHits
these are the pixel hits, including the b-layer [unit8_t].
@ expectInnermostPixelLayerHit
Do we expect a 0th-layer barrel hit for this track?
std::vector< size_t > vec
const Trk::RecVertex & beamVtx() const noexcept
void setTrackParameterCovarianceMatrix(unsigned int index, std::vector< float > &cov)
Set the cov matrix of the parameter at 'index', using a vector of floats.
bool isValid(const T &p)
Av: we implement here an ATLAS-sepcific convention: all particles which are 99xxxxx are fine.
const std::string & key() const
Return the StoreGate ID for the referenced object.
@ u
Enums for curvilinear frames.
@ numberOfInnermostPixelLayerEndcapOutliers
number of 0th layer endcap outliers
void setBeamlineTiltY(float tiltY)
An algorithm that can be simultaneously executed in multiple threads.
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
std::unique_ptr< const Acts::Logger > makeActsAthenaLogger(IMessageSvc *svc, const std::string &name, int level, std::optional< std::string > parent_name)
Acts::GeometryContext context() const
void setFitQuality(float chiSquared, float numberDoF)
Set the 'Fit Quality' information.
@ numberOfContribPixelEndcap
number of contributing endcap layers of the pixel detector [unit8_t].
@ numberOfInnermostPixelLayerOutliers
number of 0th layer barrel outliers
@ numberOfNextToInnermostPixelLayerSharedEndcapHits
number of Pixel 1st layer endcap hits shared by several tracks.
@ numberOfInnermostPixelLayerEndcapHits
these are the hits in the 0th pixel layer endcap [unit8_t].
@ numberOfPixelSharedHits
number of Pixel all-layer hits shared by several tracks [unit8_t].
void getInitializedCache(MagField::AtlasFieldCache &cache) const
get B field cache for evaluation as a function of 2-d or 3-d position.
Helper class to gather hit summary information for e.g.
uint8_t contributingOutlierHits(DetectorRegion region) const
return the number of outliers in a certain detector region.
Acts::Navigator Navigator
SummaryType
Enumerates the different types of information stored in Summary.
@ expectNextToInnermostPixelLayerHit
Do we expect a 1st-layer barrel hit for this track?
@ numberOfPixelBarrelFlatHits
these are the pixel hits, in the barrel flat layers [unit8_t].
static void initParticleHypothesisMap()
static bool exists(track_container_t &trackContainer)
::StatusCode StatusCode
StatusCode definition for legacy code.
pointer_type ptr()
Dereference the pointer.
Handle class for adding a decoration to an object.
uint8_t contributingLayers(DetectorRegion region) const
return the number of layers contributing to the hit collection in the given detector region.
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_decorator_actsTracks
Amg::Vector3D transform(Amg::Vector3D &v, Amg::Transform3D &tr)
Transform a point from a Trasformation3D.
@ numberOfPixelOutliers
these are the pixel outliers, including the b-layer [unit8_t].
iterator insert(iterator position, value_type pElem)
Add a new element to the collection.
@ standardDeviationOfChi2OS
100 times the standard deviation of the chi2 from the surfaces [unit8_t].
StatusCode initialize(bool used=true)
If this object is used as a property, then this should be called during the initialize phase.
const Amg::Vector3D & position() const
return position of vertex
@ numberOfSCTHoles
number of SCT holes [unit8_t].
Gaudi::Property< bool > m_computeExpectedLayerPattern
void setParticleHypothesis(const ParticleHypothesis hypo)
Method for setting the particle type, using the ParticleHypothesis enum.
@ numberOfTrackSummaryTypes
Include the GeoPrimitives which need to be put first.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
@ numberOfNextToInnermostPixelLayerEndcapHits
these are the hits in the 0.5th and 1st pixel layer endcap rings [unit8_t].
ElementLink implementation for ROOT usage.
SG::WriteHandleKey< xAOD::TrackParticleContainer > m_trackParticlesOutKey
uint8_t sum(DetectorRegion region, uint8_t layer) const
return the total number of hits, outliers, and/or shared hits in the givrn detector region and layer.
@ KalmanFitter
tracks produced by the Kalman Fitter
@ numberOfNextToInnermostPixelLayerOutliers
number of 1st pixel layer barrel outliers
@ numberOfNextToInnermostPixelLayerHits
these are the hits in the 1st pixel barrel layer
SG::ReadCondHandleKey< AtlasFieldCacheCondObj > m_fieldCacheCondObjInputKey
StatusCode initialize(bool used=true)
Eigen::Matrix< double, 3, 1 > Vector3D
@ numberOfPixelBarrelInclinedHits
these are the pixel hits, in the barrel inclined layers [unit8_t].
const_iterator end() const noexcept
Return a const_iterator pointing past the end of the collection.
void setDefiningParametersCovMatrixVec(const std::vector< float > &cov)
void setSummaryValue(uint8_t &value, const SummaryType &information)
Set method for TrackSummary values.
@ numberOfOutliersOnTrack
number of measurements flaged as outliers in TSOS [unit8_t].
std::array< unsigned int, 4 > expectedLayerPattern(const EventContext &ctx, const IActsExtrapolationTool &extrapolator, const Acts::BoundTrackParameters &perigee_parameters, double pathLimit)
Extrapolate from the perigee outwards and gather information which detector layers should have hits.
SG::ReadCondHandleKey< InDet::BeamSpotData > m_beamSpotKey
Acts::EigenStepper<> Stepper
StatusCode initialize(bool used=true)
If this object is used as a property, then this should be called during the initialize phase.
Class describing a Vertex.
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
@ numberOfSCTOutliers
number of SCT outliers [unit8_t].
#define ATH_MSG_WARNING(x)
double biasedVariance() const
@ numberOfNextToInnermostPixelLayerEndcapOutliers
number of 1st layer endcap disk outliers
Local cache for magnetic field (based on MagFieldServices/AtlasFieldSvcTLS.h)
Gaudi::Property< std::string > m_perigeeExpression
Gaudi::Property< double > m_pixelExpectLayerPathLimitInMM
@ numberOfInnermostPixelLayerSharedHits
number of Pixel 0th layer barrel hits shared by several tracks.
@ SiSPSeededFinder
Tracks from SiSPSeedFinder.
void getField(const double *ATH_RESTRICT xyz, double *ATH_RESTRICT bxyz, double *ATH_RESTRICT deriv=nullptr)
get B field value at given position xyz[3] is in mm, bxyz[3] is in kT if deriv[9] is given,...
std::unique_ptr< Propagator > m_propagator
@ numberOfContribPixelLayers
number of contributing layers of the pixel detector [unit8_t].
@ numberOfSCTHits
number of hits in SCT [unit8_t].
The AlignStoreProviderAlg loads the rigid alignment corrections and pipes them through the readout ge...
@ numberOfPixelEndcapHits
these are the pixel hits, in the endcap layers [unit8_t].
SG::ReadHandleKeyArray< ActsTrk::TrackContainer > m_tracksContainerKey
Gaudi::Property< double > m_paramExtrapolationParLimit
static std::array< unsigned int, 4 > get(const track_proxy_t &track)
Class describing a TrackParticle.
const T * at(size_type n) const
Access an element, as an rvalue.
ToolHandle< IActsExtrapolationTool > m_extrapolationTool
SG::ReadHandleKey< xAOD::VertexContainer > m_vertexHandle
Gaudi::Property< std::vector< unsigned int > > m_siDetEleCollToMeasurementType
static std::vector< std::pair< Acts::PdgParticle, xAOD::ParticleHypothesis > > s_actsHypothesisToxAOD ATLAS_THREAD_SAFE
DetectorRegion
Regions for which hit counts are computed.
SG::ReadCondHandleKeyArray< InDetDD::SiDetectorElementCollection > m_siDetEleCollKey
@ numberOfNextToInnermostPixelLayerSharedHits
number of Pixel 1st layer barrel hits shared by several tracks.
size_type size() const noexcept
Returns the number of elements in the collection.
Helper class to provide type-safe access to aux data.
void setBeamlineTiltX(float tiltX)
static xAOD::ParticleHypothesis convertParticleHypothesis(Acts::PdgParticle abs_pdg_id)
@ numberOfInnermostPixelLayerHits
these are the hits in the 0th pixel barrel layer
float beamTilt(int i) const noexcept
Returns the beam sigma for the i+3-th error matrix element (the 'tilt')
void setPatternRecognitionInfo(const std::bitset< xAOD::NumberOfTrackRecoInfo > &patternReco)
Method setting the pattern recognition algorithm, using a bitset.
const_pointer_type cptr()
TrackToTrackParticleCnvAlg(const std::string &name, ISvcLocator *pSvcLocator)