File indexing completed on 2025-02-22 09:36:50
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018 #include <DDSegmentation/TiledLayerGridXY.h>
0019 #include <DD4hep/Printout.h>
0020
0021
0022 #include <algorithm>
0023 #include <sstream>
0024 #include <stdexcept>
0025 #include <cmath>
0026
0027 namespace dd4hep {
0028 namespace DDSegmentation {
0029
0030
0031 TiledLayerGridXY::TiledLayerGridXY(const std::string& cellEncoding) :
0032 CartesianGrid(cellEncoding) {
0033
0034 _type = "TiledLayerGridXY";
0035 _description = "Cartesian segmentation in the local XY-plane using optimal tiling depending on the layer dimensions";
0036
0037 printout(INFO, "TiledLayerGridXY", " ######### dd4hep::DDSegmentation::TiledLayerGridXY() ");
0038
0039
0040 registerParameter("grid_size_x", "Cell size in X", _gridSizeX, 1., SegmentationParameter::LengthUnit);
0041 registerParameter("grid_size_y", "Cell size in Y", _gridSizeY, 1., SegmentationParameter::LengthUnit);
0042 registerParameter("offset_x", "Cell offset in X", _offsetX, 0., SegmentationParameter::LengthUnit, true);
0043 registerParameter("offset_y", "Cell offset in Y", _offsetY, 0., SegmentationParameter::LengthUnit, true);
0044 registerIdentifier("identifier_x", "Cell ID identifier for X", _xId, "x");
0045 registerIdentifier("identifier_y", "Cell ID identifier for Y", _yId, "y");
0046 registerIdentifier("identifier_layer", "Cell encoding identifier for layer", _identifierLayer, "layer");
0047 registerParameter("layer_offsetX", "List of layer x offset", _layerOffsetX, std::vector<double>(),
0048 SegmentationParameter::NoUnit, true);
0049 registerParameter("layer_offsetY", "List of layer y offset", _layerOffsetY, std::vector<double>(),
0050 SegmentationParameter::NoUnit, true);
0051 }
0052
0053
0054 TiledLayerGridXY::TiledLayerGridXY(const BitFieldCoder* decode) : CartesianGrid(decode) {
0055
0056 _type = "TiledLayerGridXY";
0057 _description = "Cartesian segmentation in the local XY-plane using optimal tiling depending on the layer dimensions";
0058
0059 printout(INFO, "TiledLayerGridXY", " ######### dd4hep::DDSegmentation::TiledLayerGridXY() ");
0060
0061
0062 registerParameter("grid_size_x", "Cell size in X", _gridSizeX, 1., SegmentationParameter::LengthUnit);
0063 registerParameter("grid_size_y", "Cell size in Y", _gridSizeY, 1., SegmentationParameter::LengthUnit);
0064 registerParameter("offset_x", "Cell offset in X", _offsetX, 0., SegmentationParameter::LengthUnit, true);
0065 registerParameter("offset_y", "Cell offset in Y", _offsetY, 0., SegmentationParameter::LengthUnit, true);
0066 registerIdentifier("identifier_x", "Cell ID identifier for X", _xId, "x");
0067 registerIdentifier("identifier_y", "Cell ID identifier for Y", _yId, "y");
0068 registerIdentifier("identifier_layer", "Cell encoding identifier for layer", _identifierLayer, "layer");
0069 registerParameter("layer_offsetX", "List of layer x offset", _layerOffsetX, std::vector<double>(),
0070 SegmentationParameter::NoUnit, true);
0071 registerParameter("layer_offsetY", "List of layer y offset", _layerOffsetY, std::vector<double>(),
0072 SegmentationParameter::NoUnit, true);
0073 }
0074
0075
0076 TiledLayerGridXY::~TiledLayerGridXY() {
0077
0078 }
0079
0080
0081 Vector3D TiledLayerGridXY::position(const CellID& cID) const {
0082 unsigned int _layerIndex;
0083 Vector3D cellPosition;
0084
0085
0086 _layerIndex = _decoder->get(cID,_identifierLayer);
0087
0088 if ( _layerOffsetX.size() != 0 && _layerIndex <=_layerOffsetX.size() ) {
0089 cellPosition.X = binToPosition(_decoder->get(cID,_xId), _gridSizeX, _layerOffsetX[_layerIndex - 1]*_gridSizeX/2.);
0090
0091 if ( ( _layerDimX.size() != 0 && _layerIndex <= _layerDimX.size() )
0092 &&( _fractCellSizeXPerLayer.size() != 0 && _layerIndex <= _fractCellSizeXPerLayer.size() )
0093 &&(std::fabs( cellPosition.X ) > ( _layerDimX.at(_layerIndex - 1) - _fractCellSizeXPerLayer.at(_layerIndex - 1) ))
0094 )
0095 {
0096
0097 cellPosition.X = cellPosition.X/std::fabs(cellPosition.X)
0098 *(_layerDimX.at(_layerIndex - 1) - _fractCellSizeXPerLayer.at(_layerIndex - 1)/2.0) ;
0099 }
0100 } else {
0101 cellPosition.X = binToPosition(_decoder->get(cID,_xId), _gridSizeX, _offsetX);
0102 }
0103 cellPosition.Y = binToPosition(_decoder->get(cID,_yId), _gridSizeY, _offsetY);
0104 return cellPosition;
0105 }
0106
0107
0108 CellID TiledLayerGridXY::cellID(const Vector3D& localPosition, const Vector3D& , const VolumeID& vID) const {
0109 CellID cID = vID ;
0110 unsigned int _layerIndex;
0111
0112
0113 _layerIndex = _decoder->get(cID,_identifierLayer);
0114
0115 if ( _layerOffsetX.size() != 0 && _layerIndex <=_layerOffsetX.size() ) {
0116 _decoder->set(cID,_xId,positionToBin(localPosition.X, _gridSizeX, _layerOffsetX[_layerIndex - 1]*_gridSizeX/2.));
0117 } else {
0118 _decoder->set(cID,_xId,positionToBin(localPosition.X, _gridSizeX, _offsetX));
0119 }
0120 _decoder->set(cID,_yId, positionToBin(localPosition.Y, _gridSizeY, _offsetY));
0121 return cID;
0122 }
0123
0124 std::vector<double> TiledLayerGridXY::cellDimensions(const CellID&) const {
0125 #if __cplusplus >= 201103L
0126 return {_gridSizeX, _gridSizeY};
0127 #else
0128 std::vector<double> cellDims(2,0.0);
0129 cellDims[0] = _gridSizeX;
0130 cellDims[1] = _gridSizeY;
0131 return cellDims;
0132 #endif
0133 }
0134
0135
0136 }
0137 }