7#include <GaudiKernel/SystemOfUnits.h>
12#include <GeoModelKernel/GeoFullPhysVol.h>
13#include <GeoModelKernel/GeoPhysVol.h>
14#include <GeoModelKernel/GeoTrd.h>
15#include <GeoModelKernel/GeoSimplePolygonBrep.h>
17#include <GeoModelRead/ReadGeoModel.h>
24# include "Acts/Utilities/BoundFactory.hpp"
38 if (shape->typeID() == GeoTrd::getClassTypeID()) {
39 const GeoTrd* trd =
static_cast<const GeoTrd*
>(shape);
40 result.longWidth = trd->getXHalfLength1();
41 result.shortWidth = trd->getXHalfLength2();
42 result.halfHeight = trd->getYHalfLength1();
43 result.thickness = trd->getZHalfLength();
44 }
else if (shape->typeID() == GeoSimplePolygonBrep::getClassTypeID()) {
45 const GeoSimplePolygonBrep* poly =
static_cast<const GeoSimplePolygonBrep*
>(shape);
46 std::vector<Amg::Vector2D> polyEdges =
m_geoUtilTool->polygonEdges(*poly);
47 result.thickness = poly->getDZ() * Gaudi::Units::mm;
48 if (polyEdges.size() == 4) {
49 result.longWidth = 0.5 * (polyEdges[0].x() - polyEdges[1].
x()) * Gaudi::Units::mm;
50 result.shortWidth = 0.5 * (polyEdges[3].x() - polyEdges[2].
x()) * Gaudi::Units::mm;
51 result.halfHeight = 0.5 * (polyEdges[0].y() - polyEdges[3].
y()) * Gaudi::Units::mm;
52 }
else if (polyEdges.size() == 6) {
53 result.longWidth = 0.5 * (polyEdges[0].x() - polyEdges[1].
x()) * Gaudi::Units::mm;
54 result.shortWidth = 0.5 * (polyEdges[4].x() - polyEdges[3].
x()) * Gaudi::Units::mm;
55 result.halfHeight = 0.5 * (polyEdges[0].y() - polyEdges[4].
y()) * Gaudi::Units::mm;
56 result.yCutOut = (polyEdges[1].y() - polyEdges[2].
y()) * Gaudi::Units::mm;
60 throw std::runtime_error(
"Invalid shape to extract sTGC parameters");
71 return StatusCode::FAILURE;
88 std::vector<physVolWithTrans> allGasGaps =
m_geoUtilTool->findAllLeafNodesByName(define.
physVol,
"sTgcGas");
89 if (allGasGaps.empty()) {
92 return StatusCode::FAILURE;
101 return StatusCode::FAILURE;
104 const wSTGCTable& paramBook{parBookItr->second};
108 unsigned int gasGap{0};
111 WireDesignPtr wireGroupDesign = std::make_unique<WireGroupDesign>();
122 unsigned int numWireGroups = paramBook.
numWireGroups[gasGap];
130 stripDesign->defineStripLayout(
Amg::Vector2D{firstStripPos, 0.},
135 wireGroupDesign->flipTrapezoid();
136 wireGroupDesign->defineStripLayout(
Amg::Vector2D{firstWirePos, 0.},
140 ATH_MSG_VERBOSE(
"Created new diamond wireGroup design "<<(*wireGroupDesign));
144 padDesign->flipTrapezoid();
150 stripDesign->defineStripLayout(
Amg::Vector2D{firstStripPos, 0.},
156 wireGroupDesign->flipTrapezoid();
157 wireGroupDesign->defineStripLayout(
Amg::Vector2D{firstWirePos, 0.},
165 padDesign->flipTrapezoid();
171 for (
uint wireGr=2; wireGr<numWireGroups; wireGr++){
174 unsigned int lastWireGroup = (paramBook.
numWires[gasGap] - wireGroupDesign->nAllWires());
175 wireGroupDesign->declareGroup(lastWireGroup);
176 wireGroupDesign->defineWireCutout(paramBook.
wireCutout[gasGap]);
179 double beamlineRadius = (define.
physVol->getAbsoluteTransform() * gapVol.transform).translation().perp();
180 padDesign->defineBeamlineRadius(beamlineRadius);
200 stripDesign = (*factoryCache.
stripDesigns.emplace(stripDesign).first);
206 define.
stripLayers.push_back(std::move(stripLayer));
209 wireGroupDesign = (*factoryCache.
wireGroupDesigns.emplace(wireGroupDesign).first);
214 ATH_MSG_VERBOSE(
"Added new diamond wireGroup layer at "<<wireGroupLayer);
218 padDesign = (*factoryCache.
padDesigns.emplace(padDesign).first);
224 define.
padLayers.push_back(std::move(padLayer));
226 return StatusCode::SUCCESS;
234 GeoModelIO::ReadGeoModel* sqliteReader =
m_geoDbTagSvc->getSqliteReader();
236 ATH_MSG_FATAL(
"Error, the tool works exclusively from sqlite geometry inputs");
237 return StatusCode::FAILURE;
246 physNodeMap mapFPV = sqliteReader->getPublishedNodes<std::string, GeoFullPhysVol*>(
"Muon");
247#ifndef SIMULATIONBASE
248 auto layerBounds = std::make_shared<Acts::SurfaceBoundFactory>();
251 for (
auto& [key, pv] : mapFPV) {
255 std::vector<std::string> key_tokens =
tokenize(key,
"_");
256 if (key_tokens.size() != 5 ||
257 key_tokens[0].find(
"sTGC") == std::string::npos)
261 const std::string stName = key_tokens[1][1] ==
'L' ?
"STL" :
"STS";
262 const int stEta =
atoi(key_tokens[2]);
263 const int stPhi =
atoi(key_tokens[3]);
264 const int ml =
atoi(key_tokens[4]);
267#ifndef SIMULATIONBASE
273 ATH_MSG_FATAL(
"Failed to build a good identifier out of " << key);
274 return StatusCode::FAILURE;
282 std::unique_ptr<sTgcReadoutElement> readoutEle = std::make_unique<sTgcReadoutElement>(std::move(define));
283 ATH_CHECK(mgr.addsTgcReadoutElement(std::move(readoutEle)));
285 return StatusCode::SUCCESS;
291 if (paramTable->
size() == 0) {
293 return StatusCode::FAILURE;
296 << paramTable->
tagName() <<
"] table with "
297 << paramTable->
size() <<
" records");
300 const std::string key = record-> getString(
"WSTGC_TYPE");
302 parBook.
numStrips = record->getInt(
"nStrips");
303 parBook.
stripPitch = record->getDouble(
"stripPitch");
304 parBook.
stripWidth = record->getDouble(
"stripWidth");
311 parBook.
wirePitch = record->getDouble(
"wirePitch");
312 parBook.
wireWidth = record->getDouble(
"wireWidth");
321 parBook.
anglePadPhi = record->getDouble(
"anglePadPhi");
323 parBook.
lPadLength = record->getDouble(
"lPadWidth");
324 parBook.
sPadLength = record->getDouble(
"sPadWidth");
326 parBook.
yCutout = record->getDouble(
"yCutout");
328 parBook.
gasTck = record->getDouble(
"gasTck");
329 parBook.
lFrameWidth = record->getDouble(
"ylFrame");
330 parBook.
sFrameWidth = record->getDouble(
"ysFrame");
332 ATH_MSG_DEBUG(
"Parameters of the chamber " << key <<
" are: "
337 <<
" numWires: " << parBook.
numWires
354 <<
" yCutout: " << parBook.
yCutout
356 <<
" gasGapTck: " << parBook.
gasTck
360 return StatusCode::SUCCESS;
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_VERBOSE(x)
bool isValid(const T &p)
Av: we implement here an ATLAS-sepcific convention: all particles which are 99xxxxx are fine.
Definition of the abstract IRDBAccessSvc interface.
std::shared_ptr< IRDBRecordset > IRDBRecordset_ptr
Definition of the abstract IRDBRecord interface.
Definition of the abstract IRDBRecordset interface.
std::unique_ptr< IRDBRecord > IRDBRecord_ptr
virtual std::string tagName() const =0
virtual std::string nodeName() const =0
virtual unsigned int size() const =0
The StripLayer interfaces the 2D description of the strip plane layout with the 3D description of the...
static IdentifierHash createHash(const unsigned int gasGap, const unsigned int channelType, const unsigned int channel, const unsigned int wireInGrp=0)
Create a measurement hash from the Identifier fields.
Identifier channelID(int stationName, int stationEta, int stationPhi, int multilayer, int gasGap, int channelType, int channel) const
The AlignStoreProviderAlg loads the rigid alignment corrections and pipes them through the readout ge...
std::string toString(const Translation3D &translation, int precision=4)
GeoPrimitvesToStringConverter.
Amg::Transform3D getRotateZ3D(double angle)
get a rotation transformation around Z-axis
Eigen::Matrix< double, 2, 1 > Vector2D
Amg::Transform3D getRotateY3D(double angle)
get a rotation transformation around Y-axis
std::vector< int > tokenizeInt(const std::string &the_str, std::string_view delimiter)
std::vector< std::string > tokenize(const std::string &the_str, std::string_view delimiters)
Splits the string into smaller substrings.
std::vector< double > tokenizeDouble(const std::string &the_str, std::string_view delimiter)
int atoi(std::string_view str)
Helper functions to unpack numbers decoded in string into integers and doubles The strings are requir...
The ReadoutGeomCnvAlg converts the Run4 Readout geometry build from the GeoModelXML into the legacy M...
GeoModel::TransientConstSharedPtr< WireGroupDesign > WireDesignPtr
RpcReadoutElement::defineArgs defineArgs
IMuonGeoUtilityTool::physVolWithTrans physVolWithTrans
GeoModel::TransientConstSharedPtr< StripDesign > StripDesignPtr
GeoModel::TransientConstSharedPtr< PadDesign > PadDesignPtr
Identifier detElId
ATLAS identifier.
GeoIntrusivePtr< GeoVFullPhysVol > physVol
Pointer to the underlying physical volume in GeoModel.
const GeoAlignableTransform * alignTransform
Pointer to the alignable transformation.
std::string chambDesign
chamber design name as it's occuring in the parameter book tables E.g. BMS5, RPC10,...
std::shared_ptr< Acts::SurfaceBoundFactory > layerBounds
std::vector< StripLayer > stripLayers
std::vector< StripLayer > padLayers
double yCutout
Diamond cutout height.
double halfChamberHeight
sTGC Chamber Details
std::vector< StripLayer > wireGroupLayers
double sHalfChamberLength
Length of the chamber on the short side.
unsigned int numLayers
Number of gas gap layers.
double halfChamberTck
Thickness of the chamber.
std::vector< double > firstStripPitch
double gasTck
Thickness of the gas gap.
double lHalfChamberLength
Length of the chamber on the long side.