19 #include "CLHEP/Random/RandomEngine.h"
20 #include "CLHEP/Random/Ranlux64Engine.h"
35 const std::function< CLHEP::HepRandomEngine*(void) >
CTPSimRanluxFactory = [](
void)->CLHEP::HepRandomEngine*{
36 return new CLHEP::Ranlux64Engine();
52 if(m_forceBunchGroupPattern) {
53 ATH_MSG_INFO(
"Will use bunchgroup pattern 0x" << std::hex << m_bunchGroupPattern);
55 ATH_MSG_INFO(
"Will use bunchgroup definition from bunchgroup set");
59 CHECK( m_oKeyRDO.assign(LVL1CTP::DEFAULT_RDOOutputLocation_Rerun) );
60 CHECK( m_oKeySLink.assign(LVL1CTP::DEFAULT_CTPSLinkLocation_Rerun) );
62 ATH_CHECK( m_bgKey.initialize( !m_forceBunchGroupPattern ) );
65 ATH_CHECK( m_iKeyTopo.initialize( !m_iKeyTopo.empty() && m_doL1Topo ) );
66 ATH_CHECK( m_iKeyMuctpi.initialize( ! m_iKeyMuctpi.empty() ) );
69 ATH_CHECK( m_iKeyLegacyTopo.initialize( !m_iKeyLegacyTopo.empty() && m_doL1CaloLegacy && m_doL1TopoLegacy ) );
70 ATH_CHECK( m_iKeyCtpinEM.initialize( m_doL1CaloLegacy ) );
71 ATH_CHECK( m_iKeyCtpinJet.initialize( m_doL1CaloLegacy ) );
72 ATH_CHECK( m_iKeyCtpinXE.initialize( m_doL1CaloLegacy ) );
75 ATH_CHECK( m_iKeyJFexJets.initialize( ! m_iKeyJFexJets.empty() ) );
76 ATH_CHECK( m_iKeyJFexLJets.initialize( ! m_iKeyJFexLJets.empty() ) );
77 ATH_CHECK( m_iKeyGFexJets.initialize( ! m_iKeyGFexJets.empty() ) );
78 ATH_CHECK( m_iKeyGFexMETNC.initialize( ! m_iKeyGFexMETNC.empty() ) );
79 ATH_CHECK( m_iKeyGFexMETRho.initialize( ! m_iKeyGFexMETRho.empty() ) );
80 ATH_CHECK( m_iKeyGFexMETJwoJ.initialize( ! m_iKeyGFexMETJwoJ.empty() ) );
81 ATH_CHECK( m_iKeyEFexCluster.initialize( ! m_iKeyEFexCluster.empty() ) );
82 ATH_CHECK( m_iKeyEFexTau.initialize( ! m_iKeyEFexTau.empty() ) );
83 ATH_CHECK( m_oKeyRDO.initialize( ! m_oKeyRDO.empty() ) );
84 ATH_CHECK( m_oKeySLink.initialize( ! m_oKeySLink.empty() ) );
87 ATH_CHECK( m_iKeyZDC.initialize( ! m_iKeyZDC.empty() && m_doZDC ) );
90 ATH_CHECK( m_iKeyTRT.initialize( ! m_iKeyTRT.empty() && m_doTRT ) );
98 ATH_MSG_DEBUG(
"Registering histograms under " << getBaseHistPath() <<
" in " << m_histSvc);
100 return StatusCode::SUCCESS;
109 bookHists().ignore();
113 setHistLabels(*l1menu).ignore();
115 return StatusCode::SUCCESS;
123 fillInputHistograms(context).ignore();
125 std::map<std::string, unsigned int> thrMultiMap;
127 extractMultiplicities(thrMultiMap, context).ignore();
129 simulateItems(thrMultiMap, context).ignore();
131 return StatusCode::SUCCESS;
138 std::map<std::string,std::vector<std::string>> typeMapping = {
140 {
"jet", {
"JET",
"jJ",
"jLJ",
"gJ",
"gLJ"} },
141 {
"xe", {
"XE",
"gXE",
"jXE"} },
142 {
"te", {
"TE",
"jTE",
"gTE"} },
144 {
"em", {
"EM",
"eEM",
"jEM"} },
145 {
"tau", {
"TAU",
"eTAU",
"jTAU",
"cTAU"} }
147 std::vector<TrigConf::L1Threshold> thrV;
148 for(
const std::string &
t : typeMapping[
type] ) {
150 TH2*
hist =
new TH2I( Form(
"%sMult",
t.c_str()),
151 Form(
"%s threshold multiplicity",
t.c_str()), xsize, 0, xsize, maxMult, 0, maxMult);
152 sc = hbook(
"/multi/" +
type, std::unique_ptr<TH2>(
hist));
161 std::map<std::string,std::vector<std::string>> typeMapping = {
163 {
"jet", {
"JET",
"jJ",
"jLJ",
"gJ",
"gLJ"} },
164 {
"xe", {
"XE",
"gXE",
"jXE"} },
165 {
"te", {
"TE",
"jTE",
"gTE"} },
167 {
"em", {
"EM",
"eEM",
"jEM"} },
168 {
"tau", {
"TAU",
"eTAU",
"jTAU",
"cTAU"} }
172 std::vector<TrigConf::L1Threshold> thrV;
173 for(
const std::string &
t : typeMapping[
type] ) {
175 auto hist = get2DHist(
"/multi/" +
type +
"/" +
t +
"Mult" );
176 auto & thrV =
l1menu.thresholds(
t);
177 while(
hist->GetNbinsX() < (
int)thrV.size() ) {
178 hist->LabelsInflate(
"xaxis");
180 for(
auto thr : thrV) {
181 hist->GetXaxis()->SetBinLabel(thr->mapping()+1, thr->name().c_str() );
184 ATH_MSG_DEBUG(
"Caught exception when setting new JSON MultiplicityHistLabel " <<
t <<
" : " << ex.what());
192 std::string baseHistPath( m_histPath );
193 if(baseHistPath.back()!=
'/') baseHistPath +=
"/";
194 baseHistPath +=
name();
200 const std::string &
hname(
hist->GetName());
203 if(
key.back()!=
'/')
key +=
"/";
206 if(m_hist1D.find(
key)!=m_hist1D.end()) {
208 return StatusCode::RECOVERABLE;
211 LockedHandle<TH1>
lh;
213 if(
sc.isSuccess() ) {
224 const std::string &
hname(
hist->GetName());
227 if(
key.back()!=
'/')
key +=
"/";
230 if(m_hist2D.find(
key)!=m_hist2D.end()) {
232 return StatusCode::RECOVERABLE;
235 LockedHandle<TH2>
lh;
237 if(
sc.isSuccess() ) {
249 if (itr == m_hist1D.end()) {
250 throw GaudiException(
"1D-hist "+
histName +
" does not exist",
name(), StatusCode::FAILURE);
260 if (itr == m_hist2D.end()) {
261 throw GaudiException(
"2D-hist "+
histName +
" does not exist",
name(), StatusCode::FAILURE);
282 std::vector<std::string> connNames =
l1menu.connectorNames();
283 for(
const std::string connName : {
"LegacyTopo0",
"LegacyTopo1",
"Topo1El",
"Topo2El",
"Topo3El",
"Topo1Opt0",
"Topo1Opt1",
"Topo1Opt2",
"Topo1Opt3"}) {
284 if(
find(connNames.begin(), connNames.end(), connName) == connNames.end() ) {
287 auto hTopo = *get1DHist(
"/input/topo/" + connName);
288 for(
uint fpga : {0,1}) {
289 for(
uint clock : {0,1}) {
290 for(
auto &
tl :
l1menu.connector(connName).triggerLines(fpga,clock)) {
291 uint flatIndex =
tl.flatindex();
292 hTopo->GetXaxis()->SetBinLabel(flatIndex+1,
tl.name().c_str());
298 std::vector<std::string> orderedItemnames;
299 orderedItemnames.reserve(
l1menu.size() );
301 orderedItemnames.emplace_back(
item.name());
303 std::sort(orderedItemnames.begin(), orderedItemnames.end());
306 auto tbpById = *get1DHist(
"/output/tbpById" );
307 auto tapById = *get1DHist(
"/output/tapById" );
308 auto tavById = *get1DHist(
"/output/tavById" );
309 auto tbpByName = *get1DHist(
"/output/tbpByName" );
310 auto tapByName = *get1DHist(
"/output/tapByName" );
311 auto tavByName = *get1DHist(
"/output/tavByName" );
312 unsigned int bin = 1;
313 for (
const std::string & itemname : orderedItemnames ) {
314 unsigned int ctpId(0);
316 ctpId =
item.ctpId();
317 tbpById->GetXaxis()->SetBinLabel( ctpId+1, itemname.c_str() );
318 tapById->GetXaxis()->SetBinLabel( ctpId+1, itemname.c_str() );
319 tavById->GetXaxis()->SetBinLabel( ctpId+1, itemname.c_str() );
320 tbpByName->GetXaxis()->SetBinLabel(
bin, itemname.c_str() );
321 tapByName->GetXaxis()->SetBinLabel(
bin, itemname.c_str() );
322 tavByName->GetXaxis()->SetBinLabel(
bin++, itemname.c_str() );
325 return StatusCode::SUCCESS;
332 ATH_CHECK ( hbook(
"/input/jets/", std::make_unique<TH1I>(
"jJetPt",
"Jet p_{T} - jJ", 40, 0, 80) ));
333 ATH_CHECK ( hbook(
"/input/jets/", std::make_unique<TH1I>(
"jJetEta",
"Jet #eta - jJ", 64, -3.2, 3.2) ));
334 ATH_CHECK ( hbook(
"/input/jets/", std::make_unique<TH1I>(
"jJetPhi",
"Jet #phi - jJ", 64, -3.2, 3.2) ));
335 ATH_CHECK ( hbook(
"/input/jets/", std::make_unique<TH1I>(
"jLJetPt",
"Jet p_{T} - jLJ", 40, 0, 80) ));
336 ATH_CHECK ( hbook(
"/input/jets/", std::make_unique<TH1I>(
"jLJetEta",
"Jet #eta - jLJ", 64, -3.2, 3.2) ));
337 ATH_CHECK ( hbook(
"/input/jets/", std::make_unique<TH1I>(
"jLJetPhi",
"Jet #phi - jLJ", 64, -3.2, 3.2) ));
338 ATH_CHECK ( hbook(
"/input/jets/", std::make_unique<TH1I>(
"gJetPt",
"Jet p_{T} - gJ", 40, 0, 80) ));
339 ATH_CHECK ( hbook(
"/input/jets/", std::make_unique<TH1I>(
"gJetEta",
"Jet #eta - gJ", 64, -3.2, 3.2) ));
340 ATH_CHECK ( hbook(
"/input/jets/", std::make_unique<TH1I>(
"gJetPhi",
"Jet #phi - gJ", 64, -3.2, 3.2) ));
341 ATH_CHECK ( hbook(
"/input/jets/", std::make_unique<TH1I>(
"gLJetPt",
"Jet p_{T} - gLJ", 40, 0, 80) ));
342 ATH_CHECK ( hbook(
"/input/jets/", std::make_unique<TH1I>(
"gLJetEta",
"Jet #eta - gLJ", 64, -3.2, 3.2) ));
343 ATH_CHECK ( hbook(
"/input/jets/", std::make_unique<TH1I>(
"gLJetPhi",
"Jet #phi - gLJ", 64, -3.2, 3.2) ));
346 ATH_CHECK ( hbook(
"/input/met/", std::make_unique<TH1I>(
"Pufit",
"Missing ET from algorithm pufit", 40, 0, 80) ));
347 ATH_CHECK ( hbook(
"/input/met/", std::make_unique<TH1I>(
"PufitPhi",
"Missing ET PUfit phi", 64, -3.2, 3.2) ));
348 ATH_CHECK ( hbook(
"/input/met/", std::make_unique<TH1I>(
"Rho",
"Missing ET from algorithm rhosub", 40, 0, 80) ));
349 ATH_CHECK ( hbook(
"/input/met/", std::make_unique<TH1I>(
"RhoPhi",
"Missing ET rhosub phi", 64, -3.2, 3.2) ));
350 ATH_CHECK ( hbook(
"/input/met/", std::make_unique<TH1I>(
"JwoJ",
"Missing ET from algorithm jet without jets", 40, 0, 80) ));
351 ATH_CHECK ( hbook(
"/input/met/", std::make_unique<TH1I>(
"JwoJPhi",
"Missing ET jet without jet phi", 64, -3.2, 3.2) ));
354 ATH_CHECK ( hbook(
"/input/em/", std::make_unique<TH1I>(
"et",
"Cluster et", 40, 0, 40) ));
355 ATH_CHECK ( hbook(
"/input/em/", std::make_unique<TH1I>(
"eta",
"Cluster eta ", 64, -3.2, 3.2) ));
356 ATH_CHECK ( hbook(
"/input/em/", std::make_unique<TH1I>(
"phi",
"Cluster phi", 64, -3.2, 3.2) ));
359 ATH_CHECK ( hbook(
"/input/tau/", std::make_unique<TH1I>(
"et",
"Tau et", 40, 0, 40) ));
360 ATH_CHECK ( hbook(
"/input/tau/", std::make_unique<TH1I>(
"eta",
"Tau eta ", 64, -3.2, 3.2) ));
361 ATH_CHECK ( hbook(
"/input/tau/", std::make_unique<TH1I>(
"phi",
"Tau phi", 64, -3.2, 3.2) ));
362 ATH_CHECK ( hbook(
"/input/tau/", std::make_unique<TH1I>(
"emIso",
"Tau em isolation", 40, 0, 1) ));
363 ATH_CHECK ( hbook(
"/input/tau/", std::make_unique<TH1I>(
"hadIso",
"Tau hadronic isolation", 40, 0, 1) ));
364 ATH_CHECK ( hbook(
"/input/tau/", std::make_unique<TH1I>(
"R3ET",
"Tau eT", 40, 0, 40) ));
365 ATH_CHECK ( hbook(
"/input/tau/", std::make_unique<TH1I>(
"R3Iso",
"Tau isolation", 40, 0, 1) ));
368 ATH_CHECK ( hbook(
"/input/counts/", std::make_unique<TH1I>(
"jJets",
"Number of jets (jJ)", 40, 0, 40) ));
369 ATH_CHECK ( hbook(
"/input/counts/", std::make_unique<TH1I>(
"jLJets",
"Number of jets (jLJ)", 40, 0, 40) ));
370 ATH_CHECK ( hbook(
"/input/counts/", std::make_unique<TH1I>(
"gJets",
"Number of jets (gJ)", 40, 0, 40) ));
371 ATH_CHECK ( hbook(
"/input/counts/", std::make_unique<TH1I>(
"gLJets",
"Number of jets (gLJ)", 40, 0, 40) ));
372 ATH_CHECK ( hbook(
"/input/counts/", std::make_unique<TH1I>(
"muons",
"Number of muons", 10, 0, 10) ));
373 ATH_CHECK ( hbook(
"/input/counts/", std::make_unique<TH1I>(
"emcluster",
"Number of EM clusters", 20, 0, 20) ));
374 ATH_CHECK ( hbook(
"/input/counts/", std::make_unique<TH1I>(
"taus",
"Number of TAU candidates", 20, 0, 20) ));
377 ATH_CHECK ( createMultiplicityHist(
"muon" ) );
378 ATH_CHECK ( createMultiplicityHist(
"jet" ) );
379 ATH_CHECK ( createMultiplicityHist(
"xe", 2) );
380 ATH_CHECK ( createMultiplicityHist(
"te", 2) );
381 ATH_CHECK ( createMultiplicityHist(
"xs", 2) );
382 ATH_CHECK ( createMultiplicityHist(
"em" ) );
383 ATH_CHECK ( createMultiplicityHist(
"tau" ) );
385 ATH_CHECK ( hbook(
"/multi/all", (std::unique_ptr<TH2>)std::make_unique<TH2I>(
"LegacyMult",
"Legacy thresholds multiplicity", 1, 0, 1, 10, 0, 10) ));
386 ATH_CHECK ( hbook(
"/multi/all", (std::unique_ptr<TH2>)std::make_unique<TH2I>(
"R3Mult",
"New thresholds multiplicity", 1, 0, 1, 10, 0, 10) ));
389 ATH_CHECK( hbook(
"/input/topo/", std::make_unique<TH1I>(
"LegacyTopo0",
"L1Topo Decision (Legacy 0)", 64, 0, 64) ));
390 ATH_CHECK( hbook(
"/input/topo/", std::make_unique<TH1I>(
"LegacyTopo1",
"L1Topo Decision (Legacy 1)", 64, 0, 64) ));
391 ATH_CHECK( hbook(
"/input/topo/", std::make_unique<TH1I>(
"Topo1El",
"L1Topo Decision (Topo 1 electrical)", 64, 0, 64) ));
392 ATH_CHECK( hbook(
"/input/topo/", std::make_unique<TH1I>(
"Topo2El",
"L1Topo Decision (Topo 2 electrical)", 64, 0, 64) ));
393 ATH_CHECK( hbook(
"/input/topo/", std::make_unique<TH1I>(
"Topo3El",
"L1Topo Decision (Topo 3 electrical)", 64, 0, 64) ));
394 ATH_CHECK( hbook(
"/input/topo/", std::make_unique<TH1I>(
"Topo1Opt0",
"L1Topo Decision (Topo 1 optical 0)", 128, 0, 128) ));
395 ATH_CHECK( hbook(
"/input/topo/", std::make_unique<TH1I>(
"Topo1Opt1",
"L1Topo Decision (Topo 1 optical 1)", 128, 0, 128) ));
396 ATH_CHECK( hbook(
"/input/topo/", std::make_unique<TH1I>(
"Topo1Opt2",
"L1Topo Decision (Topo 1 optical 2)", 128, 0, 128) ));
397 ATH_CHECK( hbook(
"/input/topo/", std::make_unique<TH1I>(
"Topo1Opt3",
"L1Topo Decision (Topo 1 optical 3)", 128, 0, 128) ));
400 ATH_CHECK ( hbook(
"/output/", std::make_unique<TH1I>(
"tbpById",
"Items decision (tbp)", 512, 0, 512) ));
401 ATH_CHECK ( hbook(
"/output/", std::make_unique<TH1I>(
"tapById",
"Items decision (tap)", 512, 0, 512) ));
402 ATH_CHECK ( hbook(
"/output/", std::make_unique<TH1I>(
"tavById",
"Items decision (tav)", 512, 0, 512) ));
403 ATH_CHECK ( hbook(
"/output/", std::make_unique<TH1I>(
"tbpByName",
"Items decision (tbp)", 512, 0, 512) ));
404 ATH_CHECK ( hbook(
"/output/", std::make_unique<TH1I>(
"tapByName",
"Items decision (tap)", 512, 0, 512) ));
405 ATH_CHECK ( hbook(
"/output/", std::make_unique<TH1I>(
"tavByName",
"Items decision (tav)", 512, 0, 512) ));
407 ATH_CHECK ( hbook(
"/", std::make_unique<TH1I>(
"bcid",
"Bunch crossing ID", 3564, 0, 3564)) );
411 return StatusCode::SUCCESS;
420 if( not m_iKeyJFexJets.empty() ) {
422 if(jFexJets.isValid()) {
423 get1DHist(
"/input/counts/jJets")->Fill(jFexJets->size());
424 auto h0 = *get1DHist(
"/input/jets/jJetPt");
425 auto h1 = *get1DHist(
"/input/jets/jJetEta");
426 auto h2 = *get1DHist(
"/input/jets/jJetPhi");
427 for(
const auto jet : *jFexJets ) {
428 h0->Fill(fabs(
jet->et8x8()/1000.));
429 h1->Fill(
jet->eta());
430 h2->Fill(
jet->phi());
438 if( not m_iKeyJFexLJets.empty() ) {
440 if(jFexLJets.isValid()) {
441 get1DHist(
"/input/counts/jLets")->Fill(jFexLJets->size());
442 auto h0 = *get1DHist(
"/input/jets/jLJetPt");
443 auto h1 = *get1DHist(
"/input/jets/jLJetEta");
444 auto h2 = *get1DHist(
"/input/jets/jLJetPhi");
445 for(
const auto jet : *jFexLJets ) {
446 h0->Fill(fabs(
jet->et8x8()/1000.));
447 h1->Fill(
jet->eta());
448 h2->Fill(
jet->phi());
458 if( not m_iKeyGFexJets.empty() ) {
460 if(gFexJets.isValid()) {
461 get1DHist(
"/input/counts/gJets")->Fill(gFexJets->size());
462 auto h0 = *get1DHist(
"/input/jets/gJetPt");
463 auto h1 = *get1DHist(
"/input/jets/gJetEta");
464 auto h2 = *get1DHist(
"/input/jets/gJetPhi");
465 for(
const auto jet : *gFexJets ) {
466 h0->Fill(fabs(
jet->et8x8()/1000.));
467 h1->Fill(
jet->eta());
468 h2->Fill(
jet->phi());
476 if( not m_iKeyGFexMETNC.empty() ) {
478 if( gFexMETPufit.isValid() ) {
479 get1DHist(
"/input/met/Pufit")->Fill(gFexMETPufit->energyT()/1000.);
480 get1DHist(
"/input/met/PufitPhi")->Fill(atan2(gFexMETPufit->energyX(), gFexMETPufit->energyY()));
486 if( not m_iKeyGFexMETRho.empty() ) {
488 if( gFexMETRho.isValid() ) {
489 get1DHist(
"/input/met/Rho")->Fill(gFexMETRho->energyT()/1000.);
490 get1DHist(
"/input/met/RhoPhi")->Fill(atan2(gFexMETRho->energyX(), gFexMETRho->energyY()));
496 if( not m_iKeyGFexMETJwoJ.empty() ) {
498 if( gFexMETJwoJ.isValid() ) {
499 get1DHist(
"/input/met/JwoJ")->Fill(gFexMETJwoJ->energyT()/1000.);
500 get1DHist(
"/input/met/JwoJPhi")->Fill(atan2(gFexMETJwoJ->energyX(), gFexMETJwoJ->energyY()));
507 if( not m_iKeyEFexCluster.empty() ) {
509 if( eFexCluster.isValid() ) {
510 get1DHist(
"/input/counts/emcluster")->Fill(eFexCluster->size());
511 auto h0 = *get1DHist(
"/input/em/et");
512 auto h1 = *get1DHist(
"/input/em/eta");
513 auto h2 = *get1DHist(
"/input/em/phi");
514 for(
const auto cl : *eFexCluster ) {
525 if( not m_iKeyEFexTau.empty() ) {
527 if( eFexTau.isValid() ) {
528 get1DHist(
"/input/counts/taus")->Fill(eFexTau->size());
529 auto h0 = *get1DHist(
"/input/tau/et");
530 auto h1 = *get1DHist(
"/input/tau/eta");
531 auto h2 = *get1DHist(
"/input/tau/phi");
532 auto h3 = *get1DHist(
"/input/tau/emIso");
533 auto h4 = *get1DHist(
"/input/tau/hadIso");
534 auto h5 = *get1DHist(
"/input/tau/R3ClusterET");
535 auto h6 = *get1DHist(
"/input/tau/R3ClusterIso");
538 for(
const auto tau : *eFexTau ) {
540 h1->Fill(tau->eta());
541 h2->Fill(tau->phi());
542 h3->Fill(tau->emIsol());
543 h4->Fill(tau->hadIsol());
544 h5->Fill(accR3ClET(*tau)/1000.);
545 h6->Fill(accR3ClIso(*tau));
553 if( not m_iKeyLegacyTopo.empty() && m_doL1CaloLegacy && m_doL1TopoLegacy ) {
554 auto legacyTopoInput =
SG::makeHandle( m_iKeyLegacyTopo, context );
555 if(legacyTopoInput.isValid()) {
556 ATH_MSG_DEBUG(
"Retrieved input from L1Topo from StoreGate with key " << m_iKeyTopo);
557 ATH_MSG_DEBUG(
"L1TopoLegacy0 word 0 is: 0x" << std::hex << std::setw( 8 ) << std::setfill(
'0' ) << legacyTopoInput->cableWord1(0));
558 ATH_MSG_DEBUG(
"L1TopoLegacy0 word 1 is: 0x" << std::hex << std::setw( 8 ) << std::setfill(
'0' ) << legacyTopoInput->cableWord1(1));
559 ATH_MSG_DEBUG(
"L1TopoLegacy1 word 0 is: 0x" << std::hex << std::setw( 8 ) << std::setfill(
'0' ) << legacyTopoInput->cableWord2(0));
560 ATH_MSG_DEBUG(
"L1TopoLegacy1 word 1 is: 0x" << std::hex << std::setw( 8 ) << std::setfill(
'0' ) << legacyTopoInput->cableWord2(1));
561 auto h0 = *get1DHist(
"/input/topo/LegacyTopo0");
562 auto h1 = *get1DHist(
"/input/topo/LegacyTopo1");
563 for(
unsigned int i=0;
i<32; ++
i) {
565 if( (legacyTopoInput->cableWord1(0) &
mask) != 0 )
h0->Fill(
i);
566 if( (legacyTopoInput->cableWord1(1) &
mask) != 0 )
h0->Fill(32 +
i);
567 if( (legacyTopoInput->cableWord2(0) &
mask) != 0 )
h1->Fill(
i);
568 if( (legacyTopoInput->cableWord2(1) &
mask) != 0 )
h1->Fill(32 +
i);
573 if( not m_iKeyTopo.empty() && m_doL1Topo ) {
575 if(topoInput.isValid()) {
576 ATH_MSG_DEBUG(
"Retrieved input from L1Topo from StoreGate with key " << m_iKeyTopo);
577 ATH_MSG_DEBUG(
"L1Topo0 word 0 is: 0x" << std::hex << std::setw( 8 ) << std::setfill(
'0' ) << topoInput->cableWord1(0));
578 ATH_MSG_DEBUG(
"L1Topo0 word 1 is: 0x" << std::hex << std::setw( 8 ) << std::setfill(
'0' ) << topoInput->cableWord1(1));
579 ATH_MSG_DEBUG(
"L1Topo1 word 0 is: 0x" << std::hex << std::setw( 8 ) << std::setfill(
'0' ) << topoInput->cableWord2(0));
580 ATH_MSG_DEBUG(
"L1Topo1 word 1 is: 0x" << std::hex << std::setw( 8 ) << std::setfill(
'0' ) << topoInput->cableWord2(1));
581 auto h0 = *get1DHist(
"/input/topo/Topo2El");
582 auto h1 = *get1DHist(
"/input/topo/Topo3El");
583 for(
unsigned int i=0;
i<32; ++
i) {
585 if( (topoInput->cableWord1(0) &
mask) != 0 )
h0->Fill(
i);
586 if( (topoInput->cableWord1(1) &
mask) != 0 )
h0->Fill(32 +
i);
587 if( (topoInput->cableWord2(0) &
mask) != 0 )
h1->Fill(
i);
588 if( (topoInput->cableWord2(1) &
mask) != 0 )
h1->Fill(32 +
i);
590 auto h2 = *get1DHist(
"/input/topo/Topo1Opt0");
591 auto h3 = *get1DHist(
"/input/topo/Topo1Opt1");
592 auto h4 = *get1DHist(
"/input/topo/Topo1Opt2");
593 auto h5 = *get1DHist(
"/input/topo/Topo1Opt3");
594 for(
unsigned int i=0;
i<128;
i += 3) {
595 std::bitset<128>
mask = 0x11;
mask <<=
i;
596 if( (topoInput->optcableWord(
"Topo1Opt0") &
mask) != 0 ) h2->Fill(
i);
597 if( (topoInput->optcableWord(
"Topo1Opt1") &
mask) != 0 ) h3->Fill(
i);
598 if( (topoInput->optcableWord(
"Topo1Opt2") &
mask) != 0 ) h4->Fill(
i);
599 if( (topoInput->optcableWord(
"Topo1Opt3") &
mask) != 0 ) h5->Fill(
i);
607 auto bcid = context.eventID().bunch_crossing_id();
608 get1DHist(
"/bcid")->Fill(
bcid);
610 return StatusCode::SUCCESS;
621 std::vector<std::string> connNames =
l1menu->connectorNames();
622 for (
const std::string connName : {
"LegacyTopo0",
"LegacyTopo1",
"Topo1El",
"Topo2El",
"Topo3El",
"Topo1Opt0",
"Topo1Opt1",
"Topo1Opt2",
"Topo1Opt3",
"CTPCAL",
"NIM2"})
624 if(
find(connNames.begin(), connNames.end(), connName) == connNames.end() ) {
627 bool opt_cable =
false;
628 std::bitset<128> cable128 {0};
630 if (connName.starts_with(
"Legacy")) {
631 if (m_iKeyLegacyTopo.empty() || !m_doL1CaloLegacy || !m_doL1TopoLegacy )
636 if (not topoInput.isValid()) {
639 if(connName ==
"LegacyTopo0") {
640 cable = ( (
uint64_t)topoInput->cableWord1( 1 ) << 32) + topoInput->cableWord1( 0 );
641 }
else if (connName ==
"LegacyTopo1") {
642 cable = ( (
uint64_t)topoInput->cableWord2( 1 ) << 32) + topoInput->cableWord2( 0 );
645 else if (connName.starts_with(
"CTPCAL") && m_doZDC)
648 if (not zdcInput.isValid())
652 cable =
static_cast<uint64_t>(zdcInput->cableWord0());
654 for (
auto &
tl :
conn.triggerLines()){
655 if (
tl.name().find(
"ZDC") == std::string::npos)
659 uint flatIndex =
tl.flatindex();
661 thrMultiMap[
tl.name()] = pass;
667 else if (connName.starts_with(
"NIM2"))
672 if (not trtInput.isValid())
676 cable =
static_cast<uint64_t>(trtInput->cableWord0());
678 for (
auto &
tl :
conn.triggerLines()){
679 if (
tl.name().find(
"TRT") == std::string::npos)
683 uint flatIndex =
tl.flatindex();
685 thrMultiMap[
tl.name()] = pass;
692 if (not zdcInput.isValid())
696 cable =
static_cast<uint64_t>(zdcInput->cableWord1());
698 for (
const auto &
tl :
conn.triggerLines()){
699 if (
tl.name().find(
"ZDC") == std::string::npos)
703 uint flatIndex =
tl.flatindex();
705 thrMultiMap[
tl.name()] = pass;
713 if (m_iKeyTopo.empty() || !m_doL1Topo )
718 if (not topoInput.isValid()) {
721 if(connName ==
"Topo1El") {
722 cable = ( (
uint64_t)topoInput->cableWord0( 1 ) << 32) + topoInput->cableWord0( 0 );
723 }
else if(connName ==
"Topo2El") {
724 cable = ( (
uint64_t)topoInput->cableWord1( 1 ) << 32) + topoInput->cableWord1( 0 );
725 }
else if (connName ==
"Topo3El") {
726 cable = ( (
uint64_t)topoInput->cableWord2( 1 ) << 32) + topoInput->cableWord2( 0 );
727 }
else if(connName ==
"Topo1Opt0") {
728 ATH_MSG_DEBUG(
"BIT word Topo1Opt0: " << topoInput->optcableWord( connName ));
730 cable128 = topoInput->optcableWord( connName );
731 }
else if(connName ==
"Topo1Opt1") {
732 ATH_MSG_DEBUG(
"BIT word Topo1Opt1: " << topoInput->optcableWord( connName ));
734 cable128 = topoInput->optcableWord( connName );
735 }
else if(connName ==
"Topo1Opt2") {
736 ATH_MSG_DEBUG(
"BIT word Topo1Opt2: " << topoInput->optcableWord( connName ));
738 cable128 = topoInput->optcableWord( connName );
739 }
else if(connName ==
"Topo1Opt3") {
740 ATH_MSG_DEBUG(
"BIT word Topo1Opt3: " << topoInput->optcableWord( connName ));
742 cable128 = topoInput->optcableWord( connName );
746 for(
uint fpga : {0,1}) {
747 for(
uint clock : {0,1}) {
748 for(
auto &
tl :
conn.triggerLines(fpga,clock)) {
749 uint flatIndex =
tl.flatindex();
752 pass = ((cable128 >> flatIndex).
test(0)) == 0 ? 0 : 1;
755 pass = (cable & (
static_cast<uint64_t>(0x1) << flatIndex)) == 0 ? 0 : 1;
757 if(
size_t pos =
tl.name().find(
'[');
pos == std::string::npos) {
758 thrMultiMap[
tl.name()] = pass;
761 auto thrName =
tl.name().substr(0,
pos);
762 int bit = std::stoi(
tl.name().substr(
pos+1));
763 thrMultiMap.try_emplace(thrName, 0);
764 thrMultiMap[thrName] += (pass << bit);
765 ATH_MSG_DEBUG(thrName <<
" MULT updated mult for topo " << pass);
771 for (
auto & thr :
l1menu->thresholds() ) {
772 if (thr->type() ==
"TOPO" or thr->type() ==
"MULTTOPO" or thr->type() ==
"MUTOPO")
776 if( thr->type() ==
"ZDC" && m_doZDC ){
779 if( thr->name() ==
"NIMTRT" && m_doTRT ){
783 unsigned int multiplicity = calculateMultiplicity(*thr,
l1menu, context);
785 thrMultiMap[thr->name()] = multiplicity;
786 ATH_MSG_DEBUG( thr->name() <<
" MULT calculated mult for topo " << multiplicity);
790 auto bcid = context.eventID().bunch_crossing_id();
791 if( m_forceBunchGroupPattern ) {
793 for (
size_t bg = 0;
bg < 16; ++
bg ) {
794 std::string bgName(
"BGRP");
796 thrMultiMap[bgName] = ( m_bunchGroupPattern & (0x1<<
bg) ) ? 1 : 0;
813 ATH_MSG_ERROR(
"Did not find L1BunchGroupSet in DetectorStore");
818 thrMultiMap[
"RNDM0"] = 1;
819 thrMultiMap[
"RNDM1"] = 1;
820 thrMultiMap[
"RNDM2"] = 1;
821 thrMultiMap[
"RNDM3"] = 1;
823 return StatusCode::SUCCESS;
829 unsigned int multiplicity = 0;
830 if( confThr.
type() ==
"JET" ) {
831 if(m_doL1CaloLegacy) {
833 if ( ctpinJet.isValid() ) {
834 if(
l1menu->connector(
"JET1").hasLine(confThr.
name()) ) {
835 auto & triggerline =
l1menu->connector(
"JET1").triggerLine(confThr.
name());
836 multiplicity =
CTPUtil::getMult( ctpinJet->cableWord0(), triggerline.startbit(), triggerline.endbit() );
837 }
else if(
l1menu->connector(
"JET2").hasLine(confThr.
name()) ) {
838 auto & triggerline =
l1menu->connector(
"JET2").triggerLine(confThr.
name());
839 multiplicity =
CTPUtil::getMult( ctpinJet->cableWord1(), triggerline.startbit(), triggerline.endbit() );
844 get2DHist(
"/multi/jet/" + confThr.
type() +
"Mult" )->Fill(confThr.
mapping(), multiplicity);
845 ATH_MSG_DEBUG(
"JET MULT calculated mult for threshold " << confThr.
name() <<
" : " << multiplicity);
852 unsigned int multiplicity (0);
853 if ( confThr.
name()[0]==
'e' ) {
855 if(!m_iKeyEFexCluster.empty()) {
856 float scale =
l1menu->getObject(
"thresholds.legacyCalo.EM.emscale").getValue<
float>();
858 for (
const auto cl : *eFexCluster ) {
859 float eta =
cl->eta();
860 int ieta =
int((eta + (eta>0 ? 0.005 : -0.005))/0.1);
861 unsigned int thrV = confThr.
thrValue( ieta );
862 bool clusterPasses = ( ((
unsigned int)
cl->et()) > (thrV *
scale) );
863 multiplicity += clusterPasses ? 1 : 0;
868 if(m_doL1CaloLegacy) {
870 if ( ctpinEM.isValid() ) {
871 if(
l1menu->connector(
"EM1").hasLine(confThr.
name()) ) {
872 auto & triggerline =
l1menu->connector(
"EM1").triggerLine(confThr.
name());
873 multiplicity =
CTPUtil::getMult( ctpinEM->cableWord0(), triggerline.startbit(), triggerline.endbit() );
874 }
else if(
l1menu->connector(
"EM2").hasLine(confThr.
name()) ) {
875 auto & triggerline =
l1menu->connector(
"EM2").triggerLine(confThr.
name());
876 multiplicity =
CTPUtil::getMult( ctpinEM->cableWord1(), triggerline.startbit(), triggerline.endbit() );
881 get2DHist(
"/multi/em/" + confThr.
type() +
"Mult" )->Fill(confThr.
mapping(), multiplicity);
882 ATH_MSG_DEBUG(
"EM MULT calculated mult for threshold " << confThr.
name() <<
" : " << multiplicity);
889 unsigned int multiplicity = 0;
890 if ( confThr.
name()[0]==
'e' ) {
895 if( eFexTaus.isValid() ) {
896 for (
const auto tau : *eFexTaus ) {
897 unsigned int eT = (
unsigned int) (accR3ClET(*tau)/1000.);
899 unsigned int etCut = confThr.
data().get_child(
"et").get_value<
unsigned int>();
900 bool tauPasses = (
eT >= etCut );
901 multiplicity += tauPasses ? 1 : 0;
906 if(m_doL1CaloLegacy) {
908 if ( ctpinEM.isValid() ) {
909 if(
l1menu->connector(
"TAU1").hasLine(confThr.
name()) ) {
910 auto & triggerline =
l1menu->connector(
"TAU1").triggerLine(confThr.
name());
911 multiplicity =
CTPUtil::getMult( ctpinEM->cableWord2(), triggerline.startbit(), triggerline.endbit() );
912 }
else if(
l1menu->connector(
"TAU2").hasLine(confThr.
name()) ) {
913 auto & triggerline =
l1menu->connector(
"TAU2").triggerLine(confThr.
name());
914 multiplicity =
CTPUtil::getMult( ctpinEM->cableWord3(), triggerline.startbit(), triggerline.endbit() );
919 get2DHist(
"/multi/tau/" + confThr.
type() +
"Mult" )->Fill(confThr.
mapping(), multiplicity);
920 ATH_MSG_DEBUG(
"TAU MULT calculated mult for threshold " << confThr.
name() <<
" : " << multiplicity);
927 unsigned int multiplicity = 0;
928 if ( confThr.
type() ==
"XE" or confThr.
type() ==
"TE" or confThr.
type() ==
"XS" ) {
930 if(m_doL1CaloLegacy) {
932 if ( ctpinEnergy.isValid() ) {
933 if(
l1menu->connector(
"EN1").hasLine(confThr.
name()) ) {
934 auto & triggerline =
l1menu->connector(
"EN1").triggerLine(confThr.
name());
935 multiplicity =
CTPUtil::getMult( ctpinEnergy->cableWord0(), triggerline.startbit(), triggerline.endbit() );
936 }
else if(
l1menu->connector(
"EN2").hasLine(confThr.
name()) ) {
937 auto & triggerline =
l1menu->connector(
"EN2").triggerLine(confThr.
name());
938 multiplicity =
CTPUtil::getMult( ctpinEnergy->cableWord1(), triggerline.startbit(), triggerline.endbit() );
945 if ( confThr.
name().find(
"gXENC")==0 ) {
946 rhk = & m_iKeyGFexMETNC;
948 }
else if ( confThr.
name().find(
"gXERHO")==0 ) {
949 rhk = & m_iKeyGFexMETRho;
951 }
else if ( confThr.
name().find(
"gXEJWOJ")==0 ) {
952 rhk = & m_iKeyGFexMETJwoJ;
955 rhk = & m_iKeyGFexMETJwoJ;
960 multiplicity = (
met->energyT()/1000. < confThr.
getAttribute<
unsigned int>(
"xe") ) ? 0 : 1;
963 if(confThr.
type() ==
"TE") {
964 get2DHist(
"/multi/te/" + confThr.
type() +
"Mult" )->Fill(confThr.
mapping(), multiplicity);
965 ATH_MSG_DEBUG(
"TE MULT calculated mult for threshold " << confThr.
name() <<
" : " << multiplicity);
966 }
else if(confThr.
type() ==
"XS") {
967 get2DHist(
"/multi/xs/" + confThr.
type() +
"Mult" )->Fill(confThr.
mapping(), multiplicity);
968 ATH_MSG_DEBUG(
"XS MULT calculated mult for threshold " << confThr.
name() <<
" : " << multiplicity);
970 get2DHist(
"/multi/xe/" + confThr.
type() +
"Mult" )->Fill(confThr.
mapping(), multiplicity);
971 ATH_MSG_DEBUG(
"XE MULT calculated mult for threshold " << confThr.
name() <<
" : " << multiplicity);
979 if(m_iKeyMuctpi.empty()) {
982 unsigned int multiplicity = 0;
984 if ( ctpinMuon.isValid() ) {
985 auto & triggerline =
l1menu->connector(
"MuCTPiOpt0").triggerLine(confThr.
name());
986 multiplicity =
CTPUtil::getMuonMult( ctpinMuon->muCTPIWord(), triggerline.startbit() + (m_muonRun2Format ? 1 : 0), triggerline.endbit()+ (m_muonRun2Format ? 1 : 0) );
988 get2DHist(
"/multi/muon/" + confThr.
type() +
"Mult" )->Fill(confThr.
mapping(), multiplicity);
989 ATH_MSG_DEBUG(
"MU MULT calculated mult for threshold " << confThr.
name() <<
" : " << multiplicity);
996 if(m_iKeyTopo.empty() || !m_doL1Topo ) {
999 unsigned int multiplicity = 0;
1001 std::string connector =
"";
1002 if (topoInput.isValid()) {
1003 connector =
l1menu->connectorNameFromThreshold(confThr.
name());
1004 auto & triggerline =
l1menu->connector(connector).triggerLine(confThr.
name());
1005 std::bitset<128> bits = topoInput->optcableWord(connector);
1008 std::string subfolder =
"";
1009 if (confThr.
type().find(
"XE") != std::string::npos) {
1011 }
else if (confThr.
type().find(
"TE") != std::string::npos) {
1013 }
else if (confThr.
type().find(
"TAU") != std::string::npos) {
1015 }
else if (confThr.
type().find(
"EM") != std::string::npos) {
1017 }
else if (confThr.
type().find(
"jJ") != std::string::npos) {
1019 }
else if (confThr.
type().find(
"jLJ") != std::string::npos) {
1021 }
else if (confThr.
type().find(
"gJ") != std::string::npos) {
1023 }
else if (confThr.
type().find(
"gLJ") != std::string::npos) {
1026 get2DHist(
"/multi/" + subfolder +
"/" + confThr.
type() +
"Mult" )->Fill(confThr.
mapping(), multiplicity);
1027 ATH_MSG_DEBUG(
"TOPO OPT input MULT calculated mult for threshold " << confThr.
name() <<
" : " << multiplicity <<
" received via connector: " << connector);
1029 return multiplicity;
1035 unsigned int multiplicity = 0;
1037 if (m_iKeyLegacyTopo.empty() || !m_doL1TopoLegacy )
1043 if(topoInput.isValid()) {
1045 std::string
conn(
"");
1046 if(
l1menu->connector(
"LegacyTopo0").hasLine(confThr.
name()) ) {
1047 conn =
"LegacyTopo0";
1048 cable = ( (
uint64_t)topoInput->cableWord1( 1 ) << 32) + topoInput->cableWord1( 0 );
1049 }
else if(
l1menu->connector(
"LegacyTopo1").hasLine(confThr.
name()) ) {
1050 conn =
"LegacyTopo1";
1051 cable = ( (
uint64_t)topoInput->cableWord2( 1 ) << 32) + topoInput->cableWord2( 0 );
1054 auto & triggerline =
l1menu->connector(
conn).triggerLine(confThr.
name());
1056 <<
", cable start " << triggerline.startbit() <<
" and end " << triggerline.endbit()
1057 <<
" double word 0x" << std::setw(16) << std::setfill(
'0') << std::hex << cable << std::dec << std::setfill(
' ') );
1058 multiplicity =
CTPUtil::getMultTopo( cable, triggerline.startbit(), triggerline.endbit(), triggerline.clock() );
1063 if (m_iKeyTopo.empty() || !m_doL1Topo )
1069 if(topoInput.isValid()) {
1071 std::string
conn(
"");
1072 if(
l1menu->connector(
"Topo2El").hasLine(confThr.
name()) ) {
1074 cable = ( (
uint64_t)topoInput->cableWord1( 1 ) << 32) + topoInput->cableWord1( 0 );
1075 }
else if(
l1menu->connector(
"Topo3El").hasLine(confThr.
name()) ) {
1077 cable = ( (
uint64_t)topoInput->cableWord2( 1 ) << 32) + topoInput->cableWord2( 0 );
1080 auto & triggerline =
l1menu->connector(
conn).triggerLine(confThr.
name());
1082 <<
", cable start " << triggerline.startbit() <<
" and end " << triggerline.endbit()
1083 <<
" double word 0x" << std::setw(16) << std::setfill(
'0') << std::hex << cable << std::dec << std::setfill(
' ') );
1084 multiplicity =
CTPUtil::getMultTopo( cable, triggerline.startbit(), triggerline.endbit(), triggerline.clock() );
1088 return multiplicity;
1094 unsigned int multiplicity = 0;
1096 if ( confThr.
type() ==
"EM" ) {
1097 multiplicity = calculateEMMultiplicity( confThr,
l1menu, context );
1098 }
else if ( confThr.
type() ==
"TAU" ) {
1099 multiplicity = calculateTauMultiplicity( confThr,
l1menu, context );
1100 }
else if ( confThr.
type() ==
"XE" || confThr.
type() ==
"TE" || confThr.
type() ==
"XS" ) {
1101 multiplicity = calculateMETMultiplicity( confThr,
l1menu, context );
1102 }
else if ( confThr.
type() ==
"JET" ) {
1103 multiplicity = calculateJetMultiplicity( confThr,
l1menu, context );
1104 }
else if ( confThr.
type() ==
"MU" ) {
1105 multiplicity = calculateMuonMultiplicity( confThr,
l1menu, context );
1106 }
else if ( confThr.
type() ==
"R2TOPO") {
1107 multiplicity = calculateTopoMultiplicity( confThr,
l1menu, context,
true );
1108 }
else if ( confThr.
type() ==
"TOPO" ) {
1109 multiplicity = calculateTopoMultiplicity( confThr,
l1menu, context, m_doL1TopoLegacy);
1110 }
else if ( confThr.
type()[0] ==
'e' || confThr.
type()[0] ==
'c' || confThr.
type()[0] ==
'j' || confThr.
type()[0] ==
'g' ){
1111 multiplicity = calculateTopoOptMultiplicity( confThr,
l1menu, context );
1115 ATH_MSG_FATAL(
"Caught exception when calculating multiplicity for threshold " << confThr.
name() <<
": " << ex.what());
1119 return multiplicity;
1124 const EventContext& context)
const
1127 std::vector<uint32_t> tip;
1128 CHECK( m_resultBuilder->constructTIPVector( thrMultiMap, tip ) );
1130 std::map<std::string, unsigned int> itemDecisionMap;
1131 CLHEP::HepRandomEngine* rndmEngine = m_RNGEngines.getEngine( context );
1132 CHECK( m_resultBuilder->buildItemDecision(thrMultiMap, itemDecisionMap, rndmEngine) );
1134 std::vector<uint32_t> tbp;
1135 std::vector<uint32_t>
tap;
1136 std::vector<uint32_t> tav;
1138 CHECK( m_resultBuilder->constructResultVectors( itemDecisionMap, tbp,
tap, tav,
triggerType ) );
1144 auto eventID = context.eventID();
1145 std::unique_ptr<CTP_RDO> rdo = m_resultBuilder->constructRDOResult( eventID, tbp,
tap, tav, tip,
extra );
1146 std::unique_ptr<CTPSLink> roi = m_resultBuilder->constructRoIResult( eventID, tbp,
tap, tav, tip,
extra,
triggerType );
1151 ATH_CHECK( rdoWriteHandle.record( std::move(rdo) ));
1152 ATH_CHECK( sLinkWriteHandle.record( std::move(roi) ));
1156 auto tbpById = *get1DHist(
"/output/tbpById" );
1157 auto tapById = *get1DHist(
"/output/tapById" );
1158 auto tavById = *get1DHist(
"/output/tavById" );
1159 for(
unsigned int ctpId= 0; ctpId < 512; ++ctpId ) {
1160 unsigned int wordNr = ctpId / 32;
1161 unsigned int posWithinWord = ctpId % 32;
1162 auto mask = 1
L << posWithinWord;
1163 if( 0 != (tbp[wordNr] &
mask) ) {
1164 tbpById->Fill( ctpId );
1166 if( 0 != (
tap[wordNr] &
mask) ) {
1167 tapById->Fill( ctpId );
1169 if( 0 != (tav[wordNr] &
mask) ) {
1170 tavById->Fill( ctpId );
1174 return StatusCode::SUCCESS;
1184 constexpr
unsigned int sizeOfCTPOutput = 512;
1186 unsigned int tbp[sizeOfCTPOutput];
1187 unsigned int tap[sizeOfCTPOutput];
1188 unsigned int tav[sizeOfCTPOutput];
1190 auto h = *get1DHist(
"/output/tbpById" );
1191 for(
unsigned int id = 0;
id < sizeOfCTPOutput; ++
id ) tbp[
id] =
h->GetBinContent(
id+1);
1194 auto h = *get1DHist(
"/output/tapById" );
1195 for(
unsigned int id = 0;
id < sizeOfCTPOutput; ++
id )
tap[
id] =
h->GetBinContent(
id+1);
1198 auto h = *get1DHist(
"/output/tavById" );
1199 for(
unsigned int id = 0;
id < sizeOfCTPOutput; ++
id ) tav[
id] =
h->GetBinContent(
id+1);
1204 auto htbp = *get1DHist(
"/output/tbpByName" );
1205 auto htap = *get1DHist(
"/output/tapByName" );
1206 auto htav = *get1DHist(
"/output/tavByName" );
1208 unsigned int ctpId =
item.ctpId();
1209 htbp->Fill(
item.name().c_str(), tbp[ctpId]);
1210 htap->Fill(
item.name().c_str(),
tap[ctpId]);
1211 htav->Fill(
item.name().c_str(), tav[ctpId]);
1216 htbp->LabelsDeflate();
1217 htap->LabelsDeflate();
1218 htav->LabelsDeflate();
1225 std::vector<std::string> thrHists{
"em/EM",
"muon/MU",
"tau/TAU",
"jet/JET",
"xe/XE",
"te/TE",
"xs/XS" };
1226 auto hist = * get2DHist(
"/multi/all/LegacyMult" );
1227 for(
const std::string &
histpath : thrHists) {
1228 auto h = * get2DHist(
"/multi/" +
histpath +
"Mult" );
1229 auto xaxis =
h->GetXaxis();
1230 size_t xsize = xaxis->GetNbins();
1231 size_t ysize =
h->GetNbinsY();
1232 for(
size_t x = 1;
x<xsize;
x++) {
1234 for(
size_t y = 1;
y<=ysize;
y++) {
1235 size_t binContent =
h->GetBinContent(
x,
y);
1236 hist->Fill(xaxis->GetBinLabel(
x),
y-1,binContent);
1239 ATH_MSG_DEBUG(
"REGTEST CTPSim " << xaxis->GetBinLabel(
x) <<
" MULT " <<
s);
1243 hist->LabelsDeflate();
1247 auto hist = * get2DHist(
"/multi/all/R3Mult" );
1248 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" };
1249 for(
const std::string &
histpath : thrHists) {
1250 auto h = * get2DHist(
"/multi/" +
histpath +
"Mult" );
1251 auto xaxis =
h->GetXaxis();
1252 size_t xsize = xaxis->GetNbins();
1253 size_t ysize =
h->GetNbinsY();
1254 for(
size_t x = 1;
x<=xsize;
x++) {
1256 for(
size_t y = 1;
y<=ysize;
y++) {
1257 size_t binContent =
h->GetBinContent(
x,
y);
1258 hist->Fill(xaxis->GetBinLabel(
x) ,
y-1, binContent);
1261 ATH_MSG_DEBUG(
"REGTEST CTPSim " << xaxis->GetBinLabel(
x) <<
" MULT " <<
s);
1265 hist->LabelsDeflate();
1271 " TBP " << tbp[
item.ctpId()] <<
1272 " TAP " <<
tap[
item.ctpId()] <<
1273 " TAV " << tav[
item.ctpId()]);
1276 return StatusCode::SUCCESS;
1285 std::vector<std::string> storedPaths;
1286 for(
auto &
entry : m_hist1D ) {
1287 storedPaths.push_back( getBaseHistPath() +
entry.first);
1289 for(
auto &
entry : m_hist2D ) {
1290 storedPaths.push_back( getBaseHistPath() +
entry.first);
1292 std::scoped_lock<std::mutex> metadataLock(s_metadataMutex);
1293 for (
const auto &
path : storedPaths) {
1294 size_t pos =
path.find_last_of(
'/');
1295 auto splitPath = std::make_pair(
path.substr(0,
pos),
path.substr(
pos + 1));
1296 std::string treePath = splitPath.first +
"/metadata";
1298 char triggerData[] =
"<none>";
1299 const std::string mergeDataStr =
"<default>";
1300 std::vector<char> mergeData{mergeDataStr.begin(), mergeDataStr.end()};
1301 mergeData.push_back(
'\0');
1303 if (!m_histSvc->existsTree(treePath)) {
1304 auto tree = std::make_unique<TTree>(
"metadata",
"Monitoring Metadata");
1305 tree->SetDirectory(
nullptr);
1306 tree->Branch(
"Name", &(splitPath.second[0]),
"Name/C");
1307 tree->Branch(
"Interval", &(
interval[0]),
"Interval/C");
1308 tree->Branch(
"TriggerChain", triggerData,
"TriggerChain/C");
1309 tree->Branch(
"MergeMethod", mergeData.data(),
"MergeMethod/C");
1311 if (!m_histSvc->regTree(treePath, std::move(
tree))) {
1314 <<
"Failed to register DQ metadata TTree " << treePath <<
endmsg;
1317 TTree *
tree{
nullptr};
1318 if (m_histSvc->getTree(treePath,
tree).isSuccess()) {
1319 tree->SetBranchAddress(
"Name", &(splitPath.second[0]));
1321 tree->SetBranchAddress(
"TriggerChain", triggerData);
1322 tree->SetBranchAddress(
"MergeMethod", mergeData.data());
1327 <<
"Failed to retrieve DQ metadata TTree " << treePath <<
" which is reported to exist" <<
endmsg;
1331 return StatusCode::SUCCESS;