23 #include "CLHEP/Random/RandomEngine.h"
24 #include "CLHEP/Random/Ranlux64Engine.h"
39 const std::function< CLHEP::HepRandomEngine*(void) >
CTPSimRanluxFactory = [](
void)->CLHEP::HepRandomEngine*{
40 return new CLHEP::Ranlux64Engine();
47 m_decoder(
new LVL1::CPRoIDecoder() ),
48 m_jetDecoder(
new LVL1::JEPRoIDecoder() )
58 if(m_forceBunchGroupPattern) {
59 ATH_MSG_INFO(
"Will use bunchgroup pattern 0x" << std::hex << m_bunchGroupPattern);
61 ATH_MSG_INFO(
"Will use bunchgroup definition from bunchgroup set");
65 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 ) );
71 ATH_CHECK( m_iKeyTopo.initialize( !m_iKeyTopo.empty() && m_doL1Topo ) );
72 ATH_CHECK( m_iKeyMuctpi.initialize( ! m_iKeyMuctpi.empty() ) );
75 ATH_CHECK( m_iKeyLegacyTopo.initialize( !m_iKeyLegacyTopo.empty() && m_doL1CaloLegacy && m_doL1TopoLegacy ) );
76 ATH_CHECK( m_iKeyCtpinEM.initialize( m_doL1CaloLegacy ) );
77 ATH_CHECK( m_iKeyCtpinJet.initialize( m_doL1CaloLegacy ) );
78 ATH_CHECK( m_iKeyCtpinXE.initialize( m_doL1CaloLegacy ) );
81 ATH_CHECK( m_iKeyJFexJets.initialize( ! m_iKeyJFexJets.empty() ) );
82 ATH_CHECK( m_iKeyJFexLJets.initialize( ! m_iKeyJFexLJets.empty() ) );
83 ATH_CHECK( m_iKeyGFexJets.initialize( ! m_iKeyGFexJets.empty() ) );
84 ATH_CHECK( m_iKeyGFexMETNC.initialize( ! m_iKeyGFexMETNC.empty() ) );
85 ATH_CHECK( m_iKeyGFexMETRho.initialize( ! m_iKeyGFexMETRho.empty() ) );
86 ATH_CHECK( m_iKeyGFexMETJwoJ.initialize( ! m_iKeyGFexMETJwoJ.empty() ) );
87 ATH_CHECK( m_iKeyEFexCluster.initialize( ! m_iKeyEFexCluster.empty() ) );
88 ATH_CHECK( m_iKeyEFexTau.initialize( ! m_iKeyEFexTau.empty() ) );
89 ATH_CHECK( m_oKeyRDO.initialize( ! m_oKeyRDO.empty() ) );
90 ATH_CHECK( m_oKeySLink.initialize( ! m_oKeySLink.empty() ) );
93 ATH_CHECK( m_iKeyZDC.initialize( ! m_iKeyZDC.empty() && m_doZDC ) );
96 ATH_CHECK( m_iKeyTRT.initialize( ! m_iKeyTRT.empty() && m_doTRT ) );
104 ATH_MSG_DEBUG(
"Registering histograms under " << getBaseHistPath() <<
" in " << m_histSvc);
106 return StatusCode::SUCCESS;
115 bookHists().ignore();
119 setHistLabels(*l1menu).ignore();
121 return StatusCode::SUCCESS;
129 fillInputHistograms(context).ignore();
131 std::map<std::string, unsigned int> thrMultiMap;
133 extractMultiplicities(thrMultiMap, context).ignore();
135 simulateItems(thrMultiMap, context).ignore();
137 return StatusCode::SUCCESS;
144 std::map<std::string,std::vector<std::string>> typeMapping = {
146 {
"jet", {
"JET",
"jJ",
"jLJ",
"gJ",
"gLJ"} },
147 {
"xe", {
"XE",
"gXE",
"jXE"} },
148 {
"te", {
"TE",
"jTE",
"gTE"} },
150 {
"em", {
"EM",
"eEM",
"jEM"} },
151 {
"tau", {
"TAU",
"eTAU",
"jTAU",
"cTAU"} }
153 std::vector<TrigConf::L1Threshold> thrV;
154 for(
const std::string &
t : typeMapping[
type] ) {
156 TH2*
hist =
new TH2I( Form(
"%sMult",
t.c_str()),
157 Form(
"%s threshold multiplicity",
t.c_str()), xsize, 0, xsize, maxMult, 0, maxMult);
158 sc = hbook(
"/multi/" +
type, std::unique_ptr<TH2>(
hist));
167 std::map<std::string,std::vector<std::string>> typeMapping = {
169 {
"jet", {
"JET",
"jJ",
"jLJ",
"gJ",
"gLJ"} },
170 {
"xe", {
"XE",
"gXE",
"jXE"} },
171 {
"te", {
"TE",
"jTE",
"gTE"} },
173 {
"em", {
"EM",
"eEM",
"jEM"} },
174 {
"tau", {
"TAU",
"eTAU",
"jTAU",
"cTAU"} }
178 std::vector<TrigConf::L1Threshold> thrV;
179 for(
const std::string &
t : typeMapping[
type] ) {
181 auto hist = get2DHist(
"/multi/" +
type +
"/" +
t +
"Mult" );
182 auto & thrV =
l1menu.thresholds(
t);
183 while(
hist->GetNbinsX() < (
int)thrV.size() ) {
184 hist->LabelsInflate(
"xaxis");
186 for(
auto thr : thrV) {
187 hist->GetXaxis()->SetBinLabel(thr->mapping()+1, thr->name().c_str() );
190 ATH_MSG_DEBUG(
"Caught exception when setting new JSON MultiplicityHistLabel " <<
t <<
" : " << ex.what());
198 std::string baseHistPath( m_histPath );
199 if(baseHistPath.back()!=
'/') baseHistPath +=
"/";
200 baseHistPath +=
name();
206 const std::string &
hname(
hist->GetName());
209 if(
key.back()!=
'/')
key +=
"/";
212 if(m_hist1D.find(
key)!=m_hist1D.end()) {
214 return StatusCode::RECOVERABLE;
217 LockedHandle<TH1>
lh;
219 if(
sc.isSuccess() ) {
230 const std::string &
hname(
hist->GetName());
233 if(
key.back()!=
'/')
key +=
"/";
236 if(m_hist2D.find(
key)!=m_hist2D.end()) {
238 return StatusCode::RECOVERABLE;
241 LockedHandle<TH2>
lh;
243 if(
sc.isSuccess() ) {
255 if (itr == m_hist1D.end()) {
256 throw GaudiException(
"1D-hist "+
histName +
" does not exist",
name(), StatusCode::FAILURE);
266 if (itr == m_hist2D.end()) {
267 throw GaudiException(
"2D-hist "+
histName +
" does not exist",
name(), StatusCode::FAILURE);
288 std::vector<std::string> connNames =
l1menu.connectorNames();
289 for(
const std::string connName : {
"LegacyTopo0",
"LegacyTopo1",
"Topo1El",
"Topo2El",
"Topo3El",
"Topo1Opt0",
"Topo1Opt1",
"Topo1Opt2",
"Topo1Opt3"}) {
290 if(
find(connNames.begin(), connNames.end(), connName) == connNames.end() ) {
293 auto hTopo = *get1DHist(
"/input/topo/" + connName);
294 for(
uint fpga : {0,1}) {
295 for(
uint clock : {0,1}) {
296 for(
auto &
tl :
l1menu.connector(connName).triggerLines(fpga,clock)) {
297 uint flatIndex =
tl.flatindex();
298 hTopo->GetXaxis()->SetBinLabel(flatIndex+1,
tl.name().c_str());
304 std::vector<std::string> orderedItemnames;
305 orderedItemnames.reserve(
l1menu.size() );
307 orderedItemnames.emplace_back(
item.name());
309 std::sort(orderedItemnames.begin(), orderedItemnames.end());
312 auto tbpById = *get1DHist(
"/output/tbpById" );
313 auto tapById = *get1DHist(
"/output/tapById" );
314 auto tavById = *get1DHist(
"/output/tavById" );
315 auto tbpByName = *get1DHist(
"/output/tbpByName" );
316 auto tapByName = *get1DHist(
"/output/tapByName" );
317 auto tavByName = *get1DHist(
"/output/tavByName" );
318 unsigned int bin = 1;
319 for (
const std::string & itemname : orderedItemnames ) {
320 unsigned int ctpId(0);
322 ctpId =
item.ctpId();
323 tbpById->GetXaxis()->SetBinLabel( ctpId+1, itemname.c_str() );
324 tapById->GetXaxis()->SetBinLabel( ctpId+1, itemname.c_str() );
325 tavById->GetXaxis()->SetBinLabel( ctpId+1, itemname.c_str() );
326 tbpByName->GetXaxis()->SetBinLabel(
bin, itemname.c_str() );
327 tapByName->GetXaxis()->SetBinLabel(
bin, itemname.c_str() );
328 tavByName->GetXaxis()->SetBinLabel(
bin++, itemname.c_str() );
331 return StatusCode::SUCCESS;
338 ATH_CHECK ( hbook(
"/input/jets/", std::make_unique<TH1I>(
"jJetPt",
"Jet p_{T} - jJ", 40, 0, 80) ));
339 ATH_CHECK ( hbook(
"/input/jets/", std::make_unique<TH1I>(
"jJetEta",
"Jet #eta - jJ", 64, -3.2, 3.2) ));
340 ATH_CHECK ( hbook(
"/input/jets/", std::make_unique<TH1I>(
"jJetPhi",
"Jet #phi - jJ", 64, -3.2, 3.2) ));
341 ATH_CHECK ( hbook(
"/input/jets/", std::make_unique<TH1I>(
"jLJetPt",
"Jet p_{T} - jLJ", 40, 0, 80) ));
342 ATH_CHECK ( hbook(
"/input/jets/", std::make_unique<TH1I>(
"jLJetEta",
"Jet #eta - jLJ", 64, -3.2, 3.2) ));
343 ATH_CHECK ( hbook(
"/input/jets/", std::make_unique<TH1I>(
"jLJetPhi",
"Jet #phi - jLJ", 64, -3.2, 3.2) ));
344 ATH_CHECK ( hbook(
"/input/jets/", std::make_unique<TH1I>(
"gJetPt",
"Jet p_{T} - gJ", 40, 0, 80) ));
345 ATH_CHECK ( hbook(
"/input/jets/", std::make_unique<TH1I>(
"gJetEta",
"Jet #eta - gJ", 64, -3.2, 3.2) ));
346 ATH_CHECK ( hbook(
"/input/jets/", std::make_unique<TH1I>(
"gJetPhi",
"Jet #phi - gJ", 64, -3.2, 3.2) ));
347 ATH_CHECK ( hbook(
"/input/jets/", std::make_unique<TH1I>(
"gLJetPt",
"Jet p_{T} - gLJ", 40, 0, 80) ));
348 ATH_CHECK ( hbook(
"/input/jets/", std::make_unique<TH1I>(
"gLJetEta",
"Jet #eta - gLJ", 64, -3.2, 3.2) ));
349 ATH_CHECK ( hbook(
"/input/jets/", std::make_unique<TH1I>(
"gLJetPhi",
"Jet #phi - gLJ", 64, -3.2, 3.2) ));
352 ATH_CHECK ( hbook(
"/input/met/", std::make_unique<TH1I>(
"Pufit",
"Missing ET from algorithm pufit", 40, 0, 80) ));
353 ATH_CHECK ( hbook(
"/input/met/", std::make_unique<TH1I>(
"PufitPhi",
"Missing ET PUfit phi", 64, -3.2, 3.2) ));
354 ATH_CHECK ( hbook(
"/input/met/", std::make_unique<TH1I>(
"Rho",
"Missing ET from algorithm rhosub", 40, 0, 80) ));
355 ATH_CHECK ( hbook(
"/input/met/", std::make_unique<TH1I>(
"RhoPhi",
"Missing ET rhosub phi", 64, -3.2, 3.2) ));
356 ATH_CHECK ( hbook(
"/input/met/", std::make_unique<TH1I>(
"JwoJ",
"Missing ET from algorithm jet without jets", 40, 0, 80) ));
357 ATH_CHECK ( hbook(
"/input/met/", std::make_unique<TH1I>(
"JwoJPhi",
"Missing ET jet without jet phi", 64, -3.2, 3.2) ));
360 ATH_CHECK ( hbook(
"/input/em/", std::make_unique<TH1I>(
"et",
"Cluster et", 40, 0, 40) ));
361 ATH_CHECK ( hbook(
"/input/em/", std::make_unique<TH1I>(
"eta",
"Cluster eta ", 64, -3.2, 3.2) ));
362 ATH_CHECK ( hbook(
"/input/em/", std::make_unique<TH1I>(
"phi",
"Cluster phi", 64, -3.2, 3.2) ));
365 ATH_CHECK ( hbook(
"/input/tau/", std::make_unique<TH1I>(
"et",
"Tau et", 40, 0, 40) ));
366 ATH_CHECK ( hbook(
"/input/tau/", std::make_unique<TH1I>(
"eta",
"Tau eta ", 64, -3.2, 3.2) ));
367 ATH_CHECK ( hbook(
"/input/tau/", std::make_unique<TH1I>(
"phi",
"Tau phi", 64, -3.2, 3.2) ));
368 ATH_CHECK ( hbook(
"/input/tau/", std::make_unique<TH1I>(
"emIso",
"Tau em isolation", 40, 0, 1) ));
369 ATH_CHECK ( hbook(
"/input/tau/", std::make_unique<TH1I>(
"hadIso",
"Tau hadronic isolation", 40, 0, 1) ));
370 ATH_CHECK ( hbook(
"/input/tau/", std::make_unique<TH1I>(
"R3ET",
"Tau eT", 40, 0, 40) ));
371 ATH_CHECK ( hbook(
"/input/tau/", std::make_unique<TH1I>(
"R3Iso",
"Tau isolation", 40, 0, 1) ));
374 ATH_CHECK ( hbook(
"/input/counts/", std::make_unique<TH1I>(
"jJets",
"Number of jets (jJ)", 40, 0, 40) ));
375 ATH_CHECK ( hbook(
"/input/counts/", std::make_unique<TH1I>(
"jLJets",
"Number of jets (jLJ)", 40, 0, 40) ));
376 ATH_CHECK ( hbook(
"/input/counts/", std::make_unique<TH1I>(
"gJets",
"Number of jets (gJ)", 40, 0, 40) ));
377 ATH_CHECK ( hbook(
"/input/counts/", std::make_unique<TH1I>(
"gLJets",
"Number of jets (gLJ)", 40, 0, 40) ));
378 ATH_CHECK ( hbook(
"/input/counts/", std::make_unique<TH1I>(
"muons",
"Number of muons", 10, 0, 10) ));
379 ATH_CHECK ( hbook(
"/input/counts/", std::make_unique<TH1I>(
"emcluster",
"Number of EM clusters", 20, 0, 20) ));
380 ATH_CHECK ( hbook(
"/input/counts/", std::make_unique<TH1I>(
"taus",
"Number of TAU candidates", 20, 0, 20) ));
383 ATH_CHECK ( createMultiplicityHist(
"muon" ) );
384 ATH_CHECK ( createMultiplicityHist(
"jet" ) );
385 ATH_CHECK ( createMultiplicityHist(
"xe", 2) );
386 ATH_CHECK ( createMultiplicityHist(
"te", 2) );
387 ATH_CHECK ( createMultiplicityHist(
"xs", 2) );
388 ATH_CHECK ( createMultiplicityHist(
"em" ) );
389 ATH_CHECK ( createMultiplicityHist(
"tau" ) );
391 ATH_CHECK ( hbook(
"/multi/all", (std::unique_ptr<TH2>)std::make_unique<TH2I>(
"LegacyMult",
"Legacy thresholds multiplicity", 1, 0, 1, 10, 0, 10) ));
392 ATH_CHECK ( hbook(
"/multi/all", (std::unique_ptr<TH2>)std::make_unique<TH2I>(
"R3Mult",
"New thresholds multiplicity", 1, 0, 1, 10, 0, 10) ));
395 ATH_CHECK( hbook(
"/input/topo/", std::make_unique<TH1I>(
"LegacyTopo0",
"L1Topo Decision (Legacy 0)", 64, 0, 64) ));
396 ATH_CHECK( hbook(
"/input/topo/", std::make_unique<TH1I>(
"LegacyTopo1",
"L1Topo Decision (Legacy 1)", 64, 0, 64) ));
397 ATH_CHECK( hbook(
"/input/topo/", std::make_unique<TH1I>(
"Topo1El",
"L1Topo Decision (Topo 1 electrical)", 64, 0, 64) ));
398 ATH_CHECK( hbook(
"/input/topo/", std::make_unique<TH1I>(
"Topo2El",
"L1Topo Decision (Topo 2 electrical)", 64, 0, 64) ));
399 ATH_CHECK( hbook(
"/input/topo/", std::make_unique<TH1I>(
"Topo3El",
"L1Topo Decision (Topo 3 electrical)", 64, 0, 64) ));
400 ATH_CHECK( hbook(
"/input/topo/", std::make_unique<TH1I>(
"Topo1Opt0",
"L1Topo Decision (Topo 1 optical 0)", 128, 0, 128) ));
401 ATH_CHECK( hbook(
"/input/topo/", std::make_unique<TH1I>(
"Topo1Opt1",
"L1Topo Decision (Topo 1 optical 1)", 128, 0, 128) ));
402 ATH_CHECK( hbook(
"/input/topo/", std::make_unique<TH1I>(
"Topo1Opt2",
"L1Topo Decision (Topo 1 optical 2)", 128, 0, 128) ));
403 ATH_CHECK( hbook(
"/input/topo/", std::make_unique<TH1I>(
"Topo1Opt3",
"L1Topo Decision (Topo 1 optical 3)", 128, 0, 128) ));
406 ATH_CHECK ( hbook(
"/output/", std::make_unique<TH1I>(
"tbpById",
"Items decision (tbp)", 512, 0, 512) ));
407 ATH_CHECK ( hbook(
"/output/", std::make_unique<TH1I>(
"tapById",
"Items decision (tap)", 512, 0, 512) ));
408 ATH_CHECK ( hbook(
"/output/", std::make_unique<TH1I>(
"tavById",
"Items decision (tav)", 512, 0, 512) ));
409 ATH_CHECK ( hbook(
"/output/", std::make_unique<TH1I>(
"tbpByName",
"Items decision (tbp)", 512, 0, 512) ));
410 ATH_CHECK ( hbook(
"/output/", std::make_unique<TH1I>(
"tapByName",
"Items decision (tap)", 512, 0, 512) ));
411 ATH_CHECK ( hbook(
"/output/", std::make_unique<TH1I>(
"tavByName",
"Items decision (tav)", 512, 0, 512) ));
413 ATH_CHECK ( hbook(
"/", std::make_unique<TH1I>(
"bcid",
"Bunch crossing ID", 3564, 0, 3564)) );
417 return StatusCode::SUCCESS;
426 if( not m_iKeyJFexJets.empty() ) {
428 if(jFexJets.isValid()) {
429 get1DHist(
"/input/counts/jJets")->Fill(jFexJets->size());
430 auto h0 = *get1DHist(
"/input/jets/jJetPt");
431 auto h1 = *get1DHist(
"/input/jets/jJetEta");
432 auto h2 = *get1DHist(
"/input/jets/jJetPhi");
433 for(
const auto jet : *jFexJets ) {
434 h0->Fill(fabs(
jet->et8x8()/1000.));
435 h1->Fill(
jet->eta());
436 h2->Fill(
jet->phi());
444 if( not m_iKeyJFexLJets.empty() ) {
446 if(jFexLJets.isValid()) {
447 get1DHist(
"/input/counts/jLets")->Fill(jFexLJets->size());
448 auto h0 = *get1DHist(
"/input/jets/jLJetPt");
449 auto h1 = *get1DHist(
"/input/jets/jLJetEta");
450 auto h2 = *get1DHist(
"/input/jets/jLJetPhi");
451 for(
const auto jet : *jFexLJets ) {
452 h0->Fill(fabs(
jet->et8x8()/1000.));
453 h1->Fill(
jet->eta());
454 h2->Fill(
jet->phi());
464 if( not m_iKeyGFexJets.empty() ) {
466 if(gFexJets.isValid()) {
467 get1DHist(
"/input/counts/gJets")->Fill(gFexJets->size());
468 auto h0 = *get1DHist(
"/input/jets/gJetPt");
469 auto h1 = *get1DHist(
"/input/jets/gJetEta");
470 auto h2 = *get1DHist(
"/input/jets/gJetPhi");
471 for(
const auto jet : *gFexJets ) {
472 h0->Fill(fabs(
jet->et8x8()/1000.));
473 h1->Fill(
jet->eta());
474 h2->Fill(
jet->phi());
482 if( not m_iKeyGFexMETNC.empty() ) {
484 if( gFexMETPufit.isValid() ) {
485 get1DHist(
"/input/met/Pufit")->Fill(gFexMETPufit->energyT()/1000.);
486 get1DHist(
"/input/met/PufitPhi")->Fill(atan2(gFexMETPufit->energyX(), gFexMETPufit->energyY()));
492 if( not m_iKeyGFexMETRho.empty() ) {
494 if( gFexMETRho.isValid() ) {
495 get1DHist(
"/input/met/Rho")->Fill(gFexMETRho->energyT()/1000.);
496 get1DHist(
"/input/met/RhoPhi")->Fill(atan2(gFexMETRho->energyX(), gFexMETRho->energyY()));
502 if( not m_iKeyGFexMETJwoJ.empty() ) {
504 if( gFexMETJwoJ.isValid() ) {
505 get1DHist(
"/input/met/JwoJ")->Fill(gFexMETJwoJ->energyT()/1000.);
506 get1DHist(
"/input/met/JwoJPhi")->Fill(atan2(gFexMETJwoJ->energyX(), gFexMETJwoJ->energyY()));
513 if( not m_iKeyEFexCluster.empty() ) {
515 if( eFexCluster.isValid() ) {
516 get1DHist(
"/input/counts/emcluster")->Fill(eFexCluster->size());
517 auto h0 = *get1DHist(
"/input/em/et");
518 auto h1 = *get1DHist(
"/input/em/eta");
519 auto h2 = *get1DHist(
"/input/em/phi");
520 for(
const auto cl : *eFexCluster ) {
531 if( not m_iKeyEFexTau.empty() ) {
533 if( eFexTau.isValid() ) {
534 get1DHist(
"/input/counts/taus")->Fill(eFexTau->size());
535 auto h0 = *get1DHist(
"/input/tau/et");
536 auto h1 = *get1DHist(
"/input/tau/eta");
537 auto h2 = *get1DHist(
"/input/tau/phi");
538 auto h3 = *get1DHist(
"/input/tau/emIso");
539 auto h4 = *get1DHist(
"/input/tau/hadIso");
540 auto h5 = *get1DHist(
"/input/tau/R3ClusterET");
541 auto h6 = *get1DHist(
"/input/tau/R3ClusterIso");
544 for(
const auto tau : *eFexTau ) {
546 h1->Fill(tau->eta());
547 h2->Fill(tau->phi());
548 h3->Fill(tau->emIsol());
549 h4->Fill(tau->hadIsol());
550 h5->Fill(accR3ClET(*tau)/1000.);
551 h6->Fill(accR3ClIso(*tau));
559 if( not m_iKeyLegacyTopo.empty() && m_doL1CaloLegacy && m_doL1TopoLegacy ) {
560 auto legacyTopoInput =
SG::makeHandle( m_iKeyLegacyTopo, context );
561 if(legacyTopoInput.isValid()) {
562 ATH_MSG_DEBUG(
"Retrieved input from L1Topo from StoreGate with key " << m_iKeyTopo);
563 ATH_MSG_DEBUG(
"L1TopoLegacy0 word 0 is: 0x" << std::hex << std::setw( 8 ) << std::setfill(
'0' ) << legacyTopoInput->cableWord1(0));
564 ATH_MSG_DEBUG(
"L1TopoLegacy0 word 1 is: 0x" << std::hex << std::setw( 8 ) << std::setfill(
'0' ) << legacyTopoInput->cableWord1(1));
565 ATH_MSG_DEBUG(
"L1TopoLegacy1 word 0 is: 0x" << std::hex << std::setw( 8 ) << std::setfill(
'0' ) << legacyTopoInput->cableWord2(0));
566 ATH_MSG_DEBUG(
"L1TopoLegacy1 word 1 is: 0x" << std::hex << std::setw( 8 ) << std::setfill(
'0' ) << legacyTopoInput->cableWord2(1));
567 auto h0 = *get1DHist(
"/input/topo/LegacyTopo0");
568 auto h1 = *get1DHist(
"/input/topo/LegacyTopo1");
569 for(
unsigned int i=0;
i<32; ++
i) {
571 if( (legacyTopoInput->cableWord1(0) &
mask) != 0 )
h0->Fill(
i);
572 if( (legacyTopoInput->cableWord1(1) &
mask) != 0 )
h0->Fill(32 +
i);
573 if( (legacyTopoInput->cableWord2(0) &
mask) != 0 )
h1->Fill(
i);
574 if( (legacyTopoInput->cableWord2(1) &
mask) != 0 )
h1->Fill(32 +
i);
579 if( not m_iKeyTopo.empty() && m_doL1Topo ) {
581 if(topoInput.isValid()) {
582 ATH_MSG_DEBUG(
"Retrieved input from L1Topo from StoreGate with key " << m_iKeyTopo);
583 ATH_MSG_DEBUG(
"L1Topo0 word 0 is: 0x" << std::hex << std::setw( 8 ) << std::setfill(
'0' ) << topoInput->cableWord1(0));
584 ATH_MSG_DEBUG(
"L1Topo0 word 1 is: 0x" << std::hex << std::setw( 8 ) << std::setfill(
'0' ) << topoInput->cableWord1(1));
585 ATH_MSG_DEBUG(
"L1Topo1 word 0 is: 0x" << std::hex << std::setw( 8 ) << std::setfill(
'0' ) << topoInput->cableWord2(0));
586 ATH_MSG_DEBUG(
"L1Topo1 word 1 is: 0x" << std::hex << std::setw( 8 ) << std::setfill(
'0' ) << topoInput->cableWord2(1));
587 auto h0 = *get1DHist(
"/input/topo/Topo2El");
588 auto h1 = *get1DHist(
"/input/topo/Topo3El");
589 for(
unsigned int i=0;
i<32; ++
i) {
591 if( (topoInput->cableWord1(0) &
mask) != 0 )
h0->Fill(
i);
592 if( (topoInput->cableWord1(1) &
mask) != 0 )
h0->Fill(32 +
i);
593 if( (topoInput->cableWord2(0) &
mask) != 0 )
h1->Fill(
i);
594 if( (topoInput->cableWord2(1) &
mask) != 0 )
h1->Fill(32 +
i);
596 auto h2 = *get1DHist(
"/input/topo/Topo1Opt0");
597 auto h3 = *get1DHist(
"/input/topo/Topo1Opt1");
598 auto h4 = *get1DHist(
"/input/topo/Topo1Opt2");
599 auto h5 = *get1DHist(
"/input/topo/Topo1Opt3");
600 for(
unsigned int i=0;
i<128;
i += 3) {
601 std::bitset<128>
mask = 0x11;
mask <<=
i;
602 if( (topoInput->optcableWord(
"Topo1Opt0") &
mask) != 0 ) h2->Fill(
i);
603 if( (topoInput->optcableWord(
"Topo1Opt1") &
mask) != 0 ) h3->Fill(
i);
604 if( (topoInput->optcableWord(
"Topo1Opt2") &
mask) != 0 ) h4->Fill(
i);
605 if( (topoInput->optcableWord(
"Topo1Opt3") &
mask) != 0 ) h5->Fill(
i);
613 auto bcid = context.eventID().bunch_crossing_id();
614 get1DHist(
"/bcid")->Fill(
bcid);
616 return StatusCode::SUCCESS;
627 std::vector<std::string> connNames =
l1menu->connectorNames();
628 for (
const std::string connName : {
"LegacyTopo0",
"LegacyTopo1",
"Topo1El",
"Topo2El",
"Topo3El",
"Topo1Opt0",
"Topo1Opt1",
"Topo1Opt2",
"Topo1Opt3",
"CTPCAL",
"NIM2"})
630 if(
find(connNames.begin(), connNames.end(), connName) == connNames.end() ) {
633 bool opt_cable =
false;
634 std::bitset<128> cable128 {0};
636 if (connName.starts_with(
"Legacy")) {
637 if (m_iKeyLegacyTopo.empty() || !m_doL1CaloLegacy || !m_doL1TopoLegacy )
642 if (not topoInput.isValid()) {
645 if(connName ==
"LegacyTopo0") {
646 cable = ( (
uint64_t)topoInput->cableWord1( 1 ) << 32) + topoInput->cableWord1( 0 );
647 }
else if (connName ==
"LegacyTopo1") {
648 cable = ( (
uint64_t)topoInput->cableWord2( 1 ) << 32) + topoInput->cableWord2( 0 );
651 else if (connName.starts_with(
"CTPCAL") && m_doZDC)
654 if (not zdcInput.isValid())
658 cable =
static_cast<uint64_t>(zdcInput->cableWord0());
660 for (
auto &
tl :
conn.triggerLines()){
661 if (
tl.name().find(
"ZDC") == std::string::npos)
665 uint flatIndex =
tl.flatindex();
667 thrMultiMap[
tl.name()] = pass;
673 else if (connName.starts_with(
"NIM2"))
678 if (not trtInput.isValid())
682 cable =
static_cast<uint64_t>(trtInput->cableWord0());
684 for (
auto &
tl :
conn.triggerLines()){
685 if (
tl.name().find(
"TRT") == std::string::npos)
689 uint flatIndex =
tl.flatindex();
691 thrMultiMap[
tl.name()] = pass;
698 if (not zdcInput.isValid())
702 cable =
static_cast<uint64_t>(zdcInput->cableWord1());
704 for (
const auto &
tl :
conn.triggerLines()){
705 if (
tl.name().find(
"ZDC") == std::string::npos)
709 uint flatIndex =
tl.flatindex();
711 thrMultiMap[
tl.name()] = pass;
719 if (m_iKeyTopo.empty() || !m_doL1Topo )
724 if (not topoInput.isValid()) {
727 if(connName ==
"Topo1El") {
728 cable = ( (
uint64_t)topoInput->cableWord0( 1 ) << 32) + topoInput->cableWord0( 0 );
729 }
else if(connName ==
"Topo2El") {
730 cable = ( (
uint64_t)topoInput->cableWord1( 1 ) << 32) + topoInput->cableWord1( 0 );
731 }
else if (connName ==
"Topo3El") {
732 cable = ( (
uint64_t)topoInput->cableWord2( 1 ) << 32) + topoInput->cableWord2( 0 );
733 }
else if(connName ==
"Topo1Opt0") {
734 ATH_MSG_DEBUG(
"BIT word Topo1Opt0: " << topoInput->optcableWord( connName ));
736 cable128 = topoInput->optcableWord( connName );
737 }
else if(connName ==
"Topo1Opt1") {
738 ATH_MSG_DEBUG(
"BIT word Topo1Opt1: " << topoInput->optcableWord( connName ));
740 cable128 = topoInput->optcableWord( connName );
741 }
else if(connName ==
"Topo1Opt2") {
742 ATH_MSG_DEBUG(
"BIT word Topo1Opt2: " << topoInput->optcableWord( connName ));
744 cable128 = topoInput->optcableWord( connName );
745 }
else if(connName ==
"Topo1Opt3") {
746 ATH_MSG_DEBUG(
"BIT word Topo1Opt3: " << topoInput->optcableWord( connName ));
748 cable128 = topoInput->optcableWord( connName );
752 for(
uint fpga : {0,1}) {
753 for(
uint clock : {0,1}) {
754 for(
auto &
tl :
conn.triggerLines(fpga,clock)) {
755 uint flatIndex =
tl.flatindex();
758 pass = ((cable128 >> flatIndex).
test(0)) == 0 ? 0 : 1;
761 pass = (cable & (
static_cast<uint64_t>(0x1) << flatIndex)) == 0 ? 0 : 1;
763 if(
size_t pos =
tl.name().find(
'[');
pos == std::string::npos) {
764 thrMultiMap[
tl.name()] = pass;
767 auto thrName =
tl.name().substr(0,
pos);
768 int bit = std::stoi(
tl.name().substr(
pos+1));
769 thrMultiMap.try_emplace(thrName, 0);
770 thrMultiMap[thrName] += (pass << bit);
771 ATH_MSG_DEBUG(thrName <<
" MULT updated mult for topo " << pass);
777 for (
auto & thr :
l1menu->thresholds() ) {
778 if (thr->type() ==
"TOPO" or thr->type() ==
"MULTTOPO" or thr->type() ==
"MUTOPO")
782 if( thr->type() ==
"ZDC" && m_doZDC ){
785 if( thr->name() ==
"NIMTRT" && m_doTRT ){
789 unsigned int multiplicity = calculateMultiplicity(*thr,
l1menu, context);
791 thrMultiMap[thr->name()] = multiplicity;
792 ATH_MSG_DEBUG( thr->name() <<
" MULT calculated mult for topo " << multiplicity);
796 auto bcid = context.eventID().bunch_crossing_id();
797 if( m_forceBunchGroupPattern ) {
799 for (
size_t bg = 0;
bg < 16; ++
bg ) {
800 std::string bgName(
"BGRP");
802 thrMultiMap[bgName] = ( m_bunchGroupPattern & (0x1<<
bg) ) ? 1 : 0;
819 ATH_MSG_ERROR(
"Did not find L1BunchGroupSet in DetectorStore");
824 thrMultiMap[
"RNDM0"] = 1;
825 thrMultiMap[
"RNDM1"] = 1;
826 thrMultiMap[
"RNDM2"] = 1;
827 thrMultiMap[
"RNDM3"] = 1;
829 return StatusCode::SUCCESS;
835 unsigned int multiplicity = 0;
836 if( confThr.
type() ==
"JET" ) {
837 if(m_doL1CaloLegacy) {
839 if ( ctpinJet.isValid() ) {
840 if(
l1menu->connector(
"JET1").hasLine(confThr.
name()) ) {
841 auto & triggerline =
l1menu->connector(
"JET1").triggerLine(confThr.
name());
842 multiplicity =
CTPUtil::getMult( ctpinJet->cableWord0(), triggerline.startbit(), triggerline.endbit() );
843 }
else if(
l1menu->connector(
"JET2").hasLine(confThr.
name()) ) {
844 auto & triggerline =
l1menu->connector(
"JET2").triggerLine(confThr.
name());
845 multiplicity =
CTPUtil::getMult( ctpinJet->cableWord1(), triggerline.startbit(), triggerline.endbit() );
850 get2DHist(
"/multi/jet/" + confThr.
type() +
"Mult" )->Fill(confThr.
mapping(), multiplicity);
851 ATH_MSG_DEBUG(
"JET MULT calculated mult for threshold " << confThr.
name() <<
" : " << multiplicity);
858 unsigned int multiplicity (0);
859 if ( confThr.
name()[0]==
'e' ) {
861 if(!m_iKeyEFexCluster.empty()) {
862 float scale =
l1menu->getObject(
"thresholds.legacyCalo.EM.emscale").getValue<
float>();
864 for (
const auto cl : *eFexCluster ) {
865 float eta =
cl->eta();
866 int ieta =
int((eta + (eta>0 ? 0.005 : -0.005))/0.1);
867 unsigned int thrV = confThr.
thrValue( ieta );
868 bool clusterPasses = ( ((
unsigned int)
cl->et()) > (thrV *
scale) );
869 multiplicity += clusterPasses ? 1 : 0;
874 if(m_doL1CaloLegacy) {
876 if ( ctpinEM.isValid() ) {
877 if(
l1menu->connector(
"EM1").hasLine(confThr.
name()) ) {
878 auto & triggerline =
l1menu->connector(
"EM1").triggerLine(confThr.
name());
879 multiplicity =
CTPUtil::getMult( ctpinEM->cableWord0(), triggerline.startbit(), triggerline.endbit() );
880 }
else if(
l1menu->connector(
"EM2").hasLine(confThr.
name()) ) {
881 auto & triggerline =
l1menu->connector(
"EM2").triggerLine(confThr.
name());
882 multiplicity =
CTPUtil::getMult( ctpinEM->cableWord1(), triggerline.startbit(), triggerline.endbit() );
887 get2DHist(
"/multi/em/" + confThr.
type() +
"Mult" )->Fill(confThr.
mapping(), multiplicity);
888 ATH_MSG_DEBUG(
"EM MULT calculated mult for threshold " << confThr.
name() <<
" : " << multiplicity);
895 unsigned int multiplicity = 0;
896 if ( confThr.
name()[0]==
'e' ) {
901 if( eFexTaus.isValid() ) {
902 for (
const auto tau : *eFexTaus ) {
903 unsigned int eT = (
unsigned int) (accR3ClET(*tau)/1000.);
905 unsigned int etCut = confThr.
data().get_child(
"et").get_value<
unsigned int>();
906 bool tauPasses = (
eT >= etCut );
907 multiplicity += tauPasses ? 1 : 0;
912 if(m_doL1CaloLegacy) {
914 if ( ctpinEM.isValid() ) {
915 if(
l1menu->connector(
"TAU1").hasLine(confThr.
name()) ) {
916 auto & triggerline =
l1menu->connector(
"TAU1").triggerLine(confThr.
name());
917 multiplicity =
CTPUtil::getMult( ctpinEM->cableWord2(), triggerline.startbit(), triggerline.endbit() );
918 }
else if(
l1menu->connector(
"TAU2").hasLine(confThr.
name()) ) {
919 auto & triggerline =
l1menu->connector(
"TAU2").triggerLine(confThr.
name());
920 multiplicity =
CTPUtil::getMult( ctpinEM->cableWord3(), triggerline.startbit(), triggerline.endbit() );
925 get2DHist(
"/multi/tau/" + confThr.
type() +
"Mult" )->Fill(confThr.
mapping(), multiplicity);
926 ATH_MSG_DEBUG(
"TAU MULT calculated mult for threshold " << confThr.
name() <<
" : " << multiplicity);
933 unsigned int multiplicity = 0;
934 if ( confThr.
type() ==
"XE" or confThr.
type() ==
"TE" or confThr.
type() ==
"XS" ) {
936 if(m_doL1CaloLegacy) {
938 if ( ctpinEnergy.isValid() ) {
939 if(
l1menu->connector(
"EN1").hasLine(confThr.
name()) ) {
940 auto & triggerline =
l1menu->connector(
"EN1").triggerLine(confThr.
name());
941 multiplicity =
CTPUtil::getMult( ctpinEnergy->cableWord0(), triggerline.startbit(), triggerline.endbit() );
942 }
else if(
l1menu->connector(
"EN2").hasLine(confThr.
name()) ) {
943 auto & triggerline =
l1menu->connector(
"EN2").triggerLine(confThr.
name());
944 multiplicity =
CTPUtil::getMult( ctpinEnergy->cableWord1(), triggerline.startbit(), triggerline.endbit() );
951 if ( confThr.
name().find(
"gXENC")==0 ) {
952 rhk = & m_iKeyGFexMETNC;
954 }
else if ( confThr.
name().find(
"gXERHO")==0 ) {
955 rhk = & m_iKeyGFexMETRho;
957 }
else if ( confThr.
name().find(
"gXEJWOJ")==0 ) {
958 rhk = & m_iKeyGFexMETJwoJ;
961 rhk = & m_iKeyGFexMETJwoJ;
966 multiplicity = (
met->energyT()/1000. < confThr.
getAttribute<
unsigned int>(
"xe") ) ? 0 : 1;
969 if(confThr.
type() ==
"TE") {
970 get2DHist(
"/multi/te/" + confThr.
type() +
"Mult" )->Fill(confThr.
mapping(), multiplicity);
971 ATH_MSG_DEBUG(
"TE MULT calculated mult for threshold " << confThr.
name() <<
" : " << multiplicity);
972 }
else if(confThr.
type() ==
"XS") {
973 get2DHist(
"/multi/xs/" + confThr.
type() +
"Mult" )->Fill(confThr.
mapping(), multiplicity);
974 ATH_MSG_DEBUG(
"XS MULT calculated mult for threshold " << confThr.
name() <<
" : " << multiplicity);
976 get2DHist(
"/multi/xe/" + confThr.
type() +
"Mult" )->Fill(confThr.
mapping(), multiplicity);
977 ATH_MSG_DEBUG(
"XE MULT calculated mult for threshold " << confThr.
name() <<
" : " << multiplicity);
985 if(m_iKeyMuctpi.empty()) {
988 unsigned int multiplicity = 0;
990 if ( ctpinMuon.isValid() ) {
991 auto & triggerline =
l1menu->connector(
"MuCTPiOpt0").triggerLine(confThr.
name());
992 multiplicity =
CTPUtil::getMuonMult( ctpinMuon->muCTPIWord(), triggerline.startbit() + (m_muonRun2Format ? 1 : 0), triggerline.endbit()+ (m_muonRun2Format ? 1 : 0) );
994 get2DHist(
"/multi/muon/" + confThr.
type() +
"Mult" )->Fill(confThr.
mapping(), multiplicity);
995 ATH_MSG_DEBUG(
"MU MULT calculated mult for threshold " << confThr.
name() <<
" : " << multiplicity);
1002 if(m_iKeyTopo.empty() || !m_doL1Topo ) {
1005 unsigned int multiplicity = 0;
1007 std::string connector =
"";
1008 if (topoInput.isValid()) {
1009 connector =
l1menu->connectorNameFromThreshold(confThr.
name());
1010 auto & triggerline =
l1menu->connector(connector).triggerLine(confThr.
name());
1011 std::bitset<128> bits = topoInput->optcableWord(connector);
1014 std::string subfolder =
"";
1015 if (confThr.
type().find(
"XE") != std::string::npos) {
1017 }
else if (confThr.
type().find(
"TE") != std::string::npos) {
1019 }
else if (confThr.
type().find(
"TAU") != std::string::npos) {
1021 }
else if (confThr.
type().find(
"EM") != std::string::npos) {
1023 }
else if (confThr.
type().find(
"jJ") != std::string::npos) {
1025 }
else if (confThr.
type().find(
"jLJ") != std::string::npos) {
1027 }
else if (confThr.
type().find(
"gJ") != std::string::npos) {
1029 }
else if (confThr.
type().find(
"gLJ") != std::string::npos) {
1032 get2DHist(
"/multi/" + subfolder +
"/" + confThr.
type() +
"Mult" )->Fill(confThr.
mapping(), multiplicity);
1033 ATH_MSG_DEBUG(
"TOPO OPT input MULT calculated mult for threshold " << confThr.
name() <<
" : " << multiplicity <<
" received via connector: " << connector);
1035 return multiplicity;
1041 unsigned int multiplicity = 0;
1043 if (m_iKeyLegacyTopo.empty() || !m_doL1TopoLegacy )
1049 if(topoInput.isValid()) {
1051 std::string
conn(
"");
1052 if(
l1menu->connector(
"LegacyTopo0").hasLine(confThr.
name()) ) {
1053 conn =
"LegacyTopo0";
1054 cable = ( (
uint64_t)topoInput->cableWord1( 1 ) << 32) + topoInput->cableWord1( 0 );
1055 }
else if(
l1menu->connector(
"LegacyTopo1").hasLine(confThr.
name()) ) {
1056 conn =
"LegacyTopo1";
1057 cable = ( (
uint64_t)topoInput->cableWord2( 1 ) << 32) + topoInput->cableWord2( 0 );
1060 auto & triggerline =
l1menu->connector(
conn).triggerLine(confThr.
name());
1062 <<
", cable start " << triggerline.startbit() <<
" and end " << triggerline.endbit()
1063 <<
" double word 0x" << std::setw(16) << std::setfill(
'0') << std::hex << cable << std::dec << std::setfill(
' ') );
1064 multiplicity =
CTPUtil::getMultTopo( cable, triggerline.startbit(), triggerline.endbit(), triggerline.clock() );
1069 if (m_iKeyTopo.empty() || !m_doL1Topo )
1075 if(topoInput.isValid()) {
1077 std::string
conn(
"");
1078 if(
l1menu->connector(
"Topo2El").hasLine(confThr.
name()) ) {
1080 cable = ( (
uint64_t)topoInput->cableWord1( 1 ) << 32) + topoInput->cableWord1( 0 );
1081 }
else if(
l1menu->connector(
"Topo3El").hasLine(confThr.
name()) ) {
1083 cable = ( (
uint64_t)topoInput->cableWord2( 1 ) << 32) + topoInput->cableWord2( 0 );
1086 auto & triggerline =
l1menu->connector(
conn).triggerLine(confThr.
name());
1088 <<
", cable start " << triggerline.startbit() <<
" and end " << triggerline.endbit()
1089 <<
" double word 0x" << std::setw(16) << std::setfill(
'0') << std::hex << cable << std::dec << std::setfill(
' ') );
1090 multiplicity =
CTPUtil::getMultTopo( cable, triggerline.startbit(), triggerline.endbit(), triggerline.clock() );
1094 return multiplicity;
1100 unsigned int multiplicity = 0;
1102 if ( confThr.
type() ==
"EM" ) {
1103 multiplicity = calculateEMMultiplicity( confThr,
l1menu, context );
1104 }
else if ( confThr.
type() ==
"TAU" ) {
1105 multiplicity = calculateTauMultiplicity( confThr,
l1menu, context );
1106 }
else if ( confThr.
type() ==
"XE" || confThr.
type() ==
"TE" || confThr.
type() ==
"XS" ) {
1107 multiplicity = calculateMETMultiplicity( confThr,
l1menu, context );
1108 }
else if ( confThr.
type() ==
"JET" ) {
1109 multiplicity = calculateJetMultiplicity( confThr,
l1menu, context );
1110 }
else if ( confThr.
type() ==
"MU" ) {
1111 multiplicity = calculateMuonMultiplicity( confThr,
l1menu, context );
1112 }
else if ( confThr.
type() ==
"R2TOPO") {
1113 multiplicity = calculateTopoMultiplicity( confThr,
l1menu, context,
true );
1114 }
else if ( confThr.
type() ==
"TOPO" ) {
1115 multiplicity = calculateTopoMultiplicity( confThr,
l1menu, context, m_doL1TopoLegacy);
1116 }
else if ( confThr.
type()[0] ==
'e' || confThr.
type()[0] ==
'c' || confThr.
type()[0] ==
'j' || confThr.
type()[0] ==
'g' ){
1117 multiplicity = calculateTopoOptMultiplicity( confThr,
l1menu, context );
1121 ATH_MSG_FATAL(
"Caught exception when calculating multiplicity for threshold " << confThr.
name() <<
": " << ex.what());
1125 return multiplicity;
1130 const EventContext& context)
const
1133 std::vector<uint32_t> tip;
1134 CHECK( m_resultBuilder->constructTIPVector( thrMultiMap, tip ) );
1136 std::map<std::string, unsigned int> itemDecisionMap;
1137 CLHEP::HepRandomEngine* rndmEngine = m_RNGEngines.getEngine( context );
1138 CHECK( m_resultBuilder->buildItemDecision(thrMultiMap, itemDecisionMap, rndmEngine) );
1140 std::vector<uint32_t> tbp;
1141 std::vector<uint32_t>
tap;
1142 std::vector<uint32_t> tav;
1144 CHECK( m_resultBuilder->constructResultVectors( itemDecisionMap, tbp,
tap, tav,
triggerType ) );
1150 auto eventID = context.eventID();
1151 std::unique_ptr<CTP_RDO> rdo = m_resultBuilder->constructRDOResult( eventID, tbp,
tap, tav, tip,
extra );
1152 std::unique_ptr<CTPSLink> roi = m_resultBuilder->constructRoIResult( eventID, tbp,
tap, tav, tip,
extra,
triggerType );
1157 ATH_CHECK( rdoWriteHandle.record( std::move(rdo) ));
1158 ATH_CHECK( sLinkWriteHandle.record( std::move(roi) ));
1162 auto tbpById = *get1DHist(
"/output/tbpById" );
1163 auto tapById = *get1DHist(
"/output/tapById" );
1164 auto tavById = *get1DHist(
"/output/tavById" );
1165 for(
unsigned int ctpId= 0; ctpId < 512; ++ctpId ) {
1166 unsigned int wordNr = ctpId / 32;
1167 unsigned int posWithinWord = ctpId % 32;
1168 auto mask = 1L << posWithinWord;
1169 if( 0 != (tbp[wordNr] &
mask) ) {
1170 tbpById->Fill( ctpId );
1172 if( 0 != (
tap[wordNr] &
mask) ) {
1173 tapById->Fill( ctpId );
1175 if( 0 != (tav[wordNr] &
mask) ) {
1176 tavById->Fill( ctpId );
1180 return StatusCode::SUCCESS;
1190 constexpr
unsigned int sizeOfCTPOutput = 512;
1192 unsigned int tbp[sizeOfCTPOutput];
1193 unsigned int tap[sizeOfCTPOutput];
1194 unsigned int tav[sizeOfCTPOutput];
1196 auto h = *get1DHist(
"/output/tbpById" );
1197 for(
unsigned int id = 0;
id < sizeOfCTPOutput; ++
id ) tbp[
id] =
h->GetBinContent(
id+1);
1200 auto h = *get1DHist(
"/output/tapById" );
1201 for(
unsigned int id = 0;
id < sizeOfCTPOutput; ++
id )
tap[
id] =
h->GetBinContent(
id+1);
1204 auto h = *get1DHist(
"/output/tavById" );
1205 for(
unsigned int id = 0;
id < sizeOfCTPOutput; ++
id ) tav[
id] =
h->GetBinContent(
id+1);
1210 auto htbp = *get1DHist(
"/output/tbpByName" );
1211 auto htap = *get1DHist(
"/output/tapByName" );
1212 auto htav = *get1DHist(
"/output/tavByName" );
1214 unsigned int ctpId =
item.ctpId();
1215 htbp->Fill(
item.name().c_str(), tbp[ctpId]);
1216 htap->Fill(
item.name().c_str(),
tap[ctpId]);
1217 htav->Fill(
item.name().c_str(), tav[ctpId]);
1222 htbp->LabelsDeflate();
1223 htap->LabelsDeflate();
1224 htav->LabelsDeflate();
1231 std::vector<std::string> thrHists{
"em/EM",
"muon/MU",
"tau/TAU",
"jet/JET",
"xe/XE",
"te/TE",
"xs/XS" };
1232 auto hist = * get2DHist(
"/multi/all/LegacyMult" );
1233 for(
const std::string &
histpath : thrHists) {
1234 auto h = * get2DHist(
"/multi/" +
histpath +
"Mult" );
1235 auto xaxis =
h->GetXaxis();
1236 size_t xsize = xaxis->GetNbins();
1237 size_t ysize =
h->GetNbinsY();
1238 for(
size_t x = 1;
x<xsize;
x++) {
1240 for(
size_t y = 1;
y<=ysize;
y++) {
1241 size_t binContent =
h->GetBinContent(
x,
y);
1242 hist->Fill(xaxis->GetBinLabel(
x),
y-1,binContent);
1245 ATH_MSG_DEBUG(
"REGTEST CTPSim " << xaxis->GetBinLabel(
x) <<
" MULT " <<
s);
1249 hist->LabelsDeflate();
1253 auto hist = * get2DHist(
"/multi/all/R3Mult" );
1254 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" };
1255 for(
const std::string &
histpath : thrHists) {
1256 auto h = * get2DHist(
"/multi/" +
histpath +
"Mult" );
1257 auto xaxis =
h->GetXaxis();
1258 size_t xsize = xaxis->GetNbins();
1259 size_t ysize =
h->GetNbinsY();
1260 for(
size_t x = 1;
x<=xsize;
x++) {
1262 for(
size_t y = 1;
y<=ysize;
y++) {
1263 size_t binContent =
h->GetBinContent(
x,
y);
1264 hist->Fill(xaxis->GetBinLabel(
x) ,
y-1, binContent);
1267 ATH_MSG_DEBUG(
"REGTEST CTPSim " << xaxis->GetBinLabel(
x) <<
" MULT " <<
s);
1271 hist->LabelsDeflate();
1277 " TBP " << tbp[
item.ctpId()] <<
1278 " TAP " <<
tap[
item.ctpId()] <<
1279 " TAV " << tav[
item.ctpId()]);
1282 return StatusCode::SUCCESS;
1291 std::vector<std::string> storedPaths;
1292 for(
auto &
entry : m_hist1D ) {
1293 storedPaths.push_back( getBaseHistPath() +
entry.first);
1295 for(
auto &
entry : m_hist2D ) {
1296 storedPaths.push_back( getBaseHistPath() +
entry.first);
1298 std::scoped_lock<std::mutex> metadataLock(s_metadataMutex);
1299 for (
const auto &
path : storedPaths) {
1300 size_t pos =
path.find_last_of(
'/');
1301 auto splitPath = std::make_pair(
path.substr(0,
pos),
path.substr(
pos + 1));
1302 std::string treePath = splitPath.first +
"/metadata";
1304 char triggerData[] =
"<none>";
1305 const std::string mergeDataStr =
"<default>";
1306 std::vector<char> mergeData{mergeDataStr.begin(), mergeDataStr.end()};
1307 mergeData.push_back(
'\0');
1309 if (!m_histSvc->existsTree(treePath)) {
1310 auto tree = std::make_unique<TTree>(
"metadata",
"Monitoring Metadata");
1311 tree->SetDirectory(
nullptr);
1312 tree->Branch(
"Name", &(splitPath.second[0]),
"Name/C");
1313 tree->Branch(
"Interval", &(
interval[0]),
"Interval/C");
1314 tree->Branch(
"TriggerChain", triggerData,
"TriggerChain/C");
1315 tree->Branch(
"MergeMethod", mergeData.data(),
"MergeMethod/C");
1317 if (!m_histSvc->regTree(treePath, std::move(
tree))) {
1320 <<
"Failed to register DQ metadata TTree " << treePath <<
endmsg;
1323 TTree *
tree{
nullptr};
1324 if (m_histSvc->getTree(treePath,
tree).isSuccess()) {
1325 tree->SetBranchAddress(
"Name", &(splitPath.second[0]));
1327 tree->SetBranchAddress(
"TriggerChain", triggerData);
1328 tree->SetBranchAddress(
"MergeMethod", mergeData.data());
1333 <<
"Failed to retrieve DQ metadata TTree " << treePath <<
" which is reported to exist" <<
endmsg;
1337 return StatusCode::SUCCESS;