Loading [MathJax]/extensions/tex2jax.js
ATLAS Offline Software
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
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 
42 namespace LVL1{
43 
44 using namespace TrigConf;
45 
46 const int CPCMX::s_SourceLocal;
47 const 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());
71 
72  return StatusCode::SUCCESS;
73 }
74 
75 
76 //----------------------------------------------
77 // execute() method called once per event
78 //----------------------------------------------
79 //
80 
81 
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;
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
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) ||
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 
CTPConfig.h
et
Extra patterns decribing particle interation process.
DataModel_detail::const_iterator
Const iterator class for DataVector/DataList.
Definition: DVLIterator.h:82
LVL1::CPCMX::m_CMXCPTobLocation
SG::WriteHandleKey< DataVector< CMXCPTob > > m_CMXCPTobLocation
Where to store the CMXCPTobs (for CMX readout simulation)
Definition: CPCMX.h:95
physval_make_web_display.thresh
thresh
Definition: physval_make_web_display.py:36
make_unique
std::unique_ptr< T > make_unique(Args &&... args)
Definition: SkimmingToolEXOT5.cxx:23
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:67
index
Definition: index.py:1
LVL1::CPCMX::execute
StatusCode execute()
Definition: CPCMX.cxx:82
LVL1::CMXCPHits::LOCAL
@ LOCAL
Definition: Trigger/TrigT1/TrigT1CaloEvent/TrigT1CaloEvent/CMXCPHits.h:26
skel.it
it
Definition: skel.GENtoEVGEN.py:407
LVL1::CMXCPHits
Summary of CP (EM/tau) hits produced by the merger modules.
Definition: Trigger/TrigT1/TrigT1CaloEvent/TrigT1CaloEvent/CMXCPHits.h:23
CoordToHardware.h
LVL1::CPCMX::m_CPMCMXDataLocation
SG::ReadHandleKey< DataVector< LVL1::CPMCMXData > > m_CPMCMXDataLocation
Location of input data in StoreGate.
Definition: CPCMX.h:103
TrigConf::L1Threshold_EM::isolationMask
uint16_t isolationMask(int eta) const
Definition: L1Threshold.h:28
LVL1
eFexTowerBuilder creates xAOD::eFexTowerContainer from supercells (LATOME) and triggerTowers (TREX) i...
Definition: ICMMCPHitsCnvTool.h:18
L1Threshold.h
xAOD::CMXCPHits
CMXCPHits_v1 CMXCPHits
Define the latest version of the CMMCPHits class.
Definition: Event/xAOD/xAODTrigL1Calo/xAODTrigL1Calo/CMXCPHits.h:17
LVL1::CPTopoTOB::iphi
int iphi() const
Definition: CPTopoTOB.cxx:95
SG::makeHandle
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
Definition: ReadCondHandle.h:274
TrigConf
Forward iterator to traverse the main components of the trigger configuration.
Definition: Config.h:22
LVL1::TrigT1CaloDefs::numOfIsolationBits
static const unsigned int numOfIsolationBits
Definition: TrigT1CaloDefs.h:135
LVL1::CPTopoTOB
CP TOB data for L1Topo.
Definition: CPTopoTOB.h:19
lumiFormat.i
int i
Definition: lumiFormat.py:85
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
CPTopoTOB.h
RunTileCalibRec.triggerTypes
triggerTypes
Definition: RunTileCalibRec.py:429
LVL1::CPCMX::initialize
StatusCode initialize()
Definition: CPCMX.cxx:63
LVL1::CPCMX::s_SourceLocal
static const int s_SourceLocal
Topo format parameters.
Definition: CPCMX.h:108
LVL1::CPCMX::m_TopoOutputLocation
SG::WriteHandleKey< DataVector< CPCMXTopoData > > m_TopoOutputLocation
Locations of real-time outputs in StoreGate.
Definition: CPCMX.h:97
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
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
CPMCMXData.h
LVL1::CPCMX::s_SourceTotal
static const int s_SourceTotal
Definition: CPCMX.h:109
DataVector
Derived DataVector<T>.
Definition: DataVector.h:794
TrigConf::L1Threshold_TAU::isolationMask
uint16_t isolationMask() const
Definition: L1Threshold.h:44
AthAlgorithm
Definition: AthAlgorithm.h:47
LVL1::CPCMX::m_L1MenuKey
SG::ReadHandleKey< TrigConf::L1Menu > m_L1MenuKey
Definition: CPCMX.h:105
TrigConf::name
Definition: HLTChainList.h:35
trigbs_pickEvents.num
num
Definition: trigbs_pickEvents.py:76
LVL1::CPCMX::CPCMX
CPCMX(const std::string &name, ISvcLocator *pSvcLocator)
Definition: CPCMX.cxx:55
TrigConf::L1DataDef::typeAsString
static std::string & typeAsString(TriggerType tt)
Definition: L1DataDef.h:53
CMXCPHits_ClassDEF.h
LVL1::CPTopoTOB::et
unsigned int et() const
ET value.
Definition: CPTopoTOB.h:128
DataVector::push_back
value_type push_back(value_type pElem)
Add an element to the end of the collection.
TrigT1CaloDefs.h
LVL1::CPTopoTOB::isolation
unsigned int isolation() const
Return isolation mask.
Definition: CPTopoTOB.h:123
LVL1::CPCMX::m_CMXCPHitsLocation
SG::WriteHandleKey< DataVector< CMXCPHits > > m_CMXCPHitsLocation
Store CTP SLink data objects in the TES.
Definition: CPCMX.h:93
L1DataDef.h
SG::WriteHandle
Definition: StoreGate/StoreGate/WriteHandle.h:73
TrigConf::L1DataDef::TAU
@ TAU
Definition: L1DataDef.h:20
DeMoScan.index
string index
Definition: DeMoScan.py:364
SG::WriteHandle::record
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
CPCMX.h
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
TrigT1Interfaces_ClassDEF.h
CMXCPTob_ClassDEF.h
TrigConf::L1Threshold_TAU
Definition: L1Threshold.h:37
LVL1::CPCMX::m_CTPOutputKey
SG::WriteHandleKey< EmTauCTP > m_CTPOutputKey
Definition: CPCMX.h:99
LVL1::CMXCPHits::TOTAL
@ TOTAL
Definition: Trigger/TrigT1/TrigT1CaloEvent/TrigT1CaloEvent/CMXCPHits.h:26
LVL1::CPTopoTOB::ieta
int ieta() const
Definition: CPTopoTOB.cxx:75
TrigConf::L1Threshold_EM
Definition: L1Threshold.h:17
TrigConf::L1DataDef::EM
@ EM
Definition: L1DataDef.h:20
LVL1::CPCMXTopoData
Definition: CPCMXTopoData.h:22
CPCMXTopoData_ClassDEF.h