ATLAS Offline Software
Loading...
Searching...
No Matches
InDetDD::SiDetectorElement Class Referencefinal

Class to hold geometrical description of a silicon detector element. More...

#include <SiDetectorElement.h>

Inheritance diagram for InDetDD::SiDetectorElement:
Collaboration diagram for InDetDD::SiDetectorElement:

Public Member Functions

 SiDetectorElement (const Identifier &id, const SiDetectorDesign *design, const GeoVFullPhysVol *geophysvol, const SiCommonItems *commonItems, const GeoAlignmentStore *geoAlignStore=nullptr)
 Constructor with parameters.
virtual ~SiDetectorElement ()
 Destructor.
 SiDetectorElement ()=delete
 Don't allow no-argument constructor.
 SiDetectorElement (const SiDetectorElement &)=delete
 Don't allow copy constructor.
SiDetectorElementoperator= (const SiDetectorElement &)=delete
 Don't allow assignment operator.
 SiDetectorElement (SiDetectorElement &&)=delete
 Don't allow move constructor.
SiDetectorElementoperator= (SiDetectorElement &&)=delete
 Don't allow move assignment operator.
std::string detectorTypeString () const
 Returns a string of the Detector element type.
Navigation setters

Non-const methods.

These are inline methods and set neighbours.

void setNextInEta (const SiDetectorElement *element)
void setPrevInEta (const SiDetectorElement *element)
void setNextInPhi (const SiDetectorElement *element)
void setPrevInPhi (const SiDetectorElement *element)
void setOtherSide (const SiDetectorElement *element)
 For SCT only.
Navigation

Inline methods to access neighbours.

const SiDetectorElementnextInEta () const
const SiDetectorElementprevInEta () const
const SiDetectorElementnextInPhi () const
const SiDetectorElementprevInPhi () const
const SiDetectorElementotherSide () const
 Useful for SCT only.
Identification

Methods to identify the element and identifier manipulation.

bool isPixel () const
bool isSCT () const
bool isPLR () const
bool isDBM () const
bool isBarrel () const
bool isEndcap () const
bool isBlayer () const
bool isInnermostPixelLayer () const
bool isNextToInnermostPixelLayer () const
virtual Identifier identifierFromCellId (const SiCellId &cellId) const override final
 Identifier <-> SiCellId (ie strip number or pixel eta_index,phi_index) Identifier from SiCellId (ie strip number or pixel eta_index,phi_index)
virtual SiCellId cellIdFromIdentifier (const Identifier &identifier) const override final
 SiCellId from Identifier.
Surface
const std::vector< const Trk::Surface * > & surfaces () const
 Returns the full list of surfaces associated to this detector element.
Module Frame

Methods to help work with the module frame.

This is mainly of of use in the SCT where the module frame can in general be different from the element frame. It is actully defined as the frame of one of the sides (currently the axial side), but using these methods one does not need to make any assumptions about what the actual frame is. In the following methods the local element frame is the local reconstruction frame of this element.

const Amg::Transform3DmoduleTransform () const
 Module to global frame transform.
Amg::Transform3D defModuleTransform () const
 Default module to global frame transform, ie with no misalignment.
Amg::Transform3D localToModuleFrame (const Amg::Transform3D &localTransform) const
 Take a transform of the local element frame and return its equivalent in the module frame.
Amg::Transform3D localToModuleTransform () const
 Transformation from local element to module frame.
bool isModuleFrame () const
 Check if the element and module frame are the same.
Element Extent

Methods to get extent of element in r,phi and z.

virtual double get_rz () const override final
Angle
double sinTilt () const
 Compute sin(tilt angle) at a given position: at center.
double sinTilt (const Amg::Vector2D &localPos) const
 at given local position
double sinTilt (const Amg::Vector3D &globalPosition) const
 at given global position
double sinStereo () const
 Compute sin(stereo angle) at a given position: at center.
double sinStereo (const Amg::Vector2D &localPos) const
 at given local position
double sinStereo (const Amg::Vector3D &globalPosition) const
 at given global position
double sinStereoLocal (const Amg::Vector2D &localPos) const
 Angle of strip in local frame with respect to the etaAxis.
double sinStereoLocal (const Amg::Vector3D &globalPos) const
 See previous method.
bool isStereo () const
 Check if it is the stereo side (useful for SCT)
Design methods
virtual const SiDetectorDesigndesign () const override final
 access to the local description (inline):
double phiPitch () const
 Pitch (inline methods)
double phiPitch (const Amg::Vector2D &localPosition) const
 Useful for SCT Forward.
InDetDD::CarrierType carrierType () const
 carrier type for readout.
bool swapPhiReadoutDirection () const
 Determine if readout direction between online and offline needs swapping.
bool swapEtaReadoutDirection () const
 For eta_index (only relevant for pixel) (inline)
Intersection Tests
bool nearBondGap (const Amg::Vector2D &localPosition, double etaTol) const
 Test if near bond gap within tolerances.
bool nearBondGap (const Amg::Vector3D &globalPosition, double etaTol) const
SiCellId gangedCell (const SiCellId &cellId) const
 If cell is ganged return the id of the other cell which shares the readout for this cell, otherwise return an invalid id.
Miscellaneous
std::pair< Amg::Vector3D, Amg::Vector3DendsOfStrip (const Amg::Vector2D &position) const
 Special method for SCT to retrieve the two ends of a "strip" Returned coordinates are in global frame.
virtual Trk::DetectorElemType detectorType () const override final
 TrkDetElementBase interface detectorType.
Cache handling

Methods to handle invalidating and updating caches.

The cached values include values that are affected by alignment

void invalidate ()
 Signal that cached values are no longer valid.
Common items

Inline method

const SiCommonItemsgetCommonItems () const
Identification

Methods to identify the element and identifier manipulation.

virtual Identifier identify () const override final
 identifier of this detector element (inline)
virtual IdentifierHash identifyHash () const override final
 identifier hash (inline)
const AtlasDetectorIDgetIdHelper () const
 Returns the id helper (inline)
Surface
Trk::Surfacesurface ()
 Element Surface.
virtual const Trk::Surfacesurface () const override final
 Return surface associated with this detector element.
virtual const Trk::Surfacesurface (const Identifier &) const override final
 TrkDetElementBase interface (inline)
Transformation
const GeoTrf::Transform3D & transformHit () const
 Local (simulation/hit frame) to global transform.
const HepGeom::Transform3D & transformCLHEP () const
 Local (reconstruction frame) to global transform.
virtual const Amg::Transform3Dtransform () const override final
 Return local to global transform.
virtual const Amg::Transform3Dtransform (const Identifier &) const override final
 TrkDetElementBase interface (inline)
const HepGeom::Transform3D defTransformCLHEP () const
 Default Local (reconstruction frame) to global transform ie with no misalignment.
const Amg::Transform3D defTransform () const
const HepGeom::Transform3D recoToHitTransform () const
 Transform to go from local reconstruction frame to local hit frame.
Orientation
double hitDepthDirection () const
 Directions of hit depth,phi,eta axes relative to reconstruction local position axes (LocalPosition).
double hitPhiDirection () const
 See previous method.
double hitEtaDirection () const
 See previous method.
const HepGeom::Vector3D< double > & phiAxisCLHEP () const
 To determine if readout direction between online and offline needs swapping, see methods swapPhiReadoutDirection() and swapEtaReadoutDirection() below in "Readout Cell id" section.
const Amg::Vector3DphiAxis () const
const HepGeom::Vector3D< double > & etaAxisCLHEP () const
 Get reconstruction local eta axes in global frame.
const Amg::Vector3DetaAxis () const
virtual const Amg::Vector3Dnormal () const override final
 Get reconstruction local normal axes in global frame.
virtual const Amg::Vector3Dnormal (const Identifier &) const override final
 TrkDetElementBase interface (inline)
Position
virtual const Amg::Vector3Dcenter () const override final
 Center in global coordinates.
virtual const Amg::Vector3Dcenter (const Identifier &) const override final
 TrkDetElementBase interface (inline)
HepGeom::Point3D< double > globalPositionHit (const HepGeom::Point3D< double > &simulationLocalPos) const
 transform a hit local position into a global position (inline):
Amg::Vector3D globalPositionHit (const Amg::Vector3D &simulationLocalPos) const
HepGeom::Point3D< double > globalPosition (const HepGeom::Point3D< double > &localPos) const
 transform a reconstruction local position into a global position (inline):
Amg::Vector3D globalPosition (const Amg::Vector3D &localPos) const
Amg::Vector3D globalPosition (const Amg::Vector2D &localPos) const
 as in previous method but for 2D local position (inline)
Amg::Vector2D hitLocalToLocal (double xEta, double xPhi) const
 Simulation/Hit local frame to reconstruction local frame.
HepGeom::Point3D< double > hitLocalToLocal3D (const HepGeom::Point3D< double > &hitPosition) const
 Same as previuos method but 3D.
Amg::Vector2D localPosition (const HepGeom::Point3D< double > &globalPosition) const
 transform a global position into a 2D local position (reconstruction frame) (inline)
Amg::Vector2D localPosition (const Amg::Vector3D &globalPosition) const
Element Extent

Inline methods to get extent of element in r,phi and z.

double rMin () const
double rMax () const
double zMin () const
double zMax () const
double phiMin () const
double phiMax () const
void getEtaPhiRegion (double deltaZ, double &etaMin, double &etaMax, double &phiMin, double &phiMax, double &rz) const
 Method for building up region of interest table.
Design methods
virtual const Trk::SurfaceBoundsbounds () const override final
 Return the boundaries of the element.
virtual const Trk::SurfaceBoundsbounds (const Identifier &) const override final
 TrkDetElementBase interface (inline)
double width () const
 Methods from design (inline)
double minWidth () const
 Min width.
double maxWidth () const
 Max width.
double length () const
 Length in eta direction (z - barrel, r - endcap)
double thickness () const
double etaPitch () const
 Pitch (inline methods)
Intersection Tests
SiIntersect inDetector (const Amg::Vector2D &localPosition, double phiTol, double etaTol) const
 Test that it is in the active region.
SiIntersect inDetector (const Amg::Vector3D &globalPosition, double phiTol, double etaTol) const
Readout cell id

Cell id's are the strip number in SCT and phi_index,eta_index in the pixel as defined in the offline identifier.

Their direction runs in the distPhi, distEta direction in the Reconstruction local frame.

For methods taking a SiCellId (basically phi,eta index for pixel or strip for SCT) you can do the following fro example:

  • For pixel
    localPositionOfCell(SiCellId(phi_index,eta_index));
  • For SCT
    localPositionOfCell(SiCellId(strip));
Identifier identifierOfPosition (const Amg::Vector2D &localPos) const
 Full identifier of the cell for a given position: assumes a raw local position (no Lorentz shift)
SiCellId cellIdOfPosition (const Amg::Vector2D &localPos) const
 As in previous method but returns SiCellId.
Amg::Vector2D rawLocalPositionOfCell (const SiCellId &cellId) const
 Returns position (center) of cell.
Amg::Vector2D rawLocalPositionOfCell (const Identifier &id) const
 As above.
int numberOfConnectedCells (const SiCellId cellId) const
 Test if readout cell has more than one diode associated with it.
SiCellId connectedCell (const SiCellId cellId, int number) const
 Get the cell ids sharing the readout for this cell.
virtual void updateCache () const
 Recalculate cached values.
bool depthDirection () const
 Return information on orientation.
bool etaDirection () const
bool phiDirection () const
double depthAngle () const
double etaAngle () const
double phiAngle () const

Protected Attributes

Cache vector of surfaces.
CxxUtils::CachedValue< std::vector< const Trk::Surface * > > m_surfaces
Variables set by constructor
const SiDetectorDesignm_siDesign
Variables set by commonConstructor
bool m_isPixel {false}
bool m_isSCT {false}
bool m_isPLR {false}
bool m_isDBM {false}
bool m_isBarrel {false}
Variables set by individual setter methods
const SiDetectorElementm_nextInEta {nullptr}
const SiDetectorElementm_prevInEta {nullptr}
const SiDetectorElementm_nextInPhi {nullptr}
const SiDetectorElementm_prevInPhi {nullptr}
const SiDetectorElementm_otherSide {nullptr}
Variables set by constructor

