139 {
140
141
142 SG::WriteHandle<xAOD::TrigCompositeContainer> wh_trigComposite(
m_trigCompositeKey, ctx);
143 ATH_CHECK(wh_trigComposite.record(std::make_unique<xAOD::TrigCompositeContainer>(), std::make_unique<xAOD::TrigCompositeAuxContainer>()));
144 auto trigCompCont = wh_trigComposite.ptr();
145
146 SG::WriteDecorHandle<xAOD::TrigCompositeContainer, int> trigCompL1A(
m_l1AKey, ctx);
147 SG::WriteDecorHandle<xAOD::TrigCompositeContainer, int> trigCompOther(
m_otherTypeKey, ctx);
148 SG::WriteDecorHandle<xAOD::TrigCompositeContainer, int> trigCompBeforeAfter(
m_beforeAfterKey, ctx);
149 SG::WriteDecorHandle<xAOD::TrigCompositeContainer, int> trigCompPass(
m_passKey, ctx);
150 SG::WriteDecorHandle<xAOD::TrigCompositeContainer, int> trigCompOtherBefore(
m_otherTypeBeforeKey, ctx);
151 SG::WriteDecorHandle<xAOD::TrigCompositeContainer, int> trigCompOtherAfter(
m_otherTypeAfterKey, ctx);
152 SG::WriteDecorHandle<xAOD::TrigCompositeContainer, int> trigCompBeforeOffset(
m_beforeOffsetKey, ctx);
153 SG::WriteDecorHandle<xAOD::TrigCompositeContainer, int> trigCompAfterOffset(
m_afterOffsetKey, ctx);
154
155
156 std::vector<const OFFLINE_FRAGMENTS_NAMESPACE::ROBFragment*> robFragments;
157 std::vector<uint32_t> roblist;
158
159 roblist.push_back(0x770000);
163 std::ostringstream
os;
164 for(auto rob : roblist){
166 }
168 <<
" ROBs requested/retrieved:" <<
os.str());
169 }
170 if (robFragments.size()<1){
172 return StatusCode::SUCCESS;
173 }
174 const eformat::ROBFragment<const uint32_t*>* rbf = robFragments[0];
175
176
177
178
179 const int l1a_idx = static_cast<int>(CTPfragment::lvl1AcceptBunch(rbf));
180
181 const int nBC = 2 * l1a_idx + 1;
182 const int mid = l1a_idx;
183
184
185 std::vector<std::vector<uint32_t>> tbpWords(nBC), tapWords(nBC);
186 for (
int i = 0;
i < nBC; ++
i) {
187 const unsigned k =
static_cast<unsigned>(
i);
188 tbpWords[
i] = CTPfragment::triggerDecisionBeforePrescales(rbf, k);
189 tapWords[
i] = CTPfragment::triggerDecisionAfterPrescales (rbf, k);
190 }
191
192
193 auto firedFromWords = [&](
const std::vector<uint32_t>&
w,
194 const std::vector<uint32_t>&
mask) -> uint8_t {
195 const std::size_t nw = std::min(
w.size(),
mask.size());
197 for (std::size_t iw = 0; iw < nw; ++iw) on |= static_cast<uint8_t>((w[iw] & mask[iw]) != 0u);
198 return on;
199 };
200
201
202 std::vector<uint8_t> firedbc(nBC,0), firedbc_ele(nBC,0), firedbc_mu(nBC,0), firedbc_jet(nBC,0);
203 for (
int i = 0;
i < nBC; ++
i) {
204 firedbc [
i] = firedFromWords(tbpWords[i],
m_bitmasks);
208 }
209
210
212 firedbc[mid] = firedbc_ele[mid] = firedbc_mu[mid] = firedbc_jet[mid] = 1;
213 }
214
215
216 auto collect_ids_from_words = [
this](
const std::vector<uint32_t>&
words) {
217 std::vector<int>
ids;
218 const std::size_t nw = std::min(
words.size(), this->m_bitmasks.size());
219 ids.reserve(32u * nw);
220 for (std::size_t iw = 0; iw < nw; ++iw) {
222 if (!w) continue;
223 const unsigned base =
static_cast<unsigned>(iw * 32u);
224 for (
unsigned b = 0;
b < 32; ++
b)
if (w & (1u << b))
ids.emplace_back(
static_cast<int>(
base + b));
225 }
227 };
228
229 std::vector<int> vDeltaBC_all_TBP, vCtpId_all_TBP, vDeltaBC_all_TAP, vCtpId_all_TAP;
230 vDeltaBC_all_TBP.reserve(64); vCtpId_all_TBP.reserve(64);
231 vDeltaBC_all_TAP.reserve(64); vCtpId_all_TAP.reserve(64);
232
233 for (
int i = 0;
i < nBC; ++
i) {
234 const int delta =
i - mid;
235 {
236 const auto ids = collect_ids_from_words(tbpWords[i]);
237 vDeltaBC_all_TBP.insert(vDeltaBC_all_TBP.end(),
ids.size(), delta);
238 vCtpId_all_TBP.insert (vCtpId_all_TBP.end(),
ids.begin(),
ids.end());
239 }
240 {
241 const auto ids = collect_ids_from_words(tapWords[i]);
242 vDeltaBC_all_TAP.insert(vDeltaBC_all_TAP.end(),
ids.size(), delta);
243 vCtpId_all_TAP.insert (vCtpId_all_TAP.end(),
ids.begin(),
ids.end());
244 }
245 }
246
247
248 int isPassed = 0;
249 int beforeafterflag = 0;
250 int offset_before = 0, offset_after = 0;
251 for (
int d = 1;
d <= l1a_idx; ++
d) {
252 if (firedbc[mid] && firedbc[mid - d] && offset_before == 0) { offset_before =
d; isPassed = 1; }
253 if (firedbc[mid] && firedbc[mid + d] && offset_after == 0) { offset_after =
d; isPassed = 1; }
254 if (offset_before && offset_after) break;
255 }
256
257
259 if (firedbc_ele[idx] && !firedbc_mu[idx] && !firedbc_jet[idx]) return 1;
260 else if (firedbc_mu [idx] && !firedbc_ele[idx] && !firedbc_jet[idx]) return 2;
261 else if (firedbc_jet[idx] && !firedbc_ele[idx] && !firedbc_mu[idx]) return 3;
262 else if (firedbc_ele[idx] && firedbc_mu[idx] && !firedbc_jet[idx]) return 4;
263 else if (firedbc_ele[idx] && firedbc_jet[idx] && !firedbc_mu[idx]) return 5;
264 else if (firedbc_mu [idx] && firedbc_jet[idx] && !firedbc_ele[idx]) return 6;
265 else if (firedbc_ele[idx] && firedbc_mu[idx] && firedbc_jet[idx]) return 7;
266 return 0;
267 };
268
270 int other_type_before = (offset_before > 0) ?
classify(mid - offset_before) : 0;
271 int other_type_after = (offset_after > 0) ?
classify(mid + offset_after ) : 0;
272
273
274 if (offset_before > 0 && offset_after > 0) {
275 if (offset_before < offset_after) beforeafterflag = -offset_before;
276 else if (offset_after < offset_before) beforeafterflag = +offset_after;
277 else beforeafterflag = +offset_after;
278 } else if (offset_before > 0) {
279 beforeafterflag = -offset_before;
280 } else if (offset_after > 0) {
281 beforeafterflag = +offset_after;
282 }
283
284 int other_type = 0;
285 if (beforeafterflag < 0) other_type = other_type_before;
286 else if (beforeafterflag > 0) other_type = other_type_after;
287
288
289 if (isPassed) {
291 trigCompCont->push_back(trigComp);
292 trigComp->setName("mistimemon_L1Dec");
293
294 trigCompL1A (*trigComp) = l1a_type;
295 trigCompOther (*trigComp) = other_type;
296 trigCompBeforeAfter (*trigComp) = beforeafterflag;
297 trigCompPass (*trigComp) = isPassed;
298 trigCompOtherBefore (*trigComp) = other_type_before;
299 trigCompOtherAfter (*trigComp) = other_type_after;
300 trigCompBeforeOffset(*trigComp) = offset_before;
301 trigCompAfterOffset (*trigComp) = offset_after;
302 }
303
304
305 auto mon_l1a = Monitored::Scalar<int>("l1Accept", l1a_type);
306 auto mon_otherType = Monitored::Scalar<int>("otherType", other_type);
307 auto mon_beforeAfter = Monitored::Scalar<int>("BeforeAfterFlag", beforeafterflag);
308 auto monitorIt = Monitored::Group(
m_monTool, mon_l1a, mon_otherType, mon_beforeAfter);
309
310 if (offset_before > 0 && offset_after > 0) {
311 auto mon_offsetBefore = Monitored::Scalar<int>("BeforeOffset", offset_before);
312 auto mon_offsetAfter = Monitored::Scalar<int>("AfterOffset", offset_after);
313 auto mon_otherBefore = Monitored::Scalar<int>("OtherTypeBefore", other_type_before);
314 auto mon_otherAfter = Monitored::Scalar<int>("OtherTypeAfter", other_type_after);
315 auto gBoth = Monitored::Group(
m_monTool, mon_offsetBefore, mon_offsetAfter, mon_otherBefore, mon_otherAfter);
316 (void)gBoth;
317 } else if (offset_before > 0) {
318 auto mon_offsetBefore = Monitored::Scalar<int>("BeforeOffset", offset_before);
319 auto mon_otherBefore = Monitored::Scalar<int>("OtherTypeBefore", other_type_before);
320 auto gB = Monitored::Group(
m_monTool, mon_offsetBefore, mon_otherBefore);
321 (void)gB;
322 } else if (offset_after > 0) {
323 auto mon_offsetAfter = Monitored::Scalar<int>("AfterOffset", offset_after);
324 auto mon_otherAfter = Monitored::Scalar<int>("OtherTypeAfter", other_type_after);
325 auto gA = Monitored::Group(
m_monTool, mon_offsetAfter, mon_otherAfter);
326 (void)gA;
327 }
328
329
334 auto gMaps = Monitored::Group(
m_monTool, mon_dbc_all_tbp, mon_id_all_tbp,
335 mon_dbc_all_tap, mon_id_all_tap);
336 (void)gMaps;
337
338
339 const auto ids0_tbp = collect_ids_from_words(tbpWords[mid]);
340 const auto ids0_tap = collect_ids_from_words(tapWords[mid]);
341
342 auto fill_pair_map = [&](int deltaSel, bool useTAP,
343 const char* varX, const char* varY) {
344 const int kN = mid + deltaSel;
345 if (kN < 0 || kN >= nBC) return;
346
347 const auto &idsN = useTAP ? collect_ids_from_words(tapWords[kN])
348 : collect_ids_from_words(tbpWords[kN]);
349 const auto& ids0 = useTAP ? ids0_tap : ids0_tbp;
350
351 if (ids0.empty() || idsN.empty()) return;
352
353 std::vector<int> vId0; vId0.reserve(ids0.size() * idsN.size());
354 std::vector<int> vIdN; vIdN.reserve(vId0.capacity());
355 for (int id0 : ids0) for (int idN : idsN) { vId0.emplace_back(id0); vIdN.emplace_back(idN); }
356
359 auto g = Monitored::Group(
m_monTool, mon_x, mon_y);
360 (void)g;
361 };
362
363
364 fill_pair_map(+2, false, "CTPID0tbp_p2", "CTPIDtbp_p2");
365 fill_pair_map(-2, false, "CTPID0tbp_m2", "CTPIDtbp_m2");
366 fill_pair_map(+1, false, "CTPID0tbp_p1", "CTPIDtbp_p1");
367 fill_pair_map(-1, false, "CTPID0tbp_m1", "CTPIDtbp_m1");
368
369
370 fill_pair_map(+2, true , "CTPID0tap_p2", "CTPIDtap_p2");
371 fill_pair_map(-2, true , "CTPID0tap_m2", "CTPIDtap_m2");
372 fill_pair_map(+1, true , "CTPID0tap_p1", "CTPIDtap_p1");
373 fill_pair_map(-1, true , "CTPID0tap_m1", "CTPIDtap_m1");
374
375 return StatusCode::SUCCESS;
376}
#define ATH_CHECK
Evaluate an expression and check for errors.
bool msgLvl(const MSG::Level lvl) const
SG::WriteDecorHandleKey< xAOD::TrigCompositeContainer > m_otherTypeBeforeKey
SG::WriteDecorHandleKey< xAOD::TrigCompositeContainer > m_otherTypeKey
SG::WriteDecorHandleKey< xAOD::TrigCompositeContainer > m_beforeOffsetKey
SG::WriteHandleKey< xAOD::TrigCompositeContainer > m_trigCompositeKey
std::vector< uint32_t > m_bitmasks
Gaudi::Property< bool > m_currentBCincl
std::vector< uint32_t > m_bitmasks_ele
SG::WriteDecorHandleKey< xAOD::TrigCompositeContainer > m_otherTypeAfterKey
SG::WriteDecorHandleKey< xAOD::TrigCompositeContainer > m_afterOffsetKey
std::vector< uint32_t > m_bitmasks_jets
ToolHandle< GenericMonitoringTool > m_monTool
ServiceHandle< IROBDataProviderSvc > m_robDataProviderSvc
std::vector< uint32_t > m_bitmasks_mu
SG::WriteDecorHandleKey< xAOD::TrigCompositeContainer > m_l1AKey
SG::WriteDecorHandleKey< xAOD::TrigCompositeContainer > m_beforeAfterKey
SG::WriteDecorHandleKey< xAOD::TrigCompositeContainer > m_passKey
void classify(ToolHandle< IMCTruthClassifier > &m_classif, const xAOD::TruthParticle *theParticle, unsigned int &particleOutCome, unsigned int &result, int &hadron_pdg, unsigned int &particleType, unsigned int &particleOrigin)
ValuesCollection< T > Collection(std::string name, const T &collection)
Declare a monitored (double-convertible) collection.
TrigComposite_v1 TrigComposite
Declare the latest version of the class.