ATLAS Offline Software
Functions
TopoSteeringStructure.cxx File Reference
#include "L1TopoCoreSim/TopoSteeringStructure.h"
#include "L1TopoCommon/StringUtils.h"
#include "L1TopoCommon/Exception.h"
#include "L1TopoCommon/Types.h"
#include "L1TopoConfig/LayoutConstraints.h"
#include "L1TopoConfig/L1TopoMenu.h"
#include "L1TopoInterfaces/DecisionAlg.h"
#include "L1TopoInterfaces/SortingAlg.h"
#include "L1TopoInterfaces/CountingAlg.h"
#include "L1TopoCoreSim/Connector.h"
#include "L1TopoCoreSim/InputConnector.h"
#include "L1TopoCoreSim/SortingConnector.h"
#include "L1TopoCoreSim/DecisionConnector.h"
#include "L1TopoCoreSim/CountingConnector.h"
#include "L1TopoHardware/L1TopoHardware.h"
#include "TrigConfData/L1Menu.h"
#include <set>
#include <iomanip>
#include <boost/lexical_cast.hpp>

Go to the source code of this file.

Functions

TCS::StatusCode TCS::TopoSteeringStructure::setupFromMenu ATLAS_NOT_THREAD_SAFE (const TrigConf::L1Menu &l1menu, bool legacy, bool debug)
 
TCS::StatusCode TCS::TopoSteeringStructure::instantiateAlgorithms ATLAS_NOT_THREAD_SAFE (bool debug)
 

Function Documentation

◆ ATLAS_NOT_THREAD_SAFE() [1/2]

TCS::StatusCode TCS::TopoSteeringStructure::instantiateAlgorithms ATLAS_NOT_THREAD_SAFE ( bool  debug)

Definition at line 440 of file TopoSteeringStructure.cxx.

440  {
441 
442  for(TCS::Connector* conn: m_connectors) {
443 
444  if(conn->isInputConnector()) continue;
445 
446  // for each connector instantiate the algorithm and add to connector
447  const std::string & alg = conn->algorithmName();
448 
449  // split into name and type
450  std::string algType(alg, 0, alg.find('/'));
451  std::string algName(alg, alg.find('/')+1);
452 
453  ConfigurableAlg * algInstance = TCS::AlgFactory::mutable_instance().algorithm(algName);
454  if(algInstance==0) {
455  if(debug)
456  cout << "Instantiating " << alg << endl;
457  algInstance = TCS::AlgFactory::mutable_instance().create(algType, algName);
458  } else {
459  if(algInstance->className() != algType) {
460  TCS_EXCEPTION("L1 TopoSteering: duplicate algorithm names: algorithm " << algName << " has already been instantiated but with different type");
461  }
462  }
463  conn->setAlgorithm(algInstance);
464  }
466 }

◆ ATLAS_NOT_THREAD_SAFE() [2/2]

TCS::StatusCode TCS::TopoSteeringStructure::setupFromMenu ATLAS_NOT_THREAD_SAFE ( const TrigConf::L1Menu l1menu,
bool  legacy,
bool  debug 
)

Definition at line 124 of file TopoSteeringStructure.cxx.