Protected data:

Identifier m_id {}
 identifier of this detector element
const DetectorDesignm_design {nullptr}
 local description of this detector element
const SiCommonItemsm_commonItems {nullptr}
std::unique_ptr< Trk::Surfacem_surface
const GeoAlignmentStorem_geoAlignStore {}
DetectorDesign::Axis m_hitEta
 Axes.
DetectorDesign::Axis m_hitPhi
DetectorDesign::Axis m_hitDepth
Variables set by commonConstructor
IdentifierHash m_idHash {}
 hash id of this detector element
Variables set by updateCache and not invalidated.

Directions of axes.

These are true if the hit/simulation and reconstruction local frames are in the same direction and false if they are opposite.

CxxUtils::CachedValue< AxisDirm_axisDir
Variables set by updateCache
CxxUtils::CachedValue< CachedValsm_cache

Private Member Functions

Private Methods

Do not use locks.

void commonConstructor ()
 Common code for constructors.
bool determineStereo () const
 Find isStereo.
double sinStereoImpl () const
 Private implementation method with no lock at center.
double sinStereoImpl (const Amg::Vector3D &globalPosition) const
 Private implementation method with no lock at given global position.
Private Methods

Do not use locks.

void getExtent (CachedVals &cache) const
 Calculate extent in r,z and phi.
void getCorners (HepGeom::Point3D< double > *corners) const
 Return the four corners of an element in local coordinates.
void getEtaPhiPoint (const HepGeom::Point3D< double > &point, double deltaZ, double &etaMin, double &etaMax, double &phi) const
 Get eta and phi coresponding to a point in local coordinates.

Cache result of determineStereo().

CxxUtils::CachedValue< bool > m_isStereo
MsgStream & msg (MSG::Level lvl) const
 Declaring the Message method for further use (inline)
bool msgLvl (MSG::Level lvl) const
 Declaring the Method providing Verbosity Level (inline)

Detailed Description

Class to hold geometrical description of a silicon detector element.

A detector element is a module in the pixels and one side of a module in the SCT. This class is shared between the Pixel and SCT detector since there is a lot of commonality. It inherits frm ReadoutGeometryBase/SolidStateDetectorElement, which is also used for HGTD

Coordinate Frames.

The following coordinate frames are used in these elements.

  • Global frame:
    Currently global frame in G4/GeoModel. Probably eventually will be global frame most suitable for reconstruction (eg solenoid axis).
  • Local hit frame:
    Local frame for hits. It is the same as local frame in G4 and GeoModel. I also refer to this as the local simulation frame. By convention elements are orientated such that:
  • hitDepth = local x
  • hitPhi = local y
  • hitEta = local z

Directions of these correspond to the physical wafer. Consequently hitDepth and hitPhi axes go in different directions depending on the orientation of the module. The readout side is determined from design()->readoutSide().

  • Local reconstruction frame:
  • distPhi = local x
  • distEta = local y
  • distDepth = local z

The directions of the axes are defined as

  • distPhi in direction of increasing phi
  • distEta in direction of increasing z in barrel and increasing r in endcap.
  • distDepth (normal) choosen to give right-handed coordinate. => away from intersection point for barrel, decreasing z for endcap
Overview of Methods

Methods are grouped into the the following categories

  • Identification
  • Navigation
  • Module Frame
  • Element Extent
  • Design methods
  • Intersection Tests
  • Lorentz Correction
  • Readout cell id
  • Miscellaneous
Author
Grant Gorfine
  • modified & maintained: Nick Styles, Andreas Salzburger
  • modified Nigel Hessey: get directions from the design instead of hard-wiring them
Some notes on Thread safety for AthenaMT

The private methods of this class do not have locks.

The method updateCache of is of particular interest as it set all cache values.

The const methods call updateCache() when they need to perform lazy initialization

if (!m_cache.isValid()) updateCache();
virtual void updateCache() const
Recalculate cached values.

So as concurrent const operations are valid

  • and do not race with each other.

The non-const methods can set the state of the cache or the cache itself (invalidate methods etc)

Note: Synchronisation of creating SiDetElements for different events and accessing for each events can be done via write/read handles or similar EventContext aware framework machinery.

Definition at line 109 of file SiDetectorElement.h.

Constructor & Destructor Documentation

◆ SiDetectorElement() [1/4]

InDetDD::SiDetectorElement::SiDetectorElement ( const Identifier & id,
const SiDetectorDesign * design,
const GeoVFullPhysVol * geophysvol,
const SiCommonItems * commonItems,
const GeoAlignmentStore * geoAlignStore = nullptr )

Constructor with parameters.

Definition at line 38 of file SiDetectorElement.cxx.

42 :
43 SolidStateDetectorElementBase(id,design,geophysvol,commonItems,geoAlignStore),
45 {
47 }
virtual const SiDetectorDesign & design() const override final
access to the local description (inline):
void commonConstructor()
Common code for constructors.
const SiDetectorDesign * m_siDesign
SolidStateDetectorElementBase()=delete
Don't allow no-argument constructor.

◆ ~SiDetectorElement()

InDetDD::SiDetectorElement::~SiDetectorElement ( )
virtualdefault

Destructor.

◆ SiDetectorElement() [2/4]

InDetDD::SiDetectorElement::SiDetectorElement ( )
delete

Don't allow no-argument constructor.

◆ SiDetectorElement() [3/4]

InDetDD::SiDetectorElement::SiDetectorElement ( const SiDetectorElement & )
delete

Don't allow copy constructor.

◆ SiDetectorElement() [4/4]

InDetDD::SiDetectorElement::SiDetectorElement ( SiDetectorElement && )
delete

Don't allow move constructor.

Member Function Documentation

◆ bounds() [1/2]

const Trk::SurfaceBounds & InDetDD::SolidStateDetectorElementBase::bounds ( ) const
finaloverridevirtualinherited

Return the boundaries of the element.

Implements Trk::TrkDetElementBase.

Definition at line 198 of file SolidStateDetectorElementBase.cxx.

199 {
200 return m_design->bounds();
201 }
const DetectorDesign * m_design
local description of this detector element

◆ bounds() [2/2]

virtual const Trk::SurfaceBounds & InDetDD::SolidStateDetectorElementBase::bounds ( const Identifier & ) const
finaloverridevirtualinherited

TrkDetElementBase interface (inline)

Implements Trk::TrkDetElementBase.

◆ carrierType()

InDetDD::CarrierType InDetDD::SiDetectorElement::carrierType ( ) const

carrier type for readout.

ie holes for SCT and electrons for pixels. inline

◆ cellIdFromIdentifier()

SiCellId InDetDD::SiDetectorElement::cellIdFromIdentifier ( const Identifier & identifier) const
finaloverridevirtual

SiCellId from Identifier.

Implements InDetDD::SolidStateDetectorElementBase.

Definition at line 120 of file SiDetectorElement.cxx.

121 {
122 SiCellId cellId; // Initialized in invalid state.
123
124 // If something fails it returns the cellId in an invalid state.
125
126 if (identifier.is_valid()) {
127 const auto *const pAtlasHelper = getIdHelper();
128 if (isPixel() and pAtlasHelper->helper() == AtlasDetectorID::HelperType::Pixel) {
129 const auto *const pixelIdHelper = static_cast<const PixelID*>(pAtlasHelper);
130 cellId = SiCellId(pixelIdHelper->phi_index(identifier), pixelIdHelper->eta_index(identifier));
131 } else if (isSCT() and pAtlasHelper->helper() == AtlasDetectorID::HelperType::SCT) {
132 const SCT_ID* sctIdHelper = static_cast<const SCT_ID*>(pAtlasHelper);
133 //This adds some extra code for supporting rows,
134 //but this method is only used in validation-type code
135 //So should not add an overhead in normal running
136 //(although we perhaps still try to avoid this...)
137 int strip = sctIdHelper->strip(identifier);
138 int row = sctIdHelper->row(identifier);
139 if(row>0){
140 const auto &sctDesign = *static_cast<const SiDetectorDesign *>(m_siDesign);
141 int strip1D = sctDesign.strip1Dim(strip, row);
142 cellId = SiCellId(strip1D);
143 }else {
144 cellId = SiCellId(strip);
145 }
146
147 } else if (isPLR() and pAtlasHelper->helper() == AtlasDetectorID::HelperType::PLR) {
148 const PLR_ID* plrIdHelper = static_cast<const PLR_ID*>(pAtlasHelper);
149 cellId = SiCellId(plrIdHelper->phi_index(identifier), plrIdHelper->eta_index(identifier));
150 }
151 }
152
153 return cellId;
154 }
const AtlasDetectorID * getIdHelper() const
Returns the id helper (inline)
int eta_index(const Identifier &id) const
Definition PixelID.h:645
int phi_index(const Identifier &id) const
Definition PixelID.h:639
int row(const Identifier &id) const
Definition SCT_ID.h:711
int strip(const Identifier &id) const
Definition SCT_ID.h:717
row
Appending html table to final .html summary file.

◆ cellIdOfPosition()

SiCellId InDetDD::SolidStateDetectorElementBase::cellIdOfPosition ( const Amg::Vector2D & localPos) const
inherited

As in previous method but returns SiCellId.

Definition at line 224 of file SolidStateDetectorElementBase.cxx.

225 {
226 return m_design->cellIdOfPosition(localPosition);
227 }
Amg::Vector2D localPosition(const HepGeom::Point3D< double > &globalPosition) const
transform a global position into a 2D local position (reconstruction frame) (inline)

◆ center() [1/2]

virtual const Amg::Vector3D & InDetDD::SolidStateDetectorElementBase::center ( ) const
finaloverridevirtualinherited

Center in global coordinates.

Implements Trk::TrkDetElementBase.

◆ center() [2/2]

virtual const Amg::Vector3D & InDetDD::SolidStateDetectorElementBase::center ( const Identifier & ) const
finaloverridevirtualinherited

TrkDetElementBase interface (inline)

Implements Trk::TrkDetElementBase.

◆ commonConstructor()

void InDetDD::SiDetectorElement::commonConstructor ( )
private

Common code for constructors.

Definition at line 349 of file SiDetectorElement.cxx.

350 {
351 if (!m_id.is_valid()) throw std::runtime_error("SiDetectorElement: Invalid identifier");
352
353 // Set booleans for wether we are pixel/sct barrel/endcap
356 // we use is_lumi here instead of is_plr because is_plr is currently only setup
357 // for ExpandedIdentifiers and not Identifiers, which is what is needed here.
359 if (!m_isPixel && !m_isSCT && !m_isPLR) {
360 ATH_MSG_WARNING("Element id is not for pixel, SCT, or PLR");
361 }
362
363 // Set m_idHash. Also set m_isBarrel.
365 const PixelID* pixelId = static_cast<const PixelID*>(getIdHelper());
366 if (pixelId) {
367 m_isBarrel = pixelId->is_barrel(m_id);
368 m_idHash = pixelId->wafer_hash(m_id);
369
370 if (pixelId->is_dbm(m_id)) {
371 m_isBarrel = false;
372 m_isDBM = true;
373 }
374 }
375 } else if (isSCT() and getIdHelper()->helper() == AtlasDetectorID::HelperType::SCT) {
376 const SCT_ID* sctId = static_cast<const SCT_ID*>(getIdHelper());
377 if (sctId) {
378 m_isBarrel = sctId->is_barrel(m_id);
379 m_idHash = sctId->wafer_hash(m_id);
380 }
381 } else if (isPLR() and getIdHelper()->helper() == AtlasDetectorID::HelperType::PLR) {
382 const PLR_ID* plrId = static_cast<const PLR_ID*>(getIdHelper());
383 if (plrId) {
384 m_isBarrel = plrId->is_barrel(m_id);
385 m_idHash = plrId->wafer_hash(m_id);
386 }
387 }
388
389 if (!m_idHash.is_valid()) throw std::runtime_error("SiDetectorElement: Unable to set IdentifierHash");
390
391 // Set surface
392 m_surface = std::make_unique<Trk::PlaneSurface>(*this);
393
394 }
#define ATH_MSG_WARNING(x)
bool is_sct(Identifier id) const
bool is_pixel(Identifier id) const
bool is_lumi(Identifier id) const
IdentifierHash m_idHash
hash id of this detector element
Identifier m_id
identifier of this detector element
bool is_dbm(const Identifier &id) const
Test for dbm - WARNING: id MUST be pixel id, otherwise answer is not accurate. Use SiliconID for gene...
Definition PixelID.h:593
IdentifierHash wafer_hash(Identifier wafer_id) const
wafer hash from id
Definition PixelID.h:383
bool is_barrel(const Identifier &id) const
Test for barrel - WARNING: id MUST be pixel id, otherwise answer is not accurate. Use SiliconID for g...
Definition PixelID.h:586
IdentifierHash wafer_hash(const Identifier &wafer_id) const
wafer hash from id - optimized
Definition SCT_ID.h:487
bool is_barrel(const Identifier &id) const
Test for barrel - WARNING: id MUST be sct id, otherwise answer is not accurate. Use SiliconID for gen...
Definition SCT_ID.h:674

