ATLAS Offline Software
Loading...
Searching...
No Matches
Muon::MuonSystemExtensionTool Class Reference

#include <MuonSystemExtensionTool.h>

Inheritance diagram for Muon::MuonSystemExtensionTool:
Collaboration diagram for Muon::MuonSystemExtensionTool:

Public Types

typedef std::vector< MuonLayerSurfaceSurfaceVec

Public Member Functions

virtual ~MuonSystemExtensionTool ()=default
StatusCode initialize () override
bool muonSystemExtension (const EventContext &ctx, SystemExtensionCache &cache) const override
 get muon system extension
bool muonLayerInterSections (const EventContext &ctx, const MuonCombined::TagBase &cmb_tag, SystemExtensionCache &cache) const override

Private Types

using DetRegIdx = MuonStationIndex::DetectorRegionIndex
 reference surfaces per region and sector

Private Member Functions

bool initializeGeometry ()
 initialize geometry
bool initializeGeometryBarrel (int sector, const Amg::Transform3D &sectorRotation)
bool initializeGeometryEndcap (int sector, MuonStationIndex::DetectorRegionIndex regionIndex, const Amg::Transform3D &sectorRotation)
SurfaceVec getSurfacesForIntersection (const Trk::TrackParameters &muonEntryPars, const SystemExtensionCache &cache) const
 get surfaces to be intersected for a given start parameters

Private Attributes

ToolHandle< Trk::IParticleCaloExtensionToolm_caloExtensionTool
ToolHandle< Trk::IExtrapolatorm_extrapolator {this,"Extrapolator",""}
PublicToolHandle< MuonEDMPrinterToolm_printer {this, "Printer", "Muon::MuonEDMPrinterTool/MuonEDMPrinterTool"}
ServiceHandle< IMuonIdHelperSvcm_idHelperSvc {this, "MuonIdHelperSvc", "Muon::MuonIdHelperSvc/MuonIdHelperSvc"}
ServiceHandle< IMuonEDMHelperSvcm_edmHelperSvc
std::array< std::array< SurfaceVec, 16 >, MuonStationIndex::toInt(DetRegIdx::DetectorRegionIndexMax)> m_referenceSurfaces {}
MuonSectorMapping m_sectorMapping
 sector mapping helper

Detailed Description

Definition at line 32 of file MuonSystemExtensionTool.h.

Member Typedef Documentation

◆ DetRegIdx

reference surfaces per region and sector

Definition at line 73 of file MuonSystemExtensionTool.h.

◆ SurfaceVec

Constructor & Destructor Documentation

◆ ~MuonSystemExtensionTool()

virtual Muon::MuonSystemExtensionTool::~MuonSystemExtensionTool ( )
virtualdefault

Member Function Documentation

◆ getSurfacesForIntersection()

MuonSystemExtensionTool::SurfaceVec Muon::MuonSystemExtensionTool::getSurfacesForIntersection ( const Trk::TrackParameters & muonEntryPars,
const SystemExtensionCache & cache ) const
private

get surfaces to be intersected for a given start parameters

Look whether one of the sectors has actually a recorded hit

Definition at line 219 of file MuonSystemExtensionTool.cxx.

