39 if(
m_doNtuple and Gaudi::Concurrency::ConcurrencyFlags::numConcurrentEvents() > 1) {
40 ATH_MSG_ERROR(
"DoNtuple is not possible in multi-threaded mode");
41 return StatusCode::FAILURE;
45 return StatusCode::SUCCESS;
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;
98 if(!detManager.isValid()){
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;
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;
344 const bool isLarge)
const {
345 std::set<uint32_t> forbiddens{};
348 std::set<uint32_t>
bands{};
349 for(
const auto& trigger :
triggers)
bands.emplace(trigger.getBandid());
350 auto bandids = std::vector<uint32_t>(
bands.cbegin(),
bands.cend());
352 std::sort(bandids.rbegin(), bandids.rend());
353 for(
const auto& bandid : bandids) {
356 for(
uint32_t forb{bandid-1}; forb >= encoder(bandid); --forb) forbiddens.emplace(forb);
360 for(
const auto& bandid : {0, 1, 2, 3, 4, 5}) forbiddens.emplace(bandid);
362 return std::vector<uint32_t>(forbiddens.cbegin(), forbiddens.cend());
366 const bool isLarge)
const {
367 if(input.empty())
return {};
369 std::vector<PadEmulatorTrigger> output{};
371 for(
const auto& trigger: input) {
373 output.emplace_back(trigger);
379 if(input.empty())
return {};
381 std::vector<PadEmulatorTrigger> output{};
382 const std::set<uint32_t> forbiddens{0, 1, 2, 3, 4, 5};
383 for(
const auto& trigger : input) {
385 output.emplace_back(trigger);
391 if(input.empty())
return {};
393 std::map<uint32_t, std::vector<uint32_t> > phisPerBand{};
394 for(
const auto& trigger : input) {
395 phisPerBand.try_emplace(trigger.getBandid(), std::vector<uint32_t>());
396 phisPerBand.at(trigger.getBandid()).emplace_back(trigger.getPhiid());
399 std::vector<PadEmulatorTrigger> output{};
400 for(
const auto& trigger : input) {
401 if(trigger.getPhiid() != phisPerBand.at(trigger.getBandid()).back())
continue;
402 output.emplace_back(trigger);
408 if(input.empty())
return {};
410 std::vector<PadEmulatorTrigger> output{};
411 for(
const auto& trigger : input) {
412 if(std::any_of(output.cbegin(), output.cend(), [&](
const auto&
cmp) {
413 return trigger.getBandid() == cmp.getBandid() and trigger.getPhiid() == cmp.getPhiid();
415 output.emplace_back(trigger);
425 ATH_MSG_ERROR(
"Empty filename string for pad pattern file. No pattern will be loaded");
426 return StatusCode::FAILURE;
429 std::ifstream ifs(
pfile);
432 bool isLarge =
false;
434 while (not ifs.eof()) {
435 std::getline(ifs,
line);
449 ATH_MSG_DEBUG(
"Parsed line for band ID " << bandid <<
" for large sector " << isLarge);
467 throw std::runtime_error(
"Can't unpack " +
line);
492 const std::array<uint32_t,8> pfebs = {pfeb0, pfeb1, pfeb2, pfeb3, pfeb4, pfeb5, pfeb6, pfeb7};
493 const std::array<uint32_t,8> padchans = {padchan0, padchan1, padchan2, padchan3, padchan4, padchan5, padchan6, padchan7};
502 ATH_MSG_ERROR(
"Unable to read pad pattern file. No pattern will be loaded");
503 return StatusCode::FAILURE;
507 return StatusCode::SUCCESS;
514 std::vector<char> sectorSizes = {
'L',
'S'};
515 for(
const auto& secSize: sectorSizes) {
516 const bool isLarge = (secSize ==
'L');
518 for(
uint32_t patternitter{0}; patternitter <
patterns.size(); ++patternitter) {
520 const auto pads =
pattern.getPadChannels();
524 bool is4layer = (ipfake || hofake);
526 std::map<std::string, uint32_t> problematicSectors{};
528 int offset = (ipfake) ? 0 : 4;
535 if (isLarge != (sector%2 == 0))
continue;
537 problematicSectors.try_emplace(secname,
mask);
542 if(problematicSectors.empty())
continue;
543 for(
const auto& sectoritr : problematicSectors) {
544 const auto sector = sectoritr.first;
545 m_maskedPatterns.try_emplace(sector, std::vector<std::tuple<uint32_t, uint32_t>>());
546 m_maskedPatterns.at(sector).push_back(std::make_tuple(patternitter, sectoritr.second));
552 return StatusCode::SUCCESS;
564 return StatusCode::SUCCESS;