8 #include "Identifier/Identifier.h"
23 #include <unordered_set>
50 if(
m_idHelperSvc->mdtIdHelper().stationNameIndex(
"BMG") != -1){
52 ATH_MSG_INFO(
"Processing configuration for layouts with BMG chambers.");
54 for(
int phi=6; phi<8; phi++) {
55 for(
int eta=1; eta<4; eta++) {
58 for(
int roe=1; roe<=( muonDetMgr->
getMuonStation(
"BMG",
side*eta, phi) )->nMuonReadoutElements(); roe++) {
68 return StatusCode::SUCCESS;
82 ATH_CHECK( m_mdtRegionDefiner->getMdtRegions(p_roids, rpcFitResult, muonRoad, mdtRegion) );
84 ATH_CHECK( getMdtHits(p_roids, muonRoad, mdtHits_normal) );
86 return StatusCode::SUCCESS;
100 ATH_CHECK( m_mdtRegionDefiner->getMdtRegions(p_roids, tgcFitResult, muonRoad, mdtRegion) );
102 ATH_CHECK( getMdtHits(p_roids, muonRoad, mdtHits_normal) );
104 return StatusCode::SUCCESS;
118 std::vector<uint32_t> v_robIds;
119 std::vector<IdentifierHash> mdtHashList;
120 const EventContext& ctx = Gaudi::Hive::currentContext();
122 if (m_use_RoIBasedDataAccess) {
128 m_regionSelector->lookup( ctx )->HashIDList(*iroi, mdtHashList);
131 m_regionSelector->lookup( ctx )->ROBIDList(*iroi, v_robIds);
138 m_regionSelector->lookup( ctx )->HashIDList(fullscan_roi, mdtHashList);
141 m_regionSelector->lookup( ctx )->ROBIDList(fullscan_roi, v_robIds);
144 ATH_CHECK( collectMdtHitsFromPrepData(ctx, mdtHashList, mdtHits_normal, muonRoad) );
146 return StatusCode::SUCCESS;
153 const std::vector<IdentifierHash>& v_idHash,
159 if (v_idHash.empty()) {
161 return StatusCode::SUCCESS;
168 std::vector<const Muon::MdtPrepDataCollection*> mdtCols{};
169 mdtCols.reserve(v_idHash.size());
173 auto MDTcoll = mdtPrds->indexFindPtr(
id);
175 if( MDTcoll ==
nullptr ) {
176 ATH_MSG_DEBUG(
"MDT prep data collection not found in Hash ID" << (
int)
id);
180 if( MDTcoll->size() == 0 ) {
181 ATH_MSG_DEBUG(
"MDT prep data collection is empty in Hash ID" << (
int)
id);
185 mdtCols.push_back(MDTcoll);
188 << m_idHelperSvc->toStringChamber(MDTcoll->identify())
189 <<
" with size " << MDTcoll->size()
190 <<
"in Hash ID" << (
int)
id);
195 mdtHits.reserve( mdtHits.size() + mdtCol->size() );
205 double cXmid{0.}, cYmid{0.}, cAmid{0.}, cPhip{0.};
208 int adc = mdt->adc();
209 int drift = mdt->tdc();
212 int TubeLayer = m_idHelperSvc->mdtIdHelper().tubeLayer(
id);
215 int Tube = m_idHelperSvc->mdtIdHelper().
tube(
id);
219 char st = chamberType[1];
222 if (chamberType[0]==
'E') {
239 double R = -99999., Z = -99999.;
240 if(m_idHelperSvc->mdtIdHelper().stationName(
id) == m_BMGid && m_DeadChannels.count(
id)) {
241 ATH_MSG_DEBUG(
"Skipping tube with identifier " << m_idHelperSvc->toString(
id) );
248 if(muonStation->
endcap()==0){
249 cXmid = (trans.translation()).
z();
250 double halfRadialThicknessOfMultilayer = muonStation->
RsizeMdtStation()/2.;
251 cYmid = ((trans.translation()).
perp()+halfRadialThicknessOfMultilayer);
254 cXmid = (trans.translation()).
perp();
256 cYmid = (trans.translation()).
z();
257 if(cYmid>0) cYmid += halfZThicknessOfMultilayer;
258 else cYmid -= halfZThicknessOfMultilayer;
260 cPhip = (trans.translation()).phi();
265 dphi = std::abs(cPhip - cphi);
268 if(std::abs(cphi) >
M_PI/2.) {
269 double phi1 = (cPhip>0.)? cPhip-
M_PI : cPhip+
M_PI;
270 double phi2 = (cphi >0.)? cphi -
M_PI : cphi +
M_PI;
271 dphi = std::abs(phi1) + std::abs(phi2);
274 dphi = std::abs(cPhip) + std::abs(cphi);
278 if(muonStation->
endcap()==1) R = R *std::hypot(1,
std::tan(dphi));
281 double Rmin =(trans*OrigOfMdtInAmdbFrame).
perp();
286 if(cPhip<0. && (std::abs(
M_PI+cPhip) < 0.05) ) cPhip =
M_PI;
288 ATH_MSG_DEBUG(
" ...MDT hit Z/R/chamber/MultiLater/TubeLayer/Tube/Layer/adc/tdc = "
289 << Z <<
"/" << R <<
"/" <<
chamber <<
"/" << MultiLayer <<
"/" <<
TubeLayer <<
"/"
290 << Tube <<
"/" <<
Layer <<
"/" <<
adc <<
"/" << drift);
294 if(
Layer!=0 && Tube !=0) {
298 tmp.name = m_idHelperSvc->mdtIdHelper().stationName(
id);
299 tmp.StationEta = StationEta;
300 tmp.StationPhi = StationPhi;
301 tmp.Multilayer = MultiLayer;
311 for(
unsigned int i=0;
i<4;
i++) {
tmp.cType[
i] = chamberType[
i]; }
314 tmp.DriftTime = drift;
316 tmp.LeadingCoarseTime = (drift>>5) & 0xfff;
317 tmp.LeadingFineTime = drift & 0x1f;
319 tmp.readEle = mdtReadout;
322 mdtHits.push_back(std::move(
tmp));
327 return StatusCode::SUCCESS;
334 PVConstLink cv = mydetEl->getMaterialGeom();
335 int nGrandchildren = cv->getNChildVols();
336 if(nGrandchildren <= 0)
return;
338 std::vector<int> tubes;
339 geoGetIds ([&] (
int id) { tubes.push_back (
id); }, cv);
340 std::sort (tubes.begin(), tubes.end());
344 int name = m_idHelperSvc->mdtIdHelper().stationName(detElId);
345 int eta = m_idHelperSvc->mdtIdHelper().stationEta(detElId);
346 int phi = m_idHelperSvc->mdtIdHelper().stationPhi(detElId);
347 int ml = m_idHelperSvc->mdtIdHelper().multilayer(detElId);
352 int want_id =
layer*maxNTubesPerLayer +
tube;
353 if (
it != tubes.end() && *
it == want_id) {
357 it = std::lower_bound (tubes.begin(), tubes.end(), want_id);
358 if (
it != tubes.end() && *
it == want_id) {
363 m_DeadChannels.insert(deadTubeId);
365 <<
"), phi(" << phi <<
"), eta(" << eta <<
"), name(" <<
name
366 <<
"), multilayerId(" << ml <<
") and identifier " << deadTubeId <<
" .");