ATLAS Offline Software
Public Member Functions | Private Member Functions | Static Private Member Functions | Private Attributes | List of all members
InDetDD::PixelDiodeMap Class Reference

#include <PixelDiodeMap.h>

Collaboration diagram for InDetDD::PixelDiodeMap:

Public Member Functions

 PixelDiodeMap (std::shared_ptr< const PixelDiodeMatrix > diodeMatrix)
 Constructor from Diode matrix description. More...
 
 PixelDiodeMap (const PixelDiodeMap &map)
 Copy constructor: More...
 
 ~PixelDiodeMap ()
 Destructor. More...
 
PixelDiodeMapoperator= (const PixelDiodeMap &map)
 Assignment operator. More...
 
SiDiodesParameters parameters (const SiCellId &diodeId) const
 Get diodes parameters (position and size): More...
 
SiCellId cellIdOfPosition (const Amg::Vector2D &localPosition) const
 cell id for a given local position More...
 
SiCellId cellIdInRange (const SiCellId &cellId) const
 Check if cellId is within range. More...
 
void neighboursOfCell (const SiCellId &cellId, std::vector< SiCellId > &neighbours) const
 Get the neighbouring PixelDiodes of a given PixelDiode: Cell for which the neighbours must be found List of cells which are neighbours of the given one. More...
 
double intersectionLength (const SiCellId &diode1, const SiCellId &diode2) const
 Compute the intersection length of two diodes: return: the intersection length when the two diodes are projected on one of the two axis, or 0 in case of no intersection or problem nput: the two diodes for which the intersection length is computed. More...
 
double leftColumn () const
 
double rightColumn () const
 
double leftRow () const
 
double rightRow () const
 
double width () const
 
double length () const
 
int phiDiodes () const
 
int etaDiodes () const
 
int diodes () const
 
void setGeneralLayout ()
 Set general layout flag. More...
 
std::string debugStringRepr () const
 Debug representation. More...
 

Private Member Functions

void neighboursOfCellGeneral (const SiCellId &cellId, std::vector< SiCellId > &neighbours) const
 Slower method. More...
 
double intersectionLengthGeneral (const SiCellId &diode1, const SiCellId &diode2) const
 Slower method. More...
 

Static Private Member Functions

static double intersectionLength1D (const double x1, const double dx1, const double x2, const double dx2)
 Compute the intersection length along one direction: return 0 if no intersection x1,x2 are the centers dx1,dx2 are the full lengths. More...
 

Private Attributes

std::shared_ptr< const PixelDiodeMatrixm_matrix
 diode matrix More...
 
bool m_generalLayout
 Flag set to allow for dealing wth more general layouts. More...
 

Detailed Description

Class used to describe the diode segmentation of a pixel module

Author
: David Calvet
  • modified Davide Costanzo. Replace PixelModulePosition with SiCellId
  • modified: Grant Gorfine, Andreas Salzburger

Definition at line 43 of file PixelDiodeMap.h.

Constructor & Destructor Documentation

◆ PixelDiodeMap() [1/2]

InDetDD::PixelDiodeMap::PixelDiodeMap ( std::shared_ptr< const PixelDiodeMatrix diodeMatrix)

Constructor from Diode matrix description.

Definition at line 28 of file PixelDiodeMap.cxx.

28  :
29  m_matrix(std::move(matrix)),
30  m_generalLayout(false)
31 {
32 }

◆ PixelDiodeMap() [2/2]

InDetDD::PixelDiodeMap::PixelDiodeMap ( const PixelDiodeMap map)

Copy constructor:

◆ ~PixelDiodeMap()

InDetDD::PixelDiodeMap::~PixelDiodeMap ( )
default

Destructor.

Member Function Documentation

◆ cellIdInRange()

SiCellId InDetDD::PixelDiodeMap::cellIdInRange ( const SiCellId cellId) const
inline

Check if cellId is within range.

Definition at line 189 of file PixelDiodeMap.h.

190  {
191  if (!cellId.isValid() ||
192  cellId.phiIndex() <0 || cellId.phiIndex() >= phiDiodes() ||
193  cellId.etaIndex() <0 || cellId.etaIndex() >= etaDiodes()) return SiCellId(); // Invalid
194  return cellId;
195  }

◆ cellIdOfPosition()

SiCellId InDetDD::PixelDiodeMap::cellIdOfPosition ( const Amg::Vector2D localPosition) const

cell id for a given local position

Definition at line 38 of file PixelDiodeMap.cxx.

