20 const sTgcIdHelper& idHelper{m_idHelperSvc->stgcIdHelper()};
21 auto translateTokenList = [
this, &idHelper](
const std::vector<std::string>& chNames){
23 std::set<Identifier> transcriptedIds{};
24 for (
const std::string& token : chNames) {
25 if (token.size() != 6) {
26 ATH_MSG_WARNING(
"Wrong format given for "<<token<<
". Expecting 6 characters");
30 const std::string statName = token.substr(0, 3);
31 const unsigned statEta =
std::atoi(token.substr(3, 1).c_str()) * (token[4] ==
'A' ? 1 : -1);
32 const unsigned statPhi =
std::atoi(token.substr(5, 1).c_str());
39 transcriptedIds.insert(eleId);
42 transcriptedIds.insert(secMlId);
45 return transcriptedIds;
48 std::vector <std::string>& selectedSt = m_selectStat.value();
49 const std::vector <std::string>& excludedSt = m_excludeStat.value();
50 selectedSt.erase(std::remove_if(selectedSt.begin(), selectedSt.end(),
51 [&excludedSt](
const std::string& token){
52 return std::ranges::find(excludedSt, token) != excludedSt.end();
53 }), selectedSt.end());
55 if (selectedSt.size()) {
56 m_testStations = translateTokenList(selectedSt);
57 std::stringstream sstr{};
59 sstr<<
" *** "<<m_idHelperSvc->toString(
id)<<std::endl;
61 ATH_MSG_INFO(
"Test only the following stations "<<std::endl<<sstr.str());
63 const std::set<Identifier> excluded = translateTokenList(excludedSt);
65 for(
auto itr = idHelper.detectorElement_begin();
66 itr!= idHelper.detectorElement_end();++itr){
67 if (!excluded.count(*itr)) {
68 m_testStations.insert(*itr);
72 if (!excluded.empty()) {
73 std::stringstream excluded_report{};
75 excluded_report <<
" *** " << m_idHelperSvc->toStringDetEl(
id) << std::endl;
77 ATH_MSG_INFO(
"Test all station except the following excluded ones " << std::endl << excluded_report.str());
81 return StatusCode::SUCCESS;
85 return StatusCode::SUCCESS;
88 const EventContext& ctx{Gaudi::Hive::currentContext()};
95 for (
const Identifier& test_me : m_testStations) {
96 ATH_MSG_DEBUG(
"Test retrieval of sTgc detector element "<<m_idHelperSvc->toStringDetEl(test_me));
102 if (m_idHelperSvc->stgcIdHelper().elementID(reElement->
identify()) != m_idHelperSvc->stgcIdHelper().elementID(test_me)) {
103 ATH_MSG_FATAL(
"Expected to retrieve "<<m_idHelperSvc->toString(test_me)
104 <<
". But got instead "<<m_idHelperSvc->toString(reElement->
identify()));
105 return StatusCode::FAILURE;
107 ATH_CHECK(dumpToTree(ctx,gctx,reElement));
112 for (
Amg::Vector3D axis :{Amg::Vector3D::UnitX(),Amg::Vector3D::UnitY(),Amg::Vector3D::UnitZ()}) {
113 const double closure_mag = std::abs( (transClosure*
axis).
dot(
axis) - 1.);
114 if (closure_mag > std::numeric_limits<float>::epsilon() ) {
117 return StatusCode::FAILURE;
120 const sTgcIdHelper& id_helper{m_idHelperSvc->stgcIdHelper()};
122 for (
int chType = sTgcIdHelper::sTgcChannelTypes::Pad;
chType <= sTgcIdHelper::sTgcChannelTypes::Wire; ++
chType) {
123 bool isValidLay{
false};
130 const unsigned int numChannel = reElement->
numChannels(layID);
133 bool isValidCh{
false};
142 const IdentifierHash layHash = reElement->
layerHash(chID);
144 <<
" --> layerHash: "<<
static_cast<unsigned>(layHash));
146 if (backCnv != chID) {
147 ATH_MSG_FATAL(
"The back and forth conversion of "<<m_idHelperSvc->toString(chID)
148 <<
" failed. Got "<<m_idHelperSvc->toString(backCnv));
149 return StatusCode::FAILURE;
151 if (layHash != reElement->
layerHash(measHash)) {
152 ATH_MSG_FATAL(
"Constructing the layer hash from the identifier "<<
153 m_idHelperSvc->toString(chID)<<
" leads to different layer hashes "<<
154 layHash<<
" vs. "<< reElement->
layerHash(measHash));
155 return StatusCode::FAILURE;
157 if (
chType == sTgcIdHelper::sTgcChannelTypes::Strip) {
158 ATH_MSG_VERBOSE(
"Channel "<<m_idHelperSvc->toString(chID)<<
" strip position "
161 else if (
chType == sTgcIdHelper::sTgcChannelTypes::Wire) {
162 ATH_MSG_VERBOSE(
"Channel "<<m_idHelperSvc->toString(chID)<<
" wireGroup position "
165 else if (
chType == sTgcIdHelper::sTgcChannelTypes::Pad) {
166 ATH_MSG_VERBOSE(
"Channel "<<m_idHelperSvc->toString(chID)<<
" Pad position "
174 return StatusCode::SUCCESS;
177 StatusCode GeoModelsTgcTest::dumpToTree(
const EventContext& ctx,
199 const sTgcIdHelper& id_helper{m_idHelperSvc->stgcIdHelper()};
201 for (
int chType = sTgcIdHelper::sTgcChannelTypes::Pad;
chType <= sTgcIdHelper::sTgcChannelTypes::Wire; ++
chType) {
202 unsigned int numWireGroup = 0;
204 bool isValidLay{
false};
221 case sTgcIdHelper::sTgcChannelTypes::Pad:
222 m_numPads.push_back(reElement->
numChannels(layID));
223 m_numPadEta.push_back(reElement->
numPadEta(layID));
224 m_numPadPhi.push_back(reElement->
numPadPhi(layID));
225 m_padPhiShift.push_back(reElement->
padPhiShift(layID));
229 for (
unsigned int pad = 1; pad <= reElement->
numChannels(layID); ++pad) {
230 bool isValidPad{
false};
236 <<m_idHelperSvc->toStringDetEl(reElement->
identify())
237 <<
" layer: "<<
layer<<
" pad: "<<pad<<
" channelType: "<<
chType);
241 m_firstPadHeight.push_back(reElement->
padHeight(padID));
244 m_padHeight.push_back(reElement->
padHeight(padID));
247 std::array<Amg::Vector2D,4> localPadCorners{make_array<Amg::Vector2D, 4>(
Amg::Vector2D::Zero())};
249 std::array<Amg::Vector3D,4> globalPadCorners{make_array<Amg::Vector3D, 4>(
Amg::Vector3D::Zero())};
254 m_localPadPos.push_back(localPadPos);
255 m_localPadCornerBL.push_back(localPadCorners[0]);
256 m_localPadCornerBR.push_back(localPadCorners[1]);
257 m_localPadCornerTL.push_back(localPadCorners[2]);
258 m_localPadCornerTR.push_back(localPadCorners[3]);
262 m_hitPosition.push_back(hitPos);
263 m_padNumber.push_back(reElement->
padNumber(hitPos, padID));
268 m_globalPadPos.push_back(globalPadPos);
269 m_globalPadCornerBR.push_back(globalPadCorners[0]);
270 m_globalPadCornerBL.push_back(globalPadCorners[1]);
271 m_globalPadCornerTR.push_back(globalPadCorners[2]);
272 m_globalPadCornerTL.push_back(globalPadCorners[3]);
274 m_padEta.push_back(reElement->
padEta(padID));
275 m_padPhi.push_back(reElement->
padPhi(padID));
276 m_padGasGap.push_back(
layer);
278 if (pad != 1)
continue;
281 m_padRot.push_back(locToGlob);
282 m_padRotGasGap.push_back(
layer);
287 case sTgcIdHelper::sTgcChannelTypes::Strip:{
290 m_stripPitch = design.stripPitch();
291 m_stripWidth = design.stripWidth();
292 for (
unsigned int strip = 1; strip <= reElement->
numChannels(layID); ++strip) {
293 bool isValidStrip{
false};
299 <<m_idHelperSvc->toStringDetEl(reElement->
identify())
300 <<
" layer: "<<
layer<<
" strip: "<<strip<<
" channelType: "<<
chType);
305 m_stripGasGap.push_back(
layer);
306 m_stripNum.push_back(strip);
307 m_stripLengths.push_back(reElement->
stripLength(stripID));
309 if (strip != 1)
continue;
312 m_stripRot.push_back(locToGlob);
313 m_stripRotGasGap.push_back(
layer);
317 }
case sTgcIdHelper::sTgcChannelTypes::Wire: {
320 numWireGroup = design.numStrips();
321 m_wirePitch = design.stripPitch();
322 m_wireWidth = design.stripWidth();
323 m_numWires.push_back(design.nAllWires());
324 m_firstWireGroupWidth.push_back(design.numWiresInGroup(1));
325 m_numWireGroups.push_back(numWireGroup);
326 m_wireCutout.push_back(design.wireCutout());
327 for (
unsigned int wireGroup = 1; wireGroup <= numWireGroup; ++wireGroup) {
328 bool isValidWire{
false};
334 <<m_idHelperSvc->toStringDetEl(reElement->
identify())
335 <<
" layer: "<<
layer<<
" wireGroup: "<<wireGroup<<
" channelType: "<<
chType);
340 m_wireGroupGasGap.push_back(
layer);
341 m_wireGroupNum.push_back(wireGroup);
343 if (wireGroup != 1)
continue;
346 m_wireGroupRot.push_back(locToGlob);
347 m_wireGroupRotGasGap.push_back(
layer);
354 return m_tree.fill(ctx) ? StatusCode::SUCCESS : StatusCode::FAILURE;