ATLAS Offline Software
Loading...
Searching...
No Matches
CPCMX.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
5// /***************************************************************************
6// CPCMX.cxx - description
7// -------------------
8// begin : Mon Jul 28 2014
9// email : Alan.Watson@CERN.CH
10// ***************************************************************************/
11//
12//
13//================================================
14// CPCMX class Implementation
15// ================================================
16//
17//
18//
19
20// Utilities
21//#include <memory>
22
23// This algorithm includes
24#include "CPCMX.h"
28
30
37
39
40
41
42namespace LVL1{
43
44using namespace TrigConf;
45
46const int CPCMX::s_SourceLocal;
47const int CPCMX::s_SourceTotal;
48
49
50//--------------------------------
51// Constructors and destructors
52//--------------------------------
53
55 ( const std::string& name, ISvcLocator* pSvcLocator )
56 : AthAlgorithm( name, pSvcLocator ) {}
57
58
59//---------------------------------
60// initialise()
61//---------------------------------
62
64{
65 ATH_CHECK(m_CMXCPHitsLocation.initialize());
66 ATH_CHECK(m_CMXCPTobLocation.initialize());
67 ATH_CHECK(m_TopoOutputLocation.initialize());
68 ATH_CHECK(m_CTPOutputKey.initialize());
69 ATH_CHECK(m_CPMCMXDataLocation.initialize());
70 ATH_CHECK( m_L1MenuKey.initialize() );
71
72 return StatusCode::SUCCESS;
73}
74
75
76//----------------------------------------------
77// execute() method called once per event
78//----------------------------------------------
79//
80
81
82StatusCode CPCMX::execute( )
83{
84
85 /*
86 The idea is that this thing gets the inputs, formats them as required, then
87 uses a port of the online code. Then formats outputs and sends them to the
88 required destinations.
89
90 If that doesn't work, we'll put the processing in here as well.
91 */
92
93 //make a message logging stream
94
95 ATH_MSG_DEBUG ( "starting CPCMX" );
96
99 ATH_CHECK(SG::makeHandle(m_CMXCPTobLocation).record( std::unique_ptr<DataVector<CMXCPTob>>(CMXTobs ) ));
101 ATH_CHECK(SG::makeHandle(m_CMXCPHitsLocation).record( std::unique_ptr<DataVector<CMXCPHits>>(CMXHits ) ));
102
103
105 std::vector< std::string > triggerTypes;
106 triggerTypes.push_back(L1DataDef::typeAsString(L1DataDef::EM));
107 triggerTypes.push_back(L1DataDef::typeAsString(L1DataDef::TAU));
108
109 std::vector< std::vector< std::vector<int> > > crateHits;
110 std::vector< std::vector<int> > Hits;
111
112 Hits.resize(2);
113 Hits[0].resize(16);
114 Hits[1].resize(16);
115
116 crateHits.resize(4);
117 for (int crate = 0; crate < 4; ++crate) {
118 crateHits[crate].resize(2);
119 for (int cmx = 0; cmx < 2; ++cmx) {
120 crateHits[crate][cmx].resize(16);
121 }
122 }
123
124
125 // Create objects to store TOBs for L1Topo
127 ATH_CHECK(topoData.record(std::make_unique<DataVector<CPCMXTopoData>>()));
128 for (int crate = 0; crate < 4; ++crate) {
129 for (int cmx = 0; cmx < 2; ++cmx) {
130 CPCMXTopoData* link = new CPCMXTopoData(crate, cmx);
131 topoData->push_back(link);
132 }
133 }
134
135 // Overflow flags for EM and TAU RoIs (i.e. the 2 CMXes)
136 bool cpmOverflow[2] = {false, false};
137
139 auto l1Menu = SG::makeHandle( m_L1MenuKey );
140
141
142 float cpScale = l1Menu->thrExtraInfo().EM().emScale();
143 std::vector<std::shared_ptr<TrigConf::L1Threshold>> allThresholds = l1Menu->thresholds();
144 std::vector<std::shared_ptr<TrigConf::L1Threshold>> thresholds;
145 for ( const auto& thresh : allThresholds ) {
146 if ( thresh->type() == L1DataDef::typeAsString(L1DataDef::EM) ||
147 thresh->type() == L1DataDef::typeAsString(L1DataDef::TAU) )
148 thresholds.push_back( thresh );
149 }
150
153 // Analyse module results
154 t_cpmDataContainer::const_iterator it = bpData->begin();
155 for ( ; it != bpData->end(); ++it) {
156 int crate = (*it)->crate();
157 int cmx = (*it)->type();
158 std::vector<unsigned int> tobWords = (*it)->TopoTOBs();
159
160 // Store data for L1Topo
161 int index = 2*crate + cmx;
162 bool overflow = (*it)->overflow();
163 if (overflow) {
164 (*topoData)[index]->setOverflow(true);
165 cpmOverflow[cmx] = true;
166 }
167
168 for (std::vector<unsigned int>::const_iterator word = tobWords.begin();
169 word != tobWords.end(); ++word) {
170
171 // Push back to Topo link
172 (*topoData)[index]->addTOB( (*word) );
173
174 // Decode TOB word
175 CPTopoTOB tob( crate, cmx, (*word) );
176 int ieta = tob.ieta() - 1;
177 int iphi = tob.iphi();
178 if (iphi < 0) iphi += 64;
179 int et = tob.et();
180 unsigned int isol = tob.isolation();
181
182 // Now check against trigger thresholds
183 for ( const auto& thresh : thresholds ) {
184 // Right type?
185 if ( thresh->type() != triggerTypes[cmx] ) continue;
186 // Does TOB satisfy this threshold?
187 std::optional<uint16_t> isolMask;
188 if (thresh->className() == "L1Threshold_EM") {
189 auto thresh_EM = static_cast<TrigConf::L1Threshold_EM*>(thresh.get());
190 isolMask = thresh_EM->isolationMask(ieta);
191 }
192 else if (thresh->className() == "L1Threshold_TAU") {
193 auto thresh_TAU = static_cast<TrigConf::L1Threshold_TAU*>(thresh.get());
194 isolMask = thresh_TAU->isolationMask();
195 }
196
197
198 bool isolationPassed = true;
199 if (isolMask) {
200 for (unsigned int bit = 0; bit < TrigT1CaloDefs::numOfIsolationBits; ++bit)
201 if ( (*isolMask & (1<<bit)) && !(isol & (1<<bit)) ) isolationPassed = false;
202 }
203
204 int etCut = thresh->thrValue(ieta)*cpScale;
205 if ( et > etCut && isolationPassed ) {
206 int num = thresh->mapping();
207 if (num < 16) {
208 if (crateHits[crate][cmx][num] < 7) crateHits[crate][cmx][num]++;
209 if (Hits[cmx][num] < 7) Hits[cmx][num]++;
210 }
211 else ATH_MSG_WARNING("Invalid threshold number " << num );
212 } // passes cuts
213
214 } // Loop over thresholds
215
216 } // Loop over TOBs
217
218 } // Loop over module results
219
220 // Overflow sets all trigger bits
221 for (int cmx = 0; cmx < 2; ++cmx) {
222 if (cpmOverflow[cmx]) {
223 for (int i = 0; i < 16; ++i) Hits[cmx][i] = 7;
224 }
225 }
226
227 // Form CTP data objects
228 unsigned int cableWord0 = 0;
229 unsigned int cableWord1 = 0;
230 unsigned int cableWord2 = 0;
231 unsigned int cableWord3 = 0;
232 for (int i = 0; i < 8; ++i) {
233 cableWord0 |= ( Hits[0][i]<<(3*i) );
234 cableWord1 |= ( Hits[0][i+8]<<(3*i) );
235 cableWord2 |= ( Hits[1][i]<<(3*i) );
236 cableWord3 |= ( Hits[1][i+8]<<(3*i) );
237 }
238
240 ATH_CHECK(emTauCTP.record(std::make_unique<EmTauCTP>(cableWord0, cableWord1, cableWord2, cableWord3)));
241
242 // Form and store CPCMXHits
243 std::vector<int> error0; // Dummies - there will be no actual errors simulated
244 std::vector<int> error1;
245
246 // Now form hits words from module results and insert into objects
247 std::vector<unsigned int> cratehits0;
248 std::vector<unsigned int> cratehits1;
249 const int peak = 0;
250 const int system_crate = 3;
251
252 // Crate sums (local and remote)
253 for (int crate = 0; crate < 4; ++crate) {
254 for (int cmx = 0; cmx < 2; ++cmx) {
255 cratehits0.assign(1,0);
256 cratehits1.assign(1,0);
257 for (int i = 0; i < 8; ++i) {
258 cratehits0[0] |= ( crateHits[crate][cmx][i]<<(3*i) );
259 cratehits1[0] |= ( crateHits[crate][cmx][i+8]<<(3*i) );
260 }
261 CMXCPHits* crateCMXHits = new CMXCPHits(crate, cmx, LVL1::CMXCPHits::LOCAL,
262 cratehits0, cratehits1, error0, error1, peak);
263 CMXHits->push_back(crateCMXHits);
264 if (crate != system_crate) {
265 CMXCPHits* remoteCMXHits = new CMXCPHits(system_crate, cmx, crate,
266 cratehits0, cratehits1, error0, error1, peak);
267 CMXHits->push_back(remoteCMXHits);
268 }
269 } // loop over CMXes
270 } // loop over crates
271
272 // global sums
273 cratehits0.assign(1,cableWord0);
274 cratehits1.assign(1,cableWord1);
275 CMXCPHits* totalCMXHits0 = new CMXCPHits(system_crate, 0, LVL1::CMXCPHits::TOTAL,
276 cratehits0, cratehits1, error0, error1, peak);
277 cratehits0.assign(1,cableWord2);
278 cratehits1.assign(1,cableWord3);
279 CMXCPHits* totalCMXHits1 = new CMXCPHits(system_crate, 1, LVL1::CMXCPHits::TOTAL,
280 cratehits0, cratehits1, error0, error1, peak);
281 CMXHits->push_back(totalCMXHits0);
282 CMXHits->push_back(totalCMXHits1);
283
284
285 return StatusCode::SUCCESS ;
286}
287
288} // end of namespace bracket
289
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
AthAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
Constructor with parameters:
Derived DataVector<T>.
Definition DataVector.h:795
DataModel_detail::const_iterator< DataVector > const_iterator
Definition DataVector.h:838
value_type push_back(value_type pElem)
Add an element to the end of the collection.
Summary of CP (EM/tau) hits produced by the merger modules.
SG::WriteHandleKey< EmTauCTP > m_CTPOutputKey
Definition CPCMX.h:91
CPCMX(const std::string &name, ISvcLocator *pSvcLocator)
Definition CPCMX.cxx:55
StatusCode execute()
Definition CPCMX.cxx:82
SG::WriteHandleKey< DataVector< CMXCPTob > > m_CMXCPTobLocation
Where to store the CMXCPTobs (for CMX readout simulation)
Definition CPCMX.h:87
SG::ReadHandleKey< DataVector< LVL1::CPMCMXData > > m_CPMCMXDataLocation
Location of input data in StoreGate.
Definition CPCMX.h:95
SG::WriteHandleKey< DataVector< CPCMXTopoData > > m_TopoOutputLocation
Locations of real-time outputs in StoreGate.
Definition CPCMX.h:89
SG::ReadHandleKey< TrigConf::L1Menu > m_L1MenuKey
Definition CPCMX.h:97
static const int s_SourceLocal
Topo format parameters.
Definition CPCMX.h:100
static const int s_SourceTotal
Definition CPCMX.h:101
SG::WriteHandleKey< DataVector< CMXCPHits > > m_CMXCPHitsLocation
Store CTP SLink data objects in the TES.
Definition CPCMX.h:85
StatusCode initialize()
Definition CPCMX.cxx:63
CP TOB data for L1Topo.
Definition CPTopoTOB.h:19
int iphi() const
Definition CPTopoTOB.cxx:95
unsigned int et() const
ET value.
Definition CPTopoTOB.h:128
int ieta() const
Definition CPTopoTOB.cxx:75
unsigned int isolation() const
Return isolation mask.
Definition CPTopoTOB.h:123
static const unsigned int numOfIsolationBits
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
static std::string & typeAsString(TriggerType tt)
Definition L1DataDef.h:53
uint16_t isolationMask(int eta) const
Definition L1Threshold.h:24
uint16_t isolationMask() const
Definition L1Threshold.h:44
eFexTowerBuilder creates xAOD::eFexTowerContainer from supercells (LATOME) and triggerTowers (TREX) i...
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
Definition index.py:1
Extra patterns decribing particle interation process.