39 {
40  using std::abs;
41  using Trk::distPhi;
42  using Trk::distEta;
43 
44  // Check that we are in the bounds of the top level matrix
45  // NB. edge is included in bounds.
46 
47  double halfWidth = 0.5*width();
48  double halfLength = 0.5*length();
49  if ( (abs(localPos[distPhi]) > halfWidth) ||
50  (abs(localPos[distEta]) > halfLength) ) {
51  return {}; // Invalid Id.
52  }
53 
54  // position relative to bottom left corner.
55  Amg::Vector2D relativePos = localPos + Amg::Vector2D(halfWidth, halfLength);
56 
57  // The cellId returned will be added to this so we must start with 0,0.
58  SiCellId cellId(0,0);
59 
60  const PixelDiodeMatrix *cell = m_matrix->cellIdOfPosition(relativePos, cellId);
61  // return invalid Id if there was a problem (don't expect this to be the case).
62  if (cell==nullptr) {
63  return {}; // Invalid id.
64  }
65 
66  return cellId;
67 
68 }

◆ debugStringRepr()

std::string InDetDD::PixelDiodeMap::debugStringRepr ( ) const
inline

Debug representation.

Definition at line 197 of file PixelDiodeMap.h.

198  {
199  return m_matrix->createDebugStringRepr();
200  }

◆ diodes()

int InDetDD::PixelDiodeMap::diodes ( ) const
inline

Definition at line 174 of file PixelDiodeMap.h.

175  {
176  return phiDiodes() * etaDiodes();
177  }

◆ etaDiodes()

int InDetDD::PixelDiodeMap::etaDiodes ( ) const
inline

Definition at line 184 of file PixelDiodeMap.h.

185  {
186  return m_matrix->etaCells();
187  }

◆ intersectionLength()

double InDetDD::PixelDiodeMap::intersectionLength ( const SiCellId diode1,
const SiCellId diode2 
) const

Compute the intersection length of two diodes: return: the intersection length when the two diodes are projected on one of the two axis, or 0 in case of no intersection or problem nput: the two diodes for which the intersection length is computed.

Definition at line 218 of file PixelDiodeMap.cxx.

220 {
221  if(!diode1.isValid() || !diode2.isValid()) return 0;
222  // If non regular layout revert to slower method
223  if (m_generalLayout) return intersectionLengthGeneral(diode1, diode2);
224 
225  const SiLocalPosition size = parameters(diode1).width();
226 
227  int phiIndexDelta = std::abs(diode1.phiIndex() - diode2.phiIndex());
228  int etaIndexDelta = std::abs(diode1.etaIndex() - diode2.etaIndex());
229 
230  // Intersection length is just the length or width of the diode depending on which neighbour.
231  if (phiIndexDelta == 1 && etaIndexDelta == 0) return size.xEta();
232  if (phiIndexDelta == 0 && etaIndexDelta == 1) return size.xPhi();
233  // Will return 0 if it is a corner neighbour or if its not a neighbour or if they are oth the same diode.
234  return 0;
235 }

◆ intersectionLength1D()

double InDetDD::PixelDiodeMap::intersectionLength1D ( const double  x1,
const double  dx1,
const double  x2,
const double  dx2 
)
staticprivate

Compute the intersection length along one direction: return 0 if no intersection x1,x2 are the centers dx1,dx2 are the full lengths.

Definition at line 273 of file PixelDiodeMap.cxx.

275 {
276  // compute distance between the two centers
277  double distance=std::abs(x1-x2);
278 
279  // compute theoretical intersection
280  double intersection=(dx1+dx2)/2-distance;
281 
282  // if intersection if negative, no intersection
283  if (intersection<-1e-10) return intersection;
284  else if (intersection<1e-10) return 0;
285  else {
286  // intersection cannot exceed size
287  if (intersection>dx1) intersection=dx1;
288  if (intersection>dx2) intersection=dx2;
289  return intersection;
290  }
291 }

◆ intersectionLengthGeneral()

double InDetDD::PixelDiodeMap::intersectionLengthGeneral ( const SiCellId diode1,
const SiCellId diode2 
) const
private

Slower method.

Called by intersectionLength if m_generalLayout set.

Definition at line 240 of file PixelDiodeMap.cxx.

