Loading [MathJax]/extensions/tex2jax.js
 |
ATLAS Offline Software
|
Go to the documentation of this file.
8 #include <GeoModelHelpers/TransformToStringConverter.h>
11 #include <GaudiKernel/SystemOfUnits.h>
16 #ifndef SIMULATIONBASE
18 # include "Acts/Surfaces/TrapezoidBounds.hpp"
19 # include "Acts/Surfaces/LineBounds.hpp"
20 # include "Acts/Surfaces/Surface.hpp"
28 ostr <<
" // Chamber half- length (min/max): "<<
pars.shortHalfX<<
"/"<<
pars.longHalfX
29 <<
", half-width "<<
pars.halfY<<
", height: "<<
pars.halfHeight;
30 ostr <<
" // Number of tube layers " <<
pars.tubeLayers.size()<< std::endl;
31 ostr <<
" // Tube pitch: " <<
pars.tubePitch
32 <<
" wall thickness: " <<
pars.tubeWall
33 <<
" inner radius: " <<
pars.tubeInnerRad
34 <<
" endplug: "<<
pars.endPlugLength
35 <<
" deadlength: "<<
pars.deadLength<< std::endl;
37 ostr <<
" // **** "<<
Amg::toString(
layer->tubeTransform(0).translation(), 2)<<std::endl;
41 MdtReadoutElement::~MdtReadoutElement() =
default;
44 m_pars{std::move(
args)} {
57 return StatusCode::FAILURE;
61 return StatusCode::FAILURE;
63 #ifndef SIMULATIONBASE
72 std::optional<Amg::Vector3D> prevLayPos{std::nullopt};
74 for (
unsigned int lay =1 ; lay <=
numLayers() ; ++lay) {
77 ATH_CHECK(insertTransform<MdtReadoutElement>(layHash));
78 #ifdef SIMULATIONBASE_REMOVEPLANESURFACE
83 std::optional<Amg::Vector3D> prevTubePos{std::nullopt};
90 prevTubePos = std::nullopt;
93 ATH_CHECK(insertTransform<MdtReadoutElement>(idHash));
94 #ifndef SIMULATIONBASE
100 if (std::abs(tubeRot.determinant()- 1.) > std::numeric_limits<float>::epsilon()){
101 ATH_MSG_FATAL(__FILE__<<
":"<<__LINE__<<
" Transformation matrix is not a pure rotation for "<<
104 return StatusCode::FAILURE;
111 const double dR = std::abs((tubePos - (*prevTubePos)).
z());
112 if (std::abs(dR -
tubePitch()) > pitchTolerance) {
113 ATH_MSG_FATAL(__FILE__<<
":"<<__LINE__<<
" Detected irregular tube in "<<
115 <<
". Expected tube pitch: "<<
tubePitch()<<
" measured tube pitch: "
118 return StatusCode::FAILURE;
121 if (prevLayPos &&
tube == 1) {
122 const double dR = (tubePos - (*prevLayPos)).
mag();
123 if (std::abs(dR -
tubePitch()) > pitchTolerance) {
124 ATH_MSG_FATAL(__FILE__<<
":"<<__LINE__<<
" Detected irregular layer pitch in "<<
126 <<
". Expected tube pitch: "<<
tubePitch()<<
" measured tube pitch: "
132 prevLayPos = std::make_optional<Amg::Vector3D>(tubePos);
134 prevTubePos = std::make_optional<Amg::Vector3D>(tubePos);
137 #ifndef SIMULATIONBASE
141 return StatusCode::SUCCESS;
145 const IdentifierHash&
hash)
const {
153 const IdentifierHash&
hash)
const {
158 const IdentifierHash&
hash)
const {
165 return zeroT.layerTransform();
171 return zeroT.tubeTransform(
tube);
177 return 2. * zeroT.tubeHalfLength(
tube);
183 return 2.*zeroT.uncutHalfLength(
tube);
192 const IdentifierHash& measHash,
213 getMaterialGeom()->getParent()->getX() *
214 getMaterialGeom()->getX();
222 return refEle->
asBuiltRefFrame()*(-0.5*( refEle->moduleThickness() *Amg::Vector3D::UnitX() +
223 (
stationEta() >0 || !
isBarrel() ? 1. : -1.)*refEle->moduleHeight() * Amg::Vector3D::UnitZ()));
225 #ifndef SIMULATIONBASE
227 const IdentifierHash& tubeHash,
237 const multilayer_t ml = (
multilayer() == 1) ? multilayer_t::ML1 : multilayer_t::ML2;
255 const int layer_delta = ml == multilayer_t::ML1 ?
numLayers() - tubeLayer : tubeLayer +1;
259 const double zpitch =
params.zpitch(ml,
side);
260 const double ypitch =
params.ypitch(ml,
side);
271 const double offset_stagg = 0.5 * zpitch * stagg * ( (layer_delta-1) % 2);
273 tube* zpitch + offset_stagg,
274 (layer_delta-1) * ypitch};
278 ATH_MSG_VERBOSE(
"Off set staggering "<<offset_stagg<<
", layer_delta: "<<layer_delta<<
", zpitch: "<<zpitch<<
", ypitch: "<<ypitch
279 <<
", xshift: "<<xshift);
282 reference_point.y() +
z0 + endPlug.y(),
283 reference_point.z() + y0 + endPlug.z());
299 const double chamberThickness)
const {
326 <<
moduleWidthL() <<
", height: "<<chamberHeight<<
", thickness: " <<chamberThickness <<
"." );
329 double s0mdt = localTubeEndPoint.x();
330 if (std::abs(fixedPoint.x()) > 0.01) {
331 s0mdt = localTubeEndPoint.x() - fixedPoint.x();
333 double z0mdt = localTubeEndPoint.y();
337 if (std::abs(fixedPoint.y()) > 0.01) {
338 z0mdt = localTubeEndPoint.y() - fixedPoint.y();
340 double t0mdt = localTubeEndPoint.z();
341 if (std::abs(fixedPoint.z()) > 0.01) {
342 t0mdt = localTubeEndPoint.z() - fixedPoint.z();
344 if (z0mdt < 0 || t0mdt < 0) {
345 ATH_MSG_WARNING(
""<<__func__<<
": correcting the local position of a point outside the mdt station (2 multilayers) volume -- RE "
347 <<
" fixedPoint " <<
Amg::toString(fixedPoint)<<
", z0mdt: "<<z0mdt<<
", t0mdt"<<t0mdt);
349 ATH_MSG_VERBOSE(
"** In "<<__func__<<
" - correct for offset of B-line fixed point " << s0mdt <<
" " << z0mdt <<
" " << t0mdt);
353 const double s_rel = s0mdt / (width_actual / 2.);
354 const double z_rel = (z0mdt - chamberHeight / 2.) / (chamberHeight / 2.);
355 const double t_rel = (t0mdt - chamberThickness / 2.) / (chamberThickness / 2.);
357 ATH_MSG_VERBOSE(
"** In "<<__func__<<
" - width_actual: "<<width_actual<<
", s_rel: "<<s_rel<<
", z_rel: "<<z_rel
358 <<
", t_rel:" << t_rel );
359 double ds{0.},dz{0.},
dt{0.};
363 double ztmp = z_rel * z_rel - 1;
371 dz += bline.
getParameter(Parameter::tw) * s_rel * t_rel * chamberThickness / chamberHeight;
391 const double ep = bline.
getParameter(Parameter::ep) * expansionScale;
393 const double phi = 0.5 * (ep +
en) * s_rel * s_rel + 0.5 * (ep -
en) * s_rel;
394 const double localDt = phi * (t0mdt - chamberThickness / 2.);
395 const double localDz = phi * (z0mdt - chamberHeight / 2.);
401 deformedPos[0] = localTubeEndPoint[0] +
ds;
402 deformedPos[1] = localTubeEndPoint[1] + dz;
403 deformedPos[2] = localTubeEndPoint[2] +
dt;
409 #ifdef SIMULATIONBASE
411 <<
"store address to make the compiler happy: "<<
store);
412 return Amg::Transform3D::Identity();
417 return Amg::Transform3D::Identity();
425 return Amg::Transform3D::Identity();
437 const double relSign = (
multilayer() == 1 ? -1. : 1.);
442 const double thickness = relSign*( (toAMDB* (modHalfThick*Amg::Vector3D::UnitX())) -
453 if (distortPars.asBuilt) {
459 if (distortPars.bLine) {
468 <<
", thickness: "<<
thickness<<
", height: "<<height);
472 positiveEnd = fromAMDB * positiveEnd;
473 negativeEnd = fromAMDB * negativeEnd;
474 positiveEndBline = fromAMDB * positiveEndBline;
475 negativeEndBline = fromAMDB * negativeEndBline;
485 const Amg::Vector3D new_direction = (positiveEndBline - negativeEndBline).
unit();
486 const Amg::Vector3D rotation_vector = old_direction.cross(new_direction);
489 if (rotation_vector.mag() > 10. * std::numeric_limits<double>::epsilon()) {
490 const Amg::AngleAxis3D wire_rotation(std::asin(rotation_vector.mag()), rotation_vector.unit());
491 deformedTransform = from_center * wire_rotation * to_center;
493 deformedTransform = from_center * to_center;
498 return deformedTransform;
The TransientConstSharedPtr allows non-const access if the pointer itself is non-const but in the con...
ActsTrk::SurfaceBoundSetPtr< Acts::LineBounds > tubeBounds
Sets of surface bounds which is shared amongst all readout elements used to assign the same bound obj...
Amg::Transform3D asBuiltRefFrame() const
Returns the transformation to go into the reference frame of the as-buit & b-line model starting from...
Amg::Vector3D localTubePos(const IdentifierHash &hash) const
Returns the tube position in the chamber coordinate frame (Not applying the B-line corrections)
std::set< IdentifierHash > removedTubes
List of tube places without tubes.
unsigned int numTubesInLay() const
Returns the number of tubes per layer.
const MdtReadoutElement * m_reOtherMl
Complementary readout element.
ActsTrk::SurfaceBoundSetPtr< Acts::TrapezoidBounds > layerBounds
std::vector< MdtTubeLayerPtr > tubeLayers
Vector defining the position of all tubes in each tube layer.
double tubeLength(const IdentifierHash &hash) const
bool isBarrel() const
States whether the chamber is built into the barrel or not.
double moduleThickness() const
Returns the thickness of the chamber.
static IdentifierHash measurementHash(unsigned int layerNumber, unsigned int tubeNumber)
Transform the layer and tube number to the measurementHash.
Amg::Transform3D toChamberLayer(const IdentifierHash &hash) const
Returns the transformation into the rest frame of the tube x-axis: Pointing towards the next layer y-...
The MuonReadoutElement is an abstract class representing the geometry representing the muon detector.
double activeTubeLength(const IdentifierHash &hash) const
Amg::Vector3D readOutPos(const ActsGeometryContext &ctx, const Identifier &measId) const
Returns the global position of the readout card.
multilayer_t
MDT multi-layer index.
StatusCode createGeoTransform()
Helper struct to retrieve the tube lengths and the tube centers directly from the GeoModel tree.
Amg::Transform3D globalToLocalTrans(const ActsGeometryContext &ctx) const
Transformations to translate between local <-> global coordinates.
float getParameter(const Parameter p) const
Returns a given parameter.
StatusCode initElement() override final
Element initialization.
#define ATH_MSG_VERBOSE(x)
#define AmgSymMatrix(dim)
double tubeRadius() const
Adds the thickness of the tube wall onto the radius.
double readoutSide
Is the readout chip at positive or negative Z?
Identifier measurementId(const IdentifierHash &measHash) const override final
Converts the measurement hash back to the full Identifier.
unsigned int multilayer() const
Returns the multi layer of the MdtReadoutElement.
Helper struct to cache simulatenously the As-built and the BLine corrections of the Mdts for fast acc...
double wireLength(const IdentifierHash &hash) const
static unsigned int layerNumber(const IdentifierHash &hash)
Transforms the identifier hash into a layer number ranging from (0-numLayers()-1)
double halfY
Length ~ number of tubes.
Amg::Transform3D getRotateX3D(double angle)
get a rotation transformation around X-axis
double uncutTubeLength(const IdentifierHash &tubeHash) const
Returns the uncut tube length.
Helper struct to store the pointer to the Mdt distrotion parameters, namely the As-built and the BLin...
static constexpr double expansionScale
std::string toString(const Translation3D &translation, int precision=4)
GeoPrimitvesToStringConverter.
The ReadoutGeomCnvAlg converts the Run4 Readout geometry build from the GeoModelXML into the legacy M...
parameterBook m_pars
defining parameter set
double moduleWidthS() const
Returns the length of the bottom edge of the chamber (short width)
Set of parameters to describe a MDT chamber.
const Muon::IMuonIdHelperSvc * idHelperSvc() const
Returns the pointer to the muonIdHelperSvc.
::StatusCode StatusCode
StatusCode definition for legacy code.
unsigned int numLayers() const
Returns the number of tube layer.
Eigen::Affine3d Transform3D
MsgStream & operator<<(MsgStream &out, const ActsUtils::Stat &stat)
Include the GeoPrimitives which need to be put first.
double innerTubeRadius() const
Returns the inner tube radius.
double moduleHeight() const
Returns the height of the chamber (Distance bottom - topWidth)
Identifier channelID(int stationName, int stationEta, int stationPhi, int multilayer, int tubeLayer, int tube) const
double distanceToReadout(const ActsGeometryContext &ctx, const Identifier &measId, const Amg::Vector3D &globPoint) const
Returns the distance along the wire from the readout card The distance is given as the delta z of the...
static IdentifierHash geoTransformHash()
Returns the hash that is associated with the surface cache holding the transformation that is placing...
const GeoAlignableTransform * alignableTransform() const
Returnsthe alignable transform of the readout element.
StatusCode strawSurfaceFactory(const IdentifierHash &hash, std::shared_ptr< Acts::LineBounds > lBounds)
Identifier identify() const override final
Return the athena identifier.
double tubePitch() const
Returns the pitch between 2 tubes in a layer.
Eigen::Matrix< double, 3, 1 > Vector3D
double tubePitch
Distance between 2 tubes in the layer.
double thickness() const override final
Overload from the Acts::DetectorElement (2 * halfheight)
static unsigned int tubeNumber(const IdentifierHash &hash)
Transforms the idenfier hash into a tube number ranging from (0- numTubesInLay()-1)
Amg::Vector3D bLineReferencePoint() const
Returns the fixed point of the B-line & as-bult defromation model expressed in the as-built frame.
double endPlugLength
Depth of the endplug into the active tube volume.
const MdtIdHelper & m_idHelper
Detector identifier helper to quickly extract the ID fields.
double shortHalfX
The chambers have either a rectangular or a trapezoidal shape to first approximation.
Container classifier the MDT as-built parameters See parameter description in http://atlas-muon-align...
StatusCode planeSurfaceFactory(const IdentifierHash &hash, std::shared_ptr< Acts::PlanarBounds > pBounds)
#define ATH_MSG_WARNING(x)
Amg::Transform3D fromIdealToDeformed(const IdentifierHash &tubeHash, const ActsTrk::DetectorAlignStore *store) const
Applies the B & as-built parameters.
void setComplementaryReadoutEle(const MdtReadoutElement *other)
Set the link to the second readout element inside the muon station.
const PlainObject unit() const
This is a plugin that makes Eigen look like CLHEP & defines some convenience methods.
const Amg::Transform3D & localToGlobalTrans(const ActsGeometryContext &ctx) const
Returns the local to global transformation into the ATLAS coordinate system.
Amg::Vector3D globalTubePos(const ActsGeometryContext &ctx, const Identifier &measId) const
Returns the global position of the tube center.
Eigen::AngleAxisd AngleAxis3D
The AlignStoreProviderAlg loads the rigid alignment corrections and pipes them through the readout ge...
int stationEta() const
Returns the stationEta (positive A site, negative O site)
const parameterBook & getParameters() const
Amg::Transform3D toTubeFrame(const IdentifierHash &hash) const
Returns the transformation into the rest frame of the tube x-axis: Pointing towards the next layer y-...
Amg::Vector3D highVoltPos(const ActsGeometryContext &ctx, const Identifier &measId) const
Returns the global position of the High Voltage connectors.
double moduleWidthL() const
Returns the length of the top edge of the chamber (top width)
Amg::Vector3D applyBlineCorrections(const BLinePar &bline, const Amg::Vector3D &localTubeEndPoint, const Amg::Vector3D &fixedPoint, const double thickness) const
Apply the B-line model correction to a tube endpoint.
Scalar mag() const
mag method
Amg::Vector3D wireEndpointAsBuilt(const MdtAsBuiltPar &asBuilt, const IdentifierHash &tubeHash, const Amg::Vector3D &nominalEnd, const tubeSide_t side) const
Amg::Transform3D getTranslate3D(const double X, const double Y, const double Z)
: Returns a shift transformation along an arbitrary axis