◆ connectedCell()

SiCellId InDetDD::SolidStateDetectorElementBase::connectedCell ( const SiCellId cellId,
int number ) const
inherited

Get the cell ids sharing the readout for this cell.

number = 0 will return the primary readout cell id.

Definition at line 250 of file SolidStateDetectorElementBase.cxx.

251 {
252 SiReadoutCellId readoutId = m_design->readoutIdOfCell(cellId);
253 return m_design->connectedCell(readoutId, number);
254 }
std::string number(const double &d, const std::string &s)
Definition utils.cxx:186

◆ defModuleTransform()

Amg::Transform3D InDetDD::SiDetectorElement::defModuleTransform ( ) const

Default module to global frame transform, ie with no misalignment.

The module frame is defined to be the local reconstruction frame of the axial layer in the SCT. For the pixel it is the same as the element.

Definition at line 179 of file SiDetectorElement.cxx.

180 {
182 }
const SiDetectorElement * m_otherSide
bool isModuleFrame() const
Check if the element and module frame are the same.

◆ defTransform()

const Amg::Transform3D InDetDD::SolidStateDetectorElementBase::defTransform ( ) const
inherited

Definition at line 60 of file SolidStateDetectorElementBase.cxx.

61 {
62 HepGeom::Transform3D tmpTransform = defTransformCLHEP();
63 return Amg::CLHEPTransformToEigen(tmpTransform);
64 }
const HepGeom::Transform3D defTransformCLHEP() const
Default Local (reconstruction frame) to global transform ie with no misalignment.
Amg::Transform3D CLHEPTransformToEigen(const HepGeom::Transform3D &CLHEPtransf)
Converts a CLHEP-based HepGeom::Transform3D into an Eigen Amg::Transform3D.

◆ defTransformCLHEP()

const HepGeom::Transform3D InDetDD::SolidStateDetectorElementBase::defTransformCLHEP ( ) const
inherited

Default Local (reconstruction frame) to global transform ie with no misalignment.

Definition at line 50 of file SolidStateDetectorElementBase.cxx.

51 {
52 if (m_geoAlignStore) {
53 const GeoTrf::Transform3D* ptrXf = m_geoAlignStore->getDefAbsPosition(getMaterialGeom());
54 if (ptrXf) return Amg::EigenTransformToCLHEP(*ptrXf) * recoToHitTransform();
55 }
56 return Amg::EigenTransformToCLHEP(getMaterialGeom()->getDefAbsoluteTransform()) * recoToHitTransform();
57 }
const HepGeom::Transform3D recoToHitTransform() const
Transform to go from local reconstruction frame to local hit frame.
HepGeom::Transform3D EigenTransformToCLHEP(const Amg::Transform3D &eigenTransf)
Converts an Eigen-based Amg::Transform3D into a CLHEP-based HepGeom::Transform3D.

◆ depthAngle()

double InDetDD::SolidStateDetectorElementBase::depthAngle ( ) const
inherited

◆ depthDirection()

bool InDetDD::SolidStateDetectorElementBase::depthDirection ( ) const
inherited

Return information on orientation.

◆ design()

virtual const SiDetectorDesign & InDetDD::SiDetectorElement::design ( ) const
finaloverridevirtual

access to the local description (inline):

Reimplemented from InDetDD::SolidStateDetectorElementBase.

◆ detectorType()

virtual Trk::DetectorElemType InDetDD::SiDetectorElement::detectorType ( ) const
finaloverridevirtual

TrkDetElementBase interface detectorType.

Reimplemented from InDetDD::SolidStateDetectorElementBase.

◆ detectorTypeString()

std::string Trk::TrkDetElementBase::detectorTypeString ( ) const
inherited

Returns a string of the Detector element type.

Definition at line 10 of file TrkDetElementBase.cxx.

10 {
11 auto type = detectorType();
13 return "SolidState";
14 else if (type == Trk::DetectorElemType::Silicon)
15 return "Silicon";
16 else if (type == Trk::DetectorElemType::TRT)
17 return "TRT";
18 else if (type == Trk::DetectorElemType::Csc)
19 return "Csc";
20 else if (type == Trk::DetectorElemType::Mdt)
21 return "Mdt";
22 else if (type == Trk::DetectorElemType::Rpc)
23 return "Rpc";
24 else if (type == Trk::DetectorElemType::Tgc)
25 return "Tgc";
26 else if (type == Trk::DetectorElemType::sTgc)
27 return "sTgc";
28 else if (type == Trk::DetectorElemType::MM)
29 return "Mm";
30 return "Unknown";
31}
virtual DetectorElemType detectorType() const =0
Return the Detector element type.

◆ determineStereo()

bool InDetDD::SiDetectorElement::determineStereo ( ) const
private

Find isStereo.

Definition at line 397 of file SiDetectorElement.cxx.

398 {
400 double sinStereoThis = std::abs(sinStereoImpl()); // Call the private impl method
401 double sinStereoOther = std::abs(m_otherSide->sinStereo());
402 if (std::abs(sinStereoThis - sinStereoOther) < 1e-5) {
403 // If they happen to be equal then set side0 as axial and side1 as stereo.
404 const SCT_ID* sctId = static_cast<const SCT_ID*>(getIdHelper());
405 if (sctId) {
406 int side = sctId->side(m_id);
407 return (side == 1);
408 }
409 } else {
410 // set the stereo side as the one with largest absolute sinStereo.
411 return (sinStereoThis > sinStereoOther);
412 }
413 }
414
415 return false;
416 }
double sinStereoImpl() const
Private implementation method with no lock at center.
int side(const Identifier &id) const
Definition SCT_ID.h:705

◆ endsOfStrip()

std::pair< Amg::Vector3D, Amg::Vector3D > InDetDD::SiDetectorElement::endsOfStrip ( const Amg::Vector2D & position) const

Special method for SCT to retrieve the two ends of a "strip" Returned coordinates are in global frame.

Definition at line 339 of file SiDetectorElement.cxx.

340 {
341 //again with the casting...
342 const std::pair<Amg::Vector2D,Amg::Vector2D> localEnds=
343 static_cast<const SiDetectorDesign *>(m_siDesign)->endsOfStrip(position);
344 return std::pair<Amg::Vector3D,Amg::Vector3D >(globalPosition(localEnds.first),
345 globalPosition(localEnds.second));
346 }
std::pair< Amg::Vector3D, Amg::Vector3D > endsOfStrip(const Amg::Vector2D &position) const
Special method for SCT to retrieve the two ends of a "strip" Returned coordinates are in global frame...
HepGeom::Point3D< double > globalPosition(const HepGeom::Point3D< double > &localPos) const
transform a reconstruction local position into a global position (inline):

◆ etaAngle()

double InDetDD::SolidStateDetectorElementBase::etaAngle ( ) const
inherited

◆ etaAxis()

const Amg::Vector3D & InDetDD::SolidStateDetectorElementBase::etaAxis ( ) const
inherited

Definition at line 88 of file SolidStateDetectorElementBase.cxx.

89 {
90 if (!m_cache.isValid()) updateCache();
91 return m_cache.ptr()->m_etaAxis;
92 }

◆ etaAxisCLHEP()

const HepGeom::Vector3D< double > & InDetDD::SolidStateDetectorElementBase::etaAxisCLHEP ( ) const
inherited

Get reconstruction local eta axes in global frame.

In direction of increasing z in the barrel and increasing r in the endcap.

Definition at line 81 of file SolidStateDetectorElementBase.cxx.

82 {
83 if (!m_cache.isValid()) updateCache();
84 return m_cache.ptr()->m_etaAxisCLHEP;
85 }

◆ etaDirection()

bool InDetDD::SolidStateDetectorElementBase::etaDirection ( ) const
inherited

◆ etaPitch()

double InDetDD::SolidStateDetectorElementBase::etaPitch ( ) const
inherited

Pitch (inline methods)

NOTE: phiPitch is ambiguous for the Forward SCT where it varies along the strip.
etaPitch is ambiguous for the pixel which has long pixels between FE chips.
For these cases:

phiPitch: For SCT Forward returns pitch at center.
etaPitch: For pixel returns average pitch. (Active_length/number_of_cells)
All return pitch in distance units.

◆ gangedCell()

SiCellId InDetDD::SiDetectorElement::gangedCell ( const SiCellId & cellId) const

If cell is ganged return the id of the other cell which shares the readout for this cell, otherwise return an invalid id.

This is a more convenient (and slightly faster) alternative than using the above two methods. Only relevant for pixel. For SCT always returns an invalid ID. (inline)

◆ get_rz()

double InDetDD::SiDetectorElement::get_rz ( ) const
finaloverridevirtual

Implements InDetDD::SolidStateDetectorElementBase.

Definition at line 309 of file SiDetectorElement.cxx.

310 {
311 // Calculate rz = r (barrel) or z (endcap)
312 // Use center of sensor ((0,0,0) in local coordinates) for determining this.
313 // HepGeom::Point3D<double> globalCenter = globalPosition(HepGeom::Point3D<double>(0,0,0));
314 if (isBarrel()) {
315 return center().perp(); // r
316 } else {
317 return center().z(); // z
318 }
319 }
virtual const Amg::Vector3D & center() const override final
Center in global coordinates.

◆ getCommonItems()

const SiCommonItems * InDetDD::SolidStateDetectorElementBase::getCommonItems ( ) const
inherited

◆ getCorners()

void InDetDD::SolidStateDetectorElementBase::getCorners ( HepGeom::Point3D< double > * corners) const
privateinherited

Return the four corners of an element in local coordinates.

Pass it an array of length 4. This function is used by getEtaPhiRegion()

Definition at line 551 of file SolidStateDetectorElementBase.cxx.

552 {
553 // This makes the assumption that the forward SCT detectors are orientated such that
554 // the positive etaAxis corresponds to the top of the detector where the width is largest.
555 // This is currently always the case.
556 // For the SCT barrel and pixel detectors minWidth and maxWidth are the same and so should
557 // work for all orientations.
558
559 double tmpMinWidth = minWidth();
560 double tmpMaxWidth = maxWidth();
561 double tmpLength = length();
562
563 // Lower left
564 corners[0][distPhi] = -0.5 * tmpMinWidth;
565 corners[0][distEta] = -0.5 * tmpLength;
566 corners[0][distDepth] = 0.;
567
568 // Lower right
569 corners[1][distPhi] = 0.5 * tmpMinWidth;
570 corners[1][distEta] = -0.5 * tmpLength;
571 corners[1][distDepth] = 0.;
572
573 // Upper Right
574 corners[2][distPhi] = 0.5 * tmpMaxWidth;
575 corners[2][distEta] = 0.5 * tmpLength;
576 corners[2][distDepth] = 0.;
577
578 // Upper left
579 corners[3][distPhi] = -0.5 * tmpMaxWidth;
580 corners[3][distEta] = 0.5 * tmpLength;
581 corners[3][distDepth] = 0.;
582 }
double length() const
Length in eta direction (z - barrel, r - endcap)
double maxWidth() const
Max width.
double minWidth() const
Min width.
@ distEta
readout for silicon
Definition ParamDefs.h:51
@ distPhi
Definition ParamDefs.h:50

