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"));
 
  132                 return StatusCode::FAILURE;
 
  134             const GeoShape* gapShape = m_geoUtilTool->extractShape(pVolTrans.volume);
 
  135             if (gapShape->typeID() != GeoTrd::getClassTypeID()) {
 
  136                 ATH_MSG_FATAL(
"Expected shape "<<m_geoUtilTool->dumpShape(gapShape)<<
" to be a trapezoid");
 
  137                 return StatusCode::FAILURE;
 
  139             const GeoTrd* gapTrd = 
static_cast<const GeoTrd*
>(gapShape);
 
  143                 wireDesign = (*factoryCache.
wireLayouts.insert(std::move(wireDesign)).first);
 
  149             if (!wireReadout && wireDesign) {
 
  150                 const IdentifierHash layHash = TgcReadoutElement::constructHash(0, 
gasGap+1, 
false);
 
  156                     wireReadout = std::make_unique<StripLayer>(factoryCache.
trfNodeMaker.makeTransform(trans), 
 
  157                                                                 wireDesign, radDesign, layHash);
 
  158                     wireReadout->flipPhiRotation();
 
  160                     wireReadout = std::make_unique<StripLayer>(factoryCache.
trfNodeMaker.makeTransform(trans), 
 
  161                                                                 wireDesign, layHash);
 
  165         ATH_CHECK(assignReadoutLayer(wireReadout));
 
  169     return StatusCode::SUCCESS;
 
  175     GeoModelIO::ReadGeoModel* sqliteReader = m_geoDbTagSvc->getSqliteReader();
 
  177         ATH_MSG_FATAL(
"Error, the tool works exclusively from sqlite geometry inputs");
 
  178         return StatusCode::FAILURE;
 
  184 #ifndef SIMULATIONBASE 
  185     auto layerBounds = std::make_shared<Acts::SurfaceBoundFactory>();
 
  187     const TgcIdHelper& idHelper{m_idHelperSvc->tgcIdHelper()};
 
  190     physNodeMap mapFPV = sqliteReader->getPublishedNodes<std::string, GeoFullPhysVol*>(
"Muon");
 
  191     for (
auto& [
key, 
pv] : mapFPV) {
 
  195         std::vector<std::string> key_tokens = 
tokenize(
key, 
"_");
 
  196         if (key_tokens.size() < 4 ||
 
  197             !key_tokens[0].starts_with( 
"TGC"))
 
  201         const Identifier elementID = idHelper.elementID(key_tokens[1].substr(0,3), 
atoi(key_tokens[2]), 
atoi(key_tokens[3]), 
isValid);
 
  205             return StatusCode::FAILURE;
 
  209         define.detElId = elementID;
 
  210         define.chambDesign = key_tokens[0];
 
  211         define.alignTransform = m_geoUtilTool->findAlignableTransform(define.physVol);
 
  212 #ifndef SIMULATIONBASE 
  213         define.layerBounds = layerBounds;
 
  215         ATH_MSG_DEBUG(
"Key  "<<
key<<
" lead to Identifier "<<m_idHelperSvc->toStringDetEl(define.detElId));
 
  216         ATH_CHECK(loadDimensions(define, facCache));
 
  217         std::unique_ptr<TgcReadoutElement> readoutEle = std::make_unique<TgcReadoutElement>(std::move(define));
 
  218         ATH_CHECK(
mgr.addTgcReadoutElement(std::move(readoutEle)));
 
  221     return StatusCode::SUCCESS;
 
  225     std::vector<const TgcReadoutElement*> tgcReadOutEles = 
mgr.getAllTgcReadoutElements();
 
  226     std::unique_ptr<std::vector<int>> tgcSectorMapping = std::make_unique<std::vector<int>>();
 
  227     tgcSectorMapping->resize(m_idHelperSvc->tgcIdHelper().module_hash_max());
 
  231         int& sectNumb = (*tgcSectorMapping)[m_idHelperSvc->moduleHash(readoutEle->identify())];
 
  232         sectNumb = sectorMapping.getSector(readoutEle->center(gctx).phi());
 
  235     return StatusCode::SUCCESS;
 
  240     IRDBRecordset_ptr paramTable = accessSvc->getRecordsetPtr(
"TgcSensorLayout", 
"");
 
  241     if (paramTable->size() == 0) {
 
  243         return StatusCode::FAILURE;
 
  246         const std::string chambType = record->getString(
"technology");
 
  247         const int gasGap = record->getInt(
"gasGap");
 
  248         const std::vector<int> wireGangs{
tokenizeInt(record->getString(
"wireGangs"),
",")};
 
  249         const std::vector<double> botStrips = 
tokenizeDouble(record->getString(
"bottomStrips"), 
",");
 
  250         const std::vector<double> topStrips = 
tokenizeDouble(record->getString(
"topStrips"), 
",");
 
  251         const std::vector<std::string> 
sides = 
tokenize(record->getString(
"side"), 
";");
 
  252         const double wirePitch = record->getDouble(
"wirePitch");
 
  256             parBook.wireGangs.insert(parBook.wireGangs.end(), wireGangs.begin(), wireGangs.end());
 
  257             parBook.bottomStripPos = botStrips;
 
  258             parBook.topStripPos = topStrips;
 
  259             parBook.wirePitch = wirePitch;
 
  265     return StatusCode::SUCCESS;