ATLAS Offline Software
EfexSimMonitorAlgorithm.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3 */
6 #include <set>
8 
9 EfexSimMonitorAlgorithm::EfexSimMonitorAlgorithm( const std::string& name, ISvcLocator* pSvcLocator )
10  : AthMonitorAlgorithm(name,pSvcLocator)
11 {
12 }
13 
15 
16  ATH_MSG_DEBUG("EfexSimMonitorAlgorith::initialize");
17  ATH_MSG_DEBUG("Package Name "<< m_packageName);
18  ATH_MSG_DEBUG("m_eFexEmContainer"<< m_eFexEmContainerKey);
19  ATH_MSG_DEBUG("m_eFexEmSimContainer"<< m_eFexEmSimContainerKey);
20  ATH_MSG_DEBUG("m_eFexTauContainer"<< m_eFexTauContainerKey);
21  ATH_MSG_DEBUG("m_eFexTauSimContainer"<< m_eFexTauSimContainerKey);
22 
23  // we initialise all the containers that we need
24  ATH_CHECK( m_eFexEmContainerKey.initialize() );
25  ATH_CHECK( m_eFexEmSimContainerKey.initialize() );
26  ATH_CHECK( m_eFexTauContainerKey.initialize() );
27  ATH_CHECK( m_eFexTauSimContainerKey.initialize() );
28  //m_decorKey = "EventInfo.eTowerMakerFromEfexTowers_usedSecondary";
29  //ATH_CHECK( m_decorKey.initialize() );
31  ATH_CHECK( m_bcContKey.initialize() );
32 
34 }
35 
36 StatusCode EfexSimMonitorAlgorithm::fillHistograms( const EventContext& ctx ) const {
37 
40  return StatusCode::SUCCESS;
41 }
42 
43 template <typename T> unsigned int EfexSimMonitorAlgorithm::fillHistos(const SG::ReadHandleKey<T>& key1, const SG::ReadHandleKey<T>& key2, const EventContext& ctx, const std::string& signa ) const {
44 
45 
46  auto fexReadout = Monitored::Scalar<unsigned int>("fexReadout", 0);
47  if(!m_eFexTowerContainerKey.empty()) {
49  if(towers.isValid() && !towers->empty()) {
50  fexReadout = 1;
51  }
52  }
53  auto IsDataTowers = Monitored::Scalar<bool>("IsDataTowers",fexReadout==1);
54  auto IsEmulatedTowers = Monitored::Scalar<bool>("IsEmulatedTowers",fexReadout==0);
55 
56  // mismatches can be caused by recent/imminent OTF maskings, so track timings
57  auto timeSince = Monitored::Scalar<int>("timeSince", -1);
58  auto timeUntil = Monitored::Scalar<int>("timeUntil", -1);
60  if(larBadChan.isValid()) {
61  timeSince = ctx.eventID().time_stamp() - larBadChan.getRange().start().time_stamp();
62  timeUntil = larBadChan.getRange().stop().time_stamp() - ctx.eventID().time_stamp();
63  }
64 
65  std::string EventType = "DataTowers";
66  if(fexReadout==0) {
67  EventType = "EmulatedTowers";
68  // removing next two lines until further investigation of cause of mismatches by LATOME
69  //if((timeSince>=0&&timeSince<10)) EventType+="+JustAfter";
70  //else if((timeUntil>=0&&timeUntil<10)) EventType+="+JustBefore";
71  }
72 
73  SG::ReadHandle<T> tobs1{key1, ctx};
74  SG::ReadHandle<T> tobs2{key2, ctx};
75 
76  if(!tobs1.isValid()) {
77  return 0;
78  }
79 
80  std::set<uint32_t> word0s2;
81  if(tobs2.isValid()) {
82  for(const auto tob : *tobs2) {
83  word0s2.insert(tob->word0());
84  }
85  }
86 
87  auto signature = Monitored::Scalar<std::string>("Signature",signa);
88  auto evtType = Monitored::Scalar<std::string>("EventType",EventType);
89  auto tobMismatched = Monitored::Scalar<float>("tobMismatched",0.0);
90 
91  bool mismatches=false;
92 
93  // for each collection record if TOB is matched or not
94 
95  for(const auto tob : *tobs1) {
96  tobMismatched=100;
97  if(word0s2.find(tob->word0()) == word0s2.end()) {
98  mismatches=true;
99  } else {
100  tobMismatched=0;
101  }
102  fill("mismatches",signature,evtType,tobMismatched);
103  }
104  if(tobs2.isValid() && tobs1->size() < tobs2->size()) {
105  tobMismatched=100;
106  mismatches=true;
107  for(unsigned int i=0;i<(tobs2->size()-tobs1->size());i++) {
108  fill("mismatches",signature,tobMismatched,evtType);
109  }
110  }
111  if (mismatches) {
112  // record all tobs to the debug tree .. one entry in the tree = 1 tobType for 1 event
113  auto evtNumber = Monitored::Scalar<ULong64_t>("EventNumber",GetEventInfo(ctx)->eventNumber());
115  auto lbnString = Monitored::Scalar<std::string>("LBNString","");
116  auto& firstEvents = (fexReadout==1) ? m_firstEvents_DataTowers : m_firstEvents_EmulatedTowers;
117  {
118  std::scoped_lock lock(m_firstEventsMutex);
119  auto itr = firstEvents.find(lbn);
120  if(itr==firstEvents.end()) {
121  firstEvents[lbn] = std::to_string(lbn)+":"+std::to_string(evtNumber);
122  itr = firstEvents.find(lbn);
123  }
124  lbnString = itr->second;
125  }
126 
127  std::vector<float> detas{};std::vector<float> setas{};
128  std::vector<float> dphis{};std::vector<float> sphis{};
129  std::vector<unsigned int> dword0s{};std::vector<unsigned int> sword0s{};
130  auto dtobEtas = Monitored::Collection("dataEtas", detas);
131  auto dtobPhis = Monitored::Collection("dataPhis", dphis);
132  auto dtobWord0s = Monitored::Collection("dataWord0s", dword0s);
133  auto stobEtas = Monitored::Collection("simEtas", setas);
134  auto stobPhis = Monitored::Collection("simPhis", sphis);
135  auto stobWord0s = Monitored::Collection("simWord0s", sword0s);
136  auto simReady = Monitored::Scalar<bool>("SimulationReady",fexReadout==1); // used to control if filling plot that is actually monitored in DQM
137  fillVectors(key2,ctx,detas,dphis,dword0s);
138  fillVectors(key1,ctx,setas,sphis,sword0s);
139 
140 
141  std::set<uint32_t> word0s1;
142  for(const auto tob : *tobs1) {
143  word0s1.insert(tob->word0());
144  }
145 
146  auto locIdx = Monitored::Scalar<std::string>("locIdx","");
147  for(size_t i = 0; i < sword0s.size();i++) {
148  if(word0s2.find(sword0s.at(i))==word0s2.end()) {
149  locIdx = std::to_string(tobs1->at(i)->iPhi()/8) + ":" + std::to_string(tobs1->at(i)->iEta());
150  fill(signa + "_mismatches",lbn,locIdx,simReady);
151  }
152  }
153  for(size_t i = 0; i < dword0s.size();i++) {
154  if(word0s1.find(dword0s.at(i))==word0s1.end()) {
155  locIdx = std::to_string(tobs2->at(i)->iPhi()/8) + ":" + std::to_string(tobs2->at(i)->iEta());
156  fill(signa + "_mismatches",lbn,locIdx,simReady);
157  }
158  }
159 
160 
161  fill("mismatches",lbn,lbnString,evtNumber,dtobEtas,dtobPhis,dtobWord0s,stobEtas,stobPhis,stobWord0s,evtType,timeSince,timeUntil,IsDataTowers,IsEmulatedTowers,signature,simReady);
162 
163 
164  }
165 
166 
167  return mismatches;
168 
169 }
EfexSimMonitorAlgorithm::m_eFexEmContainerKey
SG::ReadHandleKey< xAOD::eFexEMRoIContainer > m_eFexEmContainerKey
Definition: EfexSimMonitorAlgorithm.h:38
EfexSimMonitorAlgorithm::m_bcContKey
SG::ReadCondHandleKey< LArBadChannelCont > m_bcContKey
Definition: EfexSimMonitorAlgorithm.h:46
SG::ReadCondHandle
Definition: ReadCondHandle.h:44
EfexSimMonitorAlgorithm::fillHistograms
virtual StatusCode fillHistograms(const EventContext &ctx) const override
adds event to the monitoring histograms
Definition: EfexSimMonitorAlgorithm.cxx:36
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:70
EventType
This class represents the "type of event" where the type is given by one or more "characteristics".
Definition: EventType.h:92
SG::ReadHandleKey
Property holding a SG store/key/clid from which a ReadHandle is made.
Definition: StoreGate/StoreGate/ReadHandleKey.h:39
EfexSimMonitorAlgorithm::m_eFexTauContainerKey
SG::ReadHandleKey< xAOD::eFexTauRoIContainer > m_eFexTauContainerKey
Definition: EfexSimMonitorAlgorithm.h:39
EfexSimMonitorAlgorithm::EfexSimMonitorAlgorithm
EfexSimMonitorAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
Definition: EfexSimMonitorAlgorithm.cxx:9
EfexSimMonitorAlgorithm::m_packageName
StringProperty m_packageName
Definition: EfexSimMonitorAlgorithm.h:30
Monitored::Collection
ValuesCollection< T > Collection(std::string name, const T &collection)
Declare a monitored (double-convertible) collection.
Definition: MonitoredCollection.h:38
module_driven_slicing.key2
key2
Definition: module_driven_slicing.py:159
AthMonitorAlgorithm
Base class for Athena Monitoring Algorithms.
Definition: AthMonitorAlgorithm.h:36
EfexSimMonitorAlgorithm::m_eFexEmSimContainerKey
SG::ReadHandleKey< xAOD::eFexEMRoIContainer > m_eFexEmSimContainerKey
Definition: EfexSimMonitorAlgorithm.h:40
EfexSimMonitorAlgorithm::m_eFexTowerContainerKey
SG::ReadHandleKey< xAOD::eFexTowerContainer > m_eFexTowerContainerKey
Definition: EfexSimMonitorAlgorithm.h:44
lumiFormat.i
int i
Definition: lumiFormat.py:92
EfexSimMonitorAlgorithm::m_eFexTauSimContainerKey
SG::ReadHandleKey< xAOD::eFexTauRoIContainer > m_eFexTauSimContainerKey
Definition: EfexSimMonitorAlgorithm.h:41
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
eFEXTOBSimDataCompare.h
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
EfexSimMonitorAlgorithm::initialize
virtual StatusCode initialize() override
initialize
Definition: EfexSimMonitorAlgorithm.cxx:14
xAOD::eventNumber
eventNumber
Definition: EventInfo_v1.cxx:124
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.
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
EfexSimMonitorAlgorithm.h
EfexSimMonitorAlgorithm::m_firstEventsMutex
std::mutex m_firstEventsMutex
Definition: EfexSimMonitorAlgorithm.h:35
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
ActsTrk::to_string
std::string to_string(const DetectorType &type)
Definition: GeometryDefs.h:34
AthMonitorAlgorithm::initialize
virtual StatusCode initialize() override
initialize
Definition: AthMonitorAlgorithm.cxx:18
EfexSimMonitorAlgorithm::fillHistos
unsigned int fillHistos(const SG::ReadHandleKey< T > &key1, const SG::ReadHandleKey< T > &key2, const EventContext &ctx, const std::string &signa="") const
Definition: EfexSimMonitorAlgorithm.cxx:43
RunTileMonitoring.towers
towers
Definition: RunTileMonitoring.py:133
EfexSimMonitorAlgorithm::fillVectors
void fillVectors(const SG::ReadHandleKey< T > &key, const EventContext &ctx, std::vector< float > &etas, std::vector< float > &phis, std::vector< unsigned int > &word0s) const
Definition: EfexSimMonitorAlgorithm.h:55
ReadDecorHandle.h
Handle class for reading a decoration on an object.
Monitored::Scalar
Declare a monitored scalar variable.
Definition: MonitoredScalar.h:34
xAOD::lumiBlock
setTeId lumiBlock
Definition: L2StandAloneMuon_v1.cxx:327
SG::AllowEmpty
@ AllowEmpty
Definition: StoreGate/StoreGate/VarHandleKey.h:30
LB_AnalMapSplitter.lbn
lbn
Definition: LB_AnalMapSplitter.py:28
module_driven_slicing.key1
key1
Definition: module_driven_slicing.py:158