30 return StatusCode::SUCCESS;
35 auto translatedSegments = std::make_unique<Trk::SegmentCollection>();
39 for (
const Segment* segment : *translateMe) {
43 ATH_MSG_VERBOSE(
"Translated in total "<<translatedSegments->size()<<
" segments.");
47 return StatusCode::SUCCESS;
49 template <
class PrdType>
53 ATH_MSG_ERROR(
"Cannot fetch a prep data object as the container given for "<<
62 for (
const PrdType* prd : *coll) {
63 if (prd->identify() == prdId){
71 template <
class PrdType>
73 const std::string& accName)
const {
76 if (!acc.isAvailable(meas) || !acc(meas).
isValid()) {
77 ATH_MSG_WARNING(__func__<<
"() "<<__LINE__<<
" - No link decoration "<<accName<<
" for measurement "
83 template <
class PrdType>
87 std::vector<std::unique_ptr<Trk::RIO_OnTrack>>& convMeasVec,
88 const std::string& accName)
const {
98 const PrdType* prd{
nullptr};
99 if (!accName.empty()) {
103 prd =
fetchPrd(uncalib->identify(), prdContainer);
107 return StatusCode::FAILURE;
109 const Trk::Surface& surf{prd->detectorElement()->surface(prd->identify())};
112 std::unique_ptr<Trk::RIO_OnTrack> rot{};
113 if constexpr(std::is_same_v<PrdType, Muon::MdtPrepData>) {
114 rot = std::unique_ptr<Trk::RIO_OnTrack>{
m_mdtCreator->createRIO_OnTrack(*prd,
118 rot = std::unique_ptr<Trk::RIO_OnTrack>{
m_clusterCreator->createRIO_OnTrack(*prd,
121 if constexpr (std::is_same_v<PrdType, Muon::sTgcPrepData>) {
124 const Amg::Vector3D locPos = prd->detectorElement()->transform(prd->identify()).inverse() *
126 if (prd->detectorElement()->isEtaZero(prd->identify(), locPos.block<2,1>(0,0))){
141 return StatusCode::FAILURE;
144 convMeasVec.push_back(std::move(rot));
147 ATH_MSG_ERROR(
"Could not translate space point "<<spacePoint);
148 return StatusCode::FAILURE;
150 return StatusCode::SUCCESS;
171 std::vector<std::unique_ptr<Trk::RIO_OnTrack>> rots{};
172 unsigned int nPrec{0};
174 if (spacePoint->fitState() != CalibratedSpacePoint::State::Valid) {
178 switch (spacePoint->type()) {
210 auto makeCompetingROT = [
this, &measurements](
RotVec& rots) {
214 std::list<const Trk::PrepRawData*> prds{};
215 for (
const std::unique_ptr<Trk::RIO_OnTrack>& rot : rots) {
216 prds.push_back(rot->prepRawData());
222 RotVec etaPrds{}, phiPrds{};
223 for (std::unique_ptr<Trk::RIO_OnTrack>& rot : rots) {
226 std::vector<std::unique_ptr<Trk::RIO_OnTrack>>& pushMe{
m_idHelperSvc->measuresPhi(rot->identify())? phiPrds : etaPrds};
227 if (pushMe.size() && pushMe.back()->detectorElement() != rot->detectorElement()){
228 makeCompetingROT(pushMe);
230 pushMe.push_back(std::move(rot));
234 makeCompetingROT(etaPrds);
235 makeCompetingROT(phiPrds);
239 makeCompetingROT(etaPrds);
240 makeCompetingROT(phiPrds);
243 <<
". Do not convert segment due to potential puff.");
244 return StatusCode::SUCCESS;
246 ATH_MSG_DEBUG(
"Fetched in total "<<measurements.
size()<<
" measurements. "<<std::endl<<
252 segSurf->globalToLocalDirection(segment.
direction(), segDir);
253 std::vector<Identifier> holes{};
254 auto fitQuality = std::make_unique<Muon::MuonSegmentQuality>(segment.
chi2(),
255 static_cast<double>(segment.
nDoF()),
259 covMatrix.setIdentity();
267 auto legacySeg = std::make_unique<Muon::MuonSegment>(Amg::Vector2D::Zero(), std::move(segDir),
268 std::move(covMatrix), segSurf.release(),
269 std::move(measurements), fitQuality.release());
272 <<
Amg::toString(legacySeg->globalDirection())<<std::endl<<
m_printer->print(legacySeg->containedMeasurements()));
273 outContainer.
push_back(std::move(legacySeg));
274 return StatusCode::SUCCESS;
#define ATH_CHECK
Evaluate an expression and check for errors.
bool isValid() const
Test to see if the link can be dereferenced.
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
ElementLink< xAOD::TruthParticleContainer > Link_t
value_type push_back(value_type pElem)
Add an element to the end of the collection.
const PtrVector & stdcont() const
Return the underlying std::vector of the container.
size_type size() const noexcept
Returns the number of elements in the collection.
ElementLink implementation for ROOT usage.
virtual const T * indexFindPtr(IdentifierHash hashId) const override final
return pointer on the found entry or null if out of range using hashed index - fast version,...
const Amg::Transform3D & localToGlobalTransform(const ActsTrk::GeometryContext &gctx) const
Returns the local -> global tarnsformation from the sector.
The calibrated Space point is created during the calibration process.
const SpacePoint * spacePoint() const
The pointer to the space point out of which this space point has been built.
Placeholder for what will later be the muon segment EDM representation.
unsigned int nDoF() const
Returns the number of degrees of freedom.
const SegmentFit::Covariance & covariance() const
Returns the uncertainties of the defining parameters.
const MuonGMR4::SpectrometerSector * msSector() const
Returns the associated MS sector.
Acts::CloneablePtr< CalibratedSpacePoint > MeasType
Calibrated space point type.
const MeasVec & measurements() const
Returns the associated measurements.
double chi2() const
Returns the chi2 of the segment fit.
const Amg::Vector3D & position() const
Returns the global segment position.
const Amg::Vector3D & direction() const
Returns the global segment direction.
const xAOD::MuonMeasurement * secondaryMeasurement() const
const xAOD::MuonMeasurement * primaryMeasurement() const
SG::WriteHandleKey< Trk::SegmentCollection > m_writeKey
ToolHandle< Muon::IMuonClusterOnTrackCreator > m_clusterCreator
ActsTrk::GeoContextReadKey_t m_geoCtxKey
StatusCode execute(const EventContext &ctx) const override final
StatusCode convert(const EventContext &ctx, const MuonR4::Segment &segment, Trk::SegmentCollection &outContainer) const
Convert the R4 segment and fill the converted segment into the SegmentCollection.
SG::ReadHandleKey< Muon::RpcPrepDataContainer > m_keyRpc
ToolHandle< Muon::IMdtDriftCircleOnTrackCreator > m_mdtCreator
std::vector< std::unique_ptr< Trk::RIO_OnTrack > > RotVec
StatusCode initialize() override final
StatusCode convertMeasurement(const MuonR4::Segment &segment, const CalibratedSpacePoint &spacePoint, const Muon::MuonPrepDataContainerT< PrdType > *prdContainer, RotVec &convMeasVec, const std::string &accName="") const
Convert the calibrated space point of interest to a Trk::Measurement.
const PrdType * fetchPrd(const Identifier &prdId, const Muon::MuonPrepDataContainerT< PrdType > *prdContainer) const
SG::ReadHandleKeyArray< SegmentContainer > m_readKeys
SG::ReadHandleKey< Muon::MdtPrepDataContainer > m_keyMdt
ServiceHandle< Muon::IMuonIdHelperSvc > m_idHelperSvc
PublicToolHandle< Muon::MuonEDMPrinterTool > m_printer
SG::ReadHandleKey< Muon::TgcPrepDataContainer > m_keyTgc
Prep data container keys.
ToolHandle< Muon::IMuonCompetingClustersOnTrackCreator > m_compClusterCreator
SG::ReadHandleKey< Muon::MMPrepDataContainer > m_keyMM
SG::ReadHandleKey< Muon::sTgcPrepDataContainer > m_keysTgc
Template to hold collections of MuonPrepRawData objects.
Helper class to provide constant type-safe access to aux data.
Property holding a SG store/key/clid from which a ReadHandle is made.
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
represents the three-dimensional global direction with respect to a planar surface frame.
virtual bool type(PrepRawDataType type) const
Interface method checking the type.
Abstract Base Class for tracking surfaces.
Intersection straightLineIntersection(const T &pars, bool forceDir=false, const Trk::BoundaryCheck &bchk=false) const
fst straight line intersection schema - templated for charged and neutral parameters
int channelType(const Identifier &id) const
const Identifier & identify() const
Returns the Athena identifier of the measurement.
std::string toString(const Translation3D &translation, int precision=4)
GeoPrimitvesToStringConverter.
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic > MatrixX
Dynamic Matrix - dynamic allocation.
Amg::Transform3D getTransformFromRotTransl(Amg::RotationMatrix3D rot, Amg::Vector3D transl_vec)
Eigen::Affine3d Transform3D
Eigen::Matrix< double, 3, 1 > Vector3D
This header ties the generic definitions in this package.
DataVector< Segment > SegmentContainer
MuonPrepDataContainerT< RpcPrepData > RpcPrepDataContainer
MuonPrepDataContainer< MuonPrepDataCollection< PrdType > > MuonPrepDataContainerT
MuonPrepDataContainerT< TgcPrepData > TgcPrepDataContainer
MuonPrepDataContainerT< MdtPrepData > MdtPrepDataContainer
MuonPrepDataContainerT< sTgcPrepData > sTgcPrepDataContainer
MuonPrepDataContainerT< MMPrepData > MMPrepDataContainer
const T * get(const ReadCondHandleKey< T > &key, const EventContext &ctx)
Convenience function to retrieve an object given a ReadCondHandleKey.
DataVector< Trk::Segment > SegmentCollection
MuonMeasurement_v1 MuonMeasurement