13 #include <CLHEP/Random/RandGaussZiggurat.h>
14 #include <GaudiKernel/PhysicalConstants.h>
19 constexpr
double percentage(
unsigned int numerator,
unsigned int denom) {
25 ISvcLocator* pSvcLocator):
34 return StatusCode::SUCCESS;
37 ATH_MSG_INFO(
"Tried to convert "<<m_allHits[0]<<
"/"<<m_allHits[1]<<
" hits. In, "
38 <<percentage(m_acceptedHits[0], m_allHits[0]) <<
"/"
39 <<percentage(m_acceptedHits[1], m_allHits[1]) <<
" cases, the conversion was successful");
40 return StatusCode::SUCCESS;
44 if (!simHitContainer.isPresent()){
46 return StatusCode::FAILURE;
54 ATH_CHECK(prdContainer.record(std::make_unique<xAOD::TgcStripContainer>(),
55 std::make_unique<xAOD::TgcStripAuxContainer>()));
61 const double xUncert) {
64 prdContainer->push_back(prd);
69 std::move(lPos), std::move(
cov));
72 const bool measPhi{id_helper.measuresPhi(hitId)};
73 ++(m_acceptedHits[measPhi]);
83 const unsigned int gasGap = id_helper.gasGap(hitId);
85 if (!design.insideTrapezoid(locSimHitPos.block<2,1>(0,0))) {
87 <<
" is outside of the trapezoid "<<design);
90 const int wireGrpNum = design.stripNumber(locSimHitPos.block<2,1>(0,0));
97 const double uncert = design.stripPitch() * design.numWiresInGroup(wireGrpNum) / std::sqrt(12);
98 const double locX = CLHEP::RandGaussZiggurat::shoot(rndEngine, locSimHitPos.x(), uncert);
102 const int prdWireNum = design.stripNumber(smearedPos);
104 if (prdWireNum < 0) {
105 if (design.insideTrapezoid(smearedPos)) {
107 <<
Amg::toString(smearedPos)<<
" "<<uncert<<
" is outside of "<<design);
117 <<
Amg::toString(locSimHitPos, 2)<<
" eta strip number: "<<prdWireNum
120 dumpHit(prdId,
locX, uncert);
123 auto processStripHit = [&] (
const Amg::Vector3D& locSimHitPos,
127 const unsigned int gasGap = id_helper.gasGap(hitId);
129 if (!design.insideTrapezoid(locSimHitPos.block<2,1>(0,0))) {
131 <<
" is outside of the trapezoid "<<design);
134 int stripNum = design.stripNumber(locSimHitPos.block<2,1>(0,0));
140 const double stripPitch = std::abs(*Amg::intersect<2>(design.stripLeftBottom(stripNum), design.stripLeftEdge(stripNum),
141 locSimHitPos.block<2,1>(0,0), design.stripNormal(stripNum))) +
142 std::abs(*Amg::intersect<2>(design.stripRightBottom(stripNum), design.stripRightEdge(stripNum),
143 locSimHitPos.block<2,1>(0,0), design.stripNormal(stripNum)));
145 const double uncert = stripPitch / std::sqrt(12);
146 const double locX = CLHEP::RandGaussZiggurat::shoot(rndEngine, locSimHitPos.x(), uncert);
150 const int prdStripNum = design.stripNumber(smearedPos);
152 if (prdStripNum < 0) {
153 if (design.insideTrapezoid(smearedPos)) {
155 <<
Amg::toString(smearedPos)<<
" "<<uncert<<
" is outside of "<<design);
165 <<
Amg::toString(locSimHitPos, 2)<<
" eta strip number: "<<prdStripNum
168 dumpHit(prdId,
locX, uncert);
173 if (std::abs(simHit->pdgId()) != 13)
continue;
176 const Amg::Vector3D locSimHitPos{xAOD::toEigen(simHit->localPosition())};
177 const int gasGap = id_helper.gasGap(hitId);
180 processEtaHit(locSimHitPos, hitId);
189 processStripHit(toPhiRot * locSimHitPos, hitId);
192 return StatusCode::SUCCESS;
198 rngWrapper->
setSeed(rngName, ctx);