98 if(!detManager.isValid()){
99 ATH_MSG_ERROR(
"Failed to retrieve the MuonDetectorManager conditions object");
100 return StatusCode::FAILURE;
104 if(!sTGCdigits.isValid()) {
105 ATH_MSG_ERROR(
"Failed to retrieve the sTGC Digit container");
106 return StatusCode::FAILURE;
112 if(!dcsDataHandle.isValid()) {
113 ATH_MSG_ERROR(
"Failed to retrieve DCS data while running on data");
114 return StatusCode::FAILURE;
116 dcsData = dcsDataHandle.cptr();
119 const std::array<uint16_t, 8> bcWindow = {0, 1, 2, 3, 4, UINT16_MAX-1, UINT16_MAX-2, UINT16_MAX-3};
122 std::vector<uint32_t> hits_sourceid{}, hits_pfeb{}, hits_padchan{}, hits_relbcid{};
124 if(
m_idHelperSvc->stgcIdHelper().channelType(
digit->identify()) == sTgcIdHelper::sTgcChannelTypes::Pad) {
125 if(
std::find(bcWindow.begin(), bcWindow.end(),
digit->bcTag()) != bcWindow.end()) {
135 const int multilayer =
m_idHelperSvc->stgcIdHelper().multilayer(Id);
142 const char wheel = (stEta > 0) ?
'A' :
'C';
144 hits_sourceid.emplace_back(sourceid);
148 hits_pfeb.emplace_back(pfeb);
152 hits_padchan.emplace_back(padchan);
155 hits_relbcid.emplace_back(
digit->bcTag());
158 m_padTrigger_digits_sector->push_back(sector);
159 m_padTrigger_digits_eta->push_back(stEta);
160 m_padTrigger_digits_phi->push_back(stPhi);
161 m_padTrigger_digits_multilayer->push_back(multilayer);
162 m_padTrigger_digits_gasgap->push_back(
gasGap);
163 m_padTrigger_digits_source_id->push_back(sourceid);
164 m_padTrigger_digits_pfeb->push_back(pfeb);
165 m_padTrigger_digits_pad_channel->push_back(padchan);
166 m_padTrigger_digits_relbcid->push_back(
digit->bcTag());
171 ATH_MSG_DEBUG(
"Processed sTGC digit collection with size " << digitCollection->size() <<
", finding a total of " << hits_sourceid.size() <<
" pad hits");
174 if(hits_sourceid.empty() or hits_pfeb.empty() or hits_padchan.empty() or hits_relbcid.empty())
continue;
177 std::vector<uint32_t> hits_indices{};
179 if(hits_sourceid.at(
index) == rob) hits_indices.emplace_back(
index);
182 if(hits_indices.empty())
continue;
185 const auto& sourceid = hits_sourceid.at(hits_indices.front());
186 const bool isLarge = (sourceid % 2 == 0);
188 const char whl =
isA ?
'A' :
'C';
189 const auto sec = (sourceid & 0xf);
194 for(
const auto&
index: hits_indices) {
195 const auto& pfeb = hits_pfeb.at(
index);
196 const auto&
chan = hits_padchan.at(
index);
198 ATH_MSG_DEBUG(
"PadTrigger sector " << whl << sec+1 << std::dec <<
" -> Hit " <<
index <<
" pfeb " << pfeb <<
" padchan " <<
chan <<
" bcid " <<
bcid);
233 std::vector<PadEmulatorTrigger> triggersBc{};
238 isTrigger =
trigger_4over8(hitmask & 0x01, hitmask & 0x02, hitmask & 0x04, hitmask & 0x08,
239 hitmask & 0x10, hitmask & 0x20, hitmask & 0x40, hitmask & 0x80);
242 isTrigger =
trigger_3and1(hitmask & 0x01, hitmask & 0x02, hitmask & 0x04, hitmask & 0x08,
243 hitmask & 0x10, hitmask & 0x20, hitmask & 0x40, hitmask & 0x80);
246 isTrigger =
trigger_2and2(hitmask & 0x01, hitmask & 0x02, hitmask & 0x04, hitmask & 0x08,
247 hitmask & 0x10, hitmask & 0x20, hitmask & 0x40, hitmask & 0x80);
251 hitmask & 0x10, hitmask & 0x20, hitmask & 0x40, hitmask & 0x80);
254 isTrigger =
trigger_5over8(hitmask & 0x01, hitmask & 0x02, hitmask & 0x04, hitmask & 0x08,
255 hitmask & 0x10, hitmask & 0x20, hitmask & 0x40, hitmask & 0x80);
259 hitmask & 0x10, hitmask & 0x20, hitmask & 0x40, hitmask & 0x80);
263 hitmask & 0x10, hitmask & 0x20, hitmask & 0x40, hitmask & 0x80);
266 isTrigger =
trigger_2X_3over4(hitmask & 0x01, hitmask & 0x02, hitmask & 0x04, hitmask & 0x08,
267 hitmask & 0x10, hitmask & 0x20, hitmask & 0x40, hitmask & 0x80);
270 isTrigger =
trigger_6over8(hitmask & 0x01, hitmask & 0x02, hitmask & 0x04, hitmask & 0x08,
271 hitmask & 0x10, hitmask & 0x20, hitmask & 0x40, hitmask & 0x80);
274 isTrigger =
trigger_8over8(hitmask & 0x01, hitmask & 0x02, hitmask & 0x04, hitmask & 0x08,
275 hitmask & 0x10, hitmask & 0x20, hitmask & 0x40, hitmask & 0x80);
279 return StatusCode::FAILURE;
281 if(not isTrigger)
continue;
284 triggersBc.emplace_back(
289 m_padTrigger_efficiency->push_back(triggersBc.size());
290 for(
const auto& trigger : triggersBc) {
291 if(relbcid != trigger.getRelbcid())
continue;
292 m_padTrigger_TP_R_id_init->push_back(trigger.getBandid());
293 m_padTrigger_TP_phi_id_init->push_back(trigger.getPhiid());
294 m_padTrigger_TP_relbcid_init->push_back(trigger.getRelbcid());
300 if(
m_doNtuple) m_padTrigger_efficiency->push_back(triggersBc.size());
304 if(
m_doNtuple) m_padTrigger_efficiency->push_back(triggersBc.size());
308 if(
m_doNtuple) m_padTrigger_efficiency->push_back(triggersBc.size());
311 if(not triggersBc.empty()) {
313 for(
const auto& trigger : triggersBc) {
314 if(relbcid != trigger.getRelbcid())
continue;
315 newCollection->addTrigger(trigger.getBandid(), trigger.getPhiid(), 0);
317 m_padTrigger_TP_R_id->push_back(trigger.getBandid());
318 m_padTrigger_TP_phi_id->push_back(trigger.getPhiid());
319 m_padTrigger_TP_relbcid->push_back(trigger.getRelbcid());
320 m_padTrigger_wheel->push_back(trigger.getWheel());
321 m_padTrigger_sector->push_back(trigger.getSector());
322 m_padTrigger_hitmask->push_back(trigger.getHitMask());
325 if(
out->addCollection(newCollection,
out->numberOfCollections()).isFailure()) {
326 ATH_MSG_ERROR(
"Failed while storing output in the Muon::NSW_PadTriggerDataContainer");
327 return StatusCode::FAILURE;
333 return StatusCode::SUCCESS;