243 {
244  const SiDiodesParameters params1=parameters(diode1);
245  const SiDiodesParameters params2=parameters(diode2);
246  const SiLocalPosition center1=params1.centre();
247  const SiLocalPosition center2=params2.centre();
248  const SiLocalPosition size1=params1.width();
249  const SiLocalPosition size2=params2.width();
250 
251  // compute intersection length on column direction
252  const double intersectionColumn=intersectionLength1D(center1.xColumn(),
253  size1.xColumn(),
254  center2.xColumn(),
255  size2.xColumn());
256  // compute intersection length on row direction
257  const double intersectionRow=intersectionLength1D(center1.xRow(),
258  size1.xRow(),
259  center2.xRow(),
260  size2.xRow());
261 
262  // return the real intersection
263  // (if both directions intersect, there is a problem)
264  if (intersectionColumn>0) {
265  if (intersectionRow>0) return 0;
266  return intersectionColumn;
267  } else {
268  return intersectionRow;
269  }
270 }

◆ leftColumn()

double InDetDD::PixelDiodeMap::leftColumn ( ) const
inline

Definition at line 154 of file PixelDiodeMap.h.

155  {
156  return -0.5*length();
157  }

◆ leftRow()

double InDetDD::PixelDiodeMap::leftRow ( ) const
inline

Definition at line 164 of file PixelDiodeMap.h.

165  {
166  return -0.5*width();
167  }

◆ length()

double InDetDD::PixelDiodeMap::length ( ) const
inline

Definition at line 144 of file PixelDiodeMap.h.

145  {
146  return m_matrix->etaWidth();
147  }

◆ neighboursOfCell()

void InDetDD::PixelDiodeMap::neighboursOfCell ( const SiCellId cellId,
std::vector< SiCellId > &  neighbours 
) const

Get the neighbouring PixelDiodes of a given PixelDiode: Cell for which the neighbours must be found List of cells which are neighbours of the given one.

Definition at line 107 of file PixelDiodeMap.cxx.

109 {
110  neighbours.clear();
111 
112  if (!cellId.isValid()) return;
113 
114  // If non regular layout revert to slower method
115  if (m_generalLayout) return neighboursOfCellGeneral(cellId, neighbours);
116 
117  neighbours.reserve(8);
118  // neighbours easily determined from cell number
119  // normally 8 neighbours 4 edge and 4 corners
120 
121  int phiIndex = cellId.phiIndex();
122  int etaIndex = cellId.etaIndex();
123 
124  // M = minus
125  // P = plus
126  int phiM = phiIndex-1;
127  int phiP = phiIndex+1;
128  int etaM = etaIndex-1;
129  int etaP = etaIndex+1;
130 
131  // -,0
132  if (phiM >= 0) neighbours.emplace_back(phiM,etaIndex);
133  // -,-
134  if (phiM >= 0 && etaM >= 0) neighbours.emplace_back(phiM,etaM);
135  // 0,-
136  if (etaM >= 0) neighbours.emplace_back(phiIndex,etaM);
137  // +,-
138  if (phiP < phiDiodes() && etaM >= 0) neighbours.emplace_back(phiP,etaM);
139  // +,0
140  if (phiP < phiDiodes()) neighbours.emplace_back(phiP,etaIndex);
141  // -,+
142  if (phiM >= 0 && etaP < etaDiodes()) neighbours.emplace_back(phiM,etaP);
143  // 0,+
144  if (etaP < etaDiodes()) neighbours.emplace_back(phiIndex,etaP);
145  // +,+
146  if (phiP < phiDiodes() && etaP < etaDiodes()) neighbours.emplace_back(phiP,etaP);
147 }

◆ neighboursOfCellGeneral()

void InDetDD::PixelDiodeMap::neighboursOfCellGeneral ( const SiCellId cellId,
std::vector< SiCellId > &  neighbours 
) const
private

Slower method.

Called by neighboursOfCell if m_generalLayout set.

Definition at line 152 of file PixelDiodeMap.cxx.