220 {
221 using namespace MuonStationIndex;
222 // if in endcaps pick endcap surfaces
223 const double eta = muonEntryPars.position().eta();
224 DetectorRegionIndex regionIndex = DetectorRegionIndex::Barrel;
225 if (eta < -1.05) regionIndex = DetectorRegionIndex::EndcapC;
226 if (eta > 1.05) regionIndex = DetectorRegionIndex::EndcapA;
227
228 // in barrel pick primary sector
229 const double phi = muonEntryPars.position().phi();
230 std::vector<int> sectors;
231 m_sectorMapping.getSectors(phi, sectors);
232 SurfaceVec surfaces;
234 if (cache.useHitSectors) {
235 const auto map_itr = cache.sectorsWithHits->find(regionIndex);
236 if (map_itr == cache.sectorsWithHits->end()) {
237 ATH_MSG_DEBUG("No hits in detector region " << regionName(regionIndex));
238 return surfaces;
239 }
240 std::vector<int>::const_iterator sec_itr = std::find_if(
241 sectors.begin(), sectors.end(), [&map_itr](const int sector) -> bool { return map_itr->second.count(sector); });
242 if (sec_itr == sectors.end()) {
243 ATH_MSG_DEBUG("No hits found for sector " << m_sectorMapping.getSector(phi)
244 << " in MuonStation " << regionName(regionIndex));
245 return surfaces;
246 }
247 }
248
249 for (const int sector : sectors) {
250 const SurfaceVec& toInsert{m_referenceSurfaces[toInt(regionIndex)][sector - 1]};
251 surfaces.insert(surfaces.end(), toInsert.begin(), toInsert.end());
252 }
253 std::stable_sort(surfaces.begin(), surfaces.end(),
254 [&muonEntryPars](const MuonLayerSurface& s1, const MuonLayerSurface& s2) {
255 return std::abs(pathAlongPars(muonEntryPars,s1.surfacePtr->center())) <
256 std::abs(pathAlongPars(muonEntryPars,s2.surfacePtr->center()));
257
258 });
259 if (msgLvl(MSG::VERBOSE)) {
260 for (auto& s1 : surfaces) {
261 ATH_MSG_VERBOSE("Surface "<<layerName(s1.layerIndex)
262 <<", center: "<<Amg::toString(s1.surfacePtr->center())
263 <<", pathAlongPars "<<pathAlongPars(muonEntryPars,s1.surfacePtr->center())
264 <<std::endl<<(*s1.surfacePtr));
265
266 }
267 }
268 return surfaces;
269 }
Scalar eta() const
pseudorapidity method
Scalar phi() const
phi method
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_DEBUG(x)
std::vector< MuonLayerSurface > SurfaceVec
MuonSectorMapping m_sectorMapping
sector mapping helper
std::array< std::array< SurfaceVec, 16 >, MuonStationIndex::toInt(DetRegIdx::DetectorRegionIndexMax)> m_referenceSurfaces
const Amg::Vector3D & position() const
Access method for the position.
std::string toString(const Translation3D &translation, int precision=4)
GeoPrimitvesToStringConverter.
const std::string & layerName(LayerIndex index)
convert LayerIndex into a string
DetectorRegionIndex
enum to classify the different layers in the muon spectrometer
constexpr int toInt(const EnumType enumVal)
const std::string & regionName(DetectorRegionIndex index)
convert DetectorRegionIndex into a string
void stable_sort(DataModel_detail::iterator< DVL > beg, DataModel_detail::iterator< DVL > end)
Specialization of stable_sort for DataVector/List.

◆ initialize()

StatusCode Muon::MuonSystemExtensionTool::initialize ( )
override

Definition at line 35 of file MuonSystemExtensionTool.cxx.

35 {
37 ATH_CHECK(m_extrapolator.retrieve());
38 ATH_CHECK(m_idHelperSvc.retrieve());
39 if (!initializeGeometry()) return StatusCode::FAILURE;
40
41 return StatusCode::SUCCESS;
42 }
#define ATH_CHECK
Evaluate an expression and check for errors.
ToolHandle< Trk::IParticleCaloExtensionTool > m_caloExtensionTool
ToolHandle< Trk::IExtrapolator > m_extrapolator
ServiceHandle< IMuonIdHelperSvc > m_idHelperSvc
bool initializeGeometry()
initialize geometry

◆ initializeGeometry()

bool Muon::MuonSystemExtensionTool::initializeGeometry ( )
private

initialize geometry

Definition at line 44 of file MuonSystemExtensionTool.cxx.

44 {
45 // initialize reference surfaces hash vectors per region and sector
46
47 // first build the barrel, we need different reference planes for all sectors
48 ATH_MSG_DEBUG("Initializing barrel ");
49 for (unsigned int sector = 1; sector <= 16; ++sector) {
50 // get rotation into sector frame
51 double sectorPhi = m_sectorMapping.sectorPhi(sector);
52 const Amg::Transform3D sectorRotation(Amg::getRotateZ3D(sectorPhi));
53 if (!initializeGeometryBarrel(sector, sectorRotation)) return false;
54 if (!initializeGeometryEndcap(sector, DetRegIdx::EndcapA, sectorRotation)) return false;
55 if (!initializeGeometryEndcap(sector, DetRegIdx::EndcapC, sectorRotation)) return false;
56 }
57
58 return true;
59 }
bool initializeGeometryBarrel(int sector, const Amg::Transform3D &sectorRotation)
bool initializeGeometryEndcap(int sector, MuonStationIndex::DetectorRegionIndex regionIndex, const Amg::Transform3D &sectorRotation)
Amg::Transform3D getRotateZ3D(double angle)
get a rotation transformation around Z-axis
Eigen::Affine3d Transform3D

