DD4hep  1.30.0
Detector Description Toolkit for High Energy Physics
WaferGridXY.cpp
Go to the documentation of this file.
1 //==========================================================================
2 // AIDA Detector description implementation
3 //--------------------------------------------------------------------------
4 // Copyright (C) Organisation europeenne pour la Recherche nucleaire (CERN)
5 // All rights reserved.
6 //
7 // For the licensing terms see $DD4hepINSTALL/LICENSE.
8 // For the list of contributors see $DD4hepINSTALL/doc/CREDITS.
9 //
10 //==========================================================================
11 /*
12  * WaferGridXY.cpp
13  *
14  * Created on: April 19, 2016
15  * Author: S. Lu, DESY
16  */
17 
19 
20 namespace dd4hep {
21 namespace DDSegmentation {
22 
24 WaferGridXY::WaferGridXY(const std::string& cellEncoding) :
25  CartesianGrid(cellEncoding) {
26  // define type and description
27  _type = "WaferGridXY";
28  _description = "Cartesian segmentation in the local XY-plane for both Normal wafer and Magic wafer(depending on the layer dimensions)";
29 
30  // register all necessary parameters
31  registerParameter("grid_size_x", "Cell size in X", _gridSizeX, 1., SegmentationParameter::LengthUnit);
32  registerParameter("grid_size_y", "Cell size in Y", _gridSizeY, 1., SegmentationParameter::LengthUnit);
33  registerParameter("offset_x", "Cell offset in X", _offsetX, 0., SegmentationParameter::LengthUnit, true);
34  registerParameter("offset_y", "Cell offset in Y", _offsetY, 0., SegmentationParameter::LengthUnit, true);
35  registerIdentifier("identifier_x", "Cell ID identifier for X", _xId, "x");
36  registerIdentifier("identifier_y", "Cell ID identifier for Y", _yId, "y");
37  registerParameter("identifier_groupMGWafer", "Cell encoding identifier for Magic Wafer group", _identifierMGWaferGroup, std::string("layer"),
39  registerParameter("identifier_wafer", "Cell encoding identifier for wafer", _identifierWafer, std::string("wafer"),
41 }
42 
45  // define type and description
46  _type = "WaferGridXY";
47  _description = "Cartesian segmentation in the local XY-plane for both Normal wafer and Magic wafer(depending on the layer dimensions)";
48 
49  // register all necessary parameters
50  registerParameter("grid_size_x", "Cell size in X", _gridSizeX, 1., SegmentationParameter::LengthUnit);
51  registerParameter("grid_size_y", "Cell size in Y", _gridSizeY, 1., SegmentationParameter::LengthUnit);
52  registerParameter("offset_x", "Cell offset in X", _offsetX, 0., SegmentationParameter::LengthUnit, true);
53  registerParameter("offset_y", "Cell offset in Y", _offsetY, 0., SegmentationParameter::LengthUnit, true);
54  registerIdentifier("identifier_x", "Cell ID identifier for X", _xId, "x");
55  registerIdentifier("identifier_y", "Cell ID identifier for Y", _yId, "y");
56  registerParameter("identifier_groupMGWafer", "Cell encoding identifier for Magic Wafer group", _identifierMGWaferGroup, std::string("layer"),
58  registerParameter("identifier_wafer", "Cell encoding identifier for wafer", _identifierWafer, std::string("wafer"),
60 }
61 
64 
65 }
66 
69  unsigned int _groupMGWaferIndex;
70  unsigned int _waferIndex;
71  Vector3D cellPosition;
72 
73  _groupMGWaferIndex = _decoder->get(cID,_identifierMGWaferGroup);
74  _waferIndex = _decoder->get(cID,_identifierWafer);
75 
76  if ( _waferOffsetX[_groupMGWaferIndex][_waferIndex] > 0 || _waferOffsetX[_groupMGWaferIndex][_waferIndex] < 0 )
77  {
78  cellPosition.X = binToPosition(_decoder->get(cID,_xId), _gridSizeX, _offsetX+_waferOffsetX[_groupMGWaferIndex][_waferIndex]);
79  }
80  else
81  {
82  cellPosition.X = binToPosition(_decoder->get(cID,_xId), _gridSizeX, _offsetX);
83  }
84 
85  if ( _waferOffsetY[_groupMGWaferIndex][_waferIndex] > 0 || _waferOffsetY[_groupMGWaferIndex][_waferIndex] < 0 )
86  {
87  cellPosition.Y = binToPosition(_decoder->get(cID,_yId), _gridSizeY, _offsetY+_waferOffsetY[_groupMGWaferIndex][_waferIndex]);
88  }
89  else
90  {
91  cellPosition.Y = binToPosition(_decoder->get(cID,_yId), _gridSizeY, _offsetY);
92  }
93 
94  return cellPosition;
95 }
96 
98  CellID WaferGridXY::cellID(const Vector3D& localPosition, const Vector3D& /* globalPosition */, const VolumeID& vID) const {
99  unsigned int _groupMGWaferIndex;
100  unsigned int _waferIndex;
101 
102  CellID cID = vID ;
103 
104  _groupMGWaferIndex = _decoder->get(cID,_identifierMGWaferGroup);
105  _waferIndex = _decoder->get(cID,_identifierWafer);
106 
107  if ( _waferOffsetX[_groupMGWaferIndex][_waferIndex] > 0 || _waferOffsetX[_groupMGWaferIndex][_waferIndex] < 0 )
108  {
109  _decoder->set(cID,_xId, positionToBin(localPosition.X, _gridSizeX, _offsetX+_waferOffsetX[_groupMGWaferIndex][_waferIndex]));
110  }
111  else
112  {
113  _decoder->set(cID,_xId, positionToBin(localPosition.X, _gridSizeX, _offsetX));
114  }
115 
116  if ( _waferOffsetY[_groupMGWaferIndex][_waferIndex] > 0 || _waferOffsetY[_groupMGWaferIndex][_waferIndex] < 0)
117  {
118  _decoder->set(cID,_yId, positionToBin(localPosition.Y, _gridSizeY, _offsetY+_waferOffsetY[_groupMGWaferIndex][_waferIndex]));
119  }
120  else
121  {
122  _decoder->set(cID,_yId, positionToBin(localPosition.Y, _gridSizeY, _offsetY));
123  }
124 
125  return cID;
126 }
127 
128 std::vector<double> WaferGridXY::cellDimensions(const CellID&) const {
129 #if __cplusplus >= 201103L
130  return {_gridSizeX, _gridSizeY};
131 #else
132  std::vector<double> cellDims(2,0.0);
133  cellDims[0] = _gridSizeX;
134  cellDims[1] = _gridSizeY;
135  return cellDims;
136 #endif
137 }
138 
139 } /* namespace DDSegmentation */
140 } /* namespace dd4hep */
dd4hep::DDSegmentation::VolumeID
uint64_t VolumeID
Definition: BitFieldCoder.h:27
dd4hep::DDSegmentation::WaferGridXY::_identifierWafer
std::string _identifierWafer
encoding field used for the wafer
Definition: WaferGridXY.h:141
dd4hep::DDSegmentation::Segmentation::_decoder
const BitFieldCoder * _decoder
The cell ID encoder and decoder.
Definition: Segmentation.h:168
WaferGridXY.h
dd4hep::DDSegmentation::Vector3D
Simple container for a physics vector.
Definition: Segmentation.h:48
dd4hep::DDSegmentation::WaferGridXY::_waferOffsetY
double _waferOffsetY[MAX_GROUPS][MAX_WAFERS]
list of wafer y offset for each group
Definition: WaferGridXY.h:133
dd4hep::DDSegmentation::SegmentationParameter::LengthUnit
@ LengthUnit
Definition: SegmentationParameter.h:111
dd4hep::DDSegmentation::BitFieldCoder
Helper class for decoding and encoding a bit field of 64bits for convenient declaration.
Definition: BitFieldCoder.h:114
dd4hep::DDSegmentation::WaferGridXY::_yId
std::string _yId
the field name used for Y
Definition: WaferGridXY.h:137
dd4hep::DDSegmentation::BitFieldCoder::get
FieldID get(CellID bitfield, size_t idx) const
Definition: BitFieldCoder.h:165
dd4hep::DDSegmentation::WaferGridXY::_offsetX
double _offsetX
the coordinate offset in X
Definition: WaferGridXY.h:125
dd4hep::DDSegmentation::WaferGridXY::cellID
virtual CellID cellID(const Vector3D &localPosition, const Vector3D &globalPosition, const VolumeID &volumeID) const
determine the cell ID based on the position
Definition: WaferGridXY.cpp:98
dd4hep::DDSegmentation::WaferGridXY::_offsetY
double _offsetY
the coordinate offset in Y
Definition: WaferGridXY.h:129
dd4hep::DDSegmentation::SegmentationParameter::NoUnit
@ NoUnit
Definition: SegmentationParameter.h:111
dd4hep::DDSegmentation::WaferGridXY::_identifierMGWaferGroup
std::string _identifierMGWaferGroup
encoding field used for the Magic Wafer group
Definition: WaferGridXY.h:139
dd4hep::DDSegmentation::Segmentation::registerParameter
void registerParameter(const std::string &nam, const std::string &desc, TYPE &param, const TYPE &defaultVal, UnitType unitTyp=SegmentationParameter::NoUnit, bool isOpt=false)
Add a parameter to this segmentation. Used by derived classes to define their parameters.
Definition: Segmentation.h:138
dd4hep::DDSegmentation::WaferGridXY::_waferOffsetX
double _waferOffsetX[MAX_GROUPS][MAX_WAFERS]
list of wafer x offset for each group
Definition: WaferGridXY.h:131
dd4hep::DDSegmentation::WaferGridXY::~WaferGridXY
virtual ~WaferGridXY()
destructor
Definition: WaferGridXY.cpp:63
dd4hep::DDSegmentation::Vector3D::Y
double Y
Definition: Segmentation.h:71
dd4hep::DDSegmentation::BitFieldCoder::set
void set(CellID &bitfield, size_t idx, FieldID value) const
Definition: BitFieldCoder.h:177
dd4hep::DDSegmentation::WaferGridXY::WaferGridXY
WaferGridXY(const std::string &cellEncoding="")
Default constructor passing the encoding string.
Definition: WaferGridXY.cpp:24
dd4hep::DDSegmentation::CellID
uint64_t CellID
Definition: BitFieldCoder.h:26
dd4hep::DDSegmentation::Segmentation::registerIdentifier
void registerIdentifier(const std::string &nam, const std::string &desc, std::string &ident, const std::string &defaultVal)
Add a cell identifier to this segmentation. Used by derived classes to define their required identifi...
Definition: Segmentation.cpp:135
dd4hep::DDSegmentation::WaferGridXY::_gridSizeX
double _gridSizeX
the grid size in X
Definition: WaferGridXY.h:123
dd4hep::DDSegmentation::Segmentation::_description
std::string _description
The description of the segmentation.
Definition: Segmentation.h:162
dd4hep::DDSegmentation::Segmentation::positionToBin
static int positionToBin(double position, double cellSize, double offset=0.)
Helper method to convert a 1D position to a cell ID.
Definition: Segmentation.cpp:150
dd4hep::DDSegmentation::Vector3D::X
double X
Definition: Segmentation.h:71
dd4hep::DDSegmentation::Segmentation::binToPosition
static double binToPosition(FieldID bin, double cellSize, double offset=0.)
Helper method to convert a bin number to a 1D position.
Definition: Segmentation.cpp:145
dd4hep
Namespace for the AIDA detector description toolkit.
Definition: AlignmentsCalib.h:28
dd4hep::DDSegmentation::WaferGridXY::cellDimensions
virtual std::vector< double > cellDimensions(const CellID &cellID) const
Returns a vector<double> of the cellDimensions of the given cell ID in natural order of dimensions,...
Definition: WaferGridXY.cpp:128
dd4hep::DDSegmentation::WaferGridXY::position
virtual Vector3D position(const CellID &cellID) const
determine the position based on the cell ID
Definition: WaferGridXY.cpp:68
dd4hep::DDSegmentation::WaferGridXY::_xId
std::string _xId
the field name used for X
Definition: WaferGridXY.h:135
dd4hep::DDSegmentation::Segmentation::_type
std::string _type
The segmentation type.
Definition: Segmentation.h:160
dd4hep::DDSegmentation::WaferGridXY::_gridSizeY
double _gridSizeY
the grid size in Y
Definition: WaferGridXY.h:127
dd4hep::DDSegmentation::CartesianGrid
Segmentation base class describing cartesian grid segmentation.
Definition: CartesianGrid.h:28