154 {
155  // extract the diode spatial parameters
156  const SiDiodesParameters params=parameters(cellId);
157  const SiLocalPosition diodeCenter=params.centre();
158  const SiLocalPosition diodeSize=params.width();
159  const double &centerColumn=diodeCenter.xColumn();
160  const double &centerRow=diodeCenter.xRow();
161  const double halfSizeColumn=diodeSize.xColumn()/2;
162  const double halfSizeRow=diodeSize.xRow()/2;
163 
164  // parameter
165  const double epsilon=0.01;
166 
167  // compute the points to check
168  const double left1=centerColumn-halfSizeColumn*(1+epsilon);
169  const double right1=centerColumn+halfSizeColumn*(1+epsilon);
170  const double left2=centerColumn-halfSizeColumn*(1-epsilon);
171  const double right2=centerColumn+halfSizeColumn*(1-epsilon);
172  const double top1=centerRow+halfSizeRow*(1+epsilon);
173  const double bot1=centerRow-halfSizeRow*(1+epsilon);
174  const double top2=centerRow+halfSizeRow*(1-epsilon);
175  const double bot2=centerRow-halfSizeRow*(1-epsilon);
176 
177  // build the list of positions to check
178  std::vector<SiLocalPosition> positions;
179  positions.reserve(12);
180  SiLocalPosition position;
181  position.xRow(bot1); position.xColumn(left2); positions.push_back(position);
182  position.xRow(bot1); position.xColumn(left1); positions.push_back(position);
183  position.xRow(bot2); position.xColumn(left1); positions.push_back(position);
184  position.xRow(top2); position.xColumn(left1); positions.push_back(position);
185  position.xRow(top1); position.xColumn(left1); positions.push_back(position);
186  position.xRow(top1); position.xColumn(left2); positions.push_back(position);
187  position.xRow(bot1); position.xColumn(right2); positions.push_back(position);
188  position.xRow(bot1); position.xColumn(right1); positions.push_back(position);
189  position.xRow(bot2); position.xColumn(right1); positions.push_back(position);
190  position.xRow(top2); position.xColumn(right1); positions.push_back(position);
191  position.xRow(top1); position.xColumn(right1); positions.push_back(position);
192  position.xRow(top1); position.xColumn(right2); positions.push_back(position);
193 
194  // build the list of neighbours
195  neighbours.reserve(8);
196 
197  // loop on all positions to check
198  for(const auto & position : positions) {
199 
200  // get the PixelDiode for this position
201  SiCellId cellId_neighb = cellIdOfPosition(position);
202 
203  if (cellId.isValid()) {
204  // check if the diode is already in the list
205  //bool found=false;
206  std::vector<SiCellId>::const_iterator foundIter
207  = std::find(neighbours.begin(), neighbours.end(), cellId_neighb );
208 
209  // If not found add this diode to the list
210  if (foundIter == neighbours.end()) neighbours.push_back(cellId_neighb);
211 
212  }
213  }
214 }

◆ operator=()

PixelDiodeMap& InDetDD::PixelDiodeMap::operator= ( const PixelDiodeMap map)

Assignment operator.

◆ parameters()

SiDiodesParameters InDetDD::PixelDiodeMap::parameters ( const SiCellId diodeId) const

Get diodes parameters (position and size):

Definition at line 73 of file PixelDiodeMap.cxx.

74 {
75 
76  // Check we are in range
77 
78  if (!cellId.isValid() ||
79  (cellId.phiIndex() < 0) ||
80  (cellId.phiIndex() >= m_matrix->phiCells()) ||
81  (cellId.etaIndex() < 0) ||
82  (cellId.etaIndex() >= m_matrix->etaCells())) {
83  return {};
84  }
85 
86  double halfWidth = 0.5*width();
87  double halfLength = 0.5*length();
88 
89  //
90  // Position is relative to left bottom corner.
91  //
92  Amg::Vector2D position(-halfWidth, -halfLength);
93  const PixelDiodeMatrix *cell = m_matrix->positionOfCell(cellId, position);
94  if (cell != nullptr) {
95 
96  // get size
97  Amg::Vector2D size(cell->phiWidth(), cell->etaWidth());
98 
99  // return parameters
100  return SiDiodesParameters(position,size);
101  }
102 
103  // return something in case of failure.
104  return {};
105 }

◆ phiDiodes()

int InDetDD::PixelDiodeMap::phiDiodes ( ) const
inline

Definition at line 179 of file PixelDiodeMap.h.

180  {
181  return m_matrix->phiCells();
182  }

◆ rightColumn()

double InDetDD::PixelDiodeMap::rightColumn ( ) const
inline

Definition at line 159 of file PixelDiodeMap.h.

160  {
161  return 0.5*length();
162  }

◆ rightRow()

double InDetDD::PixelDiodeMap::rightRow ( ) const
inline

Definition at line 169 of file PixelDiodeMap.h.

170  {
171  return 0.5*width();
172  }

◆ setGeneralLayout()

void InDetDD::PixelDiodeMap::setGeneralLayout ( )
inline

Set general layout flag.

This can be set to true to allow handling of more complex layouts where cells are not lined up with each other such as bricking. Probably never will be needed.