◆ initializeGeometryBarrel()

bool Muon::MuonSystemExtensionTool::initializeGeometryBarrel ( int sector,
const Amg::Transform3D & sectorRotation )
private

Definition at line 94 of file MuonSystemExtensionTool.cxx.

94 {
95 MuonChamberLayerDescription chamberLayerDescription;
96
97 using namespace MuonStationIndex;
98 SurfaceVec& surfaces = m_referenceSurfaces[toInt(DetectorRegionIndex::Barrel)][sector - 1];
99 constexpr double xToZRotation = -M_PI_2;
100
101 for (const StIndex stationLayer : {StIndex::BI, StIndex::BM, StIndex::BO, StIndex::BE}) {
102 // skip BEE if in small sectors, not installed
103 if (stationLayer == StIndex::BE && m_sectorMapping.isSmall(sector)) continue;
104
105 // calculate reference position from radial position of the laeyr
106 LayerIndex layer = toLayerIndex(stationLayer);
107 MuonChamberLayerDescriptor layerDescriptor = chamberLayerDescription.getDescriptor(sector, DetectorRegionIndex::Barrel, layer);
108 Amg::Vector3D positionInSector(layerDescriptor.referencePosition, 0., 0.);
109 Amg::Vector3D globalPosition = sectorRotation * positionInSector;
110
111 // reference transform + surface
112 Amg::Transform3D trans(sectorRotation * Amg::getRotateY3D(xToZRotation));
113 trans.pretranslate(globalPosition);
114 std::unique_ptr<Trk::PlaneSurface> surface = std::make_unique<Trk::PlaneSurface>(trans);
115 // sanity checks
116 if (msgLvl(MSG::VERBOSE)) {
117 double sectorPhi = m_sectorMapping.sectorPhi(sector);
118 ATH_MSG_VERBOSE(" sector " << sector << " layer " << MuonStationIndex::layerName(layer) << " phi " << sectorPhi
119 << " ref theta " << globalPosition.theta() << " phi " << globalPosition.phi() << " r "
120 << globalPosition.perp() << " pos " << Amg::toString(globalPosition)
121 << " lpos3d " << Amg::toString(surface->transform().inverse() * globalPosition)
122 << " normal: " << Amg::toString(surface->normal()));
123 }
124 MuonLayerSurface data{std::move(surface), sector, DetectorRegionIndex::Barrel, layer};
125 surfaces.push_back(std::move(data));
126 }
127 return true;
128 }
char data[hepevt_bytes_allocation_ATLAS]
Definition HepEvt.cxx:11
Eigen::Matrix< double, 3, 1 > Vector3D
Amg::Transform3D getRotateY3D(double angle)
get a rotation transformation around Y-axis
StIndex
enum to classify the different station layers in the muon spectrometer
LayerIndex toLayerIndex(ChIndex index)
convert ChIndex into LayerIndex
LayerIndex
enum to classify the different layers in the muon spectrometer
@ layer
Definition HitInfo.h:79

◆ initializeGeometryEndcap()

bool Muon::MuonSystemExtensionTool::initializeGeometryEndcap ( int sector,
MuonStationIndex::DetectorRegionIndex regionIndex,
const Amg::Transform3D & sectorRotation )
private

Definition at line 61 of file MuonSystemExtensionTool.cxx.

