ATLAS Offline Software
Loading...
Searching...
No Matches
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
8DQTBackgroundMon::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() );
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
27StatusCode 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}
Scalar eta() const
pseudorapidity method
Scalar phi() const
phi method
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
static const Attributes_t empty
const ToolHandle< GenericMonitoringTool > & getGroup(const std::string &name) const
Get a specific monitoring tool from the tool handle array.
virtual StatusCode initialize() override
initialize
const ToolHandle< Trig::TrigDecisionTool > & getTrigDecisionTool() const
Get the trigger decision tool member.
SG::ReadHandle< xAOD::EventInfo > GetEventInfo(const EventContext &) const
Return a ReadHandle for an EventInfo object (get run/event numbers, etc.)
AthMonitorAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
Constructor.
virtual StatusCode fillHistograms(const EventContext &ctx) const override
adds event to the monitoring histograms
virtual StatusCode initialize() override
initialize
GP< int > m_unpairNonIsoBG
DQTBackgroundMon(const std::string &name, ISvcLocator *pSvcLocator)
GP< float > m_MBTSTimeCut
RHK< LUCID_RawDataContainer > m_LUCID_RawDataContainerKey
RHK< LArCollisionTime > m_LArCollisionTimeKey
RHK< SpacePointContainer > m_sctSpacePointKey
RHK< MBTSCollisionTime > m_MBTSCollisionTimeKey
SG::ReadDecorHandleKey< xAOD::EventInfo > m_eventInfoDecorKey
RHK< SpacePointContainer > m_pixSpacePointKey
GP< float > m_MBTSThresholdCut
RHK< BeamBackgroundData > m_BeamBackgroundDataKey
RHK< TileCellContainer > m_TileCellContainerKey
RHK< xAOD::VertexContainer > m_VertexContainerKey
SG::ReadHandle< T > RH
int getNhitsPMTsideA() const
int getNhitsPMTsideC() const
Declare a monitored scalar variable.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
Base class for all TrackSegment implementations, extends the common MeasurementBase.
flt_t time() const
Access cluster time.
virtual double eta() const
The pseudorapidity ( ) of the particle.
virtual double e() const
The total energy of the particle.
virtual double phi() const
The azimuthal angle ( ) of the particle.
@ Background
The beam background detectors.
float y() const
Returns the x position.
Generic monitoring tool for athena components.
ValuesCollection< T > Collection(std::string name, const T &collection)
Declare a monitored (double-convertible) collection.
Jet_v1 Jet
Definition of the current "jet version".
CaloCluster_v1 CaloCluster
Define the latest version of the calorimeter cluster class.
MuonSegment_v1 MuonSegment
Reference the current persistent version:
void fill(H5::Group &out_file, size_t iterations)