7 #include <GaudiKernel/SystemOfUnits.h>
11 #include <GeoModelKernel/GeoFullPhysVol.h>
12 #include <GeoModelKernel/GeoPhysVol.h>
13 #include <GeoModelKernel/GeoTrd.h>
14 #include <GeoModelKernel/GeoBox.h>
16 #include <GeoModelRead/ReadGeoModel.h>
26 #ifndef SIMULATIONBASE
27 # include "Acts/Utilities/BoundFactory.hpp"
40 std::unique_ptr<WireGroupDesign>
42 const GeoTrd* gapTrd)
const {
43 if (
table.wireGangs.empty()) {
46 const double halfMinX =
std::min(gapTrd->getYHalfLength1(), gapTrd->getYHalfLength2());
47 const double halfMaxX =
std::max(gapTrd->getYHalfLength1(), gapTrd->getYHalfLength2());
48 const double halfY = gapTrd->getZHalfLength();
49 auto design = std::make_unique<WireGroupDesign>();
50 design->defineTrapezoid(halfMinX, halfMaxX, halfY);
51 for (
unsigned gang :
table.wireGangs) {
52 design->declareGroup(gang);
54 const double wireOffSet = -0.5*
table.wirePitch * design->nAllWires();
59 std::unique_ptr<RadialStripDesign>
61 const GeoTrd* gapTrd)
const {
62 if (
table.bottomStripPos.empty()) {
65 const double halfMinX =
std::min(gapTrd->getYHalfLength1(), gapTrd->getYHalfLength2());
66 const double halfMaxX =
std::max(gapTrd->getYHalfLength1(), gapTrd->getYHalfLength2());
67 const double halfY = gapTrd->getZHalfLength();
69 auto design = std::make_unique<RadialStripDesign>();
71 design->defineTrapezoid(halfMinX, halfMaxX, halfY);
73 0.,0.,
table.bottomStripPos.size());
74 design->flipTrapezoid();
75 for (
size_t s = 0;
s <
table.bottomStripPos.size(); ++
s) {
76 design->addStrip(
table.bottomStripPos.at(
s),
85 <<std::endl<<std::endl<<m_geoUtilTool->dumpVolume(define.
physVol));
86 const GeoShape* shape = m_geoUtilTool->extractShape(define.
physVol);
89 return StatusCode::FAILURE;
92 if (shape->typeID() != GeoTrd::getClassTypeID()) {
94 <<
" is expected to be a trapezoid "<<m_geoUtilTool->dumpShape(shape));
95 return StatusCode::FAILURE;
97 const GeoTrd* chambTrd =
static_cast<const GeoTrd*
>(shape);
100 define.
halfHeight = chambTrd->getZHalfLength();
103 std::vector<physVolWithTrans> allGasGaps = m_geoUtilTool->findAllLeafNodesByName(define.
physVol,
"TgcGas");
104 if (allGasGaps.empty()) {
105 ATH_MSG_FATAL(
"The volume "<<m_idHelperSvc->toStringDetEl(define.
detElId)<<
" does not have any childern TgcGas"
106 <<std::endl<<m_geoUtilTool->dumpVolume(define.
physVol));
107 return StatusCode::FAILURE;
113 return StatusCode::SUCCESS;
115 unsigned layerIdx =
static_cast<unsigned>(layerReadout->hash());
118 return StatusCode::FAILURE;
121 return StatusCode::SUCCESS;
125 (m_idHelperSvc->stationEta(define.
detElId) > 0 ?
"A" :
"C"));
128 if (!wireReadout || !stripReadout) {
133 return StatusCode::FAILURE;
135 const GeoShape* gapShape = m_geoUtilTool->extractShape(pVolTrans.volume);
136 if (gapShape->typeID() != GeoTrd::getClassTypeID()) {
137 ATH_MSG_FATAL(
"Expected shape "<<m_geoUtilTool->dumpShape(gapShape)<<
" to be a trapezoid");
138 return StatusCode::FAILURE;
140 const GeoTrd* gapTrd =
static_cast<const GeoTrd*
>(gapShape);
144 wireDesign = (*factoryCache.
wireLayouts.insert(std::move(wireDesign)).first);
150 if (!wireReadout && wireDesign) {
151 const IdentifierHash layHash = TgcReadoutElement::constructHash(0,
gasGap+1,
false);
159 if (
false && radDesign) {
160 wireReadout = std::make_unique<StripLayer>(factoryCache.
trfNodeMaker.makeTransform(trans),
161 wireDesign, radDesign, layHash);
162 wireReadout->flipPhiRotation();
164 wireReadout = std::make_unique<StripLayer>(factoryCache.
trfNodeMaker.makeTransform(trans),
165 wireDesign, layHash);
168 if (!stripReadout && radDesign) {
169 const IdentifierHash layHash = TgcReadoutElement::constructHash(0,
gasGap+1,
true);
174 stripReadout = std::make_unique<StripLayer>(factoryCache.
trfNodeMaker.makeTransform(trans),
178 ATH_CHECK(assignReadoutLayer(stripReadout));
179 ATH_CHECK(assignReadoutLayer(wireReadout));
183 return StatusCode::SUCCESS;
189 GeoModelIO::ReadGeoModel* sqliteReader = m_geoDbTagSvc->getSqliteReader();
191 ATH_MSG_FATAL(
"Error, the tool works exclusively from sqlite geometry inputs");
192 return StatusCode::FAILURE;
198 #ifndef SIMULATIONBASE
199 auto layerBounds = std::make_shared<Acts::SurfaceBoundFactory>();
201 const TgcIdHelper& idHelper{m_idHelperSvc->tgcIdHelper()};
204 physNodeMap mapFPV = sqliteReader->getPublishedNodes<std::string, GeoFullPhysVol*>(
"Muon");
205 for (
auto& [
key,
pv] : mapFPV) {
209 std::vector<std::string> key_tokens =
tokenize(
key,
"_");
210 if (key_tokens.size() < 4 ||
211 !key_tokens[0].starts_with(
"TGC"))
215 const Identifier elementID = idHelper.elementID(key_tokens[1].substr(0,3),
atoi(key_tokens[2]),
atoi(key_tokens[3]),
isValid);
219 return StatusCode::FAILURE;
223 define.detElId = elementID;
224 define.chambDesign = key_tokens[0];
225 define.alignTransform = m_geoUtilTool->findAlignableTransform(define.physVol);
226 #ifndef SIMULATIONBASE
227 define.layerBounds = layerBounds;
229 ATH_MSG_DEBUG(
"Key "<<
key<<
" lead to Identifier "<<m_idHelperSvc->toStringDetEl(define.detElId));
230 ATH_CHECK(loadDimensions(define, facCache));
231 std::unique_ptr<TgcReadoutElement> readoutEle = std::make_unique<TgcReadoutElement>(std::move(define));
232 ATH_CHECK(
mgr.addTgcReadoutElement(std::move(readoutEle)));
235 return StatusCode::SUCCESS;
239 std::vector<const TgcReadoutElement*> tgcReadOutEles =
mgr.getAllTgcReadoutElements();
240 std::unique_ptr<std::vector<int>> tgcSectorMapping = std::make_unique<std::vector<int>>();
241 tgcSectorMapping->resize(m_idHelperSvc->tgcIdHelper().module_hash_max());
245 int& sectNumb = (*tgcSectorMapping)[m_idHelperSvc->moduleHash(readoutEle->identify())];
246 sectNumb = sectorMapping.getSector(readoutEle->center(gctx).phi());
249 return StatusCode::SUCCESS;
254 IRDBRecordset_ptr paramTable = accessSvc->getRecordsetPtr(
"TgcSensorLayout",
"");
255 if (paramTable->size() == 0) {
257 return StatusCode::FAILURE;
260 const std::string chambType = record->getString(
"technology");
261 const int gasGap = record->getInt(
"gasGap");
262 const std::vector<int> wireGangs{
tokenizeInt(record->getString(
"wireGangs"),
",")};
263 const std::vector<double> botStrips =
tokenizeDouble(record->getString(
"bottomStrips"),
",");
264 const std::vector<double> topStrips =
tokenizeDouble(record->getString(
"topStrips"),
",");
265 const std::vector<std::string>
sides =
tokenize(record->getString(
"side"),
";");
266 const double wirePitch = record->getDouble(
"wirePitch");
270 parBook.wireGangs.insert(parBook.wireGangs.end(), wireGangs.begin(), wireGangs.end());
271 parBook.bottomStripPos = botStrips;
272 parBook.topStripPos = topStrips;
273 parBook.wirePitch = wirePitch;
279 return StatusCode::SUCCESS;