62 {
63 using namespace MuonStationIndex;
64 ATH_MSG_DEBUG("Initializing endcap: sector " << sector << " " << regionName(regionIndex));
65
66 SurfaceVec& surfaces = m_referenceSurfaces[toInt(regionIndex)][sector - 1];
67 MuonChamberLayerDescription chamberLayerDescription;
68
69 static constexpr std::array<StIndex, 4> layers{StIndex::EI, StIndex::EE, StIndex::EM, StIndex::EO};
70
71 for (const StIndex stLayer : layers) {
72 // calculate reference position from radial position of the layer
73 LayerIndex layer = toLayerIndex(stLayer);
74 MuonChamberLayerDescriptor layerDescriptor = chamberLayerDescription.getDescriptor(sector, regionIndex, layer);
75 // reference transform + surface
76 Amg::Transform3D trans{Amg::getTranslateZ3D(layerDescriptor.referencePosition) *sectorRotation}; //*Amg::AngleAxis3D(xToZRotation,Amg::Vector3D(0.,1.,0.)
77 std::unique_ptr<Trk::PlaneSurface> surface = std::make_unique<Trk::PlaneSurface>(trans);
78 // sanity checks
79
80 ATH_MSG_VERBOSE("initializeGeometryEndcap() -- sector " << sector << " layer " << layerName(layer)
81 << " surface "<<Amg::toString(surface->transform())
82 << " center " << Amg::toString(surface->center()) << " theta " << surface->normal().theta()
83 << " normal: " <<Amg::toString(surface->normal()));
84
85 MuonLayerSurface data(std::move(surface), sector, regionIndex, layer);
86 surfaces.push_back(std::move(data));
87
88
89 }
90 ATH_MSG_VERBOSE(" Total number of surfaces " << surfaces.size());
91 return true;
92 }
Amg::Transform3D getTranslateZ3D(const double Z)
: Returns a shift transformation along the z-axis
layers(flags, cells_name, *args, **kw)
Here we define wrapper functions to set up all of the standard corrections.

◆ muonLayerInterSections()

bool Muon::MuonSystemExtensionTool::muonLayerInterSections ( const EventContext & ctx,
const MuonCombined::TagBase & cmb_tag,
SystemExtensionCache & cache ) const
override

Get the proper surfaces for the intersections

The parameters are not muon paramaters or the parameters are before the entrance parameters

The track parameters belong the same surface. Do nothing

Check whether there're measurement parameters that are closer to the target surface

Definition at line 270 of file MuonSystemExtensionTool.cxx.