◆ getEtaPhiPoint()

void InDetDD::SolidStateDetectorElementBase::getEtaPhiPoint ( const HepGeom::Point3D< double > & point,
double deltaZ,
double & etaMin,
double & etaMax,
double & phi ) const
privateinherited

Get eta and phi coresponding to a point in local coordinates.

Requires as input the vertex spread. Returns etaMin, etaMax, and phi. This function is used by getEtaPhiRegion()

Definition at line 589 of file SolidStateDetectorElementBase.cxx.

591 {
592 // Get the point in global coordinates.
593 HepGeom::Point3D<double> globalPoint = globalPosition(point);
594
595 double r = globalPoint.perp();
596 double z = globalPoint.z();
597
598 double thetaMin = std::atan2(r,(z + deltaZ));
599 etaMax = -std::log(tan(0.5 * thetaMin));
600 double thetaMax = std::atan2(r,(z - deltaZ));
601 etaMin = -std::log(tan(0.5 * thetaMax));
602
603 phi = globalPoint.phi();
604 }
Scalar phi() const
phi method
#define z
int r
Definition globals.cxx:22

◆ getEtaPhiRegion()

void InDetDD::SolidStateDetectorElementBase::getEtaPhiRegion ( double deltaZ,
double & etaMin,
double & etaMax,
double & phiMin,
double & phiMax,
double & rz ) const
inherited

Method for building up region of interest table.

Get eta/phi extent for the element. Returns min/max eta and phi and r (for barrel) or z (for endcap) Takes as input the vertex spread in z (-deltaZ to +deltaZ)

Definition at line 140 of file SolidStateDetectorElementBase.cxx.

142 {
143 HepGeom::Point3D<double> corners[4];
144 getCorners(corners);
145
146 bool first = true;
147
148 double phiOffset = 0.;
149
150 for (auto & corner : corners) {
151 double etaMinPoint = 0.;
152 double etaMaxPoint = 0.;
153 double phiPoint = 0.;
154
155 // Get the eta phi value for this corner.
156 getEtaPhiPoint(corner, deltaZ, etaMinPoint, etaMaxPoint, phiPoint);
157
158 if (first) { // Use the first point to initialize the min/max values.
159
160 // Put phi in a range so that we are not near -180/+180 division.
161 // Do this by adding an offset if phi > 90 CLHEP::deg or < -90 CLHEP::deg.
162 // This offset is later removed.
163 if (phiPoint < -0.5 * M_PI) {
164 phiOffset = -0.5 * M_PI;
165 } else if (phiPoint > 0.5 * M_PI) {
166 phiOffset = 0.5 * M_PI;
167 }
168 phiMin = phiMax = phiPoint - phiOffset;
169 etaMin = etaMinPoint;
170 etaMax = etaMaxPoint;
171 } else {
172 phiPoint -= phiOffset;
173 // put phi back in -M_PI < phi < +M_PI range
174 if (phiPoint < -M_PI) phiPoint += 2. * M_PI;
175 if (phiPoint > M_PI) phiPoint -= 2. * M_PI;
176 phiMin = std::min(phiMin, phiPoint);
177 phiMax = std::max(phiMax, phiPoint);
178 etaMin = std::min(etaMin, etaMinPoint);
179 etaMax = std::max(etaMax, etaMaxPoint);
180 }
181 first = false;
182 }
183
184 // put phi back in -M_PI < phi < +M_PI range
185 phiMin += phiOffset;
186 phiMax += phiOffset;
187 if (phiMin < -M_PI) phiMin += 2. * M_PI;
188 if (phiMin > M_PI) phiMin -= 2. * M_PI;
189 if (phiMax < -M_PI) phiMax += 2. * M_PI;
190 if (phiMax > M_PI) phiMax -= 2. * M_PI;
191 //does it make sense having this if the below is pure virtual for this base class?
192 //Should this just be postponed to the derived classes?
193 rz = get_rz();
194
195 }
#define M_PI
static Double_t rz
void getCorners(HepGeom::Point3D< double > *corners) const
Return the four corners of an element in local coordinates.
virtual double get_rz() const =0
void getEtaPhiPoint(const HepGeom::Point3D< double > &point, double deltaZ, double &etaMin, double &etaMax, double &phi) const
Get eta and phi coresponding to a point in local coordinates.
bool first
Definition DeMoScan.py:534

◆ getExtent()

void InDetDD::SolidStateDetectorElementBase::getExtent ( CachedVals & cache) const
privateinherited

Calculate extent in r,z and phi.

The values are cached and there are rMin(), rMax etc methods. It is only used from updateCache

Definition at line 483 of file SolidStateDetectorElementBase.cxx.

484 {
485 Amg::Vector3D sensorCenter = m_design->sensorCenter();
486 double radialShift = sensorCenter[0];//in sensor frame, x is radius
487
488 HepGeom::Point3D<double> corners[4];
489 getCorners(corners);
490
491 bool first = true;
492
493 double phiOffset = 0.;
494
495
496 const HepGeom::Transform3D rShift = HepGeom::TranslateY3D(radialShift);//in local frame, radius is y=distEta
497
498 for (auto & corner : corners) {
499
500 corner.transform(rShift);
501
502 // m_tranform is already there as part of the cache construction
503 // This method seems to be used only as a helper for updateCache
504 HepGeom::Point3D<double> globalPoint = cache.m_transformCLHEP * corner;
505
506 double rPoint = globalPoint.perp();
507 double zPoint = globalPoint.z();
508 double phiPoint = globalPoint.phi();
509
510 // Use first point to initializa min/max values.
511 if (first) {
512
513 // Put phi in a range so that we are not near -180/+180 division.
514 // Do this by adding an offset if phi > 90 CLHEP::deg or < -90 CLHEP::deg.
515 // This offset is later removed.
516 if (phiPoint < -0.5 * M_PI) {
517 phiOffset = -0.5 * M_PI;
518 } else if (phiPoint > 0.5 * M_PI) {
519 phiOffset = 0.5 * M_PI;
520 }
521 cache.m_minPhi = cache.m_maxPhi = phiPoint - phiOffset;
522 cache.m_minR = cache.m_maxR = rPoint;
523 cache.m_minZ = cache.m_maxZ = zPoint;
524
525 } else {
526 phiPoint -= phiOffset;
527 // put phi back in -M_PI < phi < +M_PI range
528 if (phiPoint < -M_PI) phiPoint += 2. * M_PI;
529 if (phiPoint > M_PI) phiPoint -= 2. * M_PI;
530 cache.m_minPhi = std::min(cache.m_minPhi, phiPoint);
531 cache.m_maxPhi = std::max(cache.m_maxPhi, phiPoint);
532 cache.m_minR = std::min(cache.m_minR, rPoint);
533 cache.m_maxR = std::max(cache.m_maxR, rPoint);
534 cache.m_minZ = std::min(cache.m_minZ, zPoint);
535 cache.m_maxZ = std::max(cache.m_maxZ, zPoint);
536 }
537 first = false;
538 }
539
540 // put phi back in -M_PI < phi < +M_PI range
541 cache.m_minPhi += phiOffset;
542 cache.m_maxPhi += phiOffset;
543 if (cache.m_minPhi < -M_PI) cache.m_minPhi += 2. * M_PI;
544 if (cache.m_minPhi > M_PI) cache.m_minPhi -= 2. * M_PI;
545 if (cache.m_maxPhi < -M_PI) cache.m_maxPhi += 2. * M_PI;
546 if (cache.m_maxPhi > M_PI) cache.m_maxPhi -= 2. * M_PI;
547
548 }
Eigen::Matrix< double, 3, 1 > Vector3D

◆ getIdHelper()

const AtlasDetectorID * InDetDD::SolidStateDetectorElementBase::getIdHelper ( ) const
inherited

Returns the id helper (inline)

◆ globalPosition() [1/3]

Amg::Vector3D InDetDD::SolidStateDetectorElementBase::globalPosition ( const Amg::Vector2D & localPos) const
inherited

as in previous method but for 2D local position (inline)

◆ globalPosition() [2/3]

Amg::Vector3D InDetDD::SolidStateDetectorElementBase::globalPosition ( const Amg::Vector3D & localPos) const
inherited

◆ globalPosition() [3/3]

HepGeom::Point3D< double > InDetDD::SolidStateDetectorElementBase::globalPosition ( const HepGeom::Point3D< double > & localPos) const
inherited

transform a reconstruction local position into a global position (inline):

◆ globalPositionHit() [1/2]

Amg::Vector3D InDetDD::SolidStateDetectorElementBase::globalPositionHit ( const Amg::Vector3D & simulationLocalPos) const
inherited

◆ globalPositionHit() [2/2]

HepGeom::Point3D< double > InDetDD::SolidStateDetectorElementBase::globalPositionHit ( const HepGeom::Point3D< double > & simulationLocalPos) const
inherited

transform a hit local position into a global position (inline):

◆ hitDepthDirection()

double InDetDD::SolidStateDetectorElementBase::hitDepthDirection ( ) const
inherited

Directions of hit depth,phi,eta axes relative to reconstruction local position axes (LocalPosition).

Returns +/-1. inline

◆ hitEtaDirection()

double InDetDD::SolidStateDetectorElementBase::hitEtaDirection ( ) const
inherited

See previous method.

inline

◆ hitLocalToLocal()

Amg::Vector2D InDetDD::SolidStateDetectorElementBase::hitLocalToLocal ( double xEta,
double xPhi ) const
inherited

Simulation/Hit local frame to reconstruction local frame.

2D. TODO: Will change order of parameters at some point.

Definition at line 95 of file SolidStateDetectorElementBase.cxx.

96 { // due to whether module is centred on
97 if (!m_axisDir.isValid()) updateCache(); // z or y axes
98 const AxisDir& dir = *m_axisDir.ptr();
99
100 if (!dir.m_etaDirection) xEta = -xEta;
101 if (!dir.m_phiDirection) xPhi = -xPhi;
102 auto result = Amg::Vector2D(xPhi, xEta);
103
104 if (m_design->shape() == InDetDD::PolarAnnulus) { // Do conversion to polar co-ords as well
105 double y = result.x(); // Co-ordinate flip from cartesian needs to be temporarily un-done to
106 double x = result.y(); // allow atan2 to work in conversion
107
108 double r = std::hypot(x,y);
109 double phi = std::atan2(y,x);
110 result = Amg::Vector2D(phi,r); // now flip again
111 }
112
113 return result;
114 }
#define y
#define x
Eigen::Matrix< double, 2, 1 > Vector2D

◆ hitLocalToLocal3D()

HepGeom::Point3D< double > InDetDD::SolidStateDetectorElementBase::hitLocalToLocal3D ( const HepGeom::Point3D< double > & hitPosition) const
inherited

Same as previuos method but 3D.

Definition at line 117 of file SolidStateDetectorElementBase.cxx.

118 {
119 // Equiv to transform().inverse * transformHit() * hitPosition
120 if (!m_axisDir.isValid()) updateCache();
121 const AxisDir& dir = *m_axisDir.ptr();
122
123 double xDepth = hitPosition[m_hitDepth];
124 double xPhi = hitPosition[m_hitPhi];
125 double xEta = hitPosition[m_hitEta];
126 if (!dir.m_depthDirection) xDepth = -xDepth;
127 if (!dir.m_phiDirection) xPhi = -xPhi;
128 if (!dir.m_etaDirection) xEta = -xEta;
129 return {xPhi, xEta, xDepth};
130 }

◆ hitPhiDirection()

