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/TiledLayerSegmentation.h>
0019
0020
0021 #include <algorithm>
0022 #include <sstream>
0023 #include <stdexcept>
0024
0025 namespace dd4hep {
0026 namespace DDSegmentation {
0027
0028 using std::find;
0029 using std::runtime_error;
0030 using std::stringstream;
0031 using std::vector;
0032
0033 TiledLayerSegmentation::TiledLayerSegmentation(const std::string& cellEncoding) :
0034 Segmentation(cellEncoding) {
0035 _type = "TiledLayerSegmentation";
0036 _description = "Cartesian segmentation using optimal tiling depending on the layer dimensions";
0037
0038
0039 registerParameter("grid_size_x", "Default cell size in X", _gridSizeX, 1., SegmentationParameter::LengthUnit);
0040 registerParameter("grid_size_y", "Default cell size in Y", _gridSizeY, 1., SegmentationParameter::LengthUnit);
0041 registerIdentifier("identifier_x", "Cell encoding identifier for X", _identifierX, "x");
0042 registerIdentifier("identifier_y", "Cell encoding identifier for Y", _identifierY, "y");
0043 registerParameter("identifier_layer", "Cell encoding identifier for layer", _identifierLayer, std::string("layer"),
0044 SegmentationParameter::NoUnit, true);
0045 registerParameter("layer_identifiers", "List of valid layer identifiers", _layerIndices, vector<int>(),
0046 SegmentationParameter::NoUnit, true);
0047 registerParameter("x_dimensions", "List of layer x dimensions", _layerDimensionsX, vector<double>(),
0048 SegmentationParameter::NoUnit, true);
0049 registerParameter("y_dimensions", "List of layer y dimensions", _layerDimensionsY, vector<double>(),
0050 SegmentationParameter::NoUnit, true);
0051
0052 }
0053
0054
0055 TiledLayerSegmentation::TiledLayerSegmentation(const BitFieldCoder* decode) : Segmentation(decode) {
0056 _type = "TiledLayerSegmentation";
0057 _description = "Cartesian segmentation using optimal tiling depending on the layer dimensions";
0058
0059
0060 registerParameter("grid_size_x", "Default cell size in X", _gridSizeX, 1., SegmentationParameter::LengthUnit);
0061 registerParameter("grid_size_y", "Default cell size in Y", _gridSizeY, 1., SegmentationParameter::LengthUnit);
0062 registerIdentifier("identifier_x", "Cell encoding identifier for X", _identifierX, "x");
0063 registerIdentifier("identifier_y", "Cell encoding identifier for Y", _identifierY, "y");
0064 registerParameter("identifier_layer", "Cell encoding identifier for layer", _identifierLayer, std::string("layer"),
0065 SegmentationParameter::NoUnit, true);
0066 registerParameter("layer_identifiers", "List of valid layer identifiers", _layerIndices, vector<int>(),
0067 SegmentationParameter::NoUnit, true);
0068 registerParameter("x_dimensions", "List of layer x dimensions", _layerDimensionsX, vector<double>(),
0069 SegmentationParameter::NoUnit, true);
0070 registerParameter("y_dimensions", "List of layer y dimensions", _layerDimensionsY, vector<double>(),
0071 SegmentationParameter::NoUnit, true);
0072
0073 }
0074
0075 TiledLayerSegmentation::~TiledLayerSegmentation() {
0076 }
0077
0078
0079 double TiledLayerSegmentation::layerGridSizeX(int layerIndex) const {
0080
0081 return calculateOptimalCellSize(_gridSizeX, layerDimensions(layerIndex).x);
0082 }
0083
0084
0085 double TiledLayerSegmentation::layerGridSizeY(int layerIndex) const {
0086
0087 return calculateOptimalCellSize(_gridSizeY, layerDimensions(layerIndex).y);
0088 }
0089
0090
0091 void TiledLayerSegmentation::setLayerDimensions(int layerIndex, double x, double y) {
0092
0093 if (_layerIndices.size() != _layerDimensionsX.size() or _layerIndices.size() != _layerDimensionsY.size()) {
0094 throw runtime_error(
0095 "TiledLayerSegmentation::setLayerDimensions: inconsistent size of layer parameter vectors.");
0096 }
0097 vector<int>::iterator it = find(_layerIndices.begin(), _layerIndices.end(), layerIndex);
0098 if (it == _layerIndices.end()) {
0099 _layerIndices.emplace_back(layerIndex);
0100 _layerDimensionsX.emplace_back(x);
0101 _layerDimensionsY.emplace_back(y);
0102 } else {
0103 size_t index = it - _layerIndices.begin();
0104 _layerDimensionsX[index] = x;
0105 _layerDimensionsY[index] = y;
0106 }
0107 }
0108
0109
0110 TiledLayerSegmentation::LayerDimensions TiledLayerSegmentation::layerDimensions(int layerIndex) const {
0111
0112 if (_layerIndices.size() != _layerDimensionsX.size() or _layerIndices.size() != _layerDimensionsY.size()) {
0113 throw runtime_error(
0114 "TiledLayerSegmentation::layerDimensions: inconsistent size of layer parameter vectors.");
0115 }
0116 vector<int>::const_iterator it = find(_layerIndices.begin(), _layerIndices.end(), layerIndex);
0117 if (it == _layerIndices.end()) {
0118 stringstream message;
0119 message << "TiledLayerSegmentation::layerDimensions: invalid layer index " << layerIndex;
0120 throw runtime_error(message.str());
0121 } else {
0122 size_t index = it - _layerIndices.begin();
0123 return LayerDimensions(_layerDimensionsX[index], _layerDimensionsY[index]);
0124 }
0125 }
0126
0127
0128 Vector3D TiledLayerSegmentation::position(const CellID& cID) const {
0129 int layerIndex = _decoder->get(cID,_identifierLayer);
0130 double cellSizeX = layerGridSizeX(layerIndex);
0131 double cellSizeY = layerGridSizeY(layerIndex);
0132 LayerDimensions dimensions = layerDimensions(layerIndex);
0133 double offsetX = calculateOffset(cellSizeX, dimensions.x);
0134 double offsetY = calculateOffset(cellSizeY, dimensions.y);
0135 double localX = binToPosition(_decoder->get(cID,_identifierX), cellSizeX, offsetX);
0136 double localY = binToPosition(_decoder->get(cID,_identifierY), cellSizeY, offsetY);
0137 return Vector3D(localX, localY, 0.);
0138 }
0139
0140 CellID TiledLayerSegmentation::cellID(const Vector3D& localPosition, const Vector3D& ,
0141 const VolumeID& vID) const {
0142 CellID cID = vID ;
0143 int layerIndex = _decoder->get(cID,_identifierLayer);
0144 double cellSizeX = layerGridSizeX(layerIndex);
0145 double cellSizeY = layerGridSizeY(layerIndex);
0146 LayerDimensions dimensions = layerDimensions(layerIndex);
0147 double offsetX = calculateOffset(cellSizeX, dimensions.x);
0148 double offsetY = calculateOffset(cellSizeY, dimensions.y);
0149 _decoder->set(cID,_identifierX, positionToBin(localPosition.x(), cellSizeX, offsetX));
0150 _decoder->set(cID,_identifierY, positionToBin(localPosition.y(), cellSizeY, offsetY));
0151 return cID;
0152 }
0153
0154
0155 double TiledLayerSegmentation::calculateOptimalCellSize(double , double ) {
0156
0157 return 1.;
0158 }
0159
0160
0161 double TiledLayerSegmentation::calculateOffset(double , double ) {
0162
0163 return 0.;
0164 }
0165
0166 }
0167 }