272 {
273
274 const Trk::Track* cmbTrk = cmbTag.primaryTrack();
275 if (!cmbTrk){
276 ATH_MSG_WARNING("A combined tag without any track? Please check "<<cmbTag.toString());
277 return false;
278 }
280 const Trk::TrackParameters* entryPars = cache.candidate->getCaloExtension()->muonEntryLayerIntersection();
281 std::vector<const Trk::TrackStateOnSurface*> cmbParVec{};
282
283 ATH_MSG_VERBOSE("Calo entry parameters "<<m_printer->print(*entryPars));
284 std::vector<MuonSystemExtension::Intersection> intersections{};
285 MuonLayerSurface lastSurf{};
286
287 const Trk::TrackStates::const_iterator end_itr = cmbTrk->trackStateOnSurfaces()->end();
288 for (Trk::TrackStates::const_iterator itr = cmbTrk->trackStateOnSurfaces()->begin(); itr != end_itr; ++itr) {
289 const Trk::TrackStateOnSurface* msTSOS{*itr};
290 ATH_MSG_VERBOSE("Track state "<<m_printer->print(*msTSOS));
291
292 if (!msTSOS->measurementOnTrack()) {
293 continue;
294 }
295 const Identifier measId = m_edmHelperSvc->getIdentifier(*msTSOS->measurementOnTrack());
296 const Trk::TrackParameters& msPars{*msTSOS->trackParameters()};
298 if (!m_idHelperSvc->isMuon(measId) || pathAlongPars(msPars, msPars.position() - entryPars->position())< 0.){
299 continue;
300 }
301
302
303 using namespace MuonStationIndex;
304 DetectorRegionIndex regionIdx = m_idHelperSvc->regionIndex(measId);
305 LayerIndex layerIdx = m_idHelperSvc->layerIndex(measId);
306 if (layerIdx == LayerIndex::BarrelExtended) {
307 regionIdx = DetectorRegionIndex::Barrel;
308 layerIdx = LayerIndex::Inner;
309 }
310
311 const int sector = m_sectorMapping.getSector(msTSOS->measurementOnTrack()->associatedSurface().center().phi());
312
314 if (lastSurf.layerIndex == layerIdx && lastSurf.regionIndex == regionIdx && lastSurf.sector == sector) {
315 continue;
316 }
317 const SurfaceVec& refSurfaces = m_referenceSurfaces[toInt(regionIdx)][sector - 1];
318 SurfaceVec::const_iterator surfItr = std::find_if(refSurfaces.begin(), refSurfaces.end(),
319 [&layerIdx](const MuonLayerSurface& surf){
320 return surf.layerIndex == layerIdx;
321 });
322 if (surfItr == refSurfaces.end()) {
323 ATH_MSG_WARNING("Failed to find a reference surface matching to combined parameters "<<m_printer->print(*msTSOS)
324 <<", sector: "<<sector <<", layer: "<<layerName(layerIdx)
325 <<", region index: "<<regionName(regionIdx));
326 continue;
327 }
328 lastSurf = (*surfItr);
329 const Trk::Surface& target{*lastSurf.surfacePtr};
330
332 for (Trk::TrackStates::const_iterator closePars = itr+1; closePars != end_itr; ++closePars) {
333 const Trk::TrackStateOnSurface * tsosInChamb{*closePars};
334 if (!tsosInChamb->measurementOnTrack()) continue;
335
336 const Trk::TrackParameters& chPars{*tsosInChamb->trackParameters()};
337 if (std::abs(pathAlongPars(chPars, chPars.position() - target.center())) >
338 std::abs(pathAlongPars(*msTSOS->trackParameters(),
339 msTSOS->trackParameters()->position() - target.center()))) {
340 break;
341 }
342 itr = closePars -1;
343 msTSOS = *itr;
344 }
345
346 std::unique_ptr<Trk::TrackParameters> exPars{m_extrapolator->extrapolate(ctx, *msTSOS->trackParameters(),
347 target, Trk::anyDirection, false, Trk::muon)};
348 if (!exPars) {
349 ATH_MSG_VERBOSE(__LINE__<<" - Failed to extrapolate track @ "<<m_printer->print(*msTSOS)
350 <<", sector: "<<sector <<", layer: "<<layerName(layerIdx)
351 <<", region index: "<<regionName(regionIdx) <<" to surface "<<std::endl<<target<<std::endl
352 <<", sector: "<<lastSurf.sector <<", layer: "<<layerName(lastSurf.layerIndex)
353 <<", region index: "<<regionName(lastSurf.regionIndex)
354 <<" pathAlongPars "<<pathAlongPars(*msTSOS->trackParameters(), target.center())
355 <<", dir: "<<Amg::toString(msTSOS->trackParameters()->momentum().unit()));
356 continue;
357 }
358 intersections.emplace_back(std::move(exPars), lastSurf);
359
360 }
361
362 ATH_MSG_VERBOSE("Selected "<<intersections.size()<<" intersections");
363
364 if (intersections.empty()) {
365 ATH_MSG_DEBUG("Failed to find the intersections for the combined track");
366 return false;
367 }
368 cache.candidate->setExtension(std::make_unique<MuonSystemExtension>(entryPars, std::move(intersections)));
369
370 return true;
371 }
#define ATH_MSG_WARNING(x)
DataModel_detail::const_iterator< DataVector > const_iterator
Definition DataVector.h:838
const_iterator end() const noexcept
Return a const_iterator pointing past the end of the collection.
const_iterator begin() const noexcept
Return a const_iterator pointing at the beginning of the collection.
ServiceHandle< IMuonEDMHelperSvc > m_edmHelperSvc
PublicToolHandle< MuonEDMPrinterTool > m_printer
virtual const Surface & associatedSurface() const =0
Interface method to get the associated Surface.
const Amg::Vector3D & momentum() const
Access method for the momentum.
const Amg::Vector3D & center() const
Returns the center position of the Surface.
const MeasurementBase * measurementOnTrack() const
returns MeasurementBase const overload
const TrackParameters * trackParameters() const
return ptr to trackparameters const overload
const Trk::TrackStates * trackStateOnSurfaces() const
return a pointer to a const DataVector of const TrackStateOnSurfaces.
@ anyDirection
ParametersBase< TrackParametersDim, Charged > TrackParameters

◆ muonSystemExtension()

bool Muon::MuonSystemExtensionTool::muonSystemExtension ( const EventContext & ctx,
SystemExtensionCache & cache ) const
override

get muon system extension

Get the calo extension

Definition at line 130 of file MuonSystemExtensionTool.cxx.

