From 41ca0579df8197d734b364fbb2125659145e8a29 Mon Sep 17 00:00:00 2001 From: Daniel Jeans <daniel.jeans@kek.jp> Date: Fri, 14 Jul 2017 06:41:42 +0200 Subject: [PATCH] MegatileLayerGridXY segmentation: add segmentation parameters --- .../DDSegmentation/MegatileLayerGridXY.h | 33 +++++++++++++------ .../src/segmentations/MegatileLayerGridXY.cpp | 23 ++++++++----- 2 files changed, 38 insertions(+), 18 deletions(-) diff --git a/DDCore/include/DDSegmentation/MegatileLayerGridXY.h b/DDCore/include/DDSegmentation/MegatileLayerGridXY.h index 6ef055dd6..b98c9ad1d 100644 --- a/DDCore/include/DDSegmentation/MegatileLayerGridXY.h +++ b/DDCore/include/DDSegmentation/MegatileLayerGridXY.h @@ -12,8 +12,6 @@ #include <cassert> -#define MAX_LAYERS 100 - /* a megatile is a rectangule in x-y, split into a grid along x and y, with an exactly integer number of cells in x and y. @@ -28,6 +26,11 @@ D. Jeans - Nov 2016 + July 2017 - DJeans + some changes for easier use of multi-layer segmentations + - for uniform segmentation, allow setting of ncellsx/y via parameter + - use std::vector, rather than fixed array to store ncells values + */ @@ -65,9 +68,13 @@ namespace dd4hep { } void setMegaTileCellsXY( unsigned int layer, int ix, int iy ) { - assert ( layer < MAX_LAYERS ); - _nCellsX[layer] = ix; - _nCellsY[layer] = iy; + while ( _nCellsX.size()<=layer ) { + _nCellsX.push_back(0); + _nCellsY.push_back(0); + } + _nCellsX[layer] = ix; + _nCellsY[layer] = iy; + } void setSpecialMegaTile( unsigned int layer, unsigned int tile, @@ -96,6 +103,12 @@ namespace dd4hep { virtual std::vector<double> cellDimensions(const CellID& cellID) const; virtual std::vector<double> cellDimensions(const unsigned int ilayer, const unsigned int iwafer) const; + int getUnifNCellsX() {return _unif_nCellsX;} + int getUnifNCellsY() {return _unif_nCellsY;} + + + protected: + struct segInfo { double megaTileSizeX = 0; double megaTileSizeY = 0; @@ -106,9 +119,6 @@ namespace dd4hep { segInfo() = default; }; - - protected: - mutable segInfo _currentSegInfo; void getSegInfo( unsigned int layerIndex, unsigned int waferIndex) const; @@ -125,8 +135,11 @@ namespace dd4hep { double _megaTileOffsetY = 0; // number of cells per megatile in X, Y - unsigned int _nCellsX[MAX_LAYERS]; - unsigned int _nCellsY[MAX_LAYERS]; + std::vector < int > _nCellsX; + std::vector < int > _nCellsY; + + int _unif_nCellsX; + int _unif_nCellsY; std::map < std::pair < unsigned int, unsigned int > , segInfo > specialMegaTiles_layerWafer; diff --git a/DDCore/src/segmentations/MegatileLayerGridXY.cpp b/DDCore/src/segmentations/MegatileLayerGridXY.cpp index bf5fd18de..8cb6cab68 100644 --- a/DDCore/src/segmentations/MegatileLayerGridXY.cpp +++ b/DDCore/src/segmentations/MegatileLayerGridXY.cpp @@ -50,10 +50,11 @@ namespace dd4hep { registerParameter("identifier_module", "Cell encoding identifier for module", _identifierModule, std::string("module"), SegmentationParameter::NoUnit, true); - for (int i=0; i<MAX_LAYERS; i++) { - _nCellsX[i]=0; - _nCellsY[i]=0; - } + registerParameter("common_nCellsX", "ncells in x (uniform)", _unif_nCellsX, int(0), SegmentationParameter::NoUnit, true); + registerParameter("common_nCellsY", "ncells in y (uniform)", _unif_nCellsY, int(0), SegmentationParameter::NoUnit, true); + + _nCellsX.clear(); + _nCellsY.clear(); } @@ -144,16 +145,22 @@ namespace dd4hep { void MegatileLayerGridXY::getSegInfo( unsigned int layerIndex, unsigned int waferIndex) const { - assert ( layerIndex < MAX_LAYERS && "layer index too high" ); - std::pair < unsigned int, unsigned int > tileid(layerIndex, waferIndex); if ( specialMegaTiles_layerWafer.find( tileid ) == specialMegaTiles_layerWafer.end() ) { // standard megatile _currentSegInfo.megaTileSizeX = _megaTileSizeX; _currentSegInfo.megaTileSizeY = _megaTileSizeY; _currentSegInfo.megaTileOffsetX = _megaTileOffsetX; _currentSegInfo.megaTileOffsetY = _megaTileOffsetY; - _currentSegInfo.nCellsX = _nCellsX[layerIndex]; - _currentSegInfo.nCellsY = _nCellsY[layerIndex]; + + if ( _unif_nCellsX>0 && _unif_nCellsY>0 ) { + _currentSegInfo.nCellsX = _unif_nCellsX; + _currentSegInfo.nCellsY = _unif_nCellsY; + } else { + assert ( layerIndex<_nCellsX.size() && "MegatileLayerGridXY ERROR: too high layer index?" ); + _currentSegInfo.nCellsX = _nCellsX[layerIndex]; + _currentSegInfo.nCellsY = _nCellsY[layerIndex]; + } + } else { // special megatile _currentSegInfo = specialMegaTiles_layerWafer.find( tileid )->second; } -- GitLab