double InDetDD::SolidStateDetectorElementBase::hitPhiDirection ( ) const
inherited

See previous method.

inline

◆ identifierFromCellId()

Identifier InDetDD::SiDetectorElement::identifierFromCellId ( const SiCellId & cellId) const
finaloverridevirtual

Identifier <-> SiCellId (ie strip number or pixel eta_index,phi_index) Identifier from SiCellId (ie strip number or pixel eta_index,phi_index)

Implements InDetDD::SolidStateDetectorElementBase.

Definition at line 89 of file SiDetectorElement.cxx.

90 {
91 Identifier id; // Will be initialized in an invalid state.
92
93 // If something fails it returns the id in an invalid state.
94
95 if (cellId.isValid()) {
96 const auto *const pAtlasHelper = getIdHelper();
97 if (isPixel()) {
98 if (pAtlasHelper->helper() == AtlasDetectorID::HelperType::Pixel) {
99 const PixelID* pixelIdHelper = static_cast<const PixelID*>(pAtlasHelper);
100 id = pixelIdHelper->pixel_id(m_id, cellId.phiIndex(), cellId.etaIndex());
101 }
102 } else if (isSCT()) {
103
104 if (pAtlasHelper->helper() == AtlasDetectorID::HelperType::SCT) {
105 const SCT_ID* sctIdHelper = static_cast<const SCT_ID*>(pAtlasHelper);
106 id = sctIdHelper->strip_id(m_id, cellId.strip());
107 }
108 } else if (isPLR()) {
109 if (pAtlasHelper->helper() == AtlasDetectorID::HelperType::PLR) {
110 const PLR_ID* plrIdHelper = static_cast<const PLR_ID*>(pAtlasHelper);
111 id = plrIdHelper->pixel_id(m_id, cellId.phiIndex(), cellId.etaIndex());
112 }
113 }
114 }
115
116 return id;
117 }
Identifier pixel_id(int barrel_ec, int layer_disk, int phi_module, int eta_module, int phi_index, int eta_index) const
For an individual pixel.
Definition PixelID.h:428
Identifier strip_id(int barrel_ec, int layer_disk, int phi_module, int eta_module, int side, int strip) const
For an individual strip.
Definition SCT_ID.h:530
int strip() const
Get strip number. Equivalent to phiIndex().
Definition SiCellId.h:131
int phiIndex() const
Get phi index. Equivalent to strip().
Definition SiCellId.h:122
bool isValid() const
Test if its in a valid state.
Definition SiCellId.h:136
int etaIndex() const
Get eta index.
Definition SiCellId.h:114

◆ identifierOfPosition()

Identifier InDetDD::SolidStateDetectorElementBase::identifierOfPosition ( const Amg::Vector2D & localPos) const
inherited

Full identifier of the cell for a given position: assumes a raw local position (no Lorentz shift)

Definition at line 217 of file SolidStateDetectorElementBase.cxx.

