ATLAS Offline Software
MistimedStreamMonitorAlgorithm.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 
8 #include <iostream>
9 #include <vector>
10 #include <TMath.h>
11 
12 MistimedStreamMonitorAlgorithm::MistimedStreamMonitorAlgorithm( const std::string& name, ISvcLocator* pSvcLocator )
13  : AthMonitorAlgorithm(name,pSvcLocator)
14 {
15 }
16 
18 
19  ATH_MSG_DEBUG("MistimedStreamMonitorAlgorith::initialize");
20  ATH_MSG_DEBUG("Package Name "<< m_packageName);
21  ATH_MSG_DEBUG("m_xAODTriggerTowerContainerName "<< m_xAODTriggerTowerContainerName);
22 
23  ATH_MSG_INFO("m_eFexEMContainer: "<< m_eFexEMContainerKey);
24  ATH_MSG_INFO("m_eFexEMOutContainer: "<< m_eFexEMOutContainerKey);
25  ATH_MSG_INFO("m_eFexTauContainer: "<< m_eFexTauContainerKey);
26 
27  // we initialise all the containers that we need
30  ATH_CHECK( m_cpmTowerLocation.initialize());
31  ATH_CHECK( m_jetElementLocation.initialize());
32  ATH_CHECK( m_trigDec.retrieve() );
33  ATH_CHECK( m_ttTool.retrieve());
37 
38  // eFex Container
39  ATH_CHECK( m_eFexEMContainerKey.initialize() );
40  ATH_CHECK( m_eFexEMOutContainerKey.initialize() );
41  ATH_CHECK( m_eFexTauContainerKey.initialize() );
42 
43  // jFex Container
44  ATH_CHECK( m_jFexLRJetContainerKey.initialize() );
45  ATH_CHECK( m_jFexSRJetContainerKey.initialize() );
46  ATH_CHECK( m_jFexTauContainerKey.initialize() );
47  ATH_CHECK( m_jFexDataTowerKey.initialize() );
48  ATH_CHECK( m_EmulTowerKey.initialize() );
49 
50  // gFex Container
51  ATH_CHECK( m_gFexJetTobKeyList.initialize() ) ;
52 
54 }
55 
57 
58  ATH_MSG_DEBUG("MistimedStreamMonitorAlgorith::fillHistograms");
59 
60  // Retrieve L1CaloRunParametersContainer
62  ATH_CHECK(runParameters.isValid());
63 
64  unsigned int readoutConfigID = runParameters->runParameters(1)->readoutConfigID();
65  ATH_MSG_DEBUG("RunParameters:: readoutConfigID " << readoutConfigID);
66 
68 
69  unsigned int channelID = 0;
70  unsigned int numFadcSlices = 0;
71  unsigned int l1aFadcSlice = 0;
72  unsigned int readout80ModePpm = 0;
73 
74  //the readout config ID tells you, which readoutConfig is loaded. now you can retrieve the l1aFadcSlice from this DB entry
75  if ( readoutConfigJSON->readoutConfigJSON(readoutConfigID)->channelId() == readoutConfigID){
76  ATH_MSG_DEBUG("readoutConfigID " << readoutConfigID);
77  channelID = readoutConfigJSON->readoutConfigJSON(readoutConfigID)->channelId();
78  numFadcSlices = readoutConfigJSON->readoutConfigJSON(readoutConfigID)->numFadcSlices();
79  l1aFadcSlice = readoutConfigJSON->readoutConfigJSON(readoutConfigID)->l1aFadcSlice();
80  readout80ModePpm = readoutConfigJSON->readoutConfigJSON(readoutConfigID)->readout80ModePpm();
81  ATH_MSG_DEBUG("channelID :: " << channelID);
82  ATH_MSG_DEBUG("numFadcSlices :: " << numFadcSlices);
83  ATH_MSG_DEBUG("l1aFadcSlice :: " << l1aFadcSlice);
84  ATH_MSG_DEBUG("readout80ModePpm :: " << readout80ModePpm);
85  }
86 
87  // Retrieve jetElementfrom SG
89  if(!jetElementTES.isValid()){
90  ATH_MSG_ERROR("No JetElement container found in TES "<< m_jetElementLocation);
91  return StatusCode::FAILURE;
92  }
93 
94  // Retrieve Core CPM Towers from SG
96  if(!cpmTowerTES.isValid()){
97  ATH_MSG_ERROR("No CPMTower container found in TES "<< m_cpmTowerLocation);
98  return StatusCode::FAILURE;
99  }
100 
101  // Retrieve Trigger Towers from SG
103  if(!triggerTowerTES.isValid()){
104  ATH_MSG_ERROR("No Trigger Tower container found in TES "<< m_xAODTriggerTowerContainerName);
105  return StatusCode::FAILURE;
106  }
107 
108  // Retrieve EventInfo from SG and save lumi block number, global event number and run number
109  unsigned int lumiNo = GetEventInfo(ctx)->lumiBlock();
110  unsigned int currentRunNo = ctx.eventID().run_number();
111  unsigned int currentEventNo = ctx.eventID().event_number();
112 
113  ATH_MSG_DEBUG("Lumi Block :: " << lumiNo);
114  ATH_MSG_DEBUG("Run Number :: " << currentRunNo);
115  ATH_MSG_DEBUG("Event Number :: " << currentEventNo);
116 
117  Monitored::Scalar<int> cutFlowX = Monitored::Scalar<int>("cutFlowX", 0);
118 
119  // fill first bin in cutflow
120  cutFlowX=All;
121  fill(m_packageName,cutFlowX);
122 
123  //for the algorithm to run, we need the 2 adc slices before and after the l1a-slice
124  //readout compatibility checks of the algo here
125  if(readout80ModePpm){
126  if(numFadcSlices < 9){
127  ATH_MSG_DEBUG("Number of ADC slices < 9 for 80 MHz readout, algorithm cannot run, aborting...");
128  return StatusCode::SUCCESS;
129  }
130  if(l1aFadcSlice < 4){
131  ATH_MSG_DEBUG("L1a readout pointer < 4 for 80 MHz readout, algorithm cannot run, aborting...");
132  return StatusCode::SUCCESS;
133  }
134  if(numFadcSlices - l1aFadcSlice < 4){
135  ATH_MSG_DEBUG("L1a readout pointer is at "<< l1aFadcSlice << " with "<< numFadcSlices << "slices at 80 MHz readout mode, algorithm cannot run, aborting...");
136  return StatusCode::SUCCESS;
137  }
138  }
139  else {
140  if(numFadcSlices < 5){
141  ATH_MSG_DEBUG("Number of ADC slices < 5 for 40 MHz readout, algorithm cannot run, aborting...");
142  return StatusCode::SUCCESS;
143  }
144  if(l1aFadcSlice < 2){
145  ATH_MSG_DEBUG("L1a readout pointer < 2 for 40 MHz readout, algorithm cannot run, aborting...");
146  return StatusCode::SUCCESS;
147  }
148  if(numFadcSlices - l1aFadcSlice < 2){
149  ATH_MSG_DEBUG("L1a readout pointer is at "<< l1aFadcSlice << " with "<< numFadcSlices << "slices at 40 MHz readout mode, algorithm cannot run, aborting...");
150  return StatusCode::SUCCESS;
151  }
152  }
153  cutFlowX=UnsuitableReadout;
154  fill(m_packageName,cutFlowX);
155 
156  //Select events that fired HLT_mistimedmonj400
157  if(! (m_trigDec->isPassed("HLT_mistimemonj400_L1All",TrigDefs::requireDecision))){
158  ATH_MSG_DEBUG("TrigDec don't pass HLT_mistimemonj400_L1All");
159  return StatusCode::SUCCESS;
160  }
161 
162  cutFlowX=HLT_mistimemonj400;
163  fill(m_packageName,cutFlowX);
164 
165  //Only select events which passed the L1_J100, L1_jJ160, L1_eEM26M, L1_j5400, L1_gLJ140p0ETA25 or L1_gJ400p0ETA25
166  //Adjustable depending on which trigger we are interested
167  if (m_usephaseI) {
168  if(! ( (m_trigDec->isPassed("L1_eEM26M")) or
169  (m_trigDec->isPassed("L1_gLJ140p0ETA25")) or
170  (m_trigDec->isPassed("L1_gJ400p0ETA25")) or
171  (m_trigDec->isPassed("L1_jJ160")) or
172  (m_trigDec->isPassed("L1_jJ500"))
173  ) ){
174  ATH_MSG_DEBUG("TrigDec doesn't pass");
175  return StatusCode::SUCCESS;
176  }
177  }
178 
179  else if (m_uselegacy) {
180  if(! (m_trigDec->isPassed("L1_J100")) ){
181  ATH_MSG_DEBUG("TrigDec doesn't pass");
182  return StatusCode::SUCCESS;
183  }
184  }
185 
186  else {
187  ATH_MSG_ERROR("No trigger selected...aborting");
188  return StatusCode::FAILURE;
189  }
190 
191  //Define trigger for subsequent cuts
192  bool legacyTrigger= false;
193  bool phase1Trigger= false;
194  std::string trigger = "";
195 
196  if ((m_uselegacy) and (m_trigDec->isPassed("L1_J100")) ) {
197  legacyTrigger= true;
198  }
199  else if (m_usephaseI) {
200  if (m_trigDec->isPassed("L1_eEM26M")) {
201  phase1Trigger= true;
202  trigger = "eFex";
203  }
204  if ((m_trigDec->isPassed("L1_jJ160"))or (m_trigDec->isPassed("L1_jJ500"))) {
205  phase1Trigger= true;
206  trigger = "jFex";
207  }
208  if ( (m_trigDec->isPassed("L1_gJ400p0ETA25")) or (m_trigDec->isPassed("L1_gLJ140p0ETA25")) ) {
209  phase1Trigger= true;
210  trigger = "gFex";
211  }
212  }
213 
214  cutFlowX=L1_Trigger;
215  fill(m_packageName,cutFlowX);
216 
217 
218  // now classify the tower signals by looking at their FADC counts, if it exceeds 70
219  int good3Counter = 0; // category 5 good peak 3
220  int good2Counter = 0; // category 5 good peak 2
221  int eFexintimeCounter = 0; // in-time TOBs
222  int eFexoutoftimeCounter = 0; // out-of-time TOBs
223  int jFexCounter = 0; // in-time TOBs
224  int gFexCounter = 0; // in-time TOBs
225 
226  double dEta = 0., dPhi = 0., dPhi1 = 0., dR = 0.;
227  double etaIn = 0., phiIn = 0., etIn = 0.;
228  double etaOut = 0., phiOut = 0., etOut = 0.;
229  bool overlap = false;
230 
232  if(!jFexSRJetContainer.isValid()) {
233  ATH_MSG_WARNING("No jFex SR Jet container found in storegate "<< m_jFexSRJetContainerKey<<". Will be skipped!");
234  }
235 
236  // =====================================================================
237  // ================= Container: TriggerTower ===========================
238  // =====================================================================
239 
240  // Creating a new container for saving pulseClassification
241  std::unique_ptr<xAOD::TriggerTowerContainer> ttContainer = std::make_unique<xAOD::TriggerTowerContainer>();
242  std::unique_ptr<xAOD::TriggerTowerAuxContainer> ttContainerAux = std::make_unique<xAOD::TriggerTowerAuxContainer>();
243  ttContainer->setStore(ttContainerAux.get());
244 
245  static const SG::Accessor<float> pulseClassificationAcc("pulseClassification");
246 
247  // Creating a new container for TT with pulseClassification
248  for (const xAOD::TriggerTower* tt : *triggerTowerTES) {
249 
250  float ttPulseCategory = 0;
251  const std::vector<uint16_t>& ttADC = (tt)->adc();
252  std::vector<uint16_t> readoutCorrectedADC; //this is the standard readout ADC vector: 5 40MHz samples with l1A in the middle
253  if(!readout80ModePpm){//40 MHz
254  //just acess the acd vector, as the sanity checks where done above
255  readoutCorrectedADC.push_back(ttADC.at(l1aFadcSlice-2));
256  readoutCorrectedADC.push_back(ttADC.at(l1aFadcSlice-1));
257  readoutCorrectedADC.push_back(ttADC.at(l1aFadcSlice));
258  readoutCorrectedADC.push_back(ttADC.at(l1aFadcSlice+1));
259  readoutCorrectedADC.push_back(ttADC.at(l1aFadcSlice+2));
260  }
261  else{//80 MHz
262  readoutCorrectedADC.push_back(ttADC.at(l1aFadcSlice-4));
263  readoutCorrectedADC.push_back(ttADC.at(l1aFadcSlice-2));
264  readoutCorrectedADC.push_back(ttADC.at(l1aFadcSlice));
265  readoutCorrectedADC.push_back(ttADC.at(l1aFadcSlice+2));
266  readoutCorrectedADC.push_back(ttADC.at(l1aFadcSlice+4));
267  }
268 
269  // retrieve max ADC value and position, this seems to be buggy in the DAOD
270  auto maxValIterator = std::max_element(readoutCorrectedADC.begin(), readoutCorrectedADC.end());
271  int maxADCval = *maxValIterator;
272  int adcPeakPositon = std::distance(std::begin(readoutCorrectedADC), maxValIterator);
273 
274  if(maxADCval < 70){
275  ttPulseCategory = 0.1;
276  }
277  else if(maxADCval == 1023) {
278  ttPulseCategory = 1;
279  }
280  else{
281  bool goodQual = pulseQuality(readoutCorrectedADC, adcPeakPositon);
282  //look at any of the five FADC values
283  if(adcPeakPositon == 2){ // can be class 3 or 4 now
284  if(goodQual){
285  //nicely peaking TT in BCID0
286  good2Counter++;
287  ttPulseCategory = 3;
288  }
289  else{
290  //badly peaking TT in BCID0
291  ttPulseCategory = 4;
292  }
293  }
294  else if(adcPeakPositon == 3){ // can be class 5 or 6 now
295  if(goodQual){
296  //nicely peaking TT in BCID+1
297  good3Counter++;
298  ttPulseCategory = 5;
299  }
300  else{
301  //badly peaking TT in BCID+1
302  ttPulseCategory = 6;
303  }
304  }
305  else{
306  //TT peaking in BCID-1,-2 or +2
307  ttPulseCategory = 2;
308  }
309 
310  if (trigger == "jFex") {
312  CHECK( evtStore()->retrieve( jFexSRJetRoI, "L1_jFexSRJetRoI" ) );
313  for(auto tob : *jFexSRJetRoI) {
314  etaIn = tob->eta();
315  phiIn = tob->phi();
316  etIn = tob->tobEt()/5;
317 
318  if( (adcPeakPositon == 3) and (goodQual) ) {
319  etaOut = tt->eta();
320  phiOut = tt->phi()-M_PI;
321  dEta = std::abs(etaIn-etaOut);
322  dPhi = std::abs(phiIn-phiOut);
323  if ((phiIn < 0) and (phiOut > 0)){
324  dPhi1 = std::abs((phiIn+2*M_PI)-phiOut);
325  if (dPhi1 < dPhi) {
326  dPhi = dPhi1;
327  }
328  }
329  else if ((phiIn > 0) and (phiOut < 0)){
330  dPhi1 = std::abs(phiIn-(phiOut+2*M_PI));
331  if (dPhi1 < dPhi) {
332  dPhi = dPhi1;
333  }
334  }
335  dR = TMath::Sqrt(dEta*dEta+dPhi*dPhi);
336  if ((dR < .2) and (etIn > 160.)) {
337  overlap = true;
338  }
339  } // if statement - good tt
340  } // for loop - jFex TOBs
341  } // if statement - jFex
342 
343  if (trigger == "gFex") {
344 
345  for (const auto& key : m_gFexJetTobKeyList){
347  // Check that this container is present
348  if ( !jetContainer.isValid() ) {
349  ATH_MSG_WARNING("No gFex jet container found in storegate: "<< key.key());
350  }
351  else {
353  CHECK( evtStore()->retrieve( gFexJetRoI, key.key() ) );
354  for(auto tob : *gFexJetRoI) {
355  etaIn = tob->eta();
356  phiIn = tob->phi();
357  etIn = tob->gFexTobEt()/10;
358 
359  if( (adcPeakPositon == 3) and (goodQual) ) {
360  etaOut = tt->eta();
361  phiOut = tt->phi()-M_PI;
362  dEta = std::abs(etaIn-etaOut);
363  dPhi = std::abs(phiIn-phiOut);
364  if ((phiIn < 0) and (phiOut > 0)){
365  dPhi1 = std::abs((phiIn+2*M_PI)-phiOut);
366  if (dPhi1 < dPhi) {
367  dPhi = dPhi1;
368  }
369  }
370  else if ((phiIn > 0) and (phiOut < 0)){
371  dPhi1 = std::abs(phiIn-(phiOut+2*M_PI));
372  if (dPhi1 < dPhi) {
373  dPhi = dPhi1;
374  }
375  }
376  dR = TMath::Sqrt(dEta*dEta+dPhi*dPhi);
377  if ((dR < .2) and (etIn > 100.)) {
378  overlap = true;
379  }
380  } // if statement - good tt
381  } // for loop - gFex TOBs
382  } // else stamement - valid container
383  } // for loop - gFex container
384  } // if statement - gFex
385 
386  }
387 
388  // decorate the TT in order to have to recompute the pulse categorisation
389  xAOD::TriggerTower* newTT = new xAOD::TriggerTower; //create a new TT object
390  ttContainer->push_back(newTT); // add the newTT to new output TT container (at the end of it)
391  *newTT = *(tt);// copy over all information from TT to newTT
392  pulseClassificationAcc(*newTT) = ttPulseCategory; //decorate
393  }
394 
395  // count all eFex in-time and out-of-time TOBs with at least 5GeV
396  for(auto key : {"L1_eEMxRoI","L1_eEMxRoIOutOfTime"}) {
397 
398  const xAOD::eFexEMRoIContainer* emTobs;
399  CHECK( evtStore()->retrieve( emTobs, key ) );
400 
401  for(auto tob : *emTobs) {
402  if (tob->et() > 5000) { //eFex TOB energy in MeV
403  if (tob->bcn4() == ((ctx.eventID().bunch_crossing_id()) & 0xf )) {
404  eFexintimeCounter++;
405  }
406  else if (tob->bcn4() == (((ctx.eventID().bunch_crossing_id())+1) & 0xf )) {
407  eFexoutoftimeCounter++;
408  }
409  }
410  }
411 
412  }
413 
414  // count all gFex in-time TOBs with at least 5GeV
415  const xAOD::gFexJetRoIContainer* gFexLRJetRoI;
416  CHECK( evtStore()->retrieve( gFexLRJetRoI, "L1_gFexLRJetRoI" ) );
417  for(auto tob : *gFexLRJetRoI) {
418  if (tob->et() > 50) { //gFex TOB energy in 0.1GeV
419  gFexCounter++;
420  }
421  }
422 
423  // count all jFex in-time TOBs with at least 5GeV
424  const xAOD::jFexSRJetRoIContainer* jFexJetRoI;
425  CHECK( evtStore()->retrieve( jFexJetRoI, "L1_jFexSRJetRoI" ) );
426  for(auto tob : *jFexJetRoI) {
427  if (tob->et() > 25) { //jFex TOB energy in 0.2GeV
428  jFexCounter++;
429  }
430  }
431 
432  if( (good3Counter < 2) or ((trigger == "eFex") and (eFexoutoftimeCounter < 2)) ){
433  //reject events with less than 2 pulses nicely peaking in slice 3
434  return StatusCode::SUCCESS;
435  }
436  cutFlowX=lateTT;
437  fill(m_packageName,cutFlowX);
438 
439  if( (good2Counter > 3) or
440  ((trigger == "eFex") and (eFexintimeCounter > 3)) or
441  ((trigger == "jFex") and (jFexCounter > 3)) or
442  ((trigger == "gFex") and (gFexCounter > 3)) ){
443  //reject events with more than 3 pulses nicely peaking/ 3 TOBs in slice 2 to avoid event being triggered by pileup
444  return StatusCode::SUCCESS;
445  }
446  cutFlowX= InTime;
447  fill(m_packageName,cutFlowX);
448 
449  if (trigger == "eFex") {
450  const xAOD::eFexEMRoIContainer* emTobs;
451  CHECK( evtStore()->retrieve( emTobs, "L1_eEMxRoI" ) );
452  const xAOD::eFexEMRoIContainer* emTobsOut;
453  CHECK( evtStore()->retrieve( emTobsOut, "L1_eEMxRoIOutOfTime" ) );
454 
455  for(auto tob : *emTobs) {
456  etaIn = tob->eta();
457  phiIn = tob->phi();
458  etIn = tob->et()/1000; //eT in GeV
459 
460  for(auto tobOut : *emTobsOut) {
461  etaOut = tobOut->eta();
462  phiOut = tobOut->phi();
463  etOut = tobOut->et()/1000; //eT in GeV
464 
465  dEta = std::abs(etaIn-etaOut);
466  dPhi = std::abs(phiIn-phiOut);
467  if ((phiIn < 0) and (phiOut > 0)){
468  dPhi1 = std::abs((phiIn+2*M_PI)-phiOut);
469  if (dPhi1 < dPhi) {
470  dPhi = dPhi1;
471  }
472  }
473  else if ((phiIn > 0) and (phiOut < 0)){
474  dPhi1 = std::abs(phiIn-(phiOut+2*M_PI));
475  if (dPhi1 < dPhi) {
476  dPhi = dPhi1;
477  }
478  }
479  dR = TMath::Sqrt(dEta*dEta+dPhi*dPhi);
480  if ((dR < .2) and (etIn > 26.) and (etOut > 26.)){
481  overlap = true;
482  }
483  }
484  }
485  }
486 
487  if ((legacyTrigger) and !(phase1Trigger)){
488  overlap = true;
489  }
490 
491  if(overlap==false){
492  //reject events where BCID and BCID+1 are spatially separated
493  return StatusCode::SUCCESS;
494  }
495  cutFlowX= EtaPhiOverlap;
496  fill(m_packageName,cutFlowX);
497 
498 
499  // scope for mutable error event per lumi block tt counter
500  // it allows only one event per lumiblock
501  std::lock_guard<std::mutex> lock(m_mutex);
502  m_event_counter[lumiNo]+=1;
503  const int eventCounter = m_eventCounter++;
504 
505  if( (m_event_counter[lumiNo] <m_maxEvents) && (eventCounter < m_maxEvents) ){
506  ATH_MSG_DEBUG( "EventID :: " << m_event_counter[lumiNo]);
507 
508  // Saving the lumiblock and event number of the events with mistimed
509  auto eventMonitor_legacy= Monitored::Scalar<std::string>("eventMonitor_legacy", "Event"+std::to_string(eventCounter)+"="+std::to_string(currentEventNo));
510  auto eventMonitor_phaseI= Monitored::Scalar<std::string>("eventMonitor_phaseI", "Event"+std::to_string(eventCounter)+"_"+trigger+"="+std::to_string(currentEventNo));
511  auto lbMonitor= Monitored::Scalar<std::string>("lbMonitor", std::to_string(lumiNo));
512  std::string groupName = "Event_";
513  if (legacyTrigger) {
514  fill(groupName, eventMonitor_legacy, lbMonitor );
515  }
516  if (phase1Trigger) {
517  fill(groupName, eventMonitor_phaseI, lbMonitor );
518  }
519 
520  // Create a vector of trigger towers with quantities to be monitored
521  std::vector<MonitorTT> vecMonTTDecor; // All towers
522 
523  // Loop over trigger tower container
524  //Create the trigger tower objects and calculate scaled phi
525  for (const xAOD::TriggerTower* tt : *ttContainer) {
526  ATH_CHECK( makeTowerPPM(tt, vecMonTTDecor) );
527  ATH_MSG_DEBUG( "tt->pulseClassification :: " << pulseClassificationAcc(*tt));
528  }
529 
530  groupName = "EventofInterest_" + std::to_string(eventCounter) + "_";
531  auto bcidWord = Monitored::Scalar<uint8_t>("bcidWord", 0);
532  auto pulseCat = Monitored::Scalar<float>("pulseCat", 0);
533 
534  for (auto& myTower : vecMonTTDecor) {
535  ATH_MSG_DEBUG(" looping over TTs");
536  const int layer = (myTower.tower)->layer();
537  pulseCat = pulseClassificationAcc(*myTower.tower);
538  bcidWord = (myTower.tower)->bcidVec()[0]; // look at the status bit in the central time slice
539  ATH_MSG_DEBUG("groupName :: " << groupName);
540 
541  // Check if TT is in EM or HAD layer:
542  if (layer == 0) { //========== ELECTROMAGNETIC LAYER =========================
543  ATH_CHECK( fillPPMEtaPhi(myTower, groupName+"TT_EM", "pulseCat", pulseCat) );
544  if(pulseCat > 0.5 && bcidWord > 0) {
545  ATH_CHECK( fillPPMEtaPhi(myTower, groupName+"TT_EM", "bcidWord", bcidWord) );
546  }
547  }
548  else if(layer == 1 ) { //========== HADRONIC LAYER ===============================
549  ATH_CHECK( fillPPMEtaPhi(myTower, groupName+"TT_HAD", "pulseCat", pulseCat) );
550  if(pulseCat > 0.5 && bcidWord > 0 ) ATH_CHECK( fillPPMEtaPhi(myTower, groupName+"TT_HAD", "bcidWord", bcidWord) );
551  }
552  }
553 
554  //Loop over CPM tower container
555  //Create the CPM objects and calculate scaled phi
556  std::vector<MonitorCPM> vecMonCPM; // All towers
557  for (const xAOD::CPMTower* cpm : *cpmTowerTES) {
558  ATH_CHECK( makeTowerCPM(cpm, vecMonCPM) );
559  }
560 
561  // Coordinates for CPM tower and JetElement containers
562  auto etalut = Monitored::Scalar<double>("etalut", 0);
563  auto philut = Monitored::Scalar<double>("philut", 0);
564 
565  // lut variables
566  auto emLUT0 = Monitored::Scalar<int>("emLUT0", 0);
567  auto emLUT1 = Monitored::Scalar<int>("emLUT1", 0);
568  auto emLUT2 = Monitored::Scalar<int>("emLUT2", 0);
569  auto hadLUT0 = Monitored::Scalar<int>("hadLUT0", 0);
570  auto hadLUT1 = Monitored::Scalar<int>("hadLUT1", 0);
571  auto hadLUT2 = Monitored::Scalar<int>("hadLUT2", 0);
572 
573  //loop over the cpm tower container to fill the lut histos
574  for (auto& myTower : vecMonCPM) {
575 
576  std::vector<uint8_t> cpmEMenergy = (myTower.tower)->emEnergyVec();
577  std::vector<uint8_t> cpmHADenergy = (myTower.tower)->hadEnergyVec();
578  // eta scaled
579  etalut = myTower.etaScaled;
580 
581  for (auto phi: myTower.phiScaled) {
582  // phi scaled
583  philut = phi;
584 
585  if(cpmEMenergy.size() > 2){ // expect 3 slices to be read out
586  ATH_MSG_DEBUG("CPM :: emLUT0 :: " << static_cast<unsigned>(cpmEMenergy.at(0)) << ":: emLUT1 :: " << static_cast<unsigned>(cpmEMenergy.at(1)) << ":: emLUT2 :: " << static_cast<unsigned>(cpmEMenergy.at(2)));
587 
588  emLUT0 = static_cast<int>(cpmEMenergy.at(0));
589  if(cpmEMenergy.at(0) > 0) fill(groupName+"lut_EM0",etalut,philut, emLUT0);
590 
591  emLUT1 = static_cast<int>(cpmEMenergy.at(1));
592  if(cpmEMenergy.at(1) > 0) fill(groupName+"lut_EM1",etalut,philut, emLUT1);
593 
594  emLUT2 = static_cast<int>(cpmEMenergy.at(2));
595  if(cpmEMenergy.at(2) > 0) fill(groupName+"lut_EM2",etalut,philut, emLUT2);
596  }
597  if(cpmHADenergy.size() > 2){
598  ATH_MSG_DEBUG("CPM :: hadLUT0 :: " << static_cast<unsigned>(cpmHADenergy.at(0)) << ":: hadLUT1 :: " << static_cast<unsigned>(cpmHADenergy.at(1)) << ":: hadLUT2 :: " << static_cast<unsigned>(cpmHADenergy.at(2)));
599 
600  hadLUT0 = static_cast<int>(cpmHADenergy.at(0));
601  if(cpmHADenergy.at(0) > 0) fill(groupName+"lut_HAD0",etalut,philut, hadLUT0);
602  hadLUT1 = static_cast<int>(cpmHADenergy.at(1));
603  if(cpmHADenergy.at(1) > 0) fill(groupName+"lut_HAD1",etalut,philut, hadLUT1);
604  hadLUT2 = static_cast<int>(cpmHADenergy.at(2));
605  if(cpmHADenergy.at(2) > 0)fill(groupName+"lut_HAD2",etalut,philut, hadLUT2);
606  }
607  }
608  }
609 
610  std::vector<MonitorJE> vecMonJE; // All elements
611 
612  //Create the JetElement objects and calculate scaled phi
613  for (const xAOD::JetElement* je : *jetElementTES) {
614  ATH_CHECK( makeTowerJE(je, vecMonJE) );
615  }
616 
617  //loop over the jet element container to fill the lut histos
618  for (auto& jet : vecMonJE) {
619 
620  std::vector<uint16_t> jepEMenergy = (jet.element)->emJetElementETVec();
621  std::vector<uint16_t> jepHADenergy = (jet.element)->hadJetElementETVec();
622 
623  for (auto eta: jet.etaScaled) {
624  etalut = eta;
625  if ( std::abs(eta) > 2.5){
626  for (auto phi: jet.phiScaled) {
627  philut = phi;
628  if(jepEMenergy.size() > 2){
629  ATH_MSG_DEBUG("JetElement :: emLUT0 :: " << static_cast<unsigned>(jepEMenergy.at(0)) << ":: emLUT1 :: " << static_cast<unsigned>(jepEMenergy.at(1)) << ":: emLUT2 :: " << static_cast<unsigned>(jepEMenergy.at(2)));
630 
631  emLUT0 = static_cast<int>(jepEMenergy.at(0));
632  if(jepEMenergy.at(0) > 0) fill(groupName+"lut_EM0",etalut,philut, emLUT0);
633 
634  emLUT1 = static_cast<int>(jepEMenergy.at(1));
635  if(jepEMenergy.at(1) > 0) fill(groupName+"lut_EM1",etalut,philut, emLUT1);
636 
637  emLUT2 = static_cast<int>(jepEMenergy.at(2));
638  if(jepEMenergy.at(2) > 0) fill(groupName+"lut_EM2",etalut,philut, emLUT2);
639  }
640  if(jepHADenergy.size()> 2){
641  ATH_MSG_DEBUG("JetElement :: hadLUT0 :: " << static_cast<unsigned>(jepHADenergy.at(0)) << ":: hadLUT1 :: " << static_cast<unsigned>(jepHADenergy.at(1)) << ":: hadLUT2 :: " << static_cast<unsigned>(jepHADenergy.at(2)));
642 
643  hadLUT0 = static_cast<int>(jepHADenergy.at(0));
644  if(jepHADenergy.at(0) > 0) fill(groupName+"lut_HAD0",etalut,philut, hadLUT0);
645 
646  hadLUT1 = static_cast<int>(jepHADenergy.at(1));
647  if(jepHADenergy.at(1) > 0) fill(groupName+"lut_HAD1",etalut,philut, hadLUT1);
648 
649  hadLUT2 = static_cast<int>(jepHADenergy.at(2));
650  if(jepHADenergy.at(2) > 0) fill(groupName+"lut_HAD2",etalut,philut, hadLUT2);
651  }
652  }
653  }
654  }
655  }
656 
658  if ( !eFexContainer.isValid() ) {
659  ATH_MSG_WARNING("No eFex EM container found in storegate "<< eFexContainer.key());
660  }
661 
662  // monitored variables for histograms
663  auto TOBeT = Monitored::Scalar<float>("TOBTransverseEnergy",0.0);
664  auto TOBeta = Monitored::Scalar<float>("TOBEta",0.0);
665  auto TOBphi = Monitored::Scalar<float>("TOBPhi",0.0);
666  auto TOBeT_max = Monitored::Scalar<float>("TOBTransverseEnergy_max",0.0);
667  auto TOBeta_max = Monitored::Scalar<float>("TOBEta_max",0.0);
668  auto TOBphi_max = Monitored::Scalar<float>("TOBPhi_max",0.0);
669  auto TOBeT_max_in = Monitored::Scalar<float>("TOBTransverseEnergy_max",0.0);
670  auto TOBeta_max_in = Monitored::Scalar<float>("TOBEta_max",0.0);
671  auto TOBphi_max_in = Monitored::Scalar<float>("TOBPhi_max",0.0);
672 
673  TOBeT_max = 0;
674  TOBeT_max_in = 0;
675 
676  for(auto key : {"L1_eEMxRoI","L1_eEMxRoIOutOfTime"}) {
677 
678  const xAOD::eFexEMRoIContainer* emTobs;
679  CHECK( evtStore()->retrieve( emTobs, key ) );
680 
681  for(auto tob : *emTobs) {
682  TOBeT = tob->et()/1000; //eT in GeV
683  TOBeta = tob->eta();
684 
685  // adjust the phi to 0 to 2 pi
686  if (tob->phi() < 0) {
687  TOBphi = tob->phi()+2*M_PI;
688  }
689  else {
690  TOBphi = tob->phi();
691  }
692 
693  // fill the eFex histograms in the right time slice
694  if (tob->bcn4() == (((ctx.eventID().bunch_crossing_id())-1) & 0xf )) {
695  if (TOBeT > 0.0){
696  fill(groupName+"Efex0", TOBeta, TOBphi, TOBeT);
697  }
698  }
699  else if (tob->bcn4() == ((ctx.eventID().bunch_crossing_id()) & 0xf )) {
700  if (TOBeT > 0.0){
701  if (TOBeT_max_in < TOBeT) {
702  TOBeT_max_in = tob->et()/1000;
703  TOBeta_max_in = tob->eta();
704  if (tob->phi() < 0) {
705  TOBphi_max_in = tob->phi()+2*M_PI;
706  }
707  else {
708  TOBphi_max_in = tob->phi();
709  }
710  }
711  fill(groupName+"Efex1", TOBeta, TOBphi, TOBeT);
712  }
713  }
714  else if (tob->bcn4() == (((ctx.eventID().bunch_crossing_id())+1) & 0xf )) {
715  if (TOBeT > 0.0){
716  if (TOBeT_max < TOBeT) {
717  TOBeT_max = tob->et()/1000;
718  TOBeta_max = tob->eta();
719  if (tob->phi() < 0) {
720  TOBphi_max = tob->phi()+2*M_PI;
721  }
722  else {
723  TOBphi_max = tob->phi();
724  }
725  }
726  fill(groupName+"Efex2", TOBeta, TOBphi, TOBeT);
727  }
728  }
729  }
730  }
731  if (trigger == "eFex") {
732  fill("Efex_maxTOB_in", TOBeT_max_in);
733  fill("Efex_maxTOB_out", TOBeT_max);
734  fill("Efex_maxTOB_out", TOBeta_max, TOBphi_max);
735  fill("Efex_maxTOB_in", TOBeta_max_in, TOBphi_max_in);
736  }
737 
738  // variables for histograms
739  auto jFexEt = Monitored::Scalar<int> ("jFexEt",0);
740  auto jFexeta = Monitored::Scalar<float>("jFexEta",0.0);
741  auto jFexphi = Monitored::Scalar<float>("jFexPhi",0.0);
742 
743  // Access jFex tower container
745  if(!jFexTowerContainer.isValid()) {
746  ATH_MSG_WARNING("No jFex Tower container valid in storegate with key: "<< m_jFexDataTowerKey<<". Will be skipped!");
747  }
748 
749  //SG::ReadHandle<xAOD::jFexTowerContainer> jFexEmulatedTowerContainer{m_jFexEmulatedTowerKey, ctx};
750  SG::ReadHandle<xAOD::jFexTowerContainer> jEmulatedTowerContainer;
751  jEmulatedTowerContainer = SG::ReadHandle<xAOD::jFexTowerContainer>(m_EmulTowerKey,ctx);
752  if(!jEmulatedTowerContainer.isValid()) {
753  ATH_MSG_WARNING("No jFex Tower container valid in storegate with key: "<< jEmulatedTowerContainer.key()<<". Will be skipped!");
754  }
755  else {
756  for(const xAOD::jFexTower* emulTower : *jEmulatedTowerContainer) {
757  jFexEt=emulTower->et_count().at(0);
758  //Adding 1e-5 for plotting style
759  jFexeta=emulTower->eta()+1e-5;
760  if (emulTower->phi() < 0) {
761  jFexphi=emulTower->phi()+2*M_PI;
762  }
763  else {
764  jFexphi=emulTower->phi();
765  }
766  if (jFexEt > 175) {
767  fill(groupName+"JfexEmulated",jFexeta,jFexphi, jFexEt);
768  }
769  }
770  }
771 
772  TOBeT_max = 0;
773  for(const xAOD::jFexSRJetRoI* jFexSRJetRoI : *jFexSRJetContainer) {
774  if(jFexSRJetRoI->tobWord()==0) continue; //remove empty TOBs
775  jFexEt=jFexSRJetRoI->tobEt()/5;
776  jFexeta=jFexSRJetRoI->eta();
777  if (jFexSRJetRoI->phi() < 0) {
778  jFexphi=jFexSRJetRoI->phi()+2*M_PI;
779  }
780  else {
781  jFexphi=jFexSRJetRoI->phi();
782  }
783  if (TOBeT_max < jFexEt) {
784  TOBeT_max = jFexSRJetRoI->tobEt()/5;
785  TOBeta_max = jFexSRJetRoI->eta();
786  if (jFexSRJetRoI->phi() < 0) {
787  TOBphi_max =jFexSRJetRoI->phi()+2*M_PI;
788  }
789  else {
790  TOBphi_max =jFexSRJetRoI->phi();
791  }
792  }
793  fill(groupName+"JfexSRJet", jFexeta, jFexphi, jFexEt);
794  }
795  if (trigger == "jFex") {
796  fill("Jfex_maxTOB", TOBeT_max);
797  fill("Jfex_maxTOB", TOBeta_max, TOBphi_max);
798  }
799 
801  if(!jFexTauContainer.isValid()) {
802  ATH_MSG_WARNING("No jFex Tau container found in storegate "<< m_jFexTauContainerKey<<". Will be skipped!");
803  }
804  else {
805  for(const xAOD::jFexTauRoI* jFexTauRoI : *jFexTauContainer) {
806  if(jFexTauRoI->tobWord()==0) continue; //remove empty TOBs
807  jFexEt =jFexTauRoI->tobEt()/5;
808  jFexeta=jFexTauRoI->eta();
809  if (jFexTauRoI->phi() < 0) {
810  jFexphi=jFexTauRoI->phi()+2*M_PI;
811  }
812  else {
813  jFexphi=jFexTauRoI->phi();
814  }
815  fill(groupName+"JfexTau", jFexeta, jFexphi, jFexEt);
816  }
817  }
818 
819  auto gFexEt = Monitored::Scalar<int> ("gFexEt",0);
820  auto gFexEta = Monitored::Scalar<float>("gFexEta",0.0);
821  auto gFexPhi = Monitored::Scalar<float>("gFexPhi",0.0);
822  int key_index = 0;
823 
824  TOBeT_max = 0;
825  // Small-R and large-R jets container loop
826  for (const auto& key : m_gFexJetTobKeyList){
828  // Check that this container is present
829  if ( !jetContainer.isValid() ) {
830  ATH_MSG_WARNING("No gFex jet container found in storegate: "<< key.key());
831  }
832  else {
833  for(const xAOD::gFexJetRoI* gFexJetRoIContainer : *jetContainer) {
834  gFexEt =gFexJetRoIContainer->gFexTobEt()/10;
835  gFexEta=gFexJetRoIContainer->eta();
836  if (gFexJetRoIContainer->phi() < 0) {
837  gFexPhi=gFexJetRoIContainer->phi()+2*M_PI;
838  }
839  else {
840  gFexPhi=gFexJetRoIContainer->phi();
841  }
842  if (TOBeT_max < gFexEt) {
843  TOBeT_max = gFexJetRoIContainer->gFexTobEt()/10;
844  TOBeta_max = gFexJetRoIContainer->eta();
845  if (gFexJetRoIContainer->phi() < 0) {
846  TOBphi_max=gFexJetRoIContainer->phi()+2*M_PI;
847  }
848  else {
849  TOBphi_max=gFexJetRoIContainer->phi();
850  }
851  }
852  if (key_index == 0) {
853  fill(groupName+"GfexSRJet",gFexEta, gFexPhi, gFexEt);
854  }
855  else if (key_index == 1) {
856  fill(groupName+"GfexLRJet",gFexEta, gFexPhi, gFexEt);
857  }
858  }
859  }
860  key_index++;
861  }
862  if (trigger == "gFex") {
863  fill("Gfex_maxTOB", TOBeT_max);
864  fill("Gfex_maxTOB", TOBeta_max, TOBphi_max);
865  }
866 
867  }
868  else {
869  auto eventMonitor_all_legacy= Monitored::Scalar<std::string>("eventMonitor_all_legacy", std::to_string(currentEventNo));
870  auto eventMonitor_all_phaseI= Monitored::Scalar<std::string>("eventMonitor_all_phaseI", trigger+"="+std::to_string(currentEventNo));
871  auto lbMonitor_all= Monitored::Scalar<std::string>("lbMonitor_all", std::to_string(lumiNo));
872  if (legacyTrigger) {
873  fill("Event_all_", eventMonitor_all_legacy, lbMonitor_all );
874  }
875  if (phase1Trigger) {
876  fill("Event_all_", eventMonitor_all_phaseI, lbMonitor_all );
877  }
878 
880  if ( !eFexContainer.isValid() ) {
881  ATH_MSG_WARNING("No eFex EM container found in storegate "<< eFexContainer.key());
882  }
883 
884  // monitored variables for histograms
885  auto TOBeT = Monitored::Scalar<float>("TOBTransverseEnergy",0.0);
886  auto TOBeta = Monitored::Scalar<float>("TOBEta",0.0);
887  auto TOBphi = Monitored::Scalar<float>("TOBPhi",0.0);
888  auto TOBeT_max = Monitored::Scalar<float>("TOBTransverseEnergy_max",0.0);
889  auto TOBeta_max = Monitored::Scalar<float>("TOBEta_max",0.0);
890  auto TOBphi_max = Monitored::Scalar<float>("TOBPhi_max",0.0);
891  auto TOBeT_max_in = Monitored::Scalar<float>("TOBTransverseEnergy_max",0.0);
892  auto TOBeta_max_in = Monitored::Scalar<float>("TOBEta_max",0.0);
893  auto TOBphi_max_in = Monitored::Scalar<float>("TOBPhi_max",0.0);
894 
895  TOBeT_max = 0;
896  TOBeT_max_in = 0;
897 
898  for(auto key : {"L1_eEMxRoI","L1_eEMxRoIOutOfTime"}) {
899 
900  const xAOD::eFexEMRoIContainer* emTobs;
901  CHECK( evtStore()->retrieve( emTobs, key ) );
902 
903  for(auto tob : *emTobs) {
904  TOBeT = tob->et()/1000; //eT in GeV
905  TOBeta = tob->eta();
906 
907  // adjust the phi to 0 to 2 pi
908  if (tob->phi() < 0) {
909  TOBphi = tob->phi()+2*M_PI;
910  }
911  else {
912  TOBphi = tob->phi();
913  }
914 
915  if (tob->bcn4() == ((ctx.eventID().bunch_crossing_id()) & 0xf )) {
916  if (TOBeT > 0.0){
917  if (TOBeT_max_in < TOBeT) {
918  TOBeT_max_in = tob->et()/1000;
919  TOBeta_max_in = tob->eta();
920  if (tob->phi() < 0) {
921  TOBphi_max_in = tob->phi()+2*M_PI;
922  }
923  else {
924  TOBphi_max_in = tob->phi();
925  }
926  }
927  }
928  }
929  else if (tob->bcn4() == (((ctx.eventID().bunch_crossing_id())+1) & 0xf )) {
930  if (TOBeT > 0.0){
931  if (TOBeT_max < TOBeT) {
932  TOBeT_max = tob->et()/1000;
933  TOBeta_max = tob->eta();
934  if (tob->phi() < 0) {
935  TOBphi_max = tob->phi()+2*M_PI;
936  }
937  else {
938  TOBphi_max = tob->phi();
939  }
940  }
941  }
942  }
943  }
944  }
945  if (trigger == "eFex") {
946  fill("Efex_maxTOB_in", TOBeT_max_in);
947  fill("Efex_maxTOB_out", TOBeT_max);
948  fill("Efex_maxTOB_out", TOBeta_max, TOBphi_max);
949  fill("Efex_maxTOB_in", TOBeta_max_in, TOBphi_max_in);
950  }
951 
952  // variables for histograms
953  auto jFexEt = Monitored::Scalar<int> ("jFexEt",0);
954  auto jFexeta = Monitored::Scalar<float>("jFexEta",0.0);
955  auto jFexphi = Monitored::Scalar<float>("jFexPhi",0.0);
956 
957  // Access jFex tower container
959  if(!jFexTowerContainer.isValid()) {
960  ATH_MSG_WARNING("No jFex Tower container valid in storegate with key: "<< m_jFexDataTowerKey<<". Will be skipped!");
961  }
962 
963  TOBeT_max = 0;
964  for(const xAOD::jFexSRJetRoI* jFexSRJetRoI : *jFexSRJetContainer) {
965  if(jFexSRJetRoI->tobWord()==0) continue; //remove empty TOBs
966  jFexEt=jFexSRJetRoI->tobEt()/5;
967  jFexeta=jFexSRJetRoI->eta();
968  if (jFexSRJetRoI->phi() < 0) {
969  jFexphi=jFexSRJetRoI->phi()+2*M_PI;
970  }
971  else {
972  jFexphi=jFexSRJetRoI->phi();
973  }
974  if (TOBeT_max < jFexEt) {
975  TOBeT_max = jFexSRJetRoI->tobEt()/5;
976  TOBeta_max = jFexSRJetRoI->eta();
977  if (jFexSRJetRoI->phi() < 0) {
978  TOBphi_max =jFexSRJetRoI->phi()+2*M_PI;
979  }
980  else {
981  TOBphi_max =jFexSRJetRoI->phi();
982  }
983  }
984  }
985  if (trigger == "jFex") {
986  fill("Jfex_maxTOB", TOBeT_max);
987  fill("Jfex_maxTOB", TOBeta_max, TOBphi_max);
988  }
989 
990  auto gFexEt = Monitored::Scalar<int> ("gFexEt",0);
991  auto gFexEta = Monitored::Scalar<float>("gFexEta",0.0);
992  auto gFexPhi = Monitored::Scalar<float>("gFexPhi",0.0);
993 
994  TOBeT_max = 0;
995  // Small-R and large-R jets container loop
996  for (const auto& key : m_gFexJetTobKeyList){
998  // Check that this container is present
999  if ( !jetContainer.isValid() ) {
1000  ATH_MSG_WARNING("No gFex jet container found in storegate: "<< key.key());
1001  }
1002  else {
1003  for(const xAOD::gFexJetRoI* gFexJetRoIContainer : *jetContainer) {
1004  gFexEt =gFexJetRoIContainer->gFexTobEt()/10;
1005  gFexEta=gFexJetRoIContainer->eta();
1006  if (gFexJetRoIContainer->phi() < 0) {
1007  gFexPhi=gFexJetRoIContainer->phi()+2*M_PI;
1008  }
1009  else {
1010  gFexPhi=gFexJetRoIContainer->phi();
1011  }
1012  if (TOBeT_max < gFexEt) {
1013  TOBeT_max = gFexJetRoIContainer->gFexTobEt()/10;
1014  TOBeta_max = gFexJetRoIContainer->eta();
1015  if (gFexJetRoIContainer->phi() < 0) {
1016  TOBphi_max=gFexJetRoIContainer->phi()+2*M_PI;
1017  }
1018  else {
1019  TOBphi_max=gFexJetRoIContainer->phi();
1020  }
1021  }
1022  }
1023  }
1024  }
1025  if (trigger == "gFex") {
1026  fill("Gfex_maxTOB", TOBeT_max);
1027  fill("Gfex_maxTOB", TOBeta_max, TOBphi_max);
1028  }
1029 
1030  }
1031 
1032  return StatusCode::SUCCESS;
1033 }
1034 
1035 
1037  std::vector<MonitorTT> &vecMonTT) const
1038 {
1039  // Geometry
1040  const double phi = tt->phi();
1041  double phiMod = phi * m_phiScaleTT;
1042 
1043 
1044 
1045  // Fill TT quantities
1046  MonitorTT monTT;
1047  monTT.tower = tt;
1048  monTT.phiScaled = phiMod;
1049  monTT.phi1d = 0;
1050  vecMonTT.push_back(monTT);
1051 
1052  return StatusCode::SUCCESS;
1053 }
1054 
1055 
1057  std::vector<MonitorCPM> &vecMonCPM) const
1058 {
1059  // Geometry
1060  const double phi = cpm->phi();
1061  double phiMod = phi * m_phiScaleTT;
1062 
1063 
1064  // Fill CPM quantities
1065  MonitorCPM monCPM;
1066  monCPM.tower = cpm;
1067 
1068  double etaMod = monCPM.tower->eta();
1069  const double absEta = std::abs(etaMod);
1070 
1071  const std::vector<double> offset32 = {1.5, 0.5, -0.5, -1.5};
1072  const std::vector<double> offset25 = {0.5, -0.5};
1073  std::vector<double> offset = {};
1074 
1075  if (absEta > 3.2) {
1076  // Fill four bins in phi
1077  phiMod = std::floor(phiMod/4)*4. + 2.;
1078  offset = offset32;
1079  }
1080  else if (absEta > 2.5) {
1081  // Fill two bins in phi
1082  phiMod = std::floor(phiMod/2)*2. + 1.;
1083  offset = offset25;
1084  }
1085  else {
1086  offset = {0.};
1087  }
1088 
1089 
1090 
1091  // Fill the histograms
1092  for (auto phiOffset : offset) {
1093  monCPM.phiScaled.push_back(phiMod + phiOffset);
1094  }
1095 
1096  monCPM.etaScaled = etaMod;
1097 
1098 
1099  vecMonCPM.push_back(monCPM);
1100 
1101  return StatusCode::SUCCESS;
1102 }
1103 
1105  std::vector<MonitorJE> &vecMonJE) const
1106 {
1107 
1108  // Use JEP info to fill the forward part of the lut plots, but since this has TT granularity we have to play some tricks
1109 
1110  // Geometry
1111  const double phi = je->phi();
1112  double phiMod = phi * m_phiScaleTT;
1113 
1114  // Fill JE quantities
1115  MonitorJE monJE;
1116  monJE.element = je;
1117 
1118  double etaMod = monJE.element->eta();
1119  const double absEta = std::abs(etaMod);
1120  int signeta = 1;
1121  if( etaMod < 0) signeta = -1;
1122 
1123 
1124  const std::vector<double> offset32 = {1.5, 0.5, -0.5, -1.5};
1125  const std::vector<double> offset25 = {0.5, -0.5};
1126  std::vector<double> offset = {};
1127 
1128  if (absEta > 3.2) {
1129  // Fill four bins in phi
1130  phiMod = std::floor(phiMod/4)*4. + 2.;
1131  offset = offset32;
1132  monJE.etaScaled.push_back(signeta*4.7);
1133  monJE.etaScaled.push_back(signeta*3.7);
1134  monJE.etaScaled.push_back(signeta*3.5);
1135 
1136  }
1137  else if(absEta > 2.9) {
1138  phiMod = std::floor(phiMod/2)*2. + 1.;
1139  offset = offset25;
1140  monJE.etaScaled.push_back(signeta*3.15);
1141  }
1142 
1143 
1144  if (absEta > 2.5) {
1145  // Fill two bins in phi
1146  phiMod = std::floor(phiMod/2)*2. + 1.;
1147  offset = offset25;
1148  monJE.etaScaled.push_back(etaMod);
1149  }
1150  else {
1151  offset = {0.};
1152  monJE.etaScaled.push_back(etaMod);
1153  }
1154 
1155 
1156  // Fill the histograms
1157  for (auto phiOffset : offset) {
1158  monJE.phiScaled.push_back(phiMod + phiOffset);
1159  }
1160 
1161  vecMonJE.push_back(monJE);
1162 
1163  return StatusCode::SUCCESS;
1164 }
1165 
1166 
1168  const std::string& groupName,
1169  const std::string& weightName,
1170  double weight) const {
1171 
1172 
1173  double phiMod = monTT.phiScaled; // Integer binning for 2D plots
1174  double etaMod = monTT.tower->eta();
1175  const double absEta = std::abs(etaMod);
1176 
1177  const std::vector<double> offset32 = {1.5, 0.5, -0.5, -1.5};
1178  const std::vector<double> offset25 = {0.5, -0.5};
1179  std::vector<double> offset = {};
1180 
1181  if (absEta > 3.2) {
1182  // Fill four bins in phi
1183  phiMod = std::floor(phiMod/4)*4. + 2.;
1184  offset = offset32;
1185  }
1186  else if (absEta > 2.5) {
1187  // Fill two bins in phi
1188  phiMod = std::floor(phiMod/2)*2. + 1.;
1189  offset = offset25;
1190  }
1191  else {
1192  offset = {0.};
1193  }
1194 
1195  ATH_MSG_DEBUG("absEta: " << absEta << "offset.size(): " << offset.size());
1196 
1197  // Fill the histograms
1198  for (auto phiOffset : offset) {
1199 
1200  auto etaTT_2D = Monitored::Scalar<double>("etaTT_2D", etaMod);
1201  auto phiTT_2D = Monitored::Scalar<double>("phiTT_2D", phiMod + phiOffset);
1202 
1203  auto weight_2D = Monitored::Scalar<double>(weightName, weight); // Weight for filling 2D profile histograms; name must be included in python histogram definition
1204  ATH_MSG_DEBUG("groupName: weight_2D" << weight_2D);
1205 
1206  fill(groupName, etaTT_2D, phiTT_2D, weight_2D);
1207 
1208  }
1209 
1210  return StatusCode::SUCCESS;
1211 }
1212 
1213 
1214 bool MistimedStreamMonitorAlgorithm::pulseQuality(const std::vector<uint16_t>& ttPulse, int peakSlice) const {
1215 
1216  bool goodPulse = true;
1217  int size = ttPulse.size();
1218  if (peakSlice > size) {
1219  ATH_MSG_ERROR("Peak Slice " << peakSlice << " supress the ttPulse vector size " << size );
1220  goodPulse = false;
1221  return goodPulse;
1222  }
1223  if (size < 1) {
1224  ATH_MSG_ERROR("The ttPulse vector size " << size << " not valid for Peak Slice " << peakSlice );
1225  goodPulse = false;
1226  return goodPulse;
1227  }
1228  int a = ttPulse[peakSlice-1];
1229  int b = ttPulse[peakSlice];
1230  int c = ttPulse[peakSlice+1];
1231  double tim = (0.5*a-0.5*c)/(a+c-2*b);
1232  double wid = (a+c-64.0)/(b-32.0);
1233  if ( tim < 0.0 ) goodPulse = false;
1234  else if ( tim > 0.3 ) goodPulse = false;
1235  if ( wid < 1.0 ) goodPulse = false;
1236  else if ( wid > 1.6 ) goodPulse = false;
1237 
1238  ATH_MSG_DEBUG("Pulse qual= "<< goodPulse<<" tim = "<<tim<<" wid = "<<wid);
1239  ATH_MSG_DEBUG("a = "<< a <<" b = "<<b<<" c = "<<c);
1240 
1241  return goodPulse;
1242 }
python.PyKernel.retrieve
def retrieve(aClass, aKey=None)
Definition: PyKernel.py:110
MistimedStreamMonitorAlgorithm::m_maxEvents
Gaudi::Property< int > m_maxEvents
Definition: MistimedStreamMonitorAlgorithm.h:149
MistimedStreamMonitorAlgorithm.h
AllowedVariables::e
e
Definition: AsgElectronSelectorTool.cxx:37
L1CaloReadoutConfigJSON::l1aFadcSlice
unsigned int l1aFadcSlice() const
Definition: L1CaloReadoutConfigJSON.h:21
xAOD::jFexTauRoI_v1
Class describing properties of a LVL1 jFEX global Trigger Object (TOB) in the xAOD format.
Definition: jFexTauRoI_v1.h:23
xAOD::jFexSRJetRoI_v1
Class describing properties of a LVL1 jFEX global Trigger Object (TOB) in the xAOD format.
Definition: jFexSRJetRoI_v1.h:23
MistimedStreamMonitorAlgorithm::fillHistograms
virtual StatusCode fillHistograms(const EventContext &ctx) const override
adds event to the monitoring histograms
Definition: MistimedStreamMonitorAlgorithm.cxx:56
MistimedStreamMonitorAlgorithm::MistimedStreamMonitorAlgorithm
MistimedStreamMonitorAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
Definition: MistimedStreamMonitorAlgorithm.cxx:12
xAOD::CPMTower_v2::phi
float phi() const
get phi (note that for L1Calo phi runs from 0 to 2pi)
MistimedStreamMonitorAlgorithm::m_mutex
std::mutex m_mutex
Definition: MistimedStreamMonitorAlgorithm.h:154
MistimedStreamMonitorAlgorithm::m_ttTool
ToolHandle< LVL1::IL1TriggerTowerToolRun3 > m_ttTool
Definition: MistimedStreamMonitorAlgorithm.h:121
xAOD::jFexTauRoI_v1::eta
float eta() const
MistimedStreamMonitorAlgorithm::MonitorJE::element
const xAOD::JetElement * element
Definition: MistimedStreamMonitorAlgorithm.h:80
phi
Scalar phi() const
phi method
Definition: AmgMatrixBasePlugin.h:67
SG::ReadCondHandle
Definition: ReadCondHandle.h:44
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
MistimedStreamMonitorAlgorithm::m_eFexTauContainerKey
SG::ReadHandleKey< xAOD::eFexTauRoIContainer > m_eFexTauContainerKey
Definition: MistimedStreamMonitorAlgorithm.h:107
SG::Accessor< float >
MistimedStreamMonitorAlgorithm::MonitorJE::etaScaled
std::vector< double > etaScaled
Definition: MistimedStreamMonitorAlgorithm.h:82
L1CaloReadoutConfigContainerJSON::readoutConfigJSON
const L1CaloReadoutConfigJSON * readoutConfigJSON(unsigned int channelId) const
Definition: L1CaloReadoutConfigContainerJSON.cxx:237
eta
Scalar eta() const
pseudorapidity method
Definition: AmgMatrixBasePlugin.h:83
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:67
MistimedStreamMonitorAlgorithm::EtaPhiOverlap
@ EtaPhiOverlap
Definition: MistimedStreamMonitorAlgorithm.h:165
MistimedStreamMonitorAlgorithm::m_uselegacy
Gaudi::Property< bool > m_uselegacy
Definition: MistimedStreamMonitorAlgorithm.h:125
xAOD::CPMTower_v2::eta
float eta() const
get eta
xAOD::JetElement_v2
Description of JetElement_v2.
Definition: JetElement_v2.h:26
RunTileMonitoring.groupName
groupName
Definition: RunTileMonitoring.py:158
MistimedStreamMonitorAlgorithm::lateTT
@ lateTT
Definition: MistimedStreamMonitorAlgorithm.h:163
PlotCalibFromCool.begin
begin
Definition: PlotCalibFromCool.py:94
M_PI
#define M_PI
Definition: ActiveFraction.h:11
SG::ReadCondHandle::isValid
bool isValid()
Definition: ReadCondHandle.h:210
xAOD::gFexJetRoIContainer
gFexJetRoIContainer_v1 gFexJetRoIContainer
Definition: gFexJetRoIContainer.h:15
MistimedStreamMonitorAlgorithm::m_runParametersContainer
SG::ReadCondHandleKey< L1CaloRunParametersContainer > m_runParametersContainer
Definition: MistimedStreamMonitorAlgorithm.h:129
xAOD::jFexTowerContainer
jFexTowerContainer_v1 jFexTowerContainer
Define the latest version of the TriggerTower container.
Definition: jFexTowerContainer.h:14
xAOD::jFexSRJetRoI_v1::eta
float eta() const
xAOD::jFexSRJetRoI_v1::phi
float phi() const
python.RatesEmulationExample.lock
lock
Definition: RatesEmulationExample.py:148
MistimedStreamMonitorAlgorithm::m_usephaseI
Gaudi::Property< bool > m_usephaseI
Definition: MistimedStreamMonitorAlgorithm.h:126
xAOD::jFexSRJetRoI_v1::tobWord
uint32_t tobWord() const
The "raw" 32-bit word describing the object candidate.
MistimedStreamMonitorAlgorithm::m_eFexEMContainerKey
SG::ReadHandleKey< xAOD::eFexEMRoIContainer > m_eFexEMContainerKey
Definition: MistimedStreamMonitorAlgorithm.h:106
xAOD::JetElement_v2::eta
float eta() const
get eta
MistimedStreamMonitorAlgorithm::m_gFexJetTobKeyList
SG::ReadHandleKeyArray< xAOD::gFexJetRoIContainer > m_gFexJetTobKeyList
Definition: MistimedStreamMonitorAlgorithm.h:119
TauGNNUtils::Variables::Scalar::absEta
bool absEta(const xAOD::TauJet &tau, float &out)
Definition: TauGNNUtils.cxx:107
dqt_zlumi_pandas.weight
int weight
Definition: dqt_zlumi_pandas.py:190
AthMonitorAlgorithm
Base class for Athena Monitoring Algorithms.
Definition: AthMonitorAlgorithm.h:36
python.setupRTTAlg.size
int size
Definition: setupRTTAlg.py:39
AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::evtStore
ServiceHandle< StoreGateSvc > & evtStore()
The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.
Definition: AthCommonDataStore.h:85
MistimedStreamMonitorAlgorithm::MonitorTT
Struct to contain PPM trigger tower info.
Definition: MistimedStreamMonitorAlgorithm.h:64
MistimedStreamMonitorAlgorithm::MonitorTT::phi1d
double phi1d
phi for 2d maps with integer bins (taking into account granularity in eta)
Definition: MistimedStreamMonitorAlgorithm.h:67
jet
Definition: JetCalibTools_PlotJESFactors.cxx:23
MistimedStreamMonitorAlgorithm::MonitorCPM::tower
const xAOD::CPMTower * tower
Definition: MistimedStreamMonitorAlgorithm.h:72
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
L1CaloRunParametersContainer::runParameters
const L1CaloRunParameters * runParameters(unsigned int channelId) const
Definition: L1CaloRunParametersContainer.cxx:93
MistimedStreamMonitorAlgorithm::fillPPMEtaPhi
StatusCode fillPPMEtaPhi(MonitorTT &monTT, const std::string &groupName, const std::string &weightName, double weight) const
Definition: MistimedStreamMonitorAlgorithm.cxx:1167
xAOD::jFexTauRoI_v1::tobEt
uint16_t tobEt() const
MistimedStreamMonitorAlgorithm::All
@ All
Definition: MistimedStreamMonitorAlgorithm.h:159
MistimedStreamMonitorAlgorithm::L1_Trigger
@ L1_Trigger
Definition: MistimedStreamMonitorAlgorithm.h:162
L1CaloReadoutConfigJSON::numFadcSlices
unsigned int numFadcSlices() const
Definition: L1CaloReadoutConfigJSON.h:20
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
TRT::Hit::layer
@ layer
Definition: HitInfo.h:79
xAOD::gFexJetRoI_v1
Class describing properties of a LVL1 gFEX jet Trigger Object (TOB) in the xAOD format.
Definition: gFexJetRoI_v1.h:25
xAOD::jFexSRJetRoI_v1::tobEt
uint16_t tobEt() const
xAOD::TriggerTower_v2
Description of TriggerTower_v2.
Definition: TriggerTower_v2.h:49
TauGNNUtils::Variables::Track::dEta
bool dEta(const xAOD::TauJet &tau, const xAOD::TauTrack &track, float &out)
Definition: TauGNNUtils.cxx:401
xAOD::jFexTauRoI_v1::tobWord
uint32_t tobWord() const
The "raw" 32-bit word describing the object candidate.
MistimedStreamMonitorAlgorithm::m_xAODTriggerTowerContainerName
SG::ReadHandleKey< xAOD::TriggerTowerContainer > m_xAODTriggerTowerContainerName
container keys including steering parameter and description
Definition: MistimedStreamMonitorAlgorithm.h:100
MistimedStreamMonitorAlgorithm::makeTowerJE
StatusCode makeTowerJE(const xAOD::JetElement *je, std::vector< MonitorJE > &vecMonJE) const
Definition: MistimedStreamMonitorAlgorithm.cxx:1104
xAOD::TriggerTower_v2::eta
virtual double eta() const final
The pseudorapidity ( ) of the particle.
Definition: TriggerTower_v2.cxx:210
MistimedStreamMonitorAlgorithm::MonitorTT::tower
const xAOD::TriggerTower * tower
Definition: MistimedStreamMonitorAlgorithm.h:65
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
xAOD::jFexSRJetRoI
jFexSRJetRoI_v1 jFexSRJetRoI
Define the latest version of the jFexSRJetRoI class
Definition: jFexSRJetRoI.h:14
CHECK
#define CHECK(...)
Evaluate an expression and check for errors.
Definition: Control/AthenaKernel/AthenaKernel/errorcheck.h:422
xAOD::jFexTauRoI_v1::phi
float phi() const
AthMonitorAlgorithm::fill
void fill(const ToolHandle< GenericMonitoringTool > &groupHandle, std::vector< std::reference_wrapper< Monitored::IMonitoredVariable >> &&variables) const
Fills a vector of variables to a group by reference.
SG::VarHandleKey::initialize
StatusCode initialize(bool used=true)
If this object is used as a property, then this should be called during the initialize phase.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:103
AthMonitorAlgorithm::GetEventInfo
SG::ReadHandle< xAOD::EventInfo > GetEventInfo(const EventContext &) const
Return a ReadHandle for an EventInfo object (get run/event numbers, etc.)
Definition: AthMonitorAlgorithm.cxx:107
DataVector
Derived DataVector<T>.
Definition: DataVector.h:794
MistimedStreamMonitorAlgorithm::m_trigDec
PublicToolHandle< Trig::TrigDecisionTool > m_trigDec
Definition: MistimedStreamMonitorAlgorithm.h:95
SG::ReadHandle::isValid
virtual bool isValid() override final
Can the handle be successfully dereferenced?
MistimedStreamMonitorAlgorithm::m_packageName
StringProperty m_packageName
Definition: MistimedStreamMonitorAlgorithm.h:89
MistimedStreamMonitorAlgorithm::m_eventCounter
std::atomic< int > m_eventCounter
Definition: MistimedStreamMonitorAlgorithm.h:152
MistimedStreamMonitorAlgorithm::m_ctpRdoReadKey
SG::ReadHandleKey< CTP_RDO > m_ctpRdoReadKey
Definition: MistimedStreamMonitorAlgorithm.h:97
MistimedStreamMonitorAlgorithm::m_jFexSRJetContainerKey
SG::ReadHandleKey< xAOD::jFexSRJetRoIContainer > m_jFexSRJetContainerKey
Definition: MistimedStreamMonitorAlgorithm.h:112
MistimedStreamMonitorAlgorithm::MonitorJE::phiScaled
std::vector< double > phiScaled
Definition: MistimedStreamMonitorAlgorithm.h:81
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:240
MistimedStreamMonitorAlgorithm::m_jetElementLocation
SG::ReadHandleKey< xAOD::JetElementContainer > m_jetElementLocation
Definition: MistimedStreamMonitorAlgorithm.h:104
xAOD::gFexJetRoI
gFexJetRoI_v1 gFexJetRoI
Define the latest version of the gFexJetRoI class.
Definition: gFexJetRoI.h:16
MistimedStreamMonitorAlgorithm::m_EmulTowerKey
SG::ReadHandleKey< xAOD::jFexTowerContainer > m_EmulTowerKey
Definition: MistimedStreamMonitorAlgorithm.h:116
ActsTrk::to_string
std::string to_string(const DetectorType &type)
Definition: GeometryDefs.h:34
plotBeamSpotMon.b
b
Definition: plotBeamSpotMon.py:76
MistimedStreamMonitorAlgorithm::pulseQuality
bool pulseQuality(const std::vector< uint16_t > &ttPulse, int peakSlice) const
Definition: MistimedStreamMonitorAlgorithm.cxx:1214
DataVector::push_back
value_type push_back(value_type pElem)
Add an element to the end of the collection.
SG::CondHandleKey::initialize
StatusCode initialize(bool used=true)
MistimedStreamMonitorAlgorithm::makeTowerCPM
StatusCode makeTowerCPM(const xAOD::CPMTower *cpm, std::vector< MonitorCPM > &vecMonCPM) const
Definition: MistimedStreamMonitorAlgorithm.cxx:1056
SG::VarHandleBase::key
virtual const std::string & key() const override final
Return the StoreGate ID for the referenced object.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleBase.cxx:64
MistimedStreamMonitorAlgorithm::m_jFexDataTowerKey
SG::ReadHandleKey< xAOD::jFexTowerContainer > m_jFexDataTowerKey
Definition: MistimedStreamMonitorAlgorithm.h:115
MistimedStreamMonitorAlgorithm::InTime
@ InTime
Definition: MistimedStreamMonitorAlgorithm.h:164
AthMonitorAlgorithm::initialize
virtual StatusCode initialize() override
initialize
Definition: AthMonitorAlgorithm.cxx:18
MistimedStreamMonitorAlgorithm::MonitorCPM::etaScaled
double etaScaled
Definition: MistimedStreamMonitorAlgorithm.h:74
MistimedStreamMonitorAlgorithm::MonitorCPM
Struct to contain CPM tower info.
Definition: MistimedStreamMonitorAlgorithm.h:71
a
TList * a
Definition: liststreamerinfos.cxx:10
MistimedStreamMonitorAlgorithm::m_eFexEMOutContainerKey
SG::ReadHandleKey< xAOD::eFexEMRoIContainer > m_eFexEMOutContainerKey
Definition: MistimedStreamMonitorAlgorithm.h:108
MistimedStreamMonitorAlgorithm::MonitorTT::phiScaled
double phiScaled
Definition: MistimedStreamMonitorAlgorithm.h:66
ReadFloatFromCool.adc
adc
Definition: ReadFloatFromCool.py:48
MistimedStreamMonitorAlgorithm::HLT_mistimemonj400
@ HLT_mistimemonj400
Definition: MistimedStreamMonitorAlgorithm.h:161
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
MistimedStreamMonitorAlgorithm::MonitorJE
Struct to contain JE info.
Definition: MistimedStreamMonitorAlgorithm.h:79
MistimedStreamMonitorAlgorithm::m_jFexTauContainerKey
SG::ReadHandleKey< xAOD::jFexTauRoIContainer > m_jFexTauContainerKey
Definition: MistimedStreamMonitorAlgorithm.h:113
TauGNNUtils::Variables::Track::dPhi
bool dPhi(const xAOD::TauJet &tau, const xAOD::TauTrack &track, float &out)
Definition: TauGNNUtils.cxx:412
convertTimingResiduals.offset
offset
Definition: convertTimingResiduals.py:71
xAOD::jFexTauRoI
jFexTauRoI_v1 jFexTauRoI
Define the latest version of the jFexSRJetRoI class
Definition: jFexTauRoI.h:13
xAOD::JetElement_v2::phi
float phi() const
get phi (note that for L1Calo phi runs from 0 to 2pi)
MistimedStreamMonitorAlgorithm::m_jFexLRJetContainerKey
SG::ReadHandleKey< xAOD::jFexLRJetRoIContainer > m_jFexLRJetContainerKey
Definition: MistimedStreamMonitorAlgorithm.h:111
MistimedStreamMonitorAlgorithm::m_cpmTowerLocation
SG::ReadHandleKey< xAOD::CPMTowerContainer > m_cpmTowerLocation
Definition: MistimedStreamMonitorAlgorithm.h:102
ConstAccessor.h
Helper class to provide constant type-safe access to aux data.
Monitored::Scalar
Declare a monitored scalar variable.
Definition: MonitoredScalar.h:34
fillSCTHists.etaMod
etaMod
Definition: fillSCTHists.py:23
MistimedStreamMonitorAlgorithm::MonitorCPM::phiScaled
std::vector< double > phiScaled
Definition: MistimedStreamMonitorAlgorithm.h:73
xAOD::jFexTower_v1
Class describing input data of a LVL1 jFEX.
Definition: jFexTower_v1.h:22
MistimedStreamMonitorAlgorithm::initialize
virtual StatusCode initialize() override
initialize
Definition: MistimedStreamMonitorAlgorithm.cxx:17
L1CaloReadoutConfigJSON::channelId
unsigned int channelId() const
Definition: L1CaloReadoutConfigJSON.h:18
L1CaloRunParameters::readoutConfigID
unsigned int readoutConfigID() const
Definition: L1CaloRunParameters.h:29
Amg::distance
float distance(const Amg::Vector3D &p1, const Amg::Vector3D &p2)
calculates the distance between two point in 3D space
Definition: GeoPrimitivesHelpers.h:54
TileDCSDataPlotter.tt
tt
Definition: TileDCSDataPlotter.py:876
MistimedStreamMonitorAlgorithm::m_phiScaleTT
Gaudi::Property< double > m_phiScaleTT
Definition: MistimedStreamMonitorAlgorithm.h:124
python.compressB64.c
def c
Definition: compressB64.py:93
MistimedStreamMonitorAlgorithm::makeTowerPPM
StatusCode makeTowerPPM(const xAOD::TriggerTower *tt, std::vector< MonitorTT > &vecMonTT) const
Helper functions.
Definition: MistimedStreamMonitorAlgorithm.cxx:1036
MistimedStreamMonitorAlgorithm::m_readoutConfigContainerJSON
SG::ReadCondHandleKey< L1CaloReadoutConfigContainerJSON > m_readoutConfigContainerJSON
Definition: MistimedStreamMonitorAlgorithm.h:130
xAOD::TriggerTower
TriggerTower_v2 TriggerTower
Define the latest version of the TriggerTower class.
Definition: Event/xAOD/xAODTrigL1Calo/xAODTrigL1Calo/TriggerTower.h:16
L1CaloReadoutConfigJSON::readout80ModePpm
unsigned int readout80ModePpm() const
Definition: L1CaloReadoutConfigJSON.h:68
MistimedStreamMonitorAlgorithm::UnsuitableReadout
@ UnsuitableReadout
Definition: MistimedStreamMonitorAlgorithm.h:160
mapkey::key
key
Definition: TElectronEfficiencyCorrectionTool.cxx:37
xAOD::CPMTower_v2
Description of CPMTower_v2.
Definition: CPMTower_v2.h:26