49 m_padTrigger_digits_sector = std::make_shared<MuonVal::VectorBranch<int> >(
tree,
"sTGC_PadTrigger_digits_sector");
50 m_padTrigger_digits_eta = std::make_shared<MuonVal::VectorBranch<int> >(
tree,
"sTGC_PadTrigger_digits_eta");
51 m_padTrigger_digits_phi = std::make_shared<MuonVal::VectorBranch<int> >(
tree,
"sTGC_PadTrigger_digits_phi");
52 m_padTrigger_digits_multilayer = std::make_shared<MuonVal::VectorBranch<int> >(
tree,
"sTGC_PadTrigger_digits_multilayer");
53 m_padTrigger_digits_gasgap = std::make_shared<MuonVal::VectorBranch<int> >(
tree,
"sTGC_PadTrigger_digits_gasgap");
54 m_padTrigger_digits_source_id = std::make_shared<MuonVal::VectorBranch<uint32_t> >(
tree,
"sTGC_PadTrigger_digits_source_id");
55 m_padTrigger_digits_pfeb = std::make_shared<MuonVal::VectorBranch<uint32_t> >(
tree,
"sTGC_PadTrigger_digits_pfeb");
56 m_padTrigger_digits_pad_channel = std::make_shared<MuonVal::VectorBranch<uint32_t> >(
tree,
"sTGC_PadTrigger_digits_padchannel");
57 m_padTrigger_digits_relbcid = std::make_shared<MuonVal::VectorBranch<uint32_t> >(
tree,
"sTGC_PadTrigger_digits_relbcid");
58 m_padTrigger_TP_R_id_init = std::make_shared<MuonVal::VectorBranch<uint8_t> >(
tree,
"sTGC_PadTrigger_TP_R_id_init");
59 m_padTrigger_TP_phi_id_init = std::make_shared<MuonVal::VectorBranch<uint8_t> >(
tree,
"sTGC_PadTrigger_TP_phi_id_init");
60 m_padTrigger_TP_relbcid_init = std::make_shared<MuonVal::VectorBranch<uint32_t> >(
tree,
"sTGC_PadTrigger_TP_relbcid_init");
61 m_padTrigger_TP_R_id = std::make_shared<MuonVal::VectorBranch<uint8_t> >(
tree,
"sTGC_PadTrigger_TP_R_id");
62 m_padTrigger_TP_phi_id = std::make_shared<MuonVal::VectorBranch<uint8_t> >(
tree,
"sTGC_PadTrigger_TP_phi_id");
63 m_padTrigger_TP_relbcid = std::make_shared<MuonVal::VectorBranch<uint32_t> >(
tree,
"sTGC_PadTrigger_TP_relbcid");
64 m_padTrigger_wheel = std::make_shared<MuonVal::VectorBranch<char> >(
tree,
"sTGC_PadTrigger_wheel");
65 m_padTrigger_sector = std::make_shared<MuonVal::VectorBranch<uint32_t> >(
tree,
"sTGC_PadTrigger_sector");
66 m_padTrigger_hitmask = std::make_shared<MuonVal::VectorBranch<uint32_t> >(
tree,
"sTGC_PadTrigger_hitmask");
67 m_padTrigger_efficiency = std::make_shared<MuonVal::VectorBranch<uint32_t> >(
tree,
"sTGC_PadTrigger_efficiency");
69 tree.addBranch(m_padTrigger_digits_sector);
70 tree.addBranch(m_padTrigger_digits_eta);
71 tree.addBranch(m_padTrigger_digits_phi);
72 tree.addBranch(m_padTrigger_digits_multilayer);
73 tree.addBranch(m_padTrigger_digits_gasgap);
74 tree.addBranch(m_padTrigger_digits_source_id);
75 tree.addBranch(m_padTrigger_digits_pfeb);
76 tree.addBranch(m_padTrigger_digits_pad_channel);
77 tree.addBranch(m_padTrigger_digits_relbcid);
78 tree.addBranch(m_padTrigger_TP_R_id_init);
79 tree.addBranch(m_padTrigger_TP_phi_id_init);
80 tree.addBranch(m_padTrigger_TP_relbcid_init);
81 tree.addBranch(m_padTrigger_TP_R_id);
82 tree.addBranch(m_padTrigger_TP_phi_id);
83 tree.addBranch(m_padTrigger_TP_relbcid);
84 tree.addBranch(m_padTrigger_wheel);
85 tree.addBranch(m_padTrigger_sector);
86 tree.addBranch(m_padTrigger_hitmask);
87 tree.addBranch(m_padTrigger_efficiency);
89 return StatusCode::SUCCESS;
99 ATH_MSG_ERROR(
"Failed to retrieve the MuonDetectorManager conditions object");
100 return StatusCode::FAILURE;
105 ATH_MSG_ERROR(
"Failed to retrieve the sTGC Digit container");
106 return StatusCode::FAILURE;
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{};
123 for(
const sTgcDigit* digit : *digitCollection) {
125 if(std::find(bcWindow.begin(), bcWindow.end(), digit->bcTag()) != bcWindow.end()) {
129 bool disabled =
false;
130 if(!dcsData->
isGoodTDaq(ctx,Id,disabled))
continue;
135 const int multilayer =
m_idHelperSvc->stgcIdHelper().multilayer(Id);
137 const int channel =
m_idHelperSvc->stgcIdHelper().channel(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);
208 for(
size_t it{0}; it <
patterns.size(); ++it) {
209 if(
patterns.at(it).getPfebs().at(layer) == pfeb and
patterns.at(it).getPadChannels().at(layer) == chan) {
210 for(uint32_t bc{bcid}; bc <= bcid +
m_stretch; ++bc) {
212 masks.at(it + bc*
patterns.size()) |= (1 << layer);
219 std::string secstr = whl + std::to_string(sec+1);
223 masks.at(patind + bcid*
patterns.size()) |= tomask;
233 std::vector<PadEmulatorTrigger> triggersBc{};
234 for (
size_t it{0}; it <
patterns.size(); ++it) {
235 const auto& pattern =
patterns.at(it);
236 const uint32_t hitmask = masks.at(it + relbcid*
patterns.size());
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;