6 #include <GaudiKernel/SystemOfUnits.h>
12 #include <GeoModelKernel/GeoFullPhysVol.h>
13 #include <GeoModelKernel/GeoPhysVol.h>
14 #include <GeoModelKernel/GeoTrd.h>
16 #include <GeoModelRead/ReadGeoModel.h>
29 MmReadoutGeomTool::MmReadoutGeomTool(
const std::string&
type,
30 const std::string&
name,
33 declareInterface<IMuonReadoutGeomTool>(
this);
44 return StatusCode::FAILURE;
48 if (shape->typeID() != GeoTrd::getClassTypeID()) {
50 return StatusCode::FAILURE;
53 const GeoTrd* trapezoid =
static_cast<const GeoTrd*
>(shape);
66 std::vector<physVolWithTrans> allGasGaps =
m_geoUtilTool->findAllLeafNodesByName(define.
physVol,
"actMicroMegaGas");
67 if (allGasGaps.empty()) {
69 return StatusCode::FAILURE;
79 return StatusCode::FAILURE;
82 const wMMTable& paramBook{parBookItr->second};
94 std::sort(allGasGaps.begin(), allGasGaps.end(),
96 const Amg::Vector3D posGapI = gapI.transform.translation();
97 const Amg::Vector3D posGapJ = gapJ.transform.translation();
98 return posGapI.x() < posGapJ.x();
101 for (std::size_t
gap = 0;
gap < allGasGaps.size(); ++
gap) {
103 auto& gapVol = allGasGaps[
gap];
104 const Amg::Vector3D posGapI = gapVol.transform.translation();
108 ATH_MSG_DEBUG(
"quadruplet " << define.
chambDesign.substr(6,7) <<
" stereoAngle : " << paramBook.stereoAngle.at(
gap) <<
" totalStrips " << paramBook.totalActiveStrips.at(
gap) <<
" GasGAP POS X : " << posGapI.x() );
110 const GeoShape* gapShape =
m_geoUtilTool->extractShape(gapVol.volume);
111 if (gapShape->typeID() != GeoTrd::getClassTypeID()) {
113 return StatusCode::FAILURE;
116 bool isStereo =
static_cast<bool>(paramBook.stereoAngle.at(
gap));
118 const GeoTrd* gapTrd =
static_cast<const GeoTrd*
>(gapShape);
120 double gapHalfHeight = gapTrd->getZHalfLength();
121 double gapHalfShortY =
std::min(gapTrd->getYHalfLength1(), gapTrd->getYHalfLength2());
122 double gapHalfLongY =
std::max(gapTrd->getYHalfLength1(), gapTrd->getYHalfLength2());
124 double firstStripPos{0.};
125 int firstActiveStrip{0};
127 firstActiveStrip = paramBook.nMissedBottomStereo + 1;
128 firstStripPos = -gapHalfHeight + (1.*(firstActiveStrip - paramBook.nMissedTopEta) + 2.5)* paramBook.stripPitch;
130 firstActiveStrip = paramBook.nMissedBottomEta + 1;
131 firstStripPos = -gapHalfHeight + 1.5 *paramBook.stripPitch;
141 stripDesign->defineStripLayout(firstStripPos * Amg::Vector2D::UnitX(),
142 paramBook.stripPitch,
143 paramBook.stripWidth,
144 paramBook.totalActiveStrips.at(
gap),
148 stripDesign->defineTrapezoid(gapHalfShortY, gapHalfLongY, gapHalfHeight, paramBook.stereoAngle.at(
gap));
157 stripDesign = (*factoryCache.
stripDesigns.emplace(stripDesign).first);
158 auto stripLayer = std::make_unique<StripLayer>(stripLayerRotation, stripDesign,
159 IdentifierHash{
static_cast<unsigned int>(
gap)});
160 define.
layers.push_back(*factoryCache.
stripLayers.emplace(std::move(stripLayer)).first);
162 return StatusCode::SUCCESS;
169 GeoModelIO::ReadGeoModel* sqliteReader =
m_geoDbTagSvc->getSqliteReader();
171 ATH_MSG_FATAL(
"Error, the tool works exclusively from sqlite geometry inputs");
172 return StatusCode::FAILURE;
182 physNodeMap mapFPV = sqliteReader->getPublishedNodes<std::string, GeoFullPhysVol*>(
"Muon");
183 #ifndef SIMULATIONBASE
187 for (
auto& [
key,
pv] : mapFPV) {
191 std::vector<std::string> key_tokens =
tokenize(
key,
"_");
193 if (key_tokens[0].
find(
"MM") == std::string::npos){
200 define.detElId = idHelper.channelID(key_tokens[1][0] ==
'S' ?
"MMS" :
"MML",
201 atoi(key_tokens[2].c_str()),
202 atoi(key_tokens[3].c_str()),
210 return StatusCode::FAILURE;
215 define.chambDesign = key_tokens[0]+
"_"+key_tokens[1];
216 define.alignTransform =
m_geoUtilTool->findAlignableTransform(define.physVol);
218 #ifndef SIMULATIONBASE
219 define.layerBounds = layerBounds;
221 std::unique_ptr<MmReadoutElement> readoutEle = std::make_unique<MmReadoutElement>(std::move(define));
222 ATH_CHECK(
mgr.addMmReadoutElement(std::move(readoutEle)));
224 return StatusCode::SUCCESS;
234 if (paramTable->size() == 0) {
236 return StatusCode::FAILURE;
239 << paramTable->tagName() <<
"] table with "
240 << paramTable->size() <<
" records");
245 const std::string chambType = record->getString(
"WMM_TYPE");
247 parBook.
stripPitch = record->getDouble(
"stripPitch") ;
248 parBook.
stripWidth = record->getDouble(
"stripWidth") ;
265 return StatusCode::SUCCESS;