130 {
132 if (!cache.candidate->getCaloExtension()) {
133 if (!cache.extensionContainer) {
134 std::unique_ptr<Trk::CaloExtension> caloExtension =
135 m_caloExtensionTool->caloExtension(ctx, cache.candidate->indetTrackParticle());
136 if (!caloExtension || !caloExtension->muonEntryLayerIntersection()) {
137 ATH_MSG_VERBOSE("Failed to create the calo extension for "<<cache.candidate->toString());
138 return false;
139 }
140 cache.candidate->setExtension(caloExtension);
141 } else {
142 const Trk::CaloExtension* caloExtension = m_caloExtensionTool->caloExtension(cache.candidate->indetTrackParticle(),
143 *cache.extensionContainer);
144 if (!caloExtension || !caloExtension->muonEntryLayerIntersection()) {
145 ATH_MSG_VERBOSE("Failed to create the calo extension for "<<cache.candidate->toString());
146 return false;
147 }
148 cache.candidate->setExtension(caloExtension);
149 }
150 }
151
152 if (!cache.createSystemExtension) {
153 ATH_MSG_VERBOSE("No system extension is required for "<<cache.candidate->toString());
154 return true;
155 }
156 // get entry parameters, use it as current parameter for the extrapolation
157 const Trk::TrackParameters* currentPars = cache.candidate->getCaloExtension()->muonEntryLayerIntersection();
158
159 // get reference surfaces
160 ATH_MSG_VERBOSE(" getSurfacesForIntersection " << currentPars);
161 SurfaceVec surfaces = getSurfacesForIntersection(*currentPars, cache);
162
163 // store intersections
164 std::vector<MuonSystemExtension::Intersection> intersections;
165
166 // garbage collection
167 std::vector<std::shared_ptr<Trk::TrackParameters> > trackParametersVec;
168
169 // loop over reference surfaces
170 for (const MuonLayerSurface& it : surfaces) {
171 // extrapolate to next layer
172 const Trk::Surface& surface = *it.surfacePtr;
173 ATH_MSG_VERBOSE(" startPars: "<<m_printer->print(*currentPars));
174 ATH_MSG_VERBOSE(" destination: sector " << it.sector << " " << MuonStationIndex::regionName(it.regionIndex) << " "
175 << MuonStationIndex::layerName(it.layerIndex) << " phi " << surface.center().phi()
176 << " r " << surface.center().perp() << " z " << surface.center().z());
177
178 std::unique_ptr<Trk::TrackParameters> exPars{m_extrapolator->extrapolate(ctx, *currentPars, surface,
180 if (!exPars) {
181 ATH_MSG_VERBOSE("extrapolation failed, trying next layer ");
182 continue;
183 }
184 ATH_MSG_DEBUG("Extrapolated in event "<<ctx.eventID().event_number()<<" track @ "<<m_printer->print(*exPars));
185
186 // reject intersections with very big uncertainties (parallel to surface)
187 const double sigma_lx = Amg::error(*exPars->covariance(), Trk::locX);
188 const double sigma_ly = Amg::error(*exPars->covariance(), Trk::locY);
189 if (!Amg::hasPositiveDiagElems(*exPars->covariance()) || std::max(sigma_lx, sigma_ly) > 1. * Gaudi::Units::meter){
190 ATH_MSG_DEBUG("Reject bad extrapolation "<<m_printer->print(*exPars));
191 continue;
192 }
193
194 // create shared pointer and add to garbage collection
195 std::shared_ptr<Trk::TrackParameters> sharedPtr{std::move(exPars)};
196 trackParametersVec.emplace_back(sharedPtr);
197
198 intersections.emplace_back(sharedPtr, it);
199 constexpr double TenCm = 10. * Gaudi::Units::cm;
200 if(std::hypot(sigma_lx, sigma_ly) < std::max(TenCm, 10. * std::hypot(Amg::error(*currentPars->covariance(), Trk::locX),
201 Amg::error(*currentPars->covariance(), Trk::locY)))) {
202 // only update the parameters if errors don't blow up
203 currentPars = sharedPtr.get();
204 } else {
205 ATH_MSG_DEBUG("Extrapolation reached at "<<m_printer->print(*sharedPtr)<<" has larger uncertainties than "<<
206 m_printer->print(*currentPars));
207 }
208 }
209 ATH_MSG_DEBUG("Completed extrapolation: destinations " << surfaces.size() << " intersections " << intersections.size());
210 if (intersections.empty()){
211 ATH_MSG_DEBUG("No system extensions are made for "<<cache.candidate->toString()
212 <<" will accept the candidate: "<< (!cache.requireSystemExtension ? "si": "no"));
213 return !cache.requireSystemExtension;
214 }
215 cache.candidate->setExtension(std::make_unique<MuonSystemExtension>(cache.candidate->getCaloExtension()->muonEntryLayerIntersection(),
216 std::move(intersections)));
217 return true;
218 }
SurfaceVec getSurfacesForIntersection(const Trk::TrackParameters &muonEntryPars, const SystemExtensionCache &cache) const
get surfaces to be intersected for a given start parameters
const TrackParameters * muonEntryLayerIntersection() const
access to intersection with the muon entry layer return nullptr if the intersection failed
double error(const Amg::MatrixX &mat, int index)
return diagonal error of the matrix caller should ensure the matrix is symmetric and the index is in ...
bool hasPositiveDiagElems(const AmgSymMatrix(N) &mat)
Returns true if all diagonal elements of the covariance matrix are finite aka sane in the above defin...
@ alongMomentum
@ locY
local cartesian
Definition ParamDefs.h:38
@ locX
Definition ParamDefs.h:37

Member Data Documentation

◆ m_caloExtensionTool

ToolHandle<Trk::IParticleCaloExtensionTool> Muon::MuonSystemExtensionTool::m_caloExtensionTool
private
Initial value:
{
this,
"ParticleCaloExtensionTool",
"Trk::ParticleCaloExtensionTool/ParticleCaloExtensionTool",
}

Definition at line 58 of file MuonSystemExtensionTool.h.

58 {
59 this,
60 "ParticleCaloExtensionTool",
61 "Trk::ParticleCaloExtensionTool/ParticleCaloExtensionTool",
62 };

◆ m_edmHelperSvc

ServiceHandle<IMuonEDMHelperSvc> Muon::MuonSystemExtensionTool::m_edmHelperSvc
private
Initial value:
{this,"edmHelper","Muon::MuonEDMHelperSvc/MuonEDMHelperSvc",
"Handle to the service providing the IMuonEDMHelperSvc interface"}

Definition at line 69 of file MuonSystemExtensionTool.h.

69 {this,"edmHelper","Muon::MuonEDMHelperSvc/MuonEDMHelperSvc",
70 "Handle to the service providing the IMuonEDMHelperSvc interface"};

◆ m_extrapolator

ToolHandle<Trk::IExtrapolator> Muon::MuonSystemExtensionTool::m_extrapolator {this,"Extrapolator",""}
private

Definition at line 63 of file MuonSystemExtensionTool.h.

63{this,"Extrapolator",""};

◆ m_idHelperSvc

ServiceHandle<IMuonIdHelperSvc> Muon::MuonSystemExtensionTool::m_idHelperSvc {this, "MuonIdHelperSvc", "Muon::MuonIdHelperSvc/MuonIdHelperSvc"}
private

Definition at line 67 of file MuonSystemExtensionTool.h.

67{this, "MuonIdHelperSvc", "Muon::MuonIdHelperSvc/MuonIdHelperSvc"};

◆ m_printer

PublicToolHandle<MuonEDMPrinterTool> Muon::MuonSystemExtensionTool::m_printer {this, "Printer", "Muon::MuonEDMPrinterTool/MuonEDMPrinterTool"}
private

Definition at line 65 of file MuonSystemExtensionTool.h.

65{this, "Printer", "Muon::MuonEDMPrinterTool/MuonEDMPrinterTool"};

◆ m_referenceSurfaces

std::array<std::array<SurfaceVec, 16> , MuonStationIndex::toInt(DetRegIdx::DetectorRegionIndexMax)> Muon::MuonSystemExtensionTool::m_referenceSurfaces {}
private

Definition at line 75 of file MuonSystemExtensionTool.h.

75{};

◆ m_sectorMapping

MuonSectorMapping Muon::MuonSystemExtensionTool::m_sectorMapping
private

sector mapping helper

Definition at line 78 of file MuonSystemExtensionTool.h.


The documentation for this class was generated from the following files: