ATLAS Offline Software
DQTBackgroundMon.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3 */
4 
7 
8 DQTBackgroundMon::DQTBackgroundMon( const std::string& name, ISvcLocator* pSvcLocator )
9 : AthMonitorAlgorithm(name,pSvcLocator)
10 {}
11 
13 
15  ATH_CHECK( m_LArCollisionTimeKey.initialize() );
16  ATH_CHECK( m_MBTSCollisionTimeKey.initialize() );
17  ATH_CHECK( m_TileCellContainerKey.initialize() );
18  ATH_CHECK( m_LUCID_RawDataContainerKey.initialize() );
19  ATH_CHECK( m_BeamBackgroundDataKey.initialize() );
20  ATH_CHECK( m_VertexContainerKey.initialize() );
21  ATH_CHECK( m_eventInfoDecorKey.initialize() );
22  ATH_CHECK( m_sctSpacePointKey.initialize() );
23  ATH_CHECK( m_pixSpacePointKey.initialize() );
25 }
26 
27 StatusCode DQTBackgroundMon::fillHistograms( const EventContext& ctx ) const {
28  ATH_MSG_DEBUG("In DQTBackgroundMon::fillHistograms()");
29  using namespace Monitored;
30 
31  auto group = getGroup("default");
32 
33  auto filled = Scalar<bool>("filled",false);
34  auto empty = Scalar<bool>("empty",false);
35  auto unpairIso = Scalar<bool>("unpairIso",false);
36  auto unpairNonIso = Scalar<bool>("unpairNonIso",false);
37 
38  RH<xAOD::EventInfo> eventInfo{GetEventInfo(ctx)};
43  RH<TileCellContainer> tileCellContainer(m_TileCellContainerKey,ctx);
45  RH<BeamBackgroundData> beamBackgroundData(m_BeamBackgroundDataKey,ctx);
47 
48  if ( eventInfo.isValid() ) {
49  if (!getTrigDecisionTool().empty()) {
50  unsigned int bgCode = getTrigDecisionTool()->getBGCode();
51  filled = bgCode & (1<<m_filledBG);
52  empty = bgCode & (1<<m_emptyBG);
53  unpairIso = bgCode & (1<<m_unpairIsoBG);
54  unpairNonIso = bgCode & (1<<m_unpairNonIsoBG);
55  }
56 
57  std::vector<int> bitVec = {};
58  std::vector<int> filledVec = {};
59  std::vector<int> emptyVec = {};
60  std::vector<int> unpairIsoVec = {};
61  std::vector<int> unpairNonIsoVec = {};
62 
63  for ( int bkg=0; bkg<m_nBkgWords; bkg++ ) {
64  unsigned int bgWord = eventInfo->eventFlags(xAOD::EventInfo::Background);
65  ATH_MSG_DEBUG("Background word is "<<bgWord);
66  if ( !(bgWord & 1<<bkg) ) {
67  continue;
68  }
69 
70  bitVec.push_back(bkg);
71  if (filled) {
72  filledVec.push_back(bkg);
73  } else if (empty) {
74  emptyVec.push_back(bkg);
75  } else if (unpairIso) {
76  unpairIsoVec.push_back(bkg);
77  } else if (unpairNonIso) {
78  unpairNonIsoVec.push_back(bkg);
79  }
80  }
81 
82  auto bitSet = Collection("bitSet",bitVec);
83  auto bitSetFilled = Collection("bitSetFilled",filledVec);
84  auto bitSetEmpty = Collection("bitSetEmpty",emptyVec);
85  auto bitSetUnpairIso = Collection("bitSetUnpairIso",unpairIsoVec);
86  auto bitSetUnpairNonIso = Collection("bitSetUnpairNonIso",unpairNonIsoVec);
87  fill(group,bitSet,bitSetFilled,bitSetEmpty,bitSetUnpairIso,bitSetUnpairNonIso);
88  } else {
89  ATH_MSG_WARNING("Event data invalid. Background word histograms are being skipped.");
90  }
91 
92 
93 
94  if (sctSP.isValid() and pixSP.isValid()) {
95  auto nSctSPs = Scalar<float>("nSctSPs",0.0);
96  std::for_each(sctSP->begin(),sctSP->end(),[&nSctSPs](const auto coll){if (coll) nSctSPs+=coll->size();});
97 
98  auto nPixSPs = Scalar<float>("nPixSPs",0.0);
99  std::for_each(pixSP->begin(),pixSP->end(),[&nPixSPs](const auto coll){if (coll) nPixSPs+=coll->size();});
100 
101  fill(group,nPixSPs,nSctSPs,unpairIso,unpairNonIso);
102  if ( nPixSPs<m_upPixSP ){
103  fill("lowMultiplicityPixGroup",nPixSPs,unpairIso,unpairNonIso);
104  }
105  if ( nSctSPs<m_upSctSP ) {
106  fill("lowMultiplicitySctGroup",nSctSPs,unpairIso,unpairNonIso);
107  }
108  } else {
109  ATH_MSG_WARNING("Pixe/SCT Spacepoint data invalid. nPix/nSct is being skipped.");
110  }
111 
112  if ( tps.isValid() ) {
113  if ( tps->ncellA()>m_LArECSideCut && tps->ncellC()>m_LArECSideCut ) {
114  auto LArECTimeDiff = Scalar<float>("LArECTimeDiff", tps->timeA()-tps->timeC());
115  fill(group,LArECTimeDiff);
116  }
117  } else {
118  ATH_MSG_WARNING("TPS data invalid. LArECTimeDiff is being skipped.");
119  }
120 
121  if ( mbtsTime.isValid() ) {
122  if ( mbtsTime->ncellA()>m_MBTSSideCut && mbtsTime->ncellC()>m_MBTSSideCut ) {
123  auto MBTStimeDiff = Scalar<float>("MBTStimeDiff", mbtsTime->time());
124  fill(group,MBTStimeDiff);
125  }
126  } else {
127  ATH_MSG_WARNING("MBTSCollisionTime data invalid. MBTStimeDiff is being skipped.");
128  }
129 
130  if ( tileCellContainer.isValid() ) {
131  auto MBTSCount = Scalar<int>("MBTSvetoHits",0);
132  for ( auto tileCell : *tileCellContainer ) {
133  if (tileCell->energy()>m_MBTSThresholdCut &&
134  (tileCell->qbit1() & m_MBTSMask)==m_MBTSPattern &&
135  fabs(tileCell->time())<m_MBTSTimeCut )
136  MBTSCount++;
137  }
138  fill(group,MBTSCount);
139  } else {
140  ATH_MSG_WARNING("TileCell data invalid. MBTSvetoHits is being skipped.");
141  }
142 
143  if ( LUCID_RawDataContainer.isValid() ) {
144  auto LUCIDCounter = Scalar<int>("LUCIDCounter",0);
145  for ( auto LUCID_RawData : *LUCID_RawDataContainer ) {
147  }
148  fill(group,LUCIDCounter);
149  } else {
150  ATH_MSG_WARNING("LUCID data invalid. LUCID is being skipped.");
151  }
152 
153  if ( m_doMuons ) {
154  if (beamBackgroundData.isValid() ) {
155  // Muon segments and clusters
156  std::vector<double> muSegXVec = {};
157  std::vector<double> muSegYVec = {};
158  for (int iSeg=0; iSeg<beamBackgroundData->GetNumSegment(); iSeg++) {
159  const Trk::Segment* trkSeg = beamBackgroundData->GetIndexSeg(iSeg);
160  const xAOD::MuonSegment* muonSeg = dynamic_cast<const xAOD::MuonSegment*>(trkSeg);
161  if (muonSeg) {
162  muSegXVec.push_back(muonSeg->x()*1e-3);
163  muSegYVec.push_back(muonSeg->y()*1e-3);
164  }
165  }
166  auto muSegXCollection = Collection("muonSegmentX",muSegXVec);
167  auto muSegYCollection = Collection("muonSegmentY",muSegYVec);
168 
169  std::vector<double> clusterEnergyVec = {};
170  std::vector<double> clusterEtaVec = {};
171  std::vector<double> clusterPhiVec = {};
172  std::vector<double> clusterTimeVec = {};
173  for (int i=0; i<beamBackgroundData->GetNumMatched(); i++) {
174  const xAOD::CaloCluster* cluster = beamBackgroundData->GetIndexClus(i);
175  clusterEnergyVec.push_back(cluster->e()*1e-3);
176  clusterEtaVec.push_back(cluster->eta());
177  clusterPhiVec.push_back(cluster->phi());
178  clusterTimeVec.push_back(cluster->time());
179  }
180  auto clusterEnergyCollection = Collection("clusterEnergy",clusterEnergyVec);
181  auto clusterEtaCollection = Collection("clusterEta",clusterEtaVec);
182  auto clusterPhiCollection = Collection("clusterPhi",clusterPhiVec);
183  auto clusterTimeCollection = Collection("clusterTime",clusterTimeVec);
184 
185  fill(group,muSegXCollection,muSegYCollection,clusterEnergyCollection,
186  clusterEtaCollection,clusterPhiCollection,clusterTimeCollection);
187 
188  // fake jets
189  if ( beamBackgroundData->GetNumNoTimeTight() ) {
190  std::vector<int> jetIndexVec = {};
191  for (int i=0; i<beamBackgroundData->GetNumJet(); i++) {
192  const xAOD::Jet* jet = beamBackgroundData->GetIndexJet(i);
193  int jetIndex = beamBackgroundData->GetIndexJet(jet);
194  jetIndexVec.push_back(jetIndex);
195 
196  // Leading jet
197  if ( jetIndex==0 ) {
198  auto pt = Scalar<double>("leadingJetPt", jet->pt());
199  auto eta = Scalar<double>("leadingJetEta", jet->eta());
200  auto phi = Scalar<double>("leadingJetPhi", jet->phi());
201  double timeValue = jet->getAttribute<float>(xAOD::JetAttribute::Timing);
202  auto time = Scalar<double>("leadingJetTime", timeValue);
203  double emfValue = jet->getAttribute<float>(xAOD::JetAttribute::EMFrac);
204  auto emf = Scalar<double>("leadingJetEMFrac", emfValue);
205 
206  std::vector<float> sumPt_v;
207  auto trkPtAttr = xAOD::JetAttribute::SumPtTrkPt1000;
208  bool hasSumPt = jet->getAttribute<std::vector<float>>(trkPtAttr, sumPt_v);
209  double sumPtTrk = hasSumPt ? sumPt_v[0] : 0.;
210  auto chf = Scalar<double>("leadingJetCHF", sumPtTrk / pt);
211 
212  fill(group,pt,eta,phi,time,emf,chf);
213  }
214  }
215  auto jetIndexCollection = Collection("jetIndex",jetIndexVec);
216 
217  auto bcid = Scalar<int>("bcid",2);
218  auto isAC = Scalar<bool>("isAC", beamBackgroundData->GetDirection()>0);
219  auto isCA = Scalar<bool>("isCA", beamBackgroundData->GetDirection()<0);
220  bool isOneSided = beamBackgroundData->GetNumOneSidedLoose();
221  auto isACOneSided = Scalar<bool>("isACOneSided", isAC && isOneSided );
222  auto isCAOneSided = Scalar<bool>("isCAOneSided", isCA && isOneSided );
223  fill(group,jetIndexCollection,bcid,isAC,isCA,isACOneSided,isCAOneSided);
224  } // end fake jets
225  } else {
226  ATH_MSG_WARNING("BeamBackgroundData data invalid. Muons are being skipped.");
227  }
228  } // end muons
229 
230  if (vertexContainer.isValid()) {
231  // count vertices, excluding the dummy vertex
232  auto nVertex = Scalar<int>("nVertex", vertexContainer->size()-1);
233  fill(group,nVertex,unpairIso,unpairNonIso);
234  } else {
235  ATH_MSG_DEBUG("Primary vertex data invalid. Primary vertex counts are being skipped.");
236  }
237  return StatusCode::SUCCESS;
238 }
DQTBackgroundMon::m_LArECSideCut
GP< int > m_LArECSideCut
Definition: DQTBackgroundMon.h:64
xAOD::CaloCluster_v1::phi
virtual double phi() const
The azimuthal angle ( ) of the particle.
Definition: CaloCluster_v1.cxx:256
AllowedVariables::e
e
Definition: AsgElectronSelectorTool.cxx:37
DQTBackgroundMon::m_MBTSThresholdCut
GP< float > m_MBTSThresholdCut
Definition: DQTBackgroundMon.h:67
xAOD::CaloCluster_v1::time
flt_t time() const
Access cluster time.
DQTBackgroundMon::m_VertexContainerKey
RHK< xAOD::VertexContainer > m_VertexContainerKey
Definition: DQTBackgroundMon.h:45
xAOD::MuonSegment_v1::x
float x() const
MBTSCollisionTime::time
double time() const
time difference A - C
Definition: MBTSCollisionTime.h:55
BeamBackgroundData::GetNumSegment
int GetNumSegment() const
Definition: BeamBackgroundData.h:74
Merge_LAr_blobs.filled
list filled
Definition: Merge_LAr_blobs.py:43
phi
Scalar phi() const
phi method
Definition: AmgMatrixBasePlugin.h:67
DQTBackgroundMon::m_MBTSCollisionTimeKey
RHK< MBTSCollisionTime > m_MBTSCollisionTimeKey
Definition: DQTBackgroundMon.h:41
eta
Scalar eta() const
pseudorapidity method
Definition: AmgMatrixBasePlugin.h:83
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:67
MBTSCollisionTime::ncellC
int ncellC() const
get number of cells for time C side
Definition: MBTSCollisionTime.h:34
xAOD::bgCode
bgCode
Definition: TrigDecision_v1.cxx:39
DQTBackgroundMon::m_LArCollisionTimeKey
RHK< LArCollisionTime > m_LArCollisionTimeKey
Definition: DQTBackgroundMon.h:40
BeamBackgroundData::GetIndexSeg
int GetIndexSeg(const Trk::Segment *seg) const
This function looks for the muon segment among the beam halo muon candidates.
Definition: BeamBackgroundData.cxx:13
DQTBackgroundMon::m_doMuons
GP< bool > m_doMuons
Definition: DQTBackgroundMon.h:37
BeamBackgroundData::GetNumJet
int GetNumJet() const
Definition: BeamBackgroundData.h:88
DQTBackgroundMon::m_sctSpacePointKey
RHK< SpacePointContainer > m_sctSpacePointKey
Definition: DQTBackgroundMon.h:46
AthMonitorAlgorithm::getTrigDecisionTool
const ToolHandle< Trig::TrigDecisionTool > & getTrigDecisionTool() const
Get the trigger decision tool member.
Definition: AthMonitorAlgorithm.cxx:194
test_pyathena.pt
pt
Definition: test_pyathena.py:11
DQTBackgroundMon.h
xAOD::MuonSegment_v1
Class describing a MuonSegment.
Definition: MuonSegment_v1.h:33
DQTBackgroundMon::m_MBTSMask
GP< int > m_MBTSMask
Definition: DQTBackgroundMon.h:68
TrigDecisionTool.h
DQTBackgroundMon::m_unpairNonIsoBG
GP< int > m_unpairNonIsoBG
Definition: DQTBackgroundMon.h:59
xAOD::EventInfo_v1::Background
@ Background
The beam background detectors.
Definition: EventInfo_v1.h:340
BeamBackgroundData::GetIndexJet
int GetIndexJet(const xAOD::Jet *jet) const
This function looks for the jet among the fake jets candidates.
Definition: BeamBackgroundData.cxx:51
LUCID_RawData
Definition: LUCID_RawData.h:40
Monitored::Collection
ValuesCollection< T > Collection(std::string name, const T &collection)
Declare a monitored (double-convertible) collection.
Definition: MonitoredCollection.h:38
DQTBackgroundMon::initialize
virtual StatusCode initialize() override
initialize
Definition: DQTBackgroundMon.cxx:14
AthMonitorAlgorithm
Base class for Athena Monitoring Algorithms.
Definition: AthMonitorAlgorithm.h:36
LArCollisionTime::ncellC
int ncellC() const
get number of cells for time C side
Definition: LArCollisionTime.h:33
BeamBackgroundData::GetDirection
int GetDirection() const
Definition: BeamBackgroundData.h:101
xAOD::CaloCluster_v1
Description of a calorimeter cluster.
Definition: CaloCluster_v1.h:62
jet
Definition: JetCalibTools_PlotJESFactors.cxx:23
LUCID_RawDataContainer
Definition: LUCID_RawDataContainer.h:12
xAOD::CaloCluster_v1::eta
virtual double eta() const
The pseudorapidity ( ) of the particle.
Definition: CaloCluster_v1.cxx:251
lumiFormat.i
int i
Definition: lumiFormat.py:85
Monitored
Generic monitoring tool for athena components.
Definition: GenericMonitoringTool.h:28
xAOD::JetAttribute::EMFrac
@ EMFrac
Definition: JetAttributes.h:112
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
DQTBackgroundMon::m_eventInfoDecorKey
SG::ReadDecorHandleKey< xAOD::EventInfo > m_eventInfoDecorKey
Definition: DQTBackgroundMon.h:49
Trk::Segment
Definition: Tracking/TrkEvent/TrkSegment/TrkSegment/Segment.h:56
xAOD::JetAttribute::SumPtTrkPt1000
@ SumPtTrkPt1000
Definition: JetAttributes.h:107
xAOD::JetAttribute::Timing
@ Timing
Definition: JetAttributes.h:90
LArCollisionTime::timeC
double timeC() const
time C side
Definition: LArCollisionTime.h:45
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
DQTBackgroundMon::m_nBkgWords
GP< int > m_nBkgWords
Definition: DQTBackgroundMon.h:70
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
DQTBackgroundMon::m_MBTSSideCut
GP< int > m_MBTSSideCut
Definition: DQTBackgroundMon.h:65
SG::ReadHandle::isValid
virtual bool isValid() override final
Can the handle be successfully dereferenced?
BeamBackgroundData::GetNumNoTimeTight
int GetNumNoTimeTight() const
Definition: BeamBackgroundData.h:81
MBTSCollisionTime::ncellA
int ncellA() const
get number of cells for time A side
Definition: MBTSCollisionTime.h:31
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:240
BeamBackgroundData::GetNumMatched
int GetNumMatched() const
Definition: BeamBackgroundData.h:78
DQTBackgroundMon::m_unpairIsoBG
GP< int > m_unpairIsoBG
Definition: DQTBackgroundMon.h:58
DQTBackgroundMon::DQTBackgroundMon
DQTBackgroundMon(const std::string &name, ISvcLocator *pSvcLocator)
Definition: DQTBackgroundMon.cxx:8
xAOD::bcid
setEventNumber setTimeStamp bcid
Definition: EventInfo_v1.cxx:133
LUCID_RawData::getNhitsPMTsideC
int getNhitsPMTsideC() const
Definition: LUCID_RawData.h:115
AthMonitorAlgorithm::initialize
virtual StatusCode initialize() override
initialize
Definition: AthMonitorAlgorithm.cxx:18
DQTBackgroundMon::m_LUCID_RawDataContainerKey
RHK< LUCID_RawDataContainer > m_LUCID_RawDataContainerKey
Definition: DQTBackgroundMon.h:43
xAOD::Jet_v1
Class describing a jet.
Definition: Jet_v1.h:57
LArCollisionTime::ncellA
int ncellA() const
get number of cells for time A side
Definition: LArCollisionTime.h:30
LUCID_RawData::getNhitsPMTsideA
int getNhitsPMTsideA() const
Definition: LUCID_RawData.h:114
DQTBackgroundMon::m_emptyBG
GP< int > m_emptyBG
Definition: DQTBackgroundMon.h:57
CaloLCW_tf.group
group
Definition: CaloLCW_tf.py:28
DQTBackgroundMon::m_MBTSTimeCut
GP< float > m_MBTSTimeCut
Definition: DQTBackgroundMon.h:66
xAOD::MuonSegment_v1::y
float y() const
Returns the x position.
CaloSwCorrections.time
def time(flags, cells_name, *args, **kw)
Definition: CaloSwCorrections.py:242
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
DQTBackgroundMon::m_pixSpacePointKey
RHK< SpacePointContainer > m_pixSpacePointKey
Definition: DQTBackgroundMon.h:47
DQTBackgroundMon::m_upSctSP
GP< int > m_upSctSP
Definition: DQTBackgroundMon.h:63
DQTBackgroundMon::m_MBTSPattern
GP< int > m_MBTSPattern
Definition: DQTBackgroundMon.h:69
DQTBackgroundMon::m_filledBG
GP< int > m_filledBG
Definition: DQTBackgroundMon.h:56
BeamBackgroundData::GetNumOneSidedLoose
int GetNumOneSidedLoose() const
Definition: BeamBackgroundData.h:82
DQTBackgroundMon::m_BeamBackgroundDataKey
RHK< BeamBackgroundData > m_BeamBackgroundDataKey
Definition: DQTBackgroundMon.h:44
LArCollisionTime::timeA
double timeA() const
time A side
Definition: LArCollisionTime.h:42
Monitored::Scalar
Declare a monitored scalar variable.
Definition: MonitoredScalar.h:34
BeamBackgroundData::GetIndexClus
int GetIndexClus(const xAOD::CaloCluster *clus) const
This function looks for the calorimeter cluster among the beam halo muon candidates.
Definition: BeamBackgroundData.cxx:32
DataVector::size
size_type size() const noexcept
Returns the number of elements in the collection.
DQTBackgroundMon::m_upPixSP
GP< int > m_upPixSP
Definition: DQTBackgroundMon.h:62
xAOD::CaloCluster_v1::e
virtual double e() const
The total energy of the particle.
Definition: CaloCluster_v1.cxx:265
DQTBackgroundMon::m_TileCellContainerKey
RHK< TileCellContainer > m_TileCellContainerKey
Definition: DQTBackgroundMon.h:42
AthMonitorAlgorithm::getGroup
const ToolHandle< GenericMonitoringTool > & getGroup(const std::string &name) const
Get a specific monitoring tool from the tool handle array.
Definition: AthMonitorAlgorithm.cxx:164
DQTBackgroundMon::fillHistograms
virtual StatusCode fillHistograms(const EventContext &ctx) const override
adds event to the monitoring histograms
Definition: DQTBackgroundMon.cxx:27
DQTBackgroundMon::~DQTBackgroundMon
virtual ~DQTBackgroundMon()
Definition: DQTBackgroundMon.cxx:12