151 const std::map<std::string, std::string> ¶meters)
153 int circuitsPerEta{1};
154 int circuitsPerPhi{1};
155 double thickness{0.150};
158 double pitchEtaLong{};
159 double pitchPhiLong{};
160 double pitchEtaEnd{};
161 double pitchPhiEnd{};
162 int nEtaLongPerSide{};
163 int nPhiLongPerSide{};
164 int nEtaEndPerSide{};
165 int nPhiEndPerSide{};
166 int rowsPerCircuit{};
167 int columnsPerCircuit{};
175 getParameter(typeName, parameters,
"circuitsPerEta", circuitsPerEta);
176 getParameter(typeName, parameters,
"circuitsPerPhi", circuitsPerPhi);
177 getParameter(typeName, parameters,
"thickness", thickness);
178 getParameter(typeName, parameters,
"is3D", is3D);
179 getParameter(typeName, parameters,
"rows", rowsPerCircuit);
180 getParameter(typeName, parameters,
"columns", columnsPerCircuit);
181 getParameter(typeName, parameters,
"pitchEta", pitchEta);
182 getParameter(typeName, parameters,
"pitchPhi", pitchPhi);
183 getParameter(typeName, parameters,
"pitchEtaLong", pitchEtaLong);
184 getParameter(typeName, parameters,
"pitchPhiLong", pitchPhiLong);
185 getParameter(typeName, parameters,
"pitchEtaEnd", pitchEtaEnd);
186 getParameter(typeName, parameters,
"pitchPhiEnd", pitchPhiEnd);
187 getParameter(typeName, parameters,
"nPhiLongPerSide", nPhiLongPerSide);
188 getParameter(typeName, parameters,
"nEtaLongPerSide", nEtaLongPerSide);
189 getParameter(typeName, parameters,
"nPhiEndPerSide", nPhiEndPerSide);
190 getParameter(typeName, parameters,
"nEtaEndPerSide", nEtaEndPerSide);
195 auto computeAttribute = [pitchPhi,
199 ](
const std::array<PixelDiodeTree::IndexType,2> &split_idx,
201 [[maybe_unused]]
const std::array<bool,4> &ganged,
202 [[maybe_unused]]
unsigned int split_i,
205 -> std::tuple<PixelDiodeTree::AttributeType,PixelDiodeTree::AttributeType>
226 assert(split_idx[0]>=0 && split_idx[1]>=0);
227 std::array<int,2> chip_idx{split_idx[0]/rowsPerCircuit, split_idx[1]/columnsPerCircuit};
229 unsigned int n_large_dimensions = ( (std::abs(diode_width[0]-pitchPhi)>pitchPhi*.25)
230 +(std::abs(diode_width[1]-pitchEta)>pitchEta*.25));
231 switch (n_large_dimensions) {
243 return std::make_tuple(current_matrix_attribute, current_diode_attribute);
247 =
createPixelDiodeTree(std::array<unsigned int,2>{
static_cast<unsigned int>(circuitsPerPhi),
static_cast<unsigned int>(circuitsPerEta)},
248 std::array<unsigned int,2>{
static_cast<unsigned int>(rowsPerCircuit),
static_cast<unsigned int>(columnsPerCircuit)},
250 std::array<std::array<unsigned int,2>, 2>{ std::array<unsigned int,2>{
static_cast<unsigned int>(nPhiEndPerSide),
251 static_cast<unsigned int>(nEtaEndPerSide)},
252 std::array<unsigned int,2>{
static_cast<unsigned int>(nPhiLongPerSide),
253 static_cast<unsigned int>(nEtaLongPerSide)}},
257 std::array<std::array<unsigned int,2>, 2>{ std::array<unsigned int,2>{0u,0u},
258 std::array<unsigned int,2>{0u,0u}
267 auto design = std::make_unique<PixelModuleDesign>(thickness,
268 circuitsPerPhi, circuitsPerEta,
269 columnsPerCircuit, rowsPerCircuit,
270 columnsPerCircuit, rowsPerCircuit,
271 std::move(diode_tree), carrier,
272 readoutSide, is3D, detectorType,
275 ATH_MSG_DEBUG(
"readout geo - design " << typeName <<
" " << design->width() <<
"x" << design->length() <<
"x" << design->thickness()
276 <<
" " << design->rows() <<
"x" << design->columns()
277 <<
", " << circuitsPerPhi <<
"x" << circuitsPerEta <<
" "
278 << rowsPerCircuit <<
"x" << columnsPerCircuit
279 <<
" carrier " << carrier <<
" readout side " << readoutSide <<
":\n"
282 [[maybe_unused]]
auto observedPtr =
m_detectorManager->addDesign(std::move(design));
PixelDiodeTree createPixelDiodeTree(const std::array< unsigned int, 2 > &chip_dim, const std::array< unsigned int, 2 > &chip_matrix_dim, const PixelDiodeTree::Vector2D &pitch, const std::array< std::array< unsigned int, 2 >, 2 > &edge_dim, const std::array< PixelDiodeTree::Vector2D, 2 > &edge_pitch, const std::array< std::array< unsigned int, 2 >, 2 > &dead_zone, const AttributeRefiner &func_compute_attribute, std::ostream *debug_out=nullptr)
Create a pixel diode tree.