124  {
125 
126  if(debug)
127  cout << "/***************************************************************************/" << endl
128  << " L1Topo steering structure: configuring from L1 Topo Menu " << endl
129  << "/***************************************************************************/" << endl;
130 
131  // set<TCS::inputTOBType_t> neededInputs; // Stores inputs for DecisionConnectors
132  vector<string> storedConn; // Stores decision connectors in order to avoid double counting
133  vector<vector<string>> confAlgorithms; // Stores algorithm name/category that have been configured in L1Menu to be used for setting the parameters
134  vector<string> confMultAlgorithms; // Stores algorithm names that have been configured in L1Menu to be used for setting the multiplicity thresholds
135  // Loop over boards in L1Menu and skip the ones that are not TOPO. Use Run-2 boards if legacy flag is on
136 
137  string AvailableMultAlgs[] = { "eEmMultiplicity",
138  "jEmMultiplicity",
139  "eTauMultiplicity",
140  "jTauMultiplicity",
141  "cTauMultiplicity",
142  "jJetMultiplicity",
143  "jLJetMultiplicity",
144  "gJetMultiplicity",
145  "gLJetMultiplicity",
146  "EnergyThreshold",
147  "LArSaturation" };
148 
149  for (const string & boardName : l1menu.boardNames() ){
150 
151  auto & l1board = l1menu.board(boardName);
152 
153  if (l1board.type() != "TOPO") continue;
154  if (l1board.legacy() != legacy) continue;
155 
156  // Access the connectors in the boards
157 
158  for (const string & connName : l1board.connectorNames() ){
159 
160  auto & l1conn = l1menu.connector(connName);
161 
162  // First configure decision algorithms
163  // Look at all Topo algorithms in each connector, and get inputs from each algorithm to configure SortingConnectors
164  if ( l1conn.connectorType() == TrigConf::L1Connector::ConnectorType::ELECTRICAL ) {
165 
166  for( size_t fpga : { 0, 1} ) {
167  for( size_t clock : { 0, 1} ) {
168  for( auto & tl : l1conn.triggerLines(fpga, clock) ) {
169 
170  const string & tlName = tl.name();
171  auto & algo = l1menu.algorithmFromTriggerline(tlName);
172  const string algoName = (legacy?"R2_"+algo.name():algo.name());
173 
174  // One algorithm can have multiple trigger lines. Check the connector/algorithm has not been stored already
175  auto it = find(storedConn.begin(), storedConn.end(), algoName);
176  if (it == storedConn.end()) { // Algorithm/Connector does not exist: create and store it
177 
178  storedConn.push_back(algoName);
179  vector<string> inputNames;
180  for( auto & input : algo.inputs() ) {
181  if( sortingConnector(input) == 0 ) { // if connector does not exist, create it
182  if(debug)
183  cout << "L1TopoSteering: Decision algo( " << algo.name() << " ) input is not defined: " << input << ". Creating sortingConnector" << endl;
184 
185  auto & sortAlgo = l1menu.algorithm(input, algo.category());
186  if(!(sortAlgo.type() == TrigConf::L1TopoAlgorithm::AlgorithmType::SORTING ) )
187  TCS_EXCEPTION("L1TopoSteering: Decision algo " << algo.name() << ") has as input " << input << " which is not associated to a sorting algorithm");
188 
189  // Create connector
190  SortingConnector * sortConn = new SortingConnector(sortAlgo.inputs().at(0), sortAlgo.klass()+"/"+input, sortAlgo.outputs().at(0));
191  if(debug)
192  cout << "Adding sorting connector " << "[" << *sortConn << "]" << endl;
193  addSortingConnector( sortConn );
194  confAlgorithms.push_back({sortAlgo.name(), sortAlgo.category()});
195 
196  } // if connector does not exist
197 
198  inputNames.push_back(input);
199 
200  } // loop over inputs
201 
202  DecisionConnector * conn = new DecisionConnector(algoName, inputNames, algo.klass()+"/"+algoName, algo.outputs());
203  conn->m_decision.setNBits( algo.outputs().size() );
204 
205  if(tl.name() != "UNDEF")
206  conn->m_triggers.push_back(tl);
207 
208  if(debug)
209  cout << "Adding decision connector " << "[" << *conn << "]" << endl;
210  addDecisionConnector( conn );
211  confAlgorithms.push_back({algo.name(), algo.category()});
212 
213  } else { // Connector already exists: look for it and add the trigger line
214  for(auto out : algo.outputs()){
215  auto c = m_outputLookup.find(out);
216  if (c != m_outputLookup.end()){
217  auto conn = c->second;
218  if(tl.name() != "UNDEF")
219  conn->m_triggers.push_back(tl);
220  break;
221  }
222  }
223  }
224 
225  } // Trigger Line
226 
227  } // Clock
228 
229  } // FPGA
230 
231  } else { // Configure optical connectors - multiplicity algorithms
232 
233  // In multiplicity boards all trigger lines are copied into the L1Menu::Connector 4 times (fpga 0,1 and clock 0,1)
234  // Take (fpga, clock) = (0, 0)
235 
236  for( auto & tl : l1conn.triggerLines(0, 0) ) {
237 
238  const string & tlName = tl.name();
239  auto & algo = l1menu.algorithmFromTriggerline(tlName);
240 
241  string algo_klass = algo.klass();
242  if(algo_klass=="eEmVarMultiplicity") algo_klass="eEmMultiplicity"; // in sim, use the same multiplicity algo for fixed and variable thresholds
243 
244  //Zero Bias events can't be simulated.
245  //The following line is set to simply ignore it in the simulation
246  //ZeroBias Multiplicity algorithms are not added to confMultAlgorithms
247  if ( algo_klass == "ZeroBias" ) continue;
248 
249  auto it = find(storedConn.begin(), storedConn.end(), algo.name());
250  if (it == storedConn.end()) { // Algorithm/Connector does not exist: create and store it
251 
252  storedConn.push_back(algo.name());
253  if(debug)
254  cout << "L1TopoSteering: Multiplicity algo( " << algo.name() << " ) has as input " << algo.inputs().at(0) << endl;
255 
256  CountingConnector * conn = new CountingConnector(algo.name(), algo.inputs().at(0), algo_klass+"/"+algo.name(), algo.outputs().at(0));
257  conn->m_count.setNBits( tl.nbits() );
258  conn->m_count.setFirstBit( tl.startbit() );
259 
260  if(tl.name() != "UNDEF")
261  conn->m_triggers.push_back(tl);
262 
263  if(debug)
264  cout << "Adding count connector " << "[" << *conn << "]" << endl;
265  addCountingConnector( conn );
266  confMultAlgorithms.push_back( algo.name() );
267  }
268 
269  } // Trigger Line
270 
271  } // Optical connectors - multiplicities
272 
273  } // Connector in l1board
274 
275  } // Board in l1menu
276 
277 
278  if(debug)
279  cout << "... building input connectors" << endl;
280  for(auto sortConn : m_sortedLookup) {
281  const string & in = sortConn.second->inputNames()[0]; // name of input
282 
283  if( m_inputLookup.count(in) > 0 ) continue; // InputConnector already exists
284 
285  InputConnector * conn = new InputConnector(in);
286  m_connectors.push_back(conn);
287  m_inputLookup[in] = conn;
288  if(debug)
289  cout << "Adding input connector " << "[" << *conn << "]" << endl;
290  }
291  for(auto countConn : m_countLookup) {
292  const string & in = countConn.second->inputNames()[0]; // name of input
293 
294  if( m_inputLookup.count(in) > 0 ) continue; // InputConnector already exists
295 
296  InputConnector * conn = new InputConnector(in);
297  m_connectors.push_back(conn);
298  m_inputLookup[in] = conn;
299  if(debug)
300  cout << "Adding input connector " << "[" << *conn << "]" << endl;
301  }
302 
303  // link the connector objects together
304  TCS::StatusCode sc = linkConnectors();
305 
306  // instantiate the algorithms from the algorithm names in the connectors
307  if(debug)
308  cout << "... instantiating algorithms" << endl;
309  sc &= instantiateAlgorithms(debug);
310 
311 
312  // set algorithm parameters
313  if(debug)
314  cout << "... setting algorithm parameters" << endl;
315 
316  for ( auto & confAlgo : confAlgorithms ) {
317 
318  auto & l1algo = l1menu.algorithm(confAlgo.at(0), confAlgo.at(1));
319  auto l1algoName = confAlgo.at(0);
321  l1algoName ="R2_"+confAlgo.at(0);
322 
323  if(debug)
324  cout << "TopoSteeringStructure: Parameters for algorithm with name " << l1algoName << " going to be configured." << endl;
325  ConfigurableAlg * alg = AlgFactory::mutable_instance().algorithm(l1algoName);
326 
327  if(alg->isDecisionAlg())
328  ( dynamic_cast<DecisionAlg *>(alg) )->setNumberOutputBits(l1algo.outputs().size());
329 
330  // create ParameterSpace for this algorithm
331  ParameterSpace * ps = new ParameterSpace(alg->name());
332 
333  for(auto & pe : l1algo.parameters()) {
334 
335  auto & pname = pe.name();
336  uint32_t val = pe.value();
337  uint32_t sel = pe.selection();
338 
339  if(debug)
340  cout << "Algo Name: " << l1algoName << " parameter " << ": " << setw(20) << left << pname << " value = " << setw(3) << left << val << " (selection " << sel << ")" << endl;
341  ps->addParameter( pname, val, sel);
342 
343  }
344 
345  for(auto & gen : l1algo.generics().getKeys()) {
346 
347  auto pe = l1algo.generics().getObject(gen);
348  string pname = gen;
349  uint32_t val = interpretGenericParam(pe.getAttribute("value"));
350  if (pname == "NumResultBits"){
351  if(val != l1algo.outputs().size()) {
352  TCS_EXCEPTION("Algorithm " << pname << " parameter OutputBits (" << val << ") is different from output size (" << l1algo.outputs().size() << ")");
353  }
354  continue; // ignore this, because it is defined through the output list
355  }
356  if(debug)
357  cout << " fixed parameter : " << setw(20) << left << pname << " value = " << setw(3) << left << val << endl;
358  ps->addParameter( pname, val );
359 
360  }
361 
362 
363  if(debug)
364  cout << " (setting parameters)";
365  alg->setParameters( *ps );
366 
367  if(debug)
368  cout << " --> (parameters set)";
369 
370  if(debug)
371  cout << " --> (parameters stored)" << endl;
372  } // Set parameters for Sorting/Decision algorithms
373 
374  // // set thresholds for multiplicity algorithms
375  for ( auto & multAlgo : confMultAlgorithms ) {
376 
377  auto & l1algo = l1menu.algorithm(multAlgo, "MULTTOPO");
378 
379  //Zero Bias events can't be simulated.
380  //The following line is set to simply ignore it in the simulation
381  if ( l1algo.klass() == "ZeroBias" ) continue;
382 
383  ConfigurableAlg * alg = AlgFactory::mutable_instance().algorithm(l1algo.name());
384 
385  // Get L1Threshold object and pass it to CountingAlg, from where it will be propagated to and decoded in each algorithm
386  // The output of each algorithm and the threshold name is the same - use output name to retrieve L1Threshold object
387  auto & l1thr = l1menu.threshold( l1algo.outputs().at(0) );
388  ( dynamic_cast<CountingAlg *>(alg) )->setThreshold(l1thr);
389 
390  } // Set thresholds for multiplicity algorithms
391 
392 
393  m_isConfigured = true;
394 
395  if(debug)
396  cout << "... L1TopoSteering successfully configured" << endl;
397 
398  return sc;
399 }
TCS::ConfigurableAlg::className
const std::string & className() const
Definition: ConfigurableAlg.h:49
checkCorrelInHIST.conn
conn
Definition: checkCorrelInHIST.py:25
TCS::StatusCode::SUCCESS
@ SUCCESS
Definition: Trigger/TrigT1/L1Topo/L1TopoCommon/L1TopoCommon/StatusCode.h:17
SGout2dot.alg
alg
Definition: SGout2dot.py:243
find
std::string find(const std::string &s)
return a remapped string
Definition: hcg.cxx:135
TCS::ParameterSpace::addParameter
ParameterSpace & addParameter(const Parameter &p)
Definition: ParameterSpace.cxx:29
xAOD::uint32_t
setEventNumber uint32_t
Definition: EventInfo_v1.cxx:127
TCS::Connector
Definition: Connector.h:22
xAOD::JetAlgorithmType::algName
const std::string & algName(ID id)
Converts a JetAlgorithmType::ID into a string.
Definition: JetContainerInfo.cxx:67
skel.it
it
Definition: skel.GENtoEVGEN.py:396
python.AthDsoLogger.out
out
Definition: AthDsoLogger.py:71
TCS::CountingConnector
Definition: CountingConnector.h:26
TCS::SortingConnector
Definition: SortingConnector.h:24
LArG4AODNtuplePlotter.pe
pe
Definition: LArG4AODNtuplePlotter.py:116
master.gen
gen
Definition: master.py:32
AthenaPoolTestRead.sc
sc
Definition: AthenaPoolTestRead.py:27
TCS::DecisionAlg
Definition: Trigger/TrigT1/L1Topo/L1TopoInterfaces/L1TopoInterfaces/DecisionAlg.h:22
TrigConf::L1TopoAlgorithm::AlgorithmType::SORTING
@ SORTING
TCS::ParameterSpace
Definition: ParameterSpace.h:18
TCS::InputConnector
Definition: InputConnector.h:22
sel
sel
Definition: SUSYToolsTester.cxx:97
PlotPulseshapeFromCool.input
input
Definition: PlotPulseshapeFromCool.py:106
TrigConf::L1Connector::ConnectorType::ELECTRICAL
@ ELECTRICAL
TCS_EXCEPTION
#define TCS_EXCEPTION(MSG)
Definition: Trigger/TrigT1/L1Topo/L1TopoCommon/L1TopoCommon/Exception.h:14
TCS::ConfigurableAlg
Definition: ConfigurableAlg.h:30
debug
const bool debug
Definition: MakeUncertaintyPlots.cxx:53
TrigConf::L1TopoAlgorithm::AlgorithmType::DECISION
@ DECISION
Pythia8_RapidityOrderMPI.val
val
Definition: Pythia8_RapidityOrderMPI.py:14
MistimedStreamPhI_runStandalone.legacy
legacy
Definition: MistimedStreamPhI_runStandalone.py:110
python.XMLReader.l1menu
l1menu
Definition: XMLReader.py:73
dqt_zlumi_alleff_HIST.tl
tl
Definition: dqt_zlumi_alleff_HIST.py:73
TCS::Connector::inputNames
const std::vector< std::string > & inputNames() const
Definition: Connector.h:46
python.compressB64.c
def c
Definition: compressB64.py:93
TCS::DecisionConnector
Definition: DecisionConnector.h:23
TCS::CountingAlg
Definition: CountingAlg.h:25
TCS::StatusCode
Definition: Trigger/TrigT1/L1Topo/L1TopoCommon/L1TopoCommon/StatusCode.h:15