218 {
219 SiCellId cellId = m_design->cellIdOfPosition(localPosition);
220 return identifierFromCellId(cellId);
221 }
virtual Identifier identifierFromCellId(const SiCellId &cellId) const =0
Identifier <-> SiCellId (ie strip number or pixel eta_index,phi_index) Identifier from SiCellId (ie s...

◆ identify()

virtual Identifier InDetDD::SolidStateDetectorElementBase::identify ( ) const
finaloverridevirtualinherited

identifier of this detector element (inline)

Implements Trk::TrkDetElementBase.

◆ identifyHash()

virtual IdentifierHash InDetDD::SolidStateDetectorElementBase::identifyHash ( ) const
finaloverridevirtualinherited

identifier hash (inline)

Implements Trk::TrkDetElementBase.

◆ inDetector() [1/2]

SiIntersect InDetDD::SolidStateDetectorElementBase::inDetector ( const Amg::Vector2D & localPosition,
double phiTol,
double etaTol ) const
inherited

Test that it is in the active region.

Intersect has 3 states bool SiIntersect::in() const // definitely in
bool SiIntersect::out() const // definitely out
bool SiIntersect::nearBoundary() const // near a boundary within the tolerances
bool SiIntersect::mayIntersect() const // in() OR nearBoundary()

Definition at line 204 of file SolidStateDetectorElementBase.cxx.

206 {
207 return m_design->inDetector(localPosition, phiTol, etaTol);
208 }

◆ inDetector() [2/2]

SiIntersect InDetDD::SolidStateDetectorElementBase::inDetector ( const Amg::Vector3D & globalPosition,
double phiTol,
double etaTol ) const
inherited

Definition at line 211 of file SolidStateDetectorElementBase.cxx.

212 {
213 return m_design->inDetector(localPosition(globalPosition), phiTol, etaTol);
214 }

◆ invalidate()

void InDetDD::SolidStateDetectorElementBase::invalidate ( )
inherited

Signal that cached values are no longer valid.

Invalidate general cache (inline)

◆ isBarrel()

bool InDetDD::SiDetectorElement::isBarrel ( ) const

◆ isBlayer()

bool InDetDD::SiDetectorElement::isBlayer ( ) const

Definition at line 53 of file SiDetectorElement.cxx.

54 {
55 if (const auto *const pIdHelper= getIdHelper();isPixel() and isBarrel() and
56 pIdHelper->helper() == AtlasDetectorID::HelperType::Pixel) {
57 const PixelID* p_pixelId = static_cast<const PixelID*>(pIdHelper);
58 return (0==p_pixelId->layer_disk(m_id));
59 } else {
60 return false;
61 }
62 }
int layer_disk(const Identifier &id) const
Definition PixelID.h:607

◆ isDBM()

bool InDetDD::SiDetectorElement::isDBM ( ) const

◆ isEndcap()

bool InDetDD::SiDetectorElement::isEndcap ( ) const

◆ isInnermostPixelLayer()

bool InDetDD::SiDetectorElement::isInnermostPixelLayer ( ) const

Definition at line 65 of file SiDetectorElement.cxx.

66 {
67 if (const auto *const pIdHelper= getIdHelper(); isPixel() and isBarrel()
68 and pIdHelper->helper() == AtlasDetectorID::HelperType::Pixel) {
69 const PixelID* p_pixelId = static_cast<const PixelID*>(pIdHelper);
70 return ( 0==p_pixelId->layer_disk(m_id));
71 } else {
72 return false;
73 }
74 }

◆ isModuleFrame()

bool InDetDD::SiDetectorElement::isModuleFrame ( ) const

Check if the element and module frame are the same.

Definition at line 212 of file SiDetectorElement.cxx.

213 {
214 // The module frame is the axial side.
215 // NB isStereo returns false for the pixel and so
216 // isModuleFrame is always true for the pixel.
217
218 return !isStereo();
219 }
bool isStereo() const
Check if it is the stereo side (useful for SCT)

◆ isNextToInnermostPixelLayer()

bool InDetDD::SiDetectorElement::isNextToInnermostPixelLayer ( ) const

Definition at line 77 of file SiDetectorElement.cxx.

78 {
79 if (const auto *const pIdHelper = getIdHelper(); isPixel() and isBarrel() and
80 pIdHelper->helper() == AtlasDetectorID::HelperType::Pixel) {
81 const PixelID* p_pixelId = static_cast<const PixelID*>(pIdHelper);
82 return ( 1==p_pixelId->layer_disk(m_id));
83 } else {
84 return false;
85 }
86 }

◆ isPixel()

bool InDetDD::SiDetectorElement::isPixel ( ) const

◆ isPLR()

bool InDetDD::SiDetectorElement::isPLR ( ) const

◆ isSCT()

bool InDetDD::SiDetectorElement::isSCT ( ) const

◆ isStereo()

bool InDetDD::SiDetectorElement::isStereo ( ) const

Check if it is the stereo side (useful for SCT)

Definition at line 300 of file SiDetectorElement.cxx.

301 {
302 if (!m_isStereo.isValid()) {
304 }
305
306 return *m_isStereo.ptr();
307 }
CxxUtils::CachedValue< bool > m_isStereo
bool determineStereo() const
Find isStereo.

◆ length()

double InDetDD::SolidStateDetectorElementBase::length ( ) const
inherited

Length in eta direction (z - barrel, r - endcap)

◆ localPosition() [1/2]

Amg::Vector2D InDetDD::SolidStateDetectorElementBase::localPosition ( const Amg::Vector3D & globalPosition) const
inherited

◆ localPosition() [2/2]

Amg::Vector2D InDetDD::SolidStateDetectorElementBase::localPosition ( const HepGeom::Point3D< double > & globalPosition) const
inherited

transform a global position into a 2D local position (reconstruction frame) (inline)

◆ localToModuleFrame()

Amg::Transform3D InDetDD::SiDetectorElement::localToModuleFrame ( const Amg::Transform3D & localTransform) const

Take a transform of the local element frame and return its equivalent in the module frame.

Definition at line 192 of file SiDetectorElement.cxx.

193 {
194 if (isModuleFrame()) {
195 return localTransform;
196 } else {
197 return m_otherSide->transform().inverse() * transform() * localTransform * transform().inverse() * m_otherSide->transform();
198 }
199 }
virtual const Amg::Transform3D & transform() const override final
Return local to global transform.

◆ localToModuleTransform()

Amg::Transform3D InDetDD::SiDetectorElement::localToModuleTransform ( ) const

Transformation from local element to module frame.

This can be used to take a local position in the element frame and transform it to a position in the module frame. If one is already in the module frame it will return the Identity transform.

Definition at line 202 of file SiDetectorElement.cxx.

203 {
204 if (isModuleFrame()) {
205 return {}; // Identity
206 } else {
207 return m_otherSide->transform().inverse() * transform();
208 }
209 }

◆ maxWidth()

double InDetDD::SolidStateDetectorElementBase::maxWidth ( ) const
inherited

Max width.

Needed for the SCT endcap.

◆ minWidth()

double InDetDD::SolidStateDetectorElementBase::minWidth ( ) const
inherited

Min width.

Needed for the SCT endcap.

◆ moduleTransform()

const Amg::Transform3D & InDetDD::SiDetectorElement::moduleTransform ( ) const

Module to global frame transform.

Includes misalignment. The module frame is defined to be the local reconstruction frame of the axial layer in the SCT. For the pixel it is the same as the element.

Definition at line 173 of file SiDetectorElement.cxx.

174 {
175 return (isModuleFrame()) ? transform() : m_otherSide->transform();
176 }

◆ msg()

MsgStream & InDetDD::SiDetectorElement::msg ( MSG::Level lvl) const
protected

Declaring the Message method for further use (inline)

◆ msgLvl()

bool InDetDD::SiDetectorElement::msgLvl ( MSG::Level lvl) const
protected

Declaring the Method providing Verbosity Level (inline)

◆ nearBondGap() [1/2]

bool InDetDD::SiDetectorElement::nearBondGap ( const Amg::Vector2D & localPosition,
double etaTol ) const

Test if near bond gap within tolerances.

Definition at line 323 of file SiDetectorElement.cxx.

324 {
325 //again, can we avoid casting here?
326 return static_cast<const SiDetectorDesign *>(m_siDesign)->nearBondGap(localPosition, etaTol);
327 }
bool nearBondGap(const Amg::Vector2D &localPosition, double etaTol) const
Test if near bond gap within tolerances.

◆ nearBondGap() [2/2]

bool InDetDD::SiDetectorElement::nearBondGap ( const Amg::Vector3D & globalPosition,
double etaTol ) const

Definition at line 330 of file SiDetectorElement.cxx.

331 {
332 return static_cast<const SiDetectorDesign *>(m_siDesign)->nearBondGap(localPosition(globalPosition), etaTol);
333 }

◆ nextInEta()

const SiDetectorElement * InDetDD::SiDetectorElement::nextInEta ( ) const

◆ nextInPhi()

const SiDetectorElement * InDetDD::SiDetectorElement::nextInPhi ( ) const

◆ normal() [1/2]

virtual const Amg::Vector3D & InDetDD::SolidStateDetectorElementBase::normal ( ) const
finaloverridevirtualinherited

Get reconstruction local normal axes in global frame.

Choosen to give right-handed coordinate frame.

Implements Trk::TrkDetElementBase.

◆ normal() [2/2]

virtual const Amg::Vector3D & InDetDD::SolidStateDetectorElementBase::normal ( const Identifier & ) const
finaloverridevirtualinherited

TrkDetElementBase interface (inline)

Implements Trk::TrkDetElementBase.

◆ numberOfConnectedCells()

int InDetDD::SolidStateDetectorElementBase::numberOfConnectedCells ( const SiCellId cellId) const
inherited

Test if readout cell has more than one diode associated with it.

Number of cells sharing the same readout as this cell. ie generally 1 except for ganged pixels which will be 2.

Definition at line 243 of file SolidStateDetectorElementBase.cxx.

244 {
245 SiReadoutCellId readoutId = m_design->readoutIdOfCell(cellId);
246 return m_design->numberOfConnectedCells(readoutId);
247 }

◆ operator=() [1/2]

SiDetectorElement & InDetDD::SiDetectorElement::operator= ( const SiDetectorElement & )
delete

Don't allow assignment operator.

◆ operator=() [2/2]

SiDetectorElement & InDetDD::SiDetectorElement::operator= ( SiDetectorElement && )
delete

Don't allow move assignment operator.

◆ otherSide()

const SiDetectorElement * InDetDD::SiDetectorElement::otherSide ( ) const

Useful for SCT only.

◆ phiAngle()

double InDetDD::SolidStateDetectorElementBase::phiAngle ( ) const
inherited

◆ phiAxis()

const Amg::Vector3D & InDetDD::SolidStateDetectorElementBase::phiAxis ( ) const
inherited

Definition at line 74 of file SolidStateDetectorElementBase.cxx.

75 {
76 if (!m_cache.isValid()) updateCache();
77 return m_cache.ptr()->m_phiAxis;
78 }

◆ phiAxisCLHEP()

const HepGeom::Vector3D< double > & InDetDD::SolidStateDetectorElementBase::phiAxisCLHEP ( ) const
inherited

To determine if readout direction between online and offline needs swapping, see methods swapPhiReadoutDirection() and swapEtaReadoutDirection() below in "Readout Cell id" section.

Orientation. Directions.

  • phiAxis in same direction as increasing phi and identifier phi_index/strip. NB. This requires some flipping of axes with repsect to the hits.
  • etaAxis in direction of increasing z in the barrel and increasing r in the endcap.
  • normal choosen to give right-handed coordinate frame (x=normal,y=phiAxis,z=etaAxis) NB. This requires some flipping of axes with repsect to the hits.

Get reconstruction local phi axes in global frame. In same direction as increasing phi and identifier phi_index/strip.

Definition at line 67 of file SolidStateDetectorElementBase.cxx.

68 {
69 if (!m_cache.isValid()) updateCache();
70 return m_cache.ptr()->m_phiAxisCLHEP;
71 }

◆ phiDirection()

bool InDetDD::SolidStateDetectorElementBase::phiDirection ( ) const
inherited

◆ phiMax()

double InDetDD::SolidStateDetectorElementBase::phiMax ( ) const
inherited

◆ phiMin()

double InDetDD::SolidStateDetectorElementBase::phiMin ( ) const
inherited

◆ phiPitch() [1/2]

double InDetDD::SiDetectorElement::phiPitch ( ) const

Pitch (inline methods)

NOTE: phiPitch is ambiguous for the Forward SCT where it varies along the strip.
etaPitch is ambiguous for the pixel which has long pixels between FE chips.
For these cases:

phiPitch: For SCT Forward returns pitch at center.
etaPitch: For pixel returns average pitch. (Active_length/number_of_cells)
All return pitch in distance units.

◆ phiPitch() [2/2]

double InDetDD::SiDetectorElement::phiPitch ( const Amg::Vector2D & localPosition) const

Useful for SCT Forward.

◆ prevInEta()

const SiDetectorElement * InDetDD::SiDetectorElement::prevInEta ( ) const

◆ prevInPhi()

const SiDetectorElement * InDetDD::SiDetectorElement::prevInPhi ( ) const

◆ rawLocalPositionOfCell() [1/2]

Amg::Vector2D InDetDD::SolidStateDetectorElementBase::rawLocalPositionOfCell ( const Identifier & id) const
inherited

As above.

Definition at line 236 of file SolidStateDetectorElementBase.cxx.

237 {
238 SiCellId cellId = cellIdFromIdentifier(id);
239 return m_design->localPositionOfCell(cellId);
240 }
virtual SiCellId cellIdFromIdentifier(const Identifier &identifier) const =0
SiCellId from Identifier.

◆ rawLocalPositionOfCell() [2/2]

Amg::Vector2D InDetDD::SolidStateDetectorElementBase::rawLocalPositionOfCell ( const SiCellId & cellId) const
inherited

Returns position (center) of cell.

These are the raw positions NOT corrected for the Lorentz shift

Definition at line 230 of file SolidStateDetectorElementBase.cxx.

231 {
232 return m_design->localPositionOfCell(cellId);
233 }

◆ recoToHitTransform()

const HepGeom::Transform3D InDetDD::SolidStateDetectorElementBase::recoToHitTransform ( ) const
inherited

Transform to go from local reconstruction frame to local hit frame.

Definition at line 607 of file SolidStateDetectorElementBase.cxx.

608 {
609 if (!m_axisDir.isValid()) updateCache();
610 const AxisDir& dir = *m_axisDir.ptr();
611
612 // = transfromHit * hitLocal
613 // = transformHit * recoToHitTransform * recoLocal
614 // recoToHitTransform takes recoLocal to hitLocal
615 // x,y,z -> y,z,x
616 // equiv to a rotation around Y of 90 deg followed by a rotation around X of 90deg
617 //
618 // recoToHit is static as it needs to be calculated once only.
619 // We use the HepGeom::Transform3D constructor which takes one coordinates system to another where the
620 // coordinate system is defined by it center and two axes.
621 // distPhi, distEta are the reco local axes and hitPhi and hitEta are the hit local axes.
622 // It assume phi, eta, depth makes a right handed system which is the case.
623 static const HepGeom::Vector3D<double> localAxes[3] = {
624 HepGeom::Vector3D<double>(1., 0., 0.),
625 HepGeom::Vector3D<double>(0., 1., 0.),
626 HepGeom::Vector3D<double>(0., 0., 1.)
627 };
628
629 //correct phi and eta as necessary - do not change depth, this will be defined by the transform based on the other two
630 int signPhi = dir.m_phiDirection? +1:-1;
631 int signEta = dir.m_etaDirection? +1:-1;
632
633 const HepGeom::Transform3D recoToHit(HepGeom::Point3D<double>(0., 0., 0.),
634 signPhi * localAxes[distPhi],
635 signEta *localAxes[distEta],
636 HepGeom::Point3D<double>(0., 0., 0.),
637 localAxes[m_hitPhi],
638 localAxes[m_hitEta]);
639
640 return recoToHit ;
641
642 }

◆ rMax()

double InDetDD::SolidStateDetectorElementBase::rMax ( ) const
inherited

◆ rMin()

double InDetDD::SolidStateDetectorElementBase::rMin ( ) const
inherited

◆ setNextInEta()

void InDetDD::SiDetectorElement::setNextInEta ( const SiDetectorElement * element)

◆ setNextInPhi()

void InDetDD::SiDetectorElement::setNextInPhi ( const SiDetectorElement * element)

◆ setOtherSide()

void InDetDD::SiDetectorElement::setOtherSide ( const SiDetectorElement * element)

For SCT only.

◆ setPrevInEta()

void InDetDD::SiDetectorElement::setPrevInEta ( const SiDetectorElement * element)

◆ setPrevInPhi()

void InDetDD::SiDetectorElement::setPrevInPhi ( const SiDetectorElement * element)

◆ sinStereo() [1/3]

double InDetDD::SiDetectorElement::sinStereo ( ) const

Compute sin(stereo angle) at a given position: at center.

Definition at line 269 of file SiDetectorElement.cxx.

270 {
271 return sinStereoImpl();
272 }

◆ sinStereo() [2/3]

double InDetDD::SiDetectorElement::sinStereo ( const Amg::Vector2D & localPos) const

at given local position

Definition at line 275 of file SiDetectorElement.cxx.

276 {
277 Amg::Vector3D point=globalPosition(localPos);
278 return sinStereoImpl(point);
279 }

◆ sinStereo() [3/3]

double InDetDD::SiDetectorElement::sinStereo ( const Amg::Vector3D & globalPosition) const

at given global position

Definition at line 282 of file SiDetectorElement.cxx.

283 {
284 return sinStereoImpl(globalPos);
285 }

◆ sinStereoImpl() [1/2]

double InDetDD::SiDetectorElement::sinStereoImpl ( ) const
private

Private implementation method with no lock at center.

Definition at line 419 of file SiDetectorElement.cxx.

420 {
421 // Stereo is the angle between a refVector and a vector along the strip/pixel in eta direction.
422 // I'm not sure how the sign should be defined. I've defined it here
423 // with rotation sense respect to normal,
424 // where normal is away from IP in barrel and in -ve z direction in endcap
425
426 // In Barrel refVector = unit vector along z axis,
427 // in endcap refVector = unit vector radial.
428 //
429 // sinStereo = (refVector cross stripAxis) . normal
430 // = (refVector cross etaAxis) . normal
431 // = refVector . (etaAxis cross normal)
432 // = refVector . phiAxis
433 //
434 // in Barrel we use
435 // sinStereo = refVector . phiAxis
436 // = phiAxis.z()
437 //
438 // in endcap we use
439 // sinStereo = (refVector cross etaAxis) . normal
440 // = -(center cross etaAxis) . zAxis
441 // = (etaAxis cross center). z()
442
443 //Since these are barrel, endcap, sensor-type, specific, might be better for these to be calculated in the design()
444 //However, not clear how one could do that for the annulus calculation which uses global frame
445 double sinStereo = 0.;
446 auto designShape = m_siDesign->shape();
447 if (isBarrel()) {
448 sinStereo = this->phiAxis().z();
449 } else { // endcap
450 if (designShape == InDetDD::Annulus) { //built-in Stereo angle for Annulus shape sensor
451 Amg::Vector3D sensorCenter = m_siDesign->sensorCenter();
452 //Below retrieved method will return -sin(m_Stereo), thus sinStereolocal = sin(m_Stereo)
453 double sinStereoReco = - (m_siDesign->sinStripAngleReco(sensorCenter[1], sensorCenter[0]));
454 double cosStereoReco = sqrt(1-sinStereoReco*sinStereoReco);
455 double radialShift = sensorCenter[0];
456 //The focus of all strips in the local reco frame
457 Amg::Vector2D localfocus(-radialShift*sinStereoReco, radialShift - radialShift*cosStereoReco);
458 //The focus of all strips in the global frame
459 Amg::Vector3D globalfocus(globalPosition(localfocus));
460 //The direction of x-axis of the Strip frame in the global frame
461 const Amg::Vector3D& center = this->center();
462 Amg::Vector3D globalSFxAxis =(center - globalfocus)/radialShift;
463 //Stereo angle is the angle between global radial direction and the x-axis of the Strip frame in the global frame
464 sinStereo = (center.y() * globalSFxAxis.x() - center.x() * globalSFxAxis.y()) / center.perp();
465 }
466 // else if (designShape == InDetDD::PolarAnnulus) {} // Polar specialisation in future
467 else { // barrel
468 const Amg::Vector3D& etaAxis = this->etaAxis();
469 const Amg::Vector3D& center = this->center();
470 sinStereo = (center.y() * etaAxis.x() - center.x() * etaAxis.y()) / center.perp();
471 }
472 }
473 return sinStereo;
474 }
double sinStereo() const
Compute sin(stereo angle) at a given position: at center.

◆ sinStereoImpl() [2/2]

double InDetDD::SiDetectorElement::sinStereoImpl ( const Amg::Vector3D & globalPosition) const
private

Private implementation method with no lock at given global position.

Definition at line 477 of file SiDetectorElement.cxx.

478 {
479 //
480 // sinStereo = (refVector cross stripAxis) . normal
481 //
482 double sinStereo = 0.;
483 if (isBarrel()) {
484 if (m_siDesign->shape() != InDetDD::Trapezoid) {
485 sinStereo = this->phiAxis().z();
486 } else { // trapezoid
487 assert (minWidth() != maxWidth());
488 double radius = width() * length() / (maxWidth() - minWidth());
489 const Amg::Vector3D& etaAxis = this->etaAxis();
490 const Amg::Vector3D& center = this->center();
491 const Amg::Vector3D& normal = this->normal();
492 Amg::Vector3D stripAxis = radius * etaAxis + globalPos - center;
493 sinStereo = (stripAxis.x() * normal.y() - stripAxis.y() * normal.x()) / stripAxis.mag();
494 }
495 } else { // endcap
496 if (m_siDesign->shape() != InDetDD::Trapezoid) {
497 const Amg::Vector3D& etaAxis = this->etaAxis();
498 sinStereo = (globalPos.y() * etaAxis.x() - globalPos.x() * etaAxis.y()) / globalPos.perp();
499 } else { // trapezoid
500 assert (minWidth() != maxWidth());
501 const Amg::Vector3D& etaAxis = this->etaAxis();
502 const Amg::Vector3D& center = this->center();
503 double radius = width() * length() / (maxWidth() - minWidth());
504 // Only need projection in xy plane.
505 double stripAxisX = globalPos.x() - center.x() + etaAxis.x()*radius;
506 double stripAxisY = globalPos.y() - center.y() + etaAxis.y()*radius;
507 double norm = 1./(radius*sqrt(stripAxisX*stripAxisX + stripAxisY*stripAxisY));
508 sinStereo = norm * (stripAxisX * globalPos.y() - stripAxisY * globalPos.x());
509 }
510 }
511 return sinStereo;
512 }
double width() const
Methods from design (inline)
virtual const Amg::Vector3D & normal() const override final
Get reconstruction local normal axes in global frame.

◆ sinStereoLocal() [1/2]

double InDetDD::SiDetectorElement::sinStereoLocal ( const Amg::Vector2D & localPos) const

Angle of strip in local frame with respect to the etaAxis.

Zero for all elements except trapezoidal detectors (ie SCT forward modules).

Definition at line 288 of file SiDetectorElement.cxx.

289 {
290 return static_cast<const SiDetectorDesign *>(m_design)->sinStripAngleReco(localPos[0], localPos[1]);
291 }

◆ sinStereoLocal() [2/2]

double InDetDD::SiDetectorElement::sinStereoLocal ( const Amg::Vector3D & globalPos) const

See previous method.

Definition at line 294 of file SiDetectorElement.cxx.

295 {
296 return sinStereoLocal(localPosition(globalPos));
297 }
double sinStereoLocal(const Amg::Vector2D &localPos) const
Angle of strip in local frame with respect to the etaAxis.

◆ sinTilt() [1/3]

double InDetDD::SiDetectorElement::sinTilt ( ) const

Compute sin(tilt angle) at a given position: at center.

Definition at line 223 of file SiDetectorElement.cxx.

224 {
225 // Tilt is defined as the angle between a refVector and the sensor normal.
226 // In barrel refVector = unit vector radial.
227 // in endcap it is assumed there is no tilt.
228 // sinTilt = (refVector cross normal) . z
229
230 // tilt angle is not defined for the endcap
231 if (isEndcap()) return 0.;
232
233 // Angle between normal and radial vector.
234 // HepGeom::Vector3D<double> refVector(m_center.x(), m_center.y(), 0);
235 // return (refVector.cross(m_normal)).z()/refVector.mag();
236 // or the equivalent
237 const Amg::Vector3D& normal = this->normal();
238 const Amg::Vector3D& center = this->center();
239 return (center.x() * normal.y() - center.y() * normal.x()) / center.perp();
240 }

◆ sinTilt() [2/3]

double InDetDD::SiDetectorElement::sinTilt ( const Amg::Vector2D & localPos) const

at given local position

Definition at line 243 of file SiDetectorElement.cxx.

244 {
245 // tilt angle is not defined for the endcap
246 if (isEndcap()) return 0.;
247
248 Amg::Vector3D point = globalPosition(localPos);
249 return sinTilt(point);
250 }
double sinTilt() const
Compute sin(tilt angle) at a given position: at center.

◆ sinTilt() [3/3]

double InDetDD::SiDetectorElement::sinTilt ( const Amg::Vector3D & globalPosition) const

at given global position

Definition at line 253 of file SiDetectorElement.cxx.

254 {
255 // It is assumed that the global position is already in the plane of the element.
256
257 // tilt angle is not defined for the endcap
258 if (isEndcap()) return 0.;
259
260 // Angle between normal and radial vector.
261 //HepGeom::Vector3D<double> refVector(globalPos.x(), globalPos.y(), 0);
262 //return (refVector.cross(m_normal)).z()/refVector.mag();
263 // or the equivalent
264 const Amg::Vector3D& normal = this->normal();
265 return (globalPos.x() * normal.y() - globalPos.y() * normal.x()) / globalPos.perp();
266 }

◆ surface() [1/3]

Trk::Surface & InDetDD::SolidStateDetectorElementBase::surface ( )
inherited

Element Surface.

◆ surface() [2/3]

virtual const Trk::Surface & InDetDD::SolidStateDetectorElementBase::surface ( ) const
finaloverridevirtualinherited

Return surface associated with this detector element.

Implements Trk::TrkDetElementBase.

◆ surface() [3/3]

virtual const Trk::Surface & InDetDD::SolidStateDetectorElementBase::surface ( const Identifier & ) const
finaloverridevirtualinherited

TrkDetElementBase interface (inline)

Implements Trk::TrkDetElementBase.

◆ surfaces()

const std::vector< const Trk::Surface * > & InDetDD::SiDetectorElement::surfaces ( ) const

Returns the full list of surfaces associated to this detector element.

Definition at line 157 of file SiDetectorElement.cxx.

158 {
159 if (!m_surfaces.isValid()) {
160 std::vector<const Trk::Surface*> s;
161 s.push_back(&surface());
162 if (otherSide()) {
163 s.push_back(&(otherSide()->surface()));
164 }
165 m_surfaces.set (std::move (s));
166 }
167
168 // return the surfaces
169 return *m_surfaces.ptr();
170 }
const SiDetectorElement * otherSide() const
Useful for SCT only.
CxxUtils::CachedValue< std::vector< const Trk::Surface * > > m_surfaces
Trk::Surface & surface()
Element Surface.

◆ swapEtaReadoutDirection()

bool InDetDD::SiDetectorElement::swapEtaReadoutDirection ( ) const

For eta_index (only relevant for pixel) (inline)

◆ swapPhiReadoutDirection()

bool InDetDD::SiDetectorElement::swapPhiReadoutDirection ( ) const

Determine if readout direction between online and offline needs swapping.

Returns true if online and offline numbers run in opposite directions. For strip/phi_index (inline)

◆ thickness()

double InDetDD::SolidStateDetectorElementBase::thickness ( ) const
inherited

◆ transform() [1/2]

virtual const Amg::Transform3D & InDetDD::SolidStateDetectorElementBase::transform ( ) const
finaloverridevirtualinherited

Return local to global transform.

Implements Trk::TrkDetElementBase.

◆ transform() [2/2]

virtual const Amg::Transform3D & InDetDD::SolidStateDetectorElementBase::transform ( const Identifier & ) const
finaloverridevirtualinherited

TrkDetElementBase interface (inline)

Implements Trk::TrkDetElementBase.

◆ transformCLHEP()

const HepGeom::Transform3D & InDetDD::SolidStateDetectorElementBase::transformCLHEP ( ) const
inherited

Local (reconstruction frame) to global transform.

Definition at line 43 of file SolidStateDetectorElementBase.cxx.

44 {
45 if (!m_cache.isValid()) updateCache();
46 return m_cache.ptr()->m_transformCLHEP;
47 }

◆ transformHit()

const GeoTrf::Transform3D & InDetDD::SolidStateDetectorElementBase::transformHit ( ) const
inherited

Local (simulation/hit frame) to global transform.

◆ updateCache()

void InDetDD::SolidStateDetectorElementBase::updateCache ( ) const
virtualinherited

Recalculate cached values.

Definition at line 272 of file SolidStateDetectorElementBase.cxx.

273 {
274 if (m_cache.isValid()) return;
275 CachedVals cache;
276
277 // use aligned transform if available
278 const GeoTrf::Transform3D* ptrXf;
279 GeoTrf::Transform3D geotrf;
280
281 if (m_geoAlignStore){
282 ptrXf = m_geoAlignStore->getAbsPosition(getMaterialGeom());
283 if (ptrXf) {
284 cache.m_transformHit = (*ptrXf);
285 //the below can have an (optional) shift to acccount for transformations
286 //applied when constructing the DetectorElements from the GeoPhysVols
287 //(At the moment, only used for ITkStrip barrel when creating a DetElement per row)
288 geotrf = (*ptrXf) * m_design->moduleShift();
289 }
290 else {
291 geotrf.setIdentity();
292 }
293 }
294 else{
295 cache.m_transformHit = getMaterialGeom()->getAbsoluteTransform();
296 //the below can have an (optional) shift to acccount for transformations
297 //applied when constructing the DetectorElements from the GeoPhysVols
298 //(At the moment, only used for ITkStrip barrel when creating a DetElement per row)
299 geotrf = getMaterialGeom()->getAbsoluteTransform() * m_design->moduleShift();
300 }
301
302 const GeoTrf::Transform3D& geoTransform = geotrf;
303
304 cache.m_center = geoTransform * m_design->sensorCenter();
305
306 //Is this needed outside e.g. ReadSiDetElements? Maybe candidate for future removal?
307 cache.m_centerCLHEP = HepGeom::Point3D<double>(cache.m_center[0],cache.m_center[1],cache.m_center[2]);
308
309 Amg::Vector3D centerGeoModel(0., 0., 0.);
310 cache.m_origin = geoTransform * centerGeoModel;
311
312 //
313 // Determine directions depth, eta and phi axis in reconstruction local frame
314 // ie depth away from interaction point
315 // phi in direction of increasing phi
316 // eta in direction of increasing z in barrel, and increasing r in endcap
317 //
318
319 // depthAxis, phiAxis, and etaAxis are defined to be x,y,z respectively for all detectors for hit local frame.
320 // depthAxis, phiAxis, and etaAxis are defined to be z,x,y respectively for all detectors for reco local frame.
321 static const Amg::Vector3D localAxes[3] = {
322 Amg::Vector3D(1.,0.,0.),
323 Amg::Vector3D(0.,1.,0.),
324 Amg::Vector3D(0.,0.,1.)
325 };
326
327 static const Amg::Vector3D & localRecoPhiAxis = localAxes[distPhi]; // Defined to be same as x axis
328 static const Amg::Vector3D & localRecoEtaAxis = localAxes[distEta]; // Defined to be same as y axis
329 static const Amg::Vector3D & localRecoDepthAxis = localAxes[distDepth]; // Defined to be same as z axis
330
331 // We only need to calculate the rough orientation once.
332 //For it to change would require extreme unrealistic misalignment changes.
333#ifndef NDEBUG
334 bool setAxisDir = false;
335#endif
336 if (!m_axisDir.isValid()) {
337 AxisDir dir{};
338 // Determine the unit vectors in global frame
339
340 const Amg::Vector3D &geoModelPhiAxis = localAxes[m_hitPhi];
341 const Amg::Vector3D &geoModelEtaAxis = localAxes[m_hitEta];
342 const Amg::Vector3D &geoModelDepthAxis = localAxes[m_hitDepth];
343
344 Amg::Vector3D globalDepthAxis(geoTransform.linear() * geoModelDepthAxis);
345 Amg::Vector3D globalPhiAxis(geoTransform.linear() * geoModelPhiAxis);
346 Amg::Vector3D globalEtaAxis(geoTransform.linear() * geoModelEtaAxis);
347
348 // unit radial vector
349 Amg::Vector3D unitR(cache.m_center.x(), cache.m_center.y(), 0.);
350 unitR.normalize();
351
352 Amg::Vector3D nominalEta(0.0,0.0,1.0);
353 Amg::Vector3D nominalNormal(0.0,0.0,0.0);
354 Amg::Vector3D nominalPhi(-unitR.y(), unitR.x(), 0.0);
355
356 // In Barrel like geometry, the etaAxis is along increasing z, and normal is in increasing radial direction.
357 // In Endcap like geometry, the etaAxis is along increasing r, and normal is in decreasing z direction,
358 // We base whether it is barrel like or endcap like by the orientation of the local z axis of the
359 // the element. This allows the use of endcap identifiers in a TB setup.
360
361
362 nominalEta(2) = 1.0;
363 dir.m_barrelLike = true;
364
365 if (std::abs(globalEtaAxis.dot(nominalEta)) < 0.5) { // Check that it is in roughly the right direction. Allowed not to be for ITK inclined/barrel ring modules
366 dir.m_barrelLike = false;
367 }
368
369 if (dir.m_barrelLike) {
370 nominalEta(2) = 1.0;
371 nominalNormal = unitR;
372 } else { // endcap like
373 nominalNormal(2) = -1.0;
374 nominalEta = unitR;
375 }
376
377 // Determine if axes are to have there directions swapped.
378
379 //
380 // Depth axis.
381 //
382 dir.m_depthAngle = globalDepthAxis.dot(nominalNormal);
383 dir.m_depthDirection = true;
384 if (dir.m_depthAngle < 0) {
385 if (m_design->depthSymmetric()) {
386 dir.m_depthDirection = false;
387 } else {
388 ATH_MSG_DEBUG( "Unable to swap local depth axis.");
389 }
390 }
391 if (std::abs(dir.m_depthAngle) < 0.5 && (m_design->type())!=InDetDD::PLR) { // Check that it is in roughly the right direction. Ignore this for the PLR as it gives values as low as 0.489)
392 ATH_MSG_ERROR( "Orientation of local depth axis does not follow correct convention.");
393 dir.m_depthDirection = true; // Don't swap.
394 }
395
396 // for HGTD modules, the check on phi and eta directions don't make sense
397 // as the modules do not respect the conventional position for endcap discs:
398 // - the local eta axis is never parallel to the radial direction
399 // - the local phi axis is never perpendicular to the radial direction
400 // hence, removing errors and allowing swap of the axis when needed
401 bool isHGTD = this->getIdHelper()->is_hgtd(m_id);
402
403 //
404 // Phi axis
405 //
406 dir.m_phiAngle = globalPhiAxis.dot(nominalPhi);
407 dir.m_phiDirection = true;
408 if (dir.m_phiAngle < 0) {
409 if (m_design->phiSymmetric()) {
410 dir.m_phiDirection = false;
411 } else {
412 ATH_MSG_DEBUG("Unable to swap local xPhi axis.");
413 }
414 }
415 if (not isHGTD and std::abs(dir.m_phiAngle) < 0.5) { // Check that it is in roughly the right direction.
416 ATH_MSG_ERROR( "Orientation of local xPhi axis does not follow correct convention.");
417 dir.m_phiDirection = true; // Don't swap.
418 }
419
420 //
421 // Eta axis
422 //
423 dir.m_etaAngle = globalEtaAxis.dot(nominalEta);
424 dir.m_etaDirection = true;
425 if (dir.m_etaAngle < 0) {
426 if (m_design->etaSymmetric()) {
427 dir.m_etaDirection = false;
428 } else {
429 ATH_MSG_DEBUG("Unable to swap local xEta axis.");
430 }
431 }
432 if (not isHGTD and std::abs(dir.m_etaAngle) < 0.5) { // Check that it is in roughly the right direction.
433 ATH_MSG_ERROR( "Orientation of local xEta axis does not follow correct convention.");
434 dir.m_etaDirection = true; // Don't swap
435 }
436
437 m_axisDir.set (dir);
438#ifndef NDEBUG
439 setAxisDir = true;
440#endif
441 } // end if (!m_axisDir.isValid())
442
443 cache.m_transformCLHEP = Amg::EigenTransformToCLHEP(geoTransform) * recoToHitTransform();
444 cache.m_transform = Amg::CLHEPTransformToEigen(cache.m_transformCLHEP);
445
446 #ifndef NDEBUG
447 // Check that local frame is right-handed. (ie transform has no reflection)
448 // This can be done by checking that the determinant is >0.
449 if (setAxisDir) { // Only need to check this once.
450 const AxisDir& dir = *m_axisDir.ptr();
451 HepGeom::Transform3D & t = cache.m_transformCLHEP;
452 double det = t(0,0) * (t(1,1)*t(2,2) - t(1,2)*t(2,1)) -
453 t(0,1) * (t(1,0)*t(2,2) - t(1,2)*t(2,0)) +
454 t(0,2) * (t(1,0)*t(2,1) - t(1,1)*t(2,0));
455 if (det < 0) {
456 ATH_MSG_DEBUG( "Local frame is left-handed. (hitEtaDirection, hitPhiDirection, hitDepthDirection) = ("
457 << dir.m_etaDirection <<", "
458 << dir.m_phiDirection <<", "
459 << dir.m_depthDirection <<")");
460 }
461 }
462 #endif
463
464 // Initialize various cached members, needs to be done here otherwise the necessary transforms are not yet initialized
465 // The unit vectors
466 cache.m_normal = cache.m_transform.linear() * localRecoDepthAxis;
467
468 cache.m_phiAxis = cache.m_transform.linear() * localRecoPhiAxis;
469 cache.m_etaAxis = cache.m_transform.linear() * localRecoEtaAxis;
470
471 //Check where these are actually needed - candidates for removal?
472 cache.m_phiAxisCLHEP = HepGeom::Vector3D<double>(cache.m_phiAxis[0],cache.m_phiAxis[1],cache.m_phiAxis[2]);
473 cache.m_etaAxisCLHEP = HepGeom::Vector3D<double>(cache.m_etaAxis[0],cache.m_etaAxis[1],cache.m_etaAxis[2]);
474
475 getExtent(cache);
476 m_cache.set (std::move (cache));
477 }
#define ATH_MSG_ERROR(x)
#define ATH_MSG_DEBUG(x)
bool is_hgtd(Identifier id) const
void getExtent(CachedVals &cache) const
Calculate extent in r,z and phi.

◆ width()

double InDetDD::SolidStateDetectorElementBase::width ( ) const
inherited

Methods from design (inline)

Width in phi direction. For the SCT endcap it returns the average width.

◆ zMax()

double InDetDD::SolidStateDetectorElementBase::zMax ( ) const
inherited

◆ zMin()

double InDetDD::SolidStateDetectorElementBase::zMin ( ) const
inherited

Member Data Documentation

◆ m_axisDir

CxxUtils::CachedValue<AxisDir> InDetDD::SolidStateDetectorElementBase::m_axisDir
protectedinherited

Definition at line 675 of file SolidStateDetectorElementBase.h.

◆ m_cache

CxxUtils::CachedValue<CachedVals> InDetDD::SolidStateDetectorElementBase::m_cache
protectedinherited

Definition at line 702 of file SolidStateDetectorElementBase.h.

◆ m_commonItems

const SiCommonItems* InDetDD::SolidStateDetectorElementBase::m_commonItems {nullptr}
protectedinherited

Definition at line 624 of file SolidStateDetectorElementBase.h.

624{nullptr};

◆ m_design

const DetectorDesign* InDetDD::SolidStateDetectorElementBase::m_design {nullptr}
protectedinherited

local description of this detector element

Definition at line 622 of file SolidStateDetectorElementBase.h.

622{nullptr};

◆ m_geoAlignStore

const GeoAlignmentStore* InDetDD::SolidStateDetectorElementBase::m_geoAlignStore {}
protectedinherited

Definition at line 626 of file SolidStateDetectorElementBase.h.

626{};

◆ m_hitDepth

DetectorDesign::Axis InDetDD::SolidStateDetectorElementBase::m_hitDepth
protectedinherited

Definition at line 633 of file SolidStateDetectorElementBase.h.

◆ m_hitEta

DetectorDesign::Axis InDetDD::SolidStateDetectorElementBase::m_hitEta
protectedinherited

Axes.

Definition at line 631 of file SolidStateDetectorElementBase.h.

◆ m_hitPhi

DetectorDesign::Axis InDetDD::SolidStateDetectorElementBase::m_hitPhi
protectedinherited

Definition at line 632 of file SolidStateDetectorElementBase.h.

◆ m_id

Identifier InDetDD::SolidStateDetectorElementBase::m_id {}
protectedinherited

identifier of this detector element

Definition at line 617 of file SolidStateDetectorElementBase.h.

617{};

◆ m_idHash

IdentifierHash InDetDD::SolidStateDetectorElementBase::m_idHash {}
protectedinherited

hash id of this detector element

Definition at line 643 of file SolidStateDetectorElementBase.h.

643{};

◆ m_isBarrel

bool InDetDD::SiDetectorElement::m_isBarrel {false}
protected

Definition at line 469 of file SiDetectorElement.h.

469{false};

◆ m_isDBM

bool InDetDD::SiDetectorElement::m_isDBM {false}
protected

Definition at line 468 of file SiDetectorElement.h.

468{false};

◆ m_isPixel

bool InDetDD::SiDetectorElement::m_isPixel {false}
protected

Definition at line 465 of file SiDetectorElement.h.

465{false};

◆ m_isPLR

bool InDetDD::SiDetectorElement::m_isPLR {false}
protected

Definition at line 467 of file SiDetectorElement.h.

467{false};

◆ m_isSCT

bool InDetDD::SiDetectorElement::m_isSCT {false}
protected

Definition at line 466 of file SiDetectorElement.h.

466{false};

◆ m_isStereo

CxxUtils::CachedValue<bool> InDetDD::SiDetectorElement::m_isStereo
protected

Definition at line 487 of file SiDetectorElement.h.

◆ m_nextInEta

const SiDetectorElement* InDetDD::SiDetectorElement::m_nextInEta {nullptr}
protected

Definition at line 476 of file SiDetectorElement.h.

476{nullptr}; // set by setNextInEta

◆ m_nextInPhi

const SiDetectorElement* InDetDD::SiDetectorElement::m_nextInPhi {nullptr}
protected

Definition at line 478 of file SiDetectorElement.h.

478{nullptr}; // set by setNextInPhi

◆ m_otherSide

const SiDetectorElement* InDetDD::SiDetectorElement::m_otherSide {nullptr}
protected

Definition at line 480 of file SiDetectorElement.h.

480{nullptr}; // set by setOtherSide

◆ m_prevInEta

const SiDetectorElement* InDetDD::SiDetectorElement::m_prevInEta {nullptr}
protected

Definition at line 477 of file SiDetectorElement.h.

477{nullptr}; // set by setPrevInEta

◆ m_prevInPhi

const SiDetectorElement* InDetDD::SiDetectorElement::m_prevInPhi {nullptr}
protected

Definition at line 479 of file SiDetectorElement.h.

479{nullptr}; // set by setPrevInPhi

◆ m_siDesign

const SiDetectorDesign* InDetDD::SiDetectorElement::m_siDesign
protected

Definition at line 458 of file SiDetectorElement.h.

◆ m_surface

std::unique_ptr<Trk::Surface> InDetDD::SolidStateDetectorElementBase::m_surface
protectedinherited

Definition at line 625 of file SolidStateDetectorElementBase.h.

◆ m_surfaces

CxxUtils::CachedValue<std::vector<const Trk::Surface*> > InDetDD::SiDetectorElement::m_surfaces
protected

Definition at line 451 of file SiDetectorElement.h.


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