21 #include "CLHEP/Random/RandomEngine.h"
22 #include "CLHEP/Random/Ranlux64Engine.h"
37 const std::function< CLHEP::HepRandomEngine*(void) >
CTPSimRanluxFactory = [](
void)->CLHEP::HepRandomEngine*{
38 return new CLHEP::Ranlux64Engine();
54 if(m_forceBunchGroupPattern) {
55 ATH_MSG_INFO(
"Will use bunchgroup pattern 0x" << std::hex << m_bunchGroupPattern);
57 ATH_MSG_INFO(
"Will use bunchgroup definition from bunchgroup set");
62 CHECK( m_oKeyCTPResult.assign(LVL1CTP::DEFAULT_CTPResultOutputLocation_Rerun) );
64 CHECK( m_oKeyRDO.assign(LVL1CTP::DEFAULT_RDOOutputLocation_Rerun) );
66 CHECK( m_oKeySLink.assign(LVL1CTP::DEFAULT_CTPSLinkLocation_Rerun) );
68 ATH_CHECK( m_bgKey.initialize( !m_forceBunchGroupPattern ) );
72 ATH_CHECK( m_iKeyTopo.initialize( !m_iKeyTopo.empty() && m_doL1Topo ) );
73 ATH_CHECK( m_iKeyMuctpi.initialize( ! m_iKeyMuctpi.empty() ) );
76 ATH_CHECK( m_iKeyLegacyTopo.initialize( !m_iKeyLegacyTopo.empty() && m_doL1CaloLegacy && m_doL1TopoLegacy ) );
77 ATH_CHECK( m_iKeyCtpinEM.initialize( m_doL1CaloLegacy ) );
78 ATH_CHECK( m_iKeyCtpinJet.initialize( m_doL1CaloLegacy ) );
79 ATH_CHECK( m_iKeyCtpinXE.initialize( m_doL1CaloLegacy ) );
82 ATH_CHECK( m_iKeyJFexJets.initialize( ! m_iKeyJFexJets.empty() ) );
83 ATH_CHECK( m_iKeyJFexLJets.initialize( ! m_iKeyJFexLJets.empty() ) );
84 ATH_CHECK( m_iKeyGFexJets.initialize( ! m_iKeyGFexJets.empty() ) );
85 ATH_CHECK( m_iKeyGFexMETNC.initialize( ! m_iKeyGFexMETNC.empty() ) );
86 ATH_CHECK( m_iKeyGFexMETRho.initialize( ! m_iKeyGFexMETRho.empty() ) );
87 ATH_CHECK( m_iKeyGFexMETJwoJ.initialize( ! m_iKeyGFexMETJwoJ.empty() ) );
88 ATH_CHECK( m_iKeyEFexCluster.initialize( ! m_iKeyEFexCluster.empty() ) );
89 ATH_CHECK( m_iKeyEFexTau.initialize( ! m_iKeyEFexTau.empty() ) );
90 ATH_CHECK( m_oKeyCTPResult.initialize( m_useEDMxAOD && !m_oKeyCTPResult.empty() ) );
91 ATH_CHECK( m_oKeyRDO.initialize( !m_useEDMxAOD && !m_oKeyRDO.empty() ) );
92 ATH_CHECK( m_oKeySLink.initialize( ! m_oKeySLink.empty() ) );
95 ATH_CHECK( m_iKeyZDC.initialize( ! m_iKeyZDC.empty() && m_doZDC ) );
98 ATH_CHECK( m_iKeyTRT.initialize( ! m_iKeyTRT.empty() && m_doTRT ) );
106 ATH_MSG_DEBUG(
"Registering histograms under " << getBaseHistPath() <<
" in " << m_histSvc);
108 return StatusCode::SUCCESS;
117 bookHists().ignore();
121 setHistLabels(*l1menu).ignore();
123 return StatusCode::SUCCESS;
131 fillInputHistograms(context).ignore();
133 std::map<std::string, unsigned int> thrMultiMap;
135 extractMultiplicities(thrMultiMap, context).ignore();
137 simulateItems(thrMultiMap, context).ignore();
139 return StatusCode::SUCCESS;
146 std::map<std::string,std::vector<std::string>> typeMapping = {
148 {
"jet", {
"JET",
"jJ",
"jLJ",
"gJ",
"gLJ"} },
149 {
"xe", {
"XE",
"gXE",
"jXE"} },
150 {
"te", {
"TE",
"jTE",
"gTE"} },
152 {
"em", {
"EM",
"eEM",
"jEM"} },
153 {
"tau", {
"TAU",
"eTAU",
"jTAU",
"cTAU"} }
155 std::vector<TrigConf::L1Threshold> thrV;
156 for(
const std::string &
t : typeMapping[
type] ) {
158 TH2*
hist =
new TH2I( Form(
"%sMult",
t.c_str()),
159 Form(
"%s threshold multiplicity",
t.c_str()), xsize, 0, xsize, maxMult, 0, maxMult);
160 sc = hbook(
"/multi/" +
type, std::unique_ptr<TH2>(
hist));
169 std::map<std::string,std::vector<std::string>> typeMapping = {
171 {
"jet", {
"JET",
"jJ",
"jLJ",
"gJ",
"gLJ"} },
172 {
"xe", {
"XE",
"gXE",
"jXE"} },
173 {
"te", {
"TE",
"jTE",
"gTE"} },
175 {
"em", {
"EM",
"eEM",
"jEM"} },
176 {
"tau", {
"TAU",
"eTAU",
"jTAU",
"cTAU"} }
180 std::vector<TrigConf::L1Threshold> thrV;
181 for(
const std::string &
t : typeMapping[
type] ) {
183 auto hist = get2DHist(
"/multi/" +
type +
"/" +
t +
"Mult" );
184 auto & thrV =
l1menu.thresholds(
t);
185 while(
hist->GetNbinsX() < (
int)thrV.size() ) {
186 hist->LabelsInflate(
"xaxis");
188 for(
auto thr : thrV) {
189 hist->GetXaxis()->SetBinLabel(
thr->mapping()+1,
thr->name().c_str() );
192 ATH_MSG_DEBUG(
"Caught exception when setting new JSON MultiplicityHistLabel " <<
t <<
" : " << ex.what());
200 std::string baseHistPath( m_histPath );
201 if(baseHistPath.back()!=
'/') baseHistPath +=
"/";
202 baseHistPath +=
name();
208 const std::string &
hname(
hist->GetName());
211 if(
key.back()!=
'/')
key +=
"/";
214 if(m_hist1D.find(
key)!=m_hist1D.end()) {
216 return StatusCode::RECOVERABLE;
219 LockedHandle<TH1>
lh;
221 if(
sc.isSuccess() ) {
232 const std::string &
hname(
hist->GetName());
235 if(
key.back()!=
'/')
key +=
"/";
238 if(m_hist2D.find(
key)!=m_hist2D.end()) {
240 return StatusCode::RECOVERABLE;
243 LockedHandle<TH2>
lh;
245 if(
sc.isSuccess() ) {
257 if (itr == m_hist1D.end()) {
258 throw GaudiException(
"1D-hist "+
histName +
" does not exist",
name(), StatusCode::FAILURE);
268 if (itr == m_hist2D.end()) {
269 throw GaudiException(
"2D-hist "+
histName +
" does not exist",
name(), StatusCode::FAILURE);
290 std::vector<std::string> connNames =
l1menu.connectorNames();
291 for(
const std::string connName : {
"LegacyTopo0",
"LegacyTopo1",
"Topo1El",
"Topo2El",
"Topo3El",
"Topo1Opt0",
"Topo1Opt1",
"Topo1Opt2",
"Topo1Opt3"}) {
292 if(
find(connNames.begin(), connNames.end(), connName) == connNames.end() ) {
295 auto hTopo = *get1DHist(
"/input/topo/" + connName);
296 for(
uint fpga : {0,1}) {
297 for(
uint clock : {0,1}) {
298 for(
auto &
tl :
l1menu.connector(connName).triggerLines(fpga,clock)) {
299 uint flatIndex =
tl.flatindex();
300 hTopo->GetXaxis()->SetBinLabel(flatIndex+1,
tl.name().c_str());
306 std::vector<std::string> orderedItemnames;
307 orderedItemnames.reserve(
l1menu.size() );
309 orderedItemnames.emplace_back(
item.name());
311 std::sort(orderedItemnames.begin(), orderedItemnames.end());
314 auto tbpById = *get1DHist(
"/output/tbpById" );
315 auto tapById = *get1DHist(
"/output/tapById" );
316 auto tavById = *get1DHist(
"/output/tavById" );
317 auto tbpByName = *get1DHist(
"/output/tbpByName" );
318 auto tapByName = *get1DHist(
"/output/tapByName" );
319 auto tavByName = *get1DHist(
"/output/tavByName" );
320 unsigned int bin = 1;
321 for (
const std::string & itemname : orderedItemnames ) {
322 unsigned int ctpId(0);
324 ctpId =
item.ctpId();
325 tbpById->GetXaxis()->SetBinLabel( ctpId+1, itemname.c_str() );
326 tapById->GetXaxis()->SetBinLabel( ctpId+1, itemname.c_str() );
327 tavById->GetXaxis()->SetBinLabel( ctpId+1, itemname.c_str() );
328 tbpByName->GetXaxis()->SetBinLabel(
bin, itemname.c_str() );
329 tapByName->GetXaxis()->SetBinLabel(
bin, itemname.c_str() );
330 tavByName->GetXaxis()->SetBinLabel(
bin++, itemname.c_str() );
333 return StatusCode::SUCCESS;
340 ATH_CHECK ( hbook(
"/input/jets/", std::make_unique<TH1I>(
"jJetPt",
"Jet p_{T} - jJ", 40, 0, 80) ));
341 ATH_CHECK ( hbook(
"/input/jets/", std::make_unique<TH1I>(
"jJetEta",
"Jet #eta - jJ", 64, -3.2, 3.2) ));
342 ATH_CHECK ( hbook(
"/input/jets/", std::make_unique<TH1I>(
"jJetPhi",
"Jet #phi - jJ", 64, -3.2, 3.2) ));
343 ATH_CHECK ( hbook(
"/input/jets/", std::make_unique<TH1I>(
"jLJetPt",
"Jet p_{T} - jLJ", 40, 0, 80) ));
344 ATH_CHECK ( hbook(
"/input/jets/", std::make_unique<TH1I>(
"jLJetEta",
"Jet #eta - jLJ", 64, -3.2, 3.2) ));
345 ATH_CHECK ( hbook(
"/input/jets/", std::make_unique<TH1I>(
"jLJetPhi",
"Jet #phi - jLJ", 64, -3.2, 3.2) ));
346 ATH_CHECK ( hbook(
"/input/jets/", std::make_unique<TH1I>(
"gJetPt",
"Jet p_{T} - gJ", 40, 0, 80) ));
347 ATH_CHECK ( hbook(
"/input/jets/", std::make_unique<TH1I>(
"gJetEta",
"Jet #eta - gJ", 64, -3.2, 3.2) ));
348 ATH_CHECK ( hbook(
"/input/jets/", std::make_unique<TH1I>(
"gJetPhi",
"Jet #phi - gJ", 64, -3.2, 3.2) ));
349 ATH_CHECK ( hbook(
"/input/jets/", std::make_unique<TH1I>(
"gLJetPt",
"Jet p_{T} - gLJ", 40, 0, 80) ));
350 ATH_CHECK ( hbook(
"/input/jets/", std::make_unique<TH1I>(
"gLJetEta",
"Jet #eta - gLJ", 64, -3.2, 3.2) ));
351 ATH_CHECK ( hbook(
"/input/jets/", std::make_unique<TH1I>(
"gLJetPhi",
"Jet #phi - gLJ", 64, -3.2, 3.2) ));
354 ATH_CHECK ( hbook(
"/input/met/", std::make_unique<TH1I>(
"Pufit",
"Missing ET from algorithm pufit", 40, 0, 80) ));
355 ATH_CHECK ( hbook(
"/input/met/", std::make_unique<TH1I>(
"PufitPhi",
"Missing ET PUfit phi", 64, -3.2, 3.2) ));
356 ATH_CHECK ( hbook(
"/input/met/", std::make_unique<TH1I>(
"Rho",
"Missing ET from algorithm rhosub", 40, 0, 80) ));
357 ATH_CHECK ( hbook(
"/input/met/", std::make_unique<TH1I>(
"RhoPhi",
"Missing ET rhosub phi", 64, -3.2, 3.2) ));
358 ATH_CHECK ( hbook(
"/input/met/", std::make_unique<TH1I>(
"JwoJ",
"Missing ET from algorithm jet without jets", 40, 0, 80) ));
359 ATH_CHECK ( hbook(
"/input/met/", std::make_unique<TH1I>(
"JwoJPhi",
"Missing ET jet without jet phi", 64, -3.2, 3.2) ));
362 ATH_CHECK ( hbook(
"/input/em/", std::make_unique<TH1I>(
"et",
"Cluster et", 40, 0, 40) ));
363 ATH_CHECK ( hbook(
"/input/em/", std::make_unique<TH1I>(
"eta",
"Cluster eta ", 64, -3.2, 3.2) ));
364 ATH_CHECK ( hbook(
"/input/em/", std::make_unique<TH1I>(
"phi",
"Cluster phi", 64, -3.2, 3.2) ));
367 ATH_CHECK ( hbook(
"/input/tau/", std::make_unique<TH1I>(
"et",
"Tau et", 40, 0, 40) ));
368 ATH_CHECK ( hbook(
"/input/tau/", std::make_unique<TH1I>(
"eta",
"Tau eta ", 64, -3.2, 3.2) ));
369 ATH_CHECK ( hbook(
"/input/tau/", std::make_unique<TH1I>(
"phi",
"Tau phi", 64, -3.2, 3.2) ));
370 ATH_CHECK ( hbook(
"/input/tau/", std::make_unique<TH1I>(
"emIso",
"Tau em isolation", 40, 0, 1) ));
371 ATH_CHECK ( hbook(
"/input/tau/", std::make_unique<TH1I>(
"hadIso",
"Tau hadronic isolation", 40, 0, 1) ));
372 ATH_CHECK ( hbook(
"/input/tau/", std::make_unique<TH1I>(
"R3ET",
"Tau eT", 40, 0, 40) ));
373 ATH_CHECK ( hbook(
"/input/tau/", std::make_unique<TH1I>(
"R3Iso",
"Tau isolation", 40, 0, 1) ));
376 ATH_CHECK ( hbook(
"/input/counts/", std::make_unique<TH1I>(
"jJets",
"Number of jets (jJ)", 40, 0, 40) ));
377 ATH_CHECK ( hbook(
"/input/counts/", std::make_unique<TH1I>(
"jLJets",
"Number of jets (jLJ)", 40, 0, 40) ));
378 ATH_CHECK ( hbook(
"/input/counts/", std::make_unique<TH1I>(
"gJets",
"Number of jets (gJ)", 40, 0, 40) ));
379 ATH_CHECK ( hbook(
"/input/counts/", std::make_unique<TH1I>(
"gLJets",
"Number of jets (gLJ)", 40, 0, 40) ));
380 ATH_CHECK ( hbook(
"/input/counts/", std::make_unique<TH1I>(
"muons",
"Number of muons", 10, 0, 10) ));
381 ATH_CHECK ( hbook(
"/input/counts/", std::make_unique<TH1I>(
"emcluster",
"Number of EM clusters", 20, 0, 20) ));
382 ATH_CHECK ( hbook(
"/input/counts/", std::make_unique<TH1I>(
"taus",
"Number of TAU candidates", 20, 0, 20) ));
385 ATH_CHECK ( createMultiplicityHist(
"muon" ) );
386 ATH_CHECK ( createMultiplicityHist(
"jet" ) );
387 ATH_CHECK ( createMultiplicityHist(
"xe", 2) );
388 ATH_CHECK ( createMultiplicityHist(
"te", 2) );
389 ATH_CHECK ( createMultiplicityHist(
"xs", 2) );
390 ATH_CHECK ( createMultiplicityHist(
"em" ) );
391 ATH_CHECK ( createMultiplicityHist(
"tau" ) );
393 ATH_CHECK ( hbook(
"/multi/all", (std::unique_ptr<TH2>)std::make_unique<TH2I>(
"LegacyMult",
"Legacy thresholds multiplicity", 1, 0, 1, 10, 0, 10) ));
394 ATH_CHECK ( hbook(
"/multi/all", (std::unique_ptr<TH2>)std::make_unique<TH2I>(
"R3Mult",
"New thresholds multiplicity", 1, 0, 1, 10, 0, 10) ));
397 ATH_CHECK( hbook(
"/input/topo/", std::make_unique<TH1I>(
"LegacyTopo0",
"L1Topo Decision (Legacy 0)", 64, 0, 64) ));
398 ATH_CHECK( hbook(
"/input/topo/", std::make_unique<TH1I>(
"LegacyTopo1",
"L1Topo Decision (Legacy 1)", 64, 0, 64) ));
399 ATH_CHECK( hbook(
"/input/topo/", std::make_unique<TH1I>(
"Topo1El",
"L1Topo Decision (Topo 1 electrical)", 64, 0, 64) ));
400 ATH_CHECK( hbook(
"/input/topo/", std::make_unique<TH1I>(
"Topo2El",
"L1Topo Decision (Topo 2 electrical)", 64, 0, 64) ));
401 ATH_CHECK( hbook(
"/input/topo/", std::make_unique<TH1I>(
"Topo3El",
"L1Topo Decision (Topo 3 electrical)", 64, 0, 64) ));
402 ATH_CHECK( hbook(
"/input/topo/", std::make_unique<TH1I>(
"Topo1Opt0",
"L1Topo Decision (Topo 1 optical 0)", 128, 0, 128) ));
403 ATH_CHECK( hbook(
"/input/topo/", std::make_unique<TH1I>(
"Topo1Opt1",
"L1Topo Decision (Topo 1 optical 1)", 128, 0, 128) ));
404 ATH_CHECK( hbook(
"/input/topo/", std::make_unique<TH1I>(
"Topo1Opt2",
"L1Topo Decision (Topo 1 optical 2)", 128, 0, 128) ));
405 ATH_CHECK( hbook(
"/input/topo/", std::make_unique<TH1I>(
"Topo1Opt3",
"L1Topo Decision (Topo 1 optical 3)", 128, 0, 128) ));
408 ATH_CHECK ( hbook(
"/output/", std::make_unique<TH1I>(
"tbpById",
"Items decision (tbp)", 512, 0, 512) ));
409 ATH_CHECK ( hbook(
"/output/", std::make_unique<TH1I>(
"tapById",
"Items decision (tap)", 512, 0, 512) ));
410 ATH_CHECK ( hbook(
"/output/", std::make_unique<TH1I>(
"tavById",
"Items decision (tav)", 512, 0, 512) ));
411 ATH_CHECK ( hbook(
"/output/", std::make_unique<TH1I>(
"tbpByName",
"Items decision (tbp)", 512, 0, 512) ));
412 ATH_CHECK ( hbook(
"/output/", std::make_unique<TH1I>(
"tapByName",
"Items decision (tap)", 512, 0, 512) ));
413 ATH_CHECK ( hbook(
"/output/", std::make_unique<TH1I>(
"tavByName",
"Items decision (tav)", 512, 0, 512) ));
415 ATH_CHECK ( hbook(
"/", std::make_unique<TH1I>(
"bcid",
"Bunch crossing ID", 3564, 0, 3564)) );
419 return StatusCode::SUCCESS;
428 if( not m_iKeyJFexJets.empty() ) {
430 if(jFexJets.isValid()) {
431 get1DHist(
"/input/counts/jJets")->Fill(jFexJets->size());
432 auto h0 = *get1DHist(
"/input/jets/jJetPt");
433 auto h1 = *get1DHist(
"/input/jets/jJetEta");
434 auto h2 = *get1DHist(
"/input/jets/jJetPhi");
435 for(
const auto jet : *jFexJets ) {
436 h0->Fill(fabs(
jet->et8x8()/1000.));
437 h1->Fill(
jet->eta());
438 h2->Fill(
jet->phi());
446 if( not m_iKeyJFexLJets.empty() ) {
448 if(jFexLJets.isValid()) {
449 get1DHist(
"/input/counts/jLets")->Fill(jFexLJets->size());
450 auto h0 = *get1DHist(
"/input/jets/jLJetPt");
451 auto h1 = *get1DHist(
"/input/jets/jLJetEta");
452 auto h2 = *get1DHist(
"/input/jets/jLJetPhi");
453 for(
const auto jet : *jFexLJets ) {
454 h0->Fill(fabs(
jet->et8x8()/1000.));
455 h1->Fill(
jet->eta());
456 h2->Fill(
jet->phi());
466 if( not m_iKeyGFexJets.empty() ) {
468 if(gFexJets.isValid()) {
469 get1DHist(
"/input/counts/gJets")->Fill(gFexJets->size());
470 auto h0 = *get1DHist(
"/input/jets/gJetPt");
471 auto h1 = *get1DHist(
"/input/jets/gJetEta");
472 auto h2 = *get1DHist(
"/input/jets/gJetPhi");
473 for(
const auto jet : *gFexJets ) {
474 h0->Fill(fabs(
jet->et8x8()/1000.));
475 h1->Fill(
jet->eta());
476 h2->Fill(
jet->phi());
484 if( not m_iKeyGFexMETNC.empty() ) {
486 if( gFexMETPufit.isValid() ) {
487 get1DHist(
"/input/met/Pufit")->Fill(gFexMETPufit->energyT()/1000.);
488 get1DHist(
"/input/met/PufitPhi")->Fill(atan2(gFexMETPufit->energyX(), gFexMETPufit->energyY()));
494 if( not m_iKeyGFexMETRho.empty() ) {
496 if( gFexMETRho.isValid() ) {
497 get1DHist(
"/input/met/Rho")->Fill(gFexMETRho->energyT()/1000.);
498 get1DHist(
"/input/met/RhoPhi")->Fill(atan2(gFexMETRho->energyX(), gFexMETRho->energyY()));
504 if( not m_iKeyGFexMETJwoJ.empty() ) {
506 if( gFexMETJwoJ.isValid() ) {
507 get1DHist(
"/input/met/JwoJ")->Fill(gFexMETJwoJ->energyT()/1000.);
508 get1DHist(
"/input/met/JwoJPhi")->Fill(atan2(gFexMETJwoJ->energyX(), gFexMETJwoJ->energyY()));
515 if( not m_iKeyEFexCluster.empty() ) {
517 if( eFexCluster.isValid() ) {
518 get1DHist(
"/input/counts/emcluster")->Fill(eFexCluster->size());
519 auto h0 = *get1DHist(
"/input/em/et");
520 auto h1 = *get1DHist(
"/input/em/eta");
521 auto h2 = *get1DHist(
"/input/em/phi");
522 for(
const auto cl : *eFexCluster ) {
533 if( not m_iKeyEFexTau.empty() ) {
535 if( eFexTau.isValid() ) {
536 get1DHist(
"/input/counts/taus")->Fill(eFexTau->size());
537 auto h0 = *get1DHist(
"/input/tau/et");
538 auto h1 = *get1DHist(
"/input/tau/eta");
539 auto h2 = *get1DHist(
"/input/tau/phi");
540 auto h3 = *get1DHist(
"/input/tau/emIso");
541 auto h4 = *get1DHist(
"/input/tau/hadIso");
542 auto h5 = *get1DHist(
"/input/tau/R3ClusterET");
543 auto h6 = *get1DHist(
"/input/tau/R3ClusterIso");
546 for(
const auto tau : *eFexTau ) {
548 h1->Fill(tau->eta());
549 h2->Fill(tau->phi());
550 h3->Fill(tau->emIsol());
551 h4->Fill(tau->hadIsol());
552 h5->Fill(accR3ClET(*tau)/1000.);
553 h6->Fill(accR3ClIso(*tau));
561 if( not m_iKeyLegacyTopo.empty() && m_doL1CaloLegacy && m_doL1TopoLegacy ) {
562 auto legacyTopoInput =
SG::makeHandle( m_iKeyLegacyTopo, context );
563 if(legacyTopoInput.isValid()) {
564 ATH_MSG_DEBUG(
"Retrieved input from L1Topo from StoreGate with key " << m_iKeyTopo);
565 ATH_MSG_DEBUG(
"L1TopoLegacy0 word 0 is: 0x" << std::hex << std::setw( 8 ) << std::setfill(
'0' ) << legacyTopoInput->cableWord1(0));
566 ATH_MSG_DEBUG(
"L1TopoLegacy0 word 1 is: 0x" << std::hex << std::setw( 8 ) << std::setfill(
'0' ) << legacyTopoInput->cableWord1(1));
567 ATH_MSG_DEBUG(
"L1TopoLegacy1 word 0 is: 0x" << std::hex << std::setw( 8 ) << std::setfill(
'0' ) << legacyTopoInput->cableWord2(0));
568 ATH_MSG_DEBUG(
"L1TopoLegacy1 word 1 is: 0x" << std::hex << std::setw( 8 ) << std::setfill(
'0' ) << legacyTopoInput->cableWord2(1));
569 auto h0 = *get1DHist(
"/input/topo/LegacyTopo0");
570 auto h1 = *get1DHist(
"/input/topo/LegacyTopo1");
571 for(
unsigned int i=0;
i<32; ++
i) {
573 if( (legacyTopoInput->cableWord1(0) &
mask) != 0 )
h0->Fill(
i);
574 if( (legacyTopoInput->cableWord1(1) &
mask) != 0 )
h0->Fill(32 +
i);
575 if( (legacyTopoInput->cableWord2(0) &
mask) != 0 )
h1->Fill(
i);
576 if( (legacyTopoInput->cableWord2(1) &
mask) != 0 )
h1->Fill(32 +
i);
581 if( not m_iKeyTopo.empty() && m_doL1Topo ) {
583 if(topoInput.isValid()) {
584 ATH_MSG_DEBUG(
"Retrieved input from L1Topo from StoreGate with key " << m_iKeyTopo);
585 ATH_MSG_DEBUG(
"L1Topo0 word 0 is: 0x" << std::hex << std::setw( 8 ) << std::setfill(
'0' ) << topoInput->cableWord1(0));
586 ATH_MSG_DEBUG(
"L1Topo0 word 1 is: 0x" << std::hex << std::setw( 8 ) << std::setfill(
'0' ) << topoInput->cableWord1(1));
587 ATH_MSG_DEBUG(
"L1Topo1 word 0 is: 0x" << std::hex << std::setw( 8 ) << std::setfill(
'0' ) << topoInput->cableWord2(0));
588 ATH_MSG_DEBUG(
"L1Topo1 word 1 is: 0x" << std::hex << std::setw( 8 ) << std::setfill(
'0' ) << topoInput->cableWord2(1));
589 auto h0 = *get1DHist(
"/input/topo/Topo2El");
590 auto h1 = *get1DHist(
"/input/topo/Topo3El");
591 for(
unsigned int i=0;
i<32; ++
i) {
593 if( (topoInput->cableWord1(0) &
mask) != 0 )
h0->Fill(
i);
594 if( (topoInput->cableWord1(1) &
mask) != 0 )
h0->Fill(32 +
i);
595 if( (topoInput->cableWord2(0) &
mask) != 0 )
h1->Fill(
i);
596 if( (topoInput->cableWord2(1) &
mask) != 0 )
h1->Fill(32 +
i);
598 auto h2 = *get1DHist(
"/input/topo/Topo1Opt0");
599 auto h3 = *get1DHist(
"/input/topo/Topo1Opt1");
600 auto h4 = *get1DHist(
"/input/topo/Topo1Opt2");
601 auto h5 = *get1DHist(
"/input/topo/Topo1Opt3");
602 for(
unsigned int i=0;
i<128;
i += 3) {
603 std::bitset<128>
mask = 0x11;
mask <<=
i;
604 if( (topoInput->optcableWord(
"Topo1Opt0") &
mask) != 0 ) h2->Fill(
i);
605 if( (topoInput->optcableWord(
"Topo1Opt1") &
mask) != 0 ) h3->Fill(
i);
606 if( (topoInput->optcableWord(
"Topo1Opt2") &
mask) != 0 ) h4->Fill(
i);
607 if( (topoInput->optcableWord(
"Topo1Opt3") &
mask) != 0 ) h5->Fill(
i);
615 auto bcid = context.eventID().bunch_crossing_id();
616 get1DHist(
"/bcid")->Fill(
bcid);
618 return StatusCode::SUCCESS;
629 std::vector<std::string> connNames =
l1menu->connectorNames();
630 for (
const std::string connName : {
"LegacyTopo0",
"LegacyTopo1",
"Topo1El",
"Topo2El",
"Topo3El",
"Topo1Opt0",
"Topo1Opt1",
"Topo1Opt2",
"Topo1Opt3",
"CTPCAL",
"NIM2"})
632 if(
find(connNames.begin(), connNames.end(), connName) == connNames.end() ) {
635 bool opt_cable =
false;
636 std::bitset<128> cable128 {0};
638 if (connName.starts_with(
"Legacy")) {
639 if (m_iKeyLegacyTopo.empty() || !m_doL1CaloLegacy || !m_doL1TopoLegacy )
644 if (not topoInput.isValid()) {
647 if(connName ==
"LegacyTopo0") {
648 cable = ( (
uint64_t)topoInput->cableWord1( 1 ) << 32) + topoInput->cableWord1( 0 );
649 }
else if (connName ==
"LegacyTopo1") {
650 cable = ( (
uint64_t)topoInput->cableWord2( 1 ) << 32) + topoInput->cableWord2( 0 );
653 else if (connName.starts_with(
"CTPCAL") && m_doZDC)
656 if (not zdcInput.isValid())
660 cable =
static_cast<uint64_t>(zdcInput->cableWord0());
662 for (
auto &
tl :
conn.triggerLines()){
663 if (
tl.name().find(
"ZDC") == std::string::npos)
667 uint flatIndex =
tl.flatindex();
669 thrMultiMap[
tl.name()] = pass;
675 else if (connName.starts_with(
"NIM2"))
680 if (not trtInput.isValid())
684 cable =
static_cast<uint64_t>(trtInput->cableWord0());
686 for (
auto &
tl :
conn.triggerLines()){
687 if (
tl.name().find(
"TRT") == std::string::npos)
691 uint flatIndex =
tl.flatindex();
693 thrMultiMap[
tl.name()] = pass;
700 if (not zdcInput.isValid())
704 cable =
static_cast<uint64_t>(zdcInput->cableWord1());
706 for (
const auto &
tl :
conn.triggerLines()){
707 if (
tl.name().find(
"ZDC") == std::string::npos)
711 uint flatIndex =
tl.flatindex();
713 thrMultiMap[
tl.name()] = pass;
721 if (m_iKeyTopo.empty() || !m_doL1Topo )
726 if (not topoInput.isValid()) {
729 if(connName ==
"Topo1El") {
730 cable = ( (
uint64_t)topoInput->cableWord0( 1 ) << 32) + topoInput->cableWord0( 0 );
731 }
else if(connName ==
"Topo2El") {
732 cable = ( (
uint64_t)topoInput->cableWord1( 1 ) << 32) + topoInput->cableWord1( 0 );
733 }
else if (connName ==
"Topo3El") {
734 cable = ( (
uint64_t)topoInput->cableWord2( 1 ) << 32) + topoInput->cableWord2( 0 );
735 }
else if(connName ==
"Topo1Opt0") {
736 ATH_MSG_DEBUG(
"BIT word Topo1Opt0: " << topoInput->optcableWord( connName ));
738 cable128 = topoInput->optcableWord( connName );
739 }
else if(connName ==
"Topo1Opt1") {
740 ATH_MSG_DEBUG(
"BIT word Topo1Opt1: " << topoInput->optcableWord( connName ));
742 cable128 = topoInput->optcableWord( connName );
743 }
else if(connName ==
"Topo1Opt2") {
744 ATH_MSG_DEBUG(
"BIT word Topo1Opt2: " << topoInput->optcableWord( connName ));
746 cable128 = topoInput->optcableWord( connName );
747 }
else if(connName ==
"Topo1Opt3") {
748 ATH_MSG_DEBUG(
"BIT word Topo1Opt3: " << topoInput->optcableWord( connName ));
750 cable128 = topoInput->optcableWord( connName );
754 for(
uint fpga : {0,1}) {
755 for(
uint clock : {0,1}) {
756 for(
auto &
tl :
conn.triggerLines(fpga,clock)) {
757 uint flatIndex =
tl.flatindex();
760 pass = ((cable128 >> flatIndex).
test(0)) == 0 ? 0 : 1;
763 pass = (cable & (
static_cast<uint64_t>(0x1) << flatIndex)) == 0 ? 0 : 1;
765 if(
size_t pos =
tl.name().find(
'[');
pos == std::string::npos) {
766 thrMultiMap[
tl.name()] = pass;
769 auto thrName =
tl.name().substr(0,
pos);
770 int bit = std::stoi(
tl.name().substr(
pos+1));
771 thrMultiMap.try_emplace(thrName, 0);
772 thrMultiMap[thrName] += (pass << bit);
773 ATH_MSG_DEBUG(thrName <<
" MULT updated mult for topo " << pass);
779 for (
auto &
thr :
l1menu->thresholds() ) {
780 if (
thr->type() ==
"TOPO" or
thr->type() ==
"MULTTOPO" or
thr->type() ==
"MUTOPO")
784 if(
thr->type() ==
"ZDC" && m_doZDC ){
787 if(
thr->name() ==
"NIMTRT" && m_doTRT ){
791 unsigned int multiplicity = calculateMultiplicity(*
thr,
l1menu, context);
793 thrMultiMap[
thr->name()] = multiplicity;
794 ATH_MSG_DEBUG(
thr->name() <<
" MULT calculated mult for topo " << multiplicity);
798 auto bcid = context.eventID().bunch_crossing_id();
799 if( m_forceBunchGroupPattern ) {
801 for (
size_t bg = 0;
bg < 16; ++
bg ) {
802 std::string bgName(
"BGRP");
804 thrMultiMap[bgName] = ( m_bunchGroupPattern & (0x1<<
bg) ) ? 1 : 0;
821 ATH_MSG_ERROR(
"Did not find L1BunchGroupSet in DetectorStore");
826 thrMultiMap[
"RNDM0"] = 1;
827 thrMultiMap[
"RNDM1"] = 1;
828 thrMultiMap[
"RNDM2"] = 1;
829 thrMultiMap[
"RNDM3"] = 1;
831 return StatusCode::SUCCESS;
837 unsigned int multiplicity = 0;
838 if( confThr.
type() ==
"JET" ) {
839 if(m_doL1CaloLegacy) {
841 if ( ctpinJet.isValid() ) {
842 if(
l1menu->connector(
"JET1").hasLine(confThr.
name()) ) {
843 auto & triggerline =
l1menu->connector(
"JET1").triggerLine(confThr.
name());
844 multiplicity =
CTPUtil::getMult( ctpinJet->cableWord0(), triggerline.startbit(), triggerline.endbit() );
845 }
else if(
l1menu->connector(
"JET2").hasLine(confThr.
name()) ) {
846 auto & triggerline =
l1menu->connector(
"JET2").triggerLine(confThr.
name());
847 multiplicity =
CTPUtil::getMult( ctpinJet->cableWord1(), triggerline.startbit(), triggerline.endbit() );
852 get2DHist(
"/multi/jet/" + confThr.
type() +
"Mult" )->Fill(confThr.
mapping(), multiplicity);
853 ATH_MSG_DEBUG(
"JET MULT calculated mult for threshold " << confThr.
name() <<
" : " << multiplicity);
860 unsigned int multiplicity (0);
861 if ( confThr.
name()[0]==
'e' ) {
863 if(!m_iKeyEFexCluster.empty()) {
864 float scale =
l1menu->getObject(
"thresholds.legacyCalo.EM.emscale").getValue<
float>();
866 for (
const auto cl : *eFexCluster ) {
867 float eta =
cl->eta();
868 int ieta =
int((
eta + (
eta>0 ? 0.005 : -0.005))/0.1);
869 unsigned int thrV = confThr.
thrValue( ieta );
870 bool clusterPasses = ( ((
unsigned int)
cl->et()) > (thrV *
scale) );
871 multiplicity += clusterPasses ? 1 : 0;
876 if(m_doL1CaloLegacy) {
878 if ( ctpinEM.isValid() ) {
879 if(
l1menu->connector(
"EM1").hasLine(confThr.
name()) ) {
880 auto & triggerline =
l1menu->connector(
"EM1").triggerLine(confThr.
name());
881 multiplicity =
CTPUtil::getMult( ctpinEM->cableWord0(), triggerline.startbit(), triggerline.endbit() );
882 }
else if(
l1menu->connector(
"EM2").hasLine(confThr.
name()) ) {
883 auto & triggerline =
l1menu->connector(
"EM2").triggerLine(confThr.
name());
884 multiplicity =
CTPUtil::getMult( ctpinEM->cableWord1(), triggerline.startbit(), triggerline.endbit() );
889 get2DHist(
"/multi/em/" + confThr.
type() +
"Mult" )->Fill(confThr.
mapping(), multiplicity);
890 ATH_MSG_DEBUG(
"EM MULT calculated mult for threshold " << confThr.
name() <<
" : " << multiplicity);
897 unsigned int multiplicity = 0;
898 if ( confThr.
name()[0]==
'e' ) {
903 if( eFexTaus.isValid() ) {
904 for (
const auto tau : *eFexTaus ) {
905 unsigned int eT = (
unsigned int) (accR3ClET(*tau)/1000.);
907 unsigned int etCut = confThr.
data().get_child(
"et").get_value<
unsigned int>();
908 bool tauPasses = (
eT >= etCut );
909 multiplicity += tauPasses ? 1 : 0;
914 if(m_doL1CaloLegacy) {
916 if ( ctpinEM.isValid() ) {
917 if(
l1menu->connector(
"TAU1").hasLine(confThr.
name()) ) {
918 auto & triggerline =
l1menu->connector(
"TAU1").triggerLine(confThr.
name());
919 multiplicity =
CTPUtil::getMult( ctpinEM->cableWord2(), triggerline.startbit(), triggerline.endbit() );
920 }
else if(
l1menu->connector(
"TAU2").hasLine(confThr.
name()) ) {
921 auto & triggerline =
l1menu->connector(
"TAU2").triggerLine(confThr.
name());
922 multiplicity =
CTPUtil::getMult( ctpinEM->cableWord3(), triggerline.startbit(), triggerline.endbit() );
927 get2DHist(
"/multi/tau/" + confThr.
type() +
"Mult" )->Fill(confThr.
mapping(), multiplicity);
928 ATH_MSG_DEBUG(
"TAU MULT calculated mult for threshold " << confThr.
name() <<
" : " << multiplicity);
935 unsigned int multiplicity = 0;
936 if ( confThr.
type() ==
"XE" or confThr.
type() ==
"TE" or confThr.
type() ==
"XS" ) {
938 if(m_doL1CaloLegacy) {
940 if ( ctpinEnergy.isValid() ) {
941 if(
l1menu->connector(
"EN1").hasLine(confThr.
name()) ) {
942 auto & triggerline =
l1menu->connector(
"EN1").triggerLine(confThr.
name());
943 multiplicity =
CTPUtil::getMult( ctpinEnergy->cableWord0(), triggerline.startbit(), triggerline.endbit() );
944 }
else if(
l1menu->connector(
"EN2").hasLine(confThr.
name()) ) {
945 auto & triggerline =
l1menu->connector(
"EN2").triggerLine(confThr.
name());
946 multiplicity =
CTPUtil::getMult( ctpinEnergy->cableWord1(), triggerline.startbit(), triggerline.endbit() );
953 if ( confThr.
name().find(
"gXENC")==0 ) {
954 rhk = & m_iKeyGFexMETNC;
956 }
else if ( confThr.
name().find(
"gXERHO")==0 ) {
957 rhk = & m_iKeyGFexMETRho;
959 }
else if ( confThr.
name().find(
"gXEJWOJ")==0 ) {
960 rhk = & m_iKeyGFexMETJwoJ;
963 rhk = & m_iKeyGFexMETJwoJ;
968 multiplicity = (
met->energyT()/1000. < confThr.
getAttribute<
unsigned int>(
"xe") ) ? 0 : 1;
971 if(confThr.
type() ==
"TE") {
972 get2DHist(
"/multi/te/" + confThr.
type() +
"Mult" )->Fill(confThr.
mapping(), multiplicity);
973 ATH_MSG_DEBUG(
"TE MULT calculated mult for threshold " << confThr.
name() <<
" : " << multiplicity);
974 }
else if(confThr.
type() ==
"XS") {
975 get2DHist(
"/multi/xs/" + confThr.
type() +
"Mult" )->Fill(confThr.
mapping(), multiplicity);
976 ATH_MSG_DEBUG(
"XS MULT calculated mult for threshold " << confThr.
name() <<
" : " << multiplicity);
978 get2DHist(
"/multi/xe/" + confThr.
type() +
"Mult" )->Fill(confThr.
mapping(), multiplicity);
979 ATH_MSG_DEBUG(
"XE MULT calculated mult for threshold " << confThr.
name() <<
" : " << multiplicity);
987 if(m_iKeyMuctpi.empty()) {
990 unsigned int multiplicity = 0;
992 if ( ctpinMuon.isValid() ) {
993 auto & triggerline =
l1menu->connector(
"MuCTPiOpt0").triggerLine(confThr.
name());
994 multiplicity =
CTPUtil::getMuonMult( ctpinMuon->muCTPIWord(), triggerline.startbit() + (m_muonRun2Format ? 1 : 0), triggerline.endbit()+ (m_muonRun2Format ? 1 : 0) );
996 get2DHist(
"/multi/muon/" + confThr.
type() +
"Mult" )->Fill(confThr.
mapping(), multiplicity);
997 ATH_MSG_DEBUG(
"MU MULT calculated mult for threshold " << confThr.
name() <<
" : " << multiplicity);
1004 if(m_iKeyTopo.empty() || !m_doL1Topo ) {
1007 unsigned int multiplicity = 0;
1009 std::string connector =
"";
1010 if (topoInput.isValid()) {
1011 connector =
l1menu->connectorNameFromThreshold(confThr.
name());
1012 auto & triggerline =
l1menu->connector(connector).triggerLine(confThr.
name());
1013 std::bitset<128> bits = topoInput->optcableWord(connector);
1016 std::string subfolder =
"";
1017 if (confThr.
type().find(
"XE") != std::string::npos) {
1019 }
else if (confThr.
type().find(
"TE") != std::string::npos) {
1021 }
else if (confThr.
type().find(
"TAU") != std::string::npos) {
1023 }
else if (confThr.
type().find(
"EM") != std::string::npos) {
1025 }
else if (confThr.
type().find(
"jJ") != std::string::npos) {
1027 }
else if (confThr.
type().find(
"jLJ") != std::string::npos) {
1029 }
else if (confThr.
type().find(
"gJ") != std::string::npos) {
1031 }
else if (confThr.
type().find(
"gLJ") != std::string::npos) {
1034 get2DHist(
"/multi/" + subfolder +
"/" + confThr.
type() +
"Mult" )->Fill(confThr.
mapping(), multiplicity);
1035 ATH_MSG_DEBUG(
"TOPO OPT input MULT calculated mult for threshold " << confThr.
name() <<
" : " << multiplicity <<
" received via connector: " << connector);
1037 return multiplicity;
1043 unsigned int multiplicity = 0;
1045 if (m_iKeyLegacyTopo.empty() || !m_doL1TopoLegacy )
1051 if(topoInput.isValid()) {
1053 std::string
conn(
"");
1054 if(
l1menu->connector(
"LegacyTopo0").hasLine(confThr.
name()) ) {
1055 conn =
"LegacyTopo0";
1056 cable = ( (
uint64_t)topoInput->cableWord1( 1 ) << 32) + topoInput->cableWord1( 0 );
1057 }
else if(
l1menu->connector(
"LegacyTopo1").hasLine(confThr.
name()) ) {
1058 conn =
"LegacyTopo1";
1059 cable = ( (
uint64_t)topoInput->cableWord2( 1 ) << 32) + topoInput->cableWord2( 0 );
1062 auto & triggerline =
l1menu->connector(
conn).triggerLine(confThr.
name());
1064 <<
", cable start " << triggerline.startbit() <<
" and end " << triggerline.endbit()
1065 <<
" double word 0x" << std::setw(16) << std::setfill(
'0') << std::hex << cable << std::dec << std::setfill(
' ') );
1066 multiplicity =
CTPUtil::getMultTopo( cable, triggerline.startbit(), triggerline.endbit(), triggerline.clock() );
1071 if (m_iKeyTopo.empty() || !m_doL1Topo )
1077 if(topoInput.isValid()) {
1079 std::string
conn(
"");
1080 if(
l1menu->connector(
"Topo2El").hasLine(confThr.
name()) ) {
1082 cable = ( (
uint64_t)topoInput->cableWord1( 1 ) << 32) + topoInput->cableWord1( 0 );
1083 }
else if(
l1menu->connector(
"Topo3El").hasLine(confThr.
name()) ) {
1085 cable = ( (
uint64_t)topoInput->cableWord2( 1 ) << 32) + topoInput->cableWord2( 0 );
1088 auto & triggerline =
l1menu->connector(
conn).triggerLine(confThr.
name());
1090 <<
", cable start " << triggerline.startbit() <<
" and end " << triggerline.endbit()
1091 <<
" double word 0x" << std::setw(16) << std::setfill(
'0') << std::hex << cable << std::dec << std::setfill(
' ') );
1092 multiplicity =
CTPUtil::getMultTopo( cable, triggerline.startbit(), triggerline.endbit(), triggerline.clock() );
1096 return multiplicity;
1102 unsigned int multiplicity = 0;
1104 if ( confThr.
type() ==
"EM" ) {
1105 multiplicity = calculateEMMultiplicity( confThr,
l1menu, context );
1106 }
else if ( confThr.
type() ==
"TAU" ) {
1107 multiplicity = calculateTauMultiplicity( confThr,
l1menu, context );
1108 }
else if ( confThr.
type() ==
"XE" || confThr.
type() ==
"TE" || confThr.
type() ==
"XS" ) {
1109 multiplicity = calculateMETMultiplicity( confThr,
l1menu, context );
1110 }
else if ( confThr.
type() ==
"JET" ) {
1111 multiplicity = calculateJetMultiplicity( confThr,
l1menu, context );
1112 }
else if ( confThr.
type() ==
"MU" ) {
1113 multiplicity = calculateMuonMultiplicity( confThr,
l1menu, context );
1114 }
else if ( confThr.
type() ==
"R2TOPO") {
1115 multiplicity = calculateTopoMultiplicity( confThr,
l1menu, context,
true );
1116 }
else if ( confThr.
type() ==
"TOPO" ) {
1117 multiplicity = calculateTopoMultiplicity( confThr,
l1menu, context, m_doL1TopoLegacy);
1118 }
else if ( confThr.
type()[0] ==
'e' || confThr.
type()[0] ==
'c' || confThr.
type()[0] ==
'j' || confThr.
type()[0] ==
'g' ){
1119 multiplicity = calculateTopoOptMultiplicity( confThr,
l1menu, context );
1123 ATH_MSG_FATAL(
"Caught exception when calculating multiplicity for threshold " << confThr.
name() <<
": " << ex.what());
1127 return multiplicity;
1132 const EventContext& context)
const
1135 std::vector<uint32_t> tip;
1136 CHECK( m_resultBuilder->constructTIPVector( thrMultiMap, tip ) );
1138 std::map<std::string, unsigned int> itemDecisionMap;
1139 CLHEP::HepRandomEngine* rndmEngine = m_RNGEngines.getEngine( context );
1140 CHECK( m_resultBuilder->buildItemDecision(thrMultiMap, itemDecisionMap, rndmEngine) );
1142 std::vector<uint32_t> tbp;
1143 std::vector<uint32_t>
tap;
1144 std::vector<uint32_t> tav;
1146 CHECK( m_resultBuilder->constructResultVectors( itemDecisionMap, tbp,
tap, tav,
triggerType ) );
1152 auto eventID = context.eventID();
1156 std::pair< std::unique_ptr<xAOD::CTPResult>, std::unique_ptr<xAOD::CTPResultAuxInfo> > ctpResultAuxPair = m_resultBuilder->constructCTPResult( eventID, tbp,
tap, tav, tip,
extra,
triggerType);
1157 std::unique_ptr<xAOD::CTPResult> ctpResult = std::move(ctpResultAuxPair.first);
1158 std::unique_ptr<xAOD::CTPResultAuxInfo> ctpResultAux = std::move(ctpResultAuxPair.second);
1159 auto ctpResultWriteHandle =
SG::makeHandle( m_oKeyCTPResult, context );
1160 ATH_CHECK( ctpResultWriteHandle.record( std::move(ctpResult), std::move(ctpResultAux) ));
1163 std::unique_ptr<CTP_RDO> rdo = m_resultBuilder->constructRDOResult( eventID, tbp,
tap, tav, tip,
extra );
1165 ATH_CHECK( rdoWriteHandle.record( std::move(rdo) ));
1167 std::unique_ptr<CTPSLink> roi = m_resultBuilder->constructRoIResult( eventID, tbp,
tap, tav, tip,
extra,
triggerType );
1169 ATH_CHECK( sLinkWriteHandle.record( std::move(roi) ));
1173 auto tbpById = *get1DHist(
"/output/tbpById" );
1174 auto tapById = *get1DHist(
"/output/tapById" );
1175 auto tavById = *get1DHist(
"/output/tavById" );
1176 for(
unsigned int ctpId= 0; ctpId < 512; ++ctpId ) {
1177 unsigned int wordNr = ctpId / 32;
1178 unsigned int posWithinWord = ctpId % 32;
1179 auto mask = 1
L << posWithinWord;
1180 if( 0 != (tbp[wordNr] &
mask) ) {
1181 tbpById->Fill( ctpId );
1183 if( 0 != (
tap[wordNr] &
mask) ) {
1184 tapById->Fill( ctpId );
1186 if( 0 != (tav[wordNr] &
mask) ) {
1187 tavById->Fill( ctpId );
1191 return StatusCode::SUCCESS;
1201 constexpr
unsigned int sizeOfCTPOutput = 512;
1203 unsigned int tbp[sizeOfCTPOutput];
1204 unsigned int tap[sizeOfCTPOutput];
1205 unsigned int tav[sizeOfCTPOutput];
1207 auto h = *get1DHist(
"/output/tbpById" );
1208 for(
unsigned int id = 0;
id < sizeOfCTPOutput; ++
id ) tbp[
id] =
h->GetBinContent(
id+1);
1211 auto h = *get1DHist(
"/output/tapById" );
1212 for(
unsigned int id = 0;
id < sizeOfCTPOutput; ++
id )
tap[
id] =
h->GetBinContent(
id+1);
1215 auto h = *get1DHist(
"/output/tavById" );
1216 for(
unsigned int id = 0;
id < sizeOfCTPOutput; ++
id ) tav[
id] =
h->GetBinContent(
id+1);
1221 auto htbp = *get1DHist(
"/output/tbpByName" );
1222 auto htap = *get1DHist(
"/output/tapByName" );
1223 auto htav = *get1DHist(
"/output/tavByName" );
1225 unsigned int ctpId =
item.ctpId();
1226 htbp->Fill(
item.name().c_str(), tbp[ctpId]);
1227 htap->Fill(
item.name().c_str(),
tap[ctpId]);
1228 htav->Fill(
item.name().c_str(), tav[ctpId]);
1233 htbp->LabelsDeflate();
1234 htap->LabelsDeflate();
1235 htav->LabelsDeflate();
1242 std::vector<std::string> thrHists{
"em/EM",
"muon/MU",
"tau/TAU",
"jet/JET",
"xe/XE",
"te/TE",
"xs/XS" };
1243 auto hist = * get2DHist(
"/multi/all/LegacyMult" );
1244 for(
const std::string &
histpath : thrHists) {
1245 auto h = * get2DHist(
"/multi/" +
histpath +
"Mult" );
1246 auto xaxis =
h->GetXaxis();
1247 size_t xsize = xaxis->GetNbins();
1248 size_t ysize =
h->GetNbinsY();
1249 for(
size_t x = 1;
x<xsize;
x++) {
1251 for(
size_t y = 1;
y<=ysize;
y++) {
1252 size_t binContent =
h->GetBinContent(
x,
y);
1253 hist->Fill(xaxis->GetBinLabel(
x),
y-1,binContent);
1256 ATH_MSG_DEBUG(
"REGTEST CTPSim " << xaxis->GetBinLabel(
x) <<
" MULT " <<
s);
1260 hist->LabelsDeflate();
1264 auto hist = * get2DHist(
"/multi/all/R3Mult" );
1265 std::vector<std::string> thrHists = {
"em/eEM",
"em/jEM",
"muon/MU",
"tau/eTAU",
"tau/jTAU",
"tau/cTAU",
"jet/jJ",
"jet/jLJ",
"jet/gJ",
"jet/gLJ",
"xe/gXE",
"xe/jXE",
"te/jTE",
"te/gTE" };
1266 for(
const std::string &
histpath : thrHists) {
1267 auto h = * get2DHist(
"/multi/" +
histpath +
"Mult" );
1268 auto xaxis =
h->GetXaxis();
1269 size_t xsize = xaxis->GetNbins();
1270 size_t ysize =
h->GetNbinsY();
1271 for(
size_t x = 1;
x<=xsize;
x++) {
1273 for(
size_t y = 1;
y<=ysize;
y++) {
1274 size_t binContent =
h->GetBinContent(
x,
y);
1275 hist->Fill(xaxis->GetBinLabel(
x) ,
y-1, binContent);
1278 ATH_MSG_DEBUG(
"REGTEST CTPSim " << xaxis->GetBinLabel(
x) <<
" MULT " <<
s);
1282 hist->LabelsDeflate();
1288 " TBP " << tbp[
item.ctpId()] <<
1289 " TAP " <<
tap[
item.ctpId()] <<
1290 " TAV " << tav[
item.ctpId()]);
1293 return StatusCode::SUCCESS;
1302 std::vector<std::string> storedPaths;
1303 for(
auto &
entry : m_hist1D ) {
1304 storedPaths.push_back( getBaseHistPath() +
entry.first);
1306 for(
auto &
entry : m_hist2D ) {
1307 storedPaths.push_back( getBaseHistPath() +
entry.first);
1309 std::scoped_lock<std::mutex> metadataLock(s_metadataMutex);
1310 for (
const auto &
path : storedPaths) {
1311 size_t pos =
path.find_last_of(
'/');
1312 auto splitPath = std::make_pair(
path.substr(0,
pos),
path.substr(
pos + 1));
1313 std::string treePath = splitPath.first +
"/metadata";
1315 char triggerData[] =
"<none>";
1316 const std::string mergeDataStr =
"<default>";
1317 std::vector<char> mergeData{mergeDataStr.begin(), mergeDataStr.end()};
1318 mergeData.push_back(
'\0');
1320 if (!m_histSvc->existsTree(treePath)) {
1321 auto tree = std::make_unique<TTree>(
"metadata",
"Monitoring Metadata");
1322 tree->SetDirectory(
nullptr);
1323 tree->Branch(
"Name", &(splitPath.second[0]),
"Name/C");
1324 tree->Branch(
"Interval", &(
interval[0]),
"Interval/C");
1325 tree->Branch(
"TriggerChain", triggerData,
"TriggerChain/C");
1326 tree->Branch(
"MergeMethod", mergeData.data(),
"MergeMethod/C");
1328 if (!m_histSvc->regTree(treePath, std::move(
tree))) {
1331 <<
"Failed to register DQ metadata TTree " << treePath <<
endmsg;
1334 TTree *
tree{
nullptr};
1335 if (m_histSvc->getTree(treePath,
tree).isSuccess()) {
1336 tree->SetBranchAddress(
"Name", &(splitPath.second[0]));
1338 tree->SetBranchAddress(
"TriggerChain", triggerData);
1339 tree->SetBranchAddress(
"MergeMethod", mergeData.data());
1344 <<
"Failed to retrieve DQ metadata TTree " << treePath <<
" which is reported to exist" <<
endmsg;
1348 return StatusCode::SUCCESS;