Definition at line 106 of file PixelDiodeMap.h.

106 {m_generalLayout = true;}

◆ width()

double InDetDD::PixelDiodeMap::width ( ) const
inline

Definition at line 149 of file PixelDiodeMap.h.

150  {
151  return m_matrix->phiWidth();
152  }

Member Data Documentation

◆ m_generalLayout

bool InDetDD::PixelDiodeMap::m_generalLayout
private

Flag set to allow for dealing wth more general layouts.

Definition at line 137 of file PixelDiodeMap.h.

◆ m_matrix

std::shared_ptr<const PixelDiodeMatrix> InDetDD::PixelDiodeMap::m_matrix
private

diode matrix

Definition at line 136 of file PixelDiodeMap.h.


The documentation for this class was generated from the following files:
AllowedVariables::e
e
Definition: AsgElectronSelectorTool.cxx:37
plotBeamSpotCompare.x1
x1
Definition: plotBeamSpotCompare.py:216
ReadCellNoiseFromCool.cell
cell
Definition: ReadCellNoiseFromCool.py:53
find
std::string find(const std::string &s)
return a remapped string
Definition: hcg.cxx:135
Amg::Vector2D
Eigen::Matrix< double, 2, 1 > Vector2D
Definition: GeoPrimitives.h:48
InDetDD::PixelDiodeMap::parameters
SiDiodesParameters parameters(const SiCellId &diodeId) const
Get diodes parameters (position and size):
Definition: PixelDiodeMap.cxx:73
InDetDD::PixelDiodeMap::m_matrix
std::shared_ptr< const PixelDiodeMatrix > m_matrix
diode matrix
Definition: PixelDiodeMap.h:136
InDetDD::PixelDiodeMap::width
double width() const
Definition: PixelDiodeMap.h:149
plotBeamSpotCompare.x2
x2
Definition: plotBeamSpotCompare.py:218
InDetDD::PixelDiodeMap::intersectionLength1D
static double intersectionLength1D(const double x1, const double dx1, const double x2, const double dx2)
Compute the intersection length along one direction: return 0 if no intersection x1,...
Definition: PixelDiodeMap.cxx:273
InDetDD::PixelDiodeMap::m_generalLayout
bool m_generalLayout
Flag set to allow for dealing wth more general layouts.
Definition: PixelDiodeMap.h:137
intersection
std::vector< std::string > intersection(std::vector< std::string > &v1, std::vector< std::string > &v2)
Definition: compareFlatTrees.cxx:25
InDetDD::PixelDiodeMap::etaDiodes
int etaDiodes() const
Definition: PixelDiodeMap.h:184
python.setupRTTAlg.size
int size
Definition: setupRTTAlg.py:39
Trk::distEta
@ distEta
readout for silicon
Definition: ParamDefs.h:51
InDetDD::PixelDiodeMap::phiDiodes
int phiDiodes() const
Definition: PixelDiodeMap.h:179
Trk::distPhi
@ distPhi
Definition: ParamDefs.h:50
InDetDD::PixelDiodeMap::neighboursOfCellGeneral
void neighboursOfCellGeneral(const SiCellId &cellId, std::vector< SiCellId > &neighbours) const
Slower method.
Definition: PixelDiodeMap.cxx:152
eflowRec::phiIndex
unsigned int phiIndex(float phi, float binsize)
calculate phi index for a given phi
Definition: EtaPhiLUT.cxx:23
InDetDD::PixelDiodeMap::length
double length() const
Definition: PixelDiodeMap.h:144
python.testIfMatch.matrix
matrix
Definition: testIfMatch.py:66
InDetDD::SiDiodesParameters::width
const SiLocalPosition & width() const
width of the diodes:
Definition: SiDiodesParameters.h:96
InDetDD::PixelDiodeMap::intersectionLengthGeneral
double intersectionLengthGeneral(const SiCellId &diode1, const SiCellId &diode2) const
Slower method.
Definition: PixelDiodeMap.cxx:240
PowhegControl_ttFCNC_NLO.params
params
Definition: PowhegControl_ttFCNC_NLO.py:226
InDetDD::PixelDiodeMap::cellIdOfPosition
SiCellId cellIdOfPosition(const Amg::Vector2D &localPosition) const
cell id for a given local position
Definition: PixelDiodeMap.cxx:38
Amg::distance
float distance(const Amg::Vector3D &p1, const Amg::Vector3D &p2)
calculates the distance between two point in 3D space
Definition: GeoPrimitivesHelpers.h:54