Belle II Software development
CDCTriggerTSFFirmwareModule Class Reference

This class is the interface between TSim/basf2 TSF module and the firmware simulation core of XSim/ISim. More...

#include <CDCTriggerTSFFirmwareModule.h>

Inheritance diagram for CDCTriggerTSFFirmwareModule:
Module PathElement

Public Types

enum  EModulePropFlags {
  c_Input = 1 ,
  c_Output = 2 ,
  c_ParallelProcessingCertified = 4 ,
  c_HistogramManager = 8 ,
  c_InternalSerializer = 16 ,
  c_TerminateInAllProcesses = 32 ,
  c_DontCollectStatistics = 64
}
 Each module can be tagged with property flags, which indicate certain features of the module. More...
 
typedef ModuleCondition::EAfterConditionPath EAfterConditionPath
 Forward the EAfterConditionPath definition from the ModuleCondition.
 

Public Member Functions

 CDCTriggerTSFFirmwareModule ()
 Constructor.
 
void initialize () override
 spawn child process for workers, open pipes to pass data
 
void terminate () override
 close the pipes and wait for children to die.
 
void event () override
 Things to do for each event.
 
virtual std::vector< std::string > getFileNames (bool outputFiles)
 Return a list of output filenames for this modules.
 
virtual void beginRun ()
 Called when entering a new run.
 
virtual void endRun ()
 This method is called if the current run ends.
 
const std::string & getName () const
 Returns the name of the module.
 
const std::string & getType () const
 Returns the type of the module (i.e.
 
const std::string & getPackage () const
 Returns the package this module is in.
 
const std::string & getDescription () const
 Returns the description of the module.
 
void setName (const std::string &name)
 Set the name of the module.
 
void setPropertyFlags (unsigned int propertyFlags)
 Sets the flags for the module properties.
 
LogConfiggetLogConfig ()
 Returns the log system configuration.
 
void setLogConfig (const LogConfig &logConfig)
 Set the log system configuration.
 
void setLogLevel (int logLevel)
 Configure the log level.
 
void setDebugLevel (int debugLevel)
 Configure the debug messaging level.
 
void setAbortLevel (int abortLevel)
 Configure the abort log level.
 
void setLogInfo (int logLevel, unsigned int logInfo)
 Configure the printed log information for the given level.
 
void if_value (const std::string &expression, const std::shared_ptr< Path > &path, EAfterConditionPath afterConditionPath=EAfterConditionPath::c_End)
 Add a condition to the module.
 
void if_false (const std::shared_ptr< Path > &path, EAfterConditionPath afterConditionPath=EAfterConditionPath::c_End)
 A simplified version to add a condition to the module.
 
void if_true (const std::shared_ptr< Path > &path, EAfterConditionPath afterConditionPath=EAfterConditionPath::c_End)
 A simplified version to set the condition of the module.
 
bool hasCondition () const
 Returns true if at least one condition was set for the module.
 
const ModuleConditiongetCondition () const
 Return a pointer to the first condition (or nullptr, if none was set)
 
const std::vector< ModuleCondition > & getAllConditions () const
 Return all set conditions for this module.
 
bool evalCondition () const
 If at least one condition was set, it is evaluated and true returned if at least one condition returns true.
 
std::shared_ptr< PathgetConditionPath () const
 Returns the path of the last true condition (if there is at least one, else reaturn a null pointer).
 
Module::EAfterConditionPath getAfterConditionPath () const
 What to do after the conditional path is finished.
 
std::vector< std::shared_ptr< Path > > getAllConditionPaths () const
 Return all condition paths currently set (no matter if the condition is true or not).
 
bool hasProperties (unsigned int propertyFlags) const
 Returns true if all specified property flags are available in this module.
 
bool hasUnsetForcedParams () const
 Returns true and prints error message if the module has unset parameters which the user has to set in the steering file.
 
const ModuleParamListgetParamList () const
 Return module param list.
 
template<typename T >
ModuleParam< T > & getParam (const std::string &name) const
 Returns a reference to a parameter.
 
bool hasReturnValue () const
 Return true if this module has a valid return value set.
 
int getReturnValue () const
 Return the return value set by this module.
 
std::shared_ptr< PathElementclone () const override
 Create an independent copy of this module.
 
std::shared_ptr< boost::python::list > getParamInfoListPython () const
 Returns a python list of all parameters.
 

Static Public Member Functions

static void exposePythonAPI ()
 Exposes methods of the Module class to Python.
 

Static Public Attributes

static constexpr int m_nSubModules = 5
 number of TSF to simulate
 
static constexpr std::array< int, 9 > nMergers = {10, 10, 12, 14, 16, 18, 20, 22, 24}
 number of mergers in each super layer
 
static constexpr std::array< int, m_nSubModulesnAxialMergers = {10, 12, 16, 20, 24}
 number of mergers in axial super layers
 
static constexpr int nTrackers = 4
 number of trackers
 
static constexpr int mergerWidth = 256
 merger output data width
 
static constexpr int width_out = 429
 width of output data width
 
static constexpr int nWiresInMerger = 80
 number of wire/cell in a single merger unit
 
static constexpr int nCellsInLayer = 16
 Number of wire/cells in a single layer per merger unit.
 
static constexpr int nSegmentsInMerger = 16
 number of track segments in a single merger unit
 
static constexpr size_t timeWidth = 4
 bit width for priority time and fast time
 
static constexpr int m_nClockPerEvent = 44
 how many clocks to simulate per event
 
static constexpr int clockPeriod = 16
 data clock period (32ns) in unit of 2ns
 

Protected Types

using outputVector = std::array< char, width_out >
 output vector
 
using outputArray = std::array< outputVector, nTrackers >
 output array
 
using signalBus = std::array< outputArray, m_nSubModules >
 signal bus
 
using signalBitStream = Bitstream< signalBus >
 signal bit stream
 
using mergerVector = std::bitset< mergerWidth >
 Merger vector.
 
using mergerOutput = std::vector< mergerVector >
 Merger output.
 
using mergerOutArray = std::array< mergerOutput, m_nSubModules >
 Merger output array.
 
using inputVector = std::array< char, mergerWidth >
 input array
 
using inputFromMerger = std::vector< inputVector >
 input array from Merger
 
using inputToTSFArray = std::array< inputFromMerger, m_nSubModules >
 input array to TSF
 
using streamPair = std::array< FILE *, 2 >
 file handlers of pipes
 
using timeVec = std::bitset< timeWidth >
 element of data structure to hold merger output
 
template<size_t nEdges>
using mergerStructElement = std::tuple< std::array< timeVec, nSegmentsInMerger >, std::array< timeVec, nSegmentsInMerger >, std::array< timeVec, nEdges >, std::array< std::bitset< nWiresInMerger >, 1 >, std::array< std::bitset< nSegmentsInMerger >, 1 > >
 data structure to hold merger output <priority time (4 bits x 16), fast time (4 bits x 16), edge timing (4 bits x 3 or 5), hitmap (80 bits x 1), 2nd priority hit (16 bit x 1)>
 
template<size_t nEdges>
using mergerStruct = std::vector< mergerStructElement< nEdges > >
 data structure to hold merger output
 
using registeredStructElement = std::array< std::bitset< nCellsInLayer >, 3 >
 record when a time slow has been registered by a hit <priority time, fast time, edge timing>
 
using registeredStruct = std::vector< registeredStructElement >
 vector of registeredStructElement
 
using priorityHitInMerger = std::map< unsigned, int >
 priority hits map in Merger
 
using priorityHitStructInSL = std::vector< priorityHitInMerger >
 priority hits map in Merger for a SL
 
using priorityHitStructInClock = std::map< unsigned, priorityHitStructInSL >
 priority hits map in Merger for a clock
 
using priorityHitStruct = std::array< priorityHitStructInClock, m_nClockPerEvent >
 all priority hits map in Merger
 
using WireSet = std::vector< short >
 Wire set.
 
using TSMap = std::unordered_map< short, WireSet >
 TS map.
 
using edgeMap = std::unordered_map< unsigned short, timeVec * >
 edge wire list
 
using cellList = std::vector< unsigned short >
 cell list
 
using edgeList = std::unordered_map< unsigned short, std::vector< unsigned short > >
 edge wire list
 

Protected Member Functions

template<int iSL>
char * getData (inputToTSFArray)
 get the XSI compliant format from the bits format TSF input
 
void write (const char *message, FILE *outstream)
 write TSF input signals to the worker
 
outputArray read (FILE *instream)
 write TSF output signals from the worker
 
CDCTrigger::Priority priority (int index)
 write TSF input signals to the worker
 
unsigned short trgTime (int index, int iFirstHit)
 Get the trigger time of the CDC hit.
 
unsigned short mergerCellID (int index)
 Get the cell ID in the merger.
 
unsigned short mergerNumber (int index)
 Get the merger unit ID in a super layer.
 
WireSet segmentID (int iHit)
 Get the list of associated track segments with a hit.
 
std::bitset< 4 > timeStamp (int index, int iFirstHit)
 Get the trigger time stamp of a hit.
 
void computeEdges ()
 Compute the map from merger cell ID to all its related edge fields.
 
void initializeMerger ()
 Get CDC hits from the DataStore and distribute them to clocks.
 
void simulateMerger (unsigned iclock)
 Simulate 1 clock of merger.
 
template<CDCTrigger::MergerOut field, size_t width>
void pack (inputVector::reverse_iterator &rInput, unsigned number, mergerStructElement< 5 > &output)
 Pack the merger output data structure to TSF input vector.
 
bool notHit (CDCTrigger::MergerOut field, unsigned iTS, registeredStructElement &reg)
 Whether a time field in a merger has been hit in the clock cycle.
 
void registerHit (CDCTrigger::MergerOut field, unsigned iTS, registeredStructElement &reg)
 Register the timing field so that later hits won't overwrite it.
 
void saveFirmwareOutput ()
 save firmware output
 
void saveFastOutput (short iclock)
 save fast TSIM output
 
void setSecondPriority (unsigned priTS, unsigned iHit, timeVec hitTime, unsigned lr, mergerStructElement< 5 > &mergerData, registeredStructElement &registeredCell, priorityHitInMerger &priorityHit)
 set 2nd priority info
 
virtual void def_initialize ()
 Wrappers to make the methods without "def_" prefix callable from Python.
 
virtual void def_beginRun ()
 Wrapper method for the virtual function beginRun() that has the implementation to be used in a call from Python.
 
virtual void def_event ()
 Wrapper method for the virtual function event() that has the implementation to be used in a call from Python.
 
virtual void def_endRun ()
 This method can receive that the current run ends as a call from the Python side.
 
virtual void def_terminate ()
 Wrapper method for the virtual function terminate() that has the implementation to be used in a call from Python.
 
void setDescription (const std::string &description)
 Sets the description of the module.
 
void setType (const std::string &type)
 Set the module type.
 
template<typename T >
void addParam (const std::string &name, T &paramVariable, const std::string &description, const T &defaultValue)
 Adds a new parameter to the module.
 
template<typename T >
void addParam (const std::string &name, T &paramVariable, const std::string &description)
 Adds a new enforced parameter to the module.
 
void setReturnValue (int value)
 Sets the return value for this module as integer.
 
void setReturnValue (bool value)
 Sets the return value for this module as bool.
 
void setParamList (const ModuleParamList &params)
 Replace existing parameter list.
 

Protected Attributes

std::string m_hitCollectionName
 Name of the StoreArray containing the input CDC hits.
 
std::string m_outputCollectionName
 Name of the StoreArray holding the found TS hits.
 
std::string m_outputBitstreamNameTo2D
 Name of the StoreArray holding the raw bit content to 2D trackers.
 
std::string m_outputBitstreamNameToETF
 Name of the StoreArray holding the raw bit content to ETF.
 
Belle2::StoreArray< CDCHitm_cdcHits
 CDCHit array.
 
StoreArray< signalBitStreamm_bitsTo2D
 bitstream of TSF output to 2D tracker
 
StoreArray< CDCTriggerSegmentHitm_tsHits
 unpacked track segment hit
 
bool m_mergerOnly
 flag to only simulation merger and not TSF
 
bool m_simulateCC
 flag to simulate front-end clock counter
 
std::vector< bool > m_stubLUT
 list of flags to run a TSF firmware simulation with dummy L/R LUT (to speed up loading)
 
int m_debugLevel = 0
 debug level specified in the steering file
 
int m_TDCCountForT0 = 4988
 TDC count value from T0.
 
bool m_allPositiveTime = true
 switch If true, the trigger time of the hit with largest TDC count becomes 0.
 
std::string lib_extension = ".so"
 extension of lib
 
std::string cwd = getcurrentdir()
 current diretory
 
std::string design_libname_pre = cwd + "/xsim.dir/tsf"
 path to the simulation snapshot
 
std::string design_libname_post = "/xsimk" + lib_extension
 path to the simulation snapshot
 
std::string simengine_libname = "librdi_simulator_kernel" + lib_extension
 path to the simulation engine
 
std::string wdbName_pre = "tsf"
 wdb name prefix
 
std::string wdbName_post = ".wdb"
 wdb name extension
 
std::array< pid_t, m_nSubModulesm_pid
 '1' in XSI VHDL simulation
 
mergerOutArray outputFromMerger
 bits format of merger output / TSF input
 
inputToTSFArray inputToTSF
 XSI compliant format of input to TSF.
 
std::array< outputArray, m_nSubModulesoutputToTracker
 array holding TSF output data
 
std::array< streamPair, m_nSubModulesstream
 array holding file handlers of pipes
 
std::array< std::array< int, 2 >, m_nSubModulesinputFileDescriptor
 array holding file descriptors of pipes
 
std::array< std::array< int, 2 >, m_nSubModulesoutputFileDescriptor
 array holding file descriptors of pipes
 
std::istream * ins = nullptr
 data stream
 
std::map< unsigned, mergerStruct< 5 > > dataAcrossClocks
 data structure to hold merger output
 
priorityHitStruct m_priorityHit
 list keeping the index of priority hit of a TS for making fastsim ts hit object
 
std::vector< std::vector< int > > iAxialHitInClock
 CDC hit ID in each clock.
 
std::array< TSMap, 2 > m_tsMap
 map from cell ID to TS ID, for inner and outer Merger
 
std::array< cellList, 5 > innerInvEdge
 list of cell ID related to edge timing
 
std::array< cellList, 3 > outerInvEdge
 list of cell ID related to edge timing
 
std::array< edgeList, 2 > m_edge
 map from cell ID to related edge ID
 
int m_iFirstHit = std::numeric_limits<int>::quiet_NaN()
 ID of the earlist CDC hit in an event.
 

Private Member Functions

std::list< ModulePtrgetModules () const override
 no submodules, return empty list
 
std::string getPathString () const override
 return the module name.
 
void setParamPython (const std::string &name, const boost::python::object &pyObj)
 Implements a method for setting boost::python objects.
 
void setParamPythonDict (const boost::python::dict &dictionary)
 Implements a method for reading the parameter values from a boost::python dictionary.
 

Private Attributes

std::string m_name
 The name of the module, saved as a string (user-modifiable)
 
std::string m_type
 The type of the module, saved as a string.
 
std::string m_package
 Package this module is found in (may be empty).
 
std::string m_description
 The description of the module.
 
unsigned int m_propertyFlags
 The properties of the module as bitwise or (with |) of EModulePropFlags.
 
LogConfig m_logConfig
 The log system configuration of the module.
 
ModuleParamList m_moduleParamList
 List storing and managing all parameter of the module.
 
bool m_hasReturnValue
 True, if the return value is set.
 
int m_returnValue
 The return value.
 
std::vector< ModuleConditionm_conditions
 Module condition, only non-null if set.
 

Detailed Description

This class is the interface between TSim/basf2 TSF module and the firmware simulation core of XSim/ISim.

Definition at line 52 of file CDCTriggerTSFFirmwareModule.h.

Member Typedef Documentation

◆ cellList

using cellList = std::vector<unsigned short>
protected

cell list

Definition at line 299 of file CDCTriggerTSFFirmwareModule.h.

◆ EAfterConditionPath

Forward the EAfterConditionPath definition from the ModuleCondition.

Definition at line 88 of file Module.h.

◆ edgeList

using edgeList = std::unordered_map<unsigned short, std::vector<unsigned short> >
protected

edge wire list

Definition at line 314 of file CDCTriggerTSFFirmwareModule.h.

◆ edgeMap

using edgeMap = std::unordered_map<unsigned short, timeVec*>
protected

edge wire list

Definition at line 297 of file CDCTriggerTSFFirmwareModule.h.

◆ inputFromMerger

using inputFromMerger = std::vector<inputVector>
protected

input array from Merger

Definition at line 201 of file CDCTriggerTSFFirmwareModule.h.

◆ inputToTSFArray

using inputToTSFArray = std::array<inputFromMerger, m_nSubModules>
protected

input array to TSF

Definition at line 203 of file CDCTriggerTSFFirmwareModule.h.

◆ inputVector

using inputVector = std::array<char, mergerWidth>
protected

input array

Definition at line 199 of file CDCTriggerTSFFirmwareModule.h.

◆ mergerOutArray

using mergerOutArray = std::array<mergerOutput, m_nSubModules>
protected

Merger output array.

Definition at line 194 of file CDCTriggerTSFFirmwareModule.h.

◆ mergerOutput

using mergerOutput = std::vector<mergerVector>
protected

Merger output.

Definition at line 192 of file CDCTriggerTSFFirmwareModule.h.

◆ mergerStruct

using mergerStruct = std::vector<mergerStructElement<nEdges> >
protected

data structure to hold merger output

Definition at line 266 of file CDCTriggerTSFFirmwareModule.h.

◆ mergerStructElement

using mergerStructElement = std::tuple < std::array<timeVec, nSegmentsInMerger>, std::array<timeVec, nSegmentsInMerger>, std::array<timeVec, nEdges>, std::array<std::bitset<nWiresInMerger>, 1>, std::array<std::bitset<nSegmentsInMerger>, 1> >
protected

data structure to hold merger output <priority time (4 bits x 16), fast time (4 bits x 16), edge timing (4 bits x 3 or 5), hitmap (80 bits x 1), 2nd priority hit (16 bit x 1)>

Definition at line 258 of file CDCTriggerTSFFirmwareModule.h.

◆ mergerVector

using mergerVector = std::bitset<mergerWidth>
protected

Merger vector.

Definition at line 190 of file CDCTriggerTSFFirmwareModule.h.

◆ outputArray

using outputArray = std::array<outputVector, nTrackers>
protected

output array

Definition at line 132 of file CDCTriggerTSFFirmwareModule.h.

◆ outputVector

using outputVector = std::array<char, width_out>
protected

output vector

Definition at line 130 of file CDCTriggerTSFFirmwareModule.h.

◆ priorityHitInMerger

using priorityHitInMerger = std::map<unsigned, int>
protected

priority hits map in Merger

Definition at line 277 of file CDCTriggerTSFFirmwareModule.h.

◆ priorityHitStruct

all priority hits map in Merger

Definition at line 283 of file CDCTriggerTSFFirmwareModule.h.

◆ priorityHitStructInClock

using priorityHitStructInClock = std::map<unsigned, priorityHitStructInSL>
protected

priority hits map in Merger for a clock

Definition at line 281 of file CDCTriggerTSFFirmwareModule.h.

◆ priorityHitStructInSL

using priorityHitStructInSL = std::vector<priorityHitInMerger>
protected

priority hits map in Merger for a SL

Definition at line 279 of file CDCTriggerTSFFirmwareModule.h.

◆ registeredStruct

using registeredStruct = std::vector<registeredStructElement>
protected

vector of registeredStructElement

Definition at line 274 of file CDCTriggerTSFFirmwareModule.h.

◆ registeredStructElement

using registeredStructElement = std::array<std::bitset<nCellsInLayer>, 3>
protected

record when a time slow has been registered by a hit <priority time, fast time, edge timing>

Definition at line 272 of file CDCTriggerTSFFirmwareModule.h.

◆ signalBitStream

using signalBitStream = Bitstream<signalBus>
protected

signal bit stream

Definition at line 137 of file CDCTriggerTSFFirmwareModule.h.

◆ signalBus

using signalBus = std::array<outputArray, m_nSubModules>
protected

signal bus

Definition at line 135 of file CDCTriggerTSFFirmwareModule.h.

◆ streamPair

using streamPair = std::array<FILE*, 2>
protected

file handlers of pipes

Definition at line 215 of file CDCTriggerTSFFirmwareModule.h.

◆ timeVec

using timeVec = std::bitset<timeWidth>
protected

element of data structure to hold merger output

Definition at line 250 of file CDCTriggerTSFFirmwareModule.h.

◆ TSMap

using TSMap = std::unordered_map<short, WireSet>
protected

TS map.

Definition at line 292 of file CDCTriggerTSFFirmwareModule.h.

◆ WireSet

using WireSet = std::vector<short>
protected

Wire set.

Definition at line 290 of file CDCTriggerTSFFirmwareModule.h.

Member Enumeration Documentation

◆ EModulePropFlags

enum EModulePropFlags
inherited

Each module can be tagged with property flags, which indicate certain features of the module.

Enumerator
c_Input 

This module is an input module (reads data).

c_Output 

This module is an output module (writes data).

c_ParallelProcessingCertified 

This module can be run in parallel processing mode safely (All I/O must be done through the data store, in particular, the module must not write any files.)

c_HistogramManager 

This module is used to manage histograms accumulated by other modules.

c_InternalSerializer 

This module is an internal serializer/deserializer for parallel processing.

c_TerminateInAllProcesses 

When using parallel processing, call this module's terminate() function in all processes().

This will also ensure that there is exactly one process (single-core if no parallel modules found) or at least one input, one main and one output process.

c_DontCollectStatistics 

No statistics is collected for this module.

Definition at line 77 of file Module.h.

77 {
78 c_Input = 1,
79 c_Output = 2,
85 };
@ c_HistogramManager
This module is used to manage histograms accumulated by other modules.
Definition: Module.h:81
@ c_Input
This module is an input module (reads data).
Definition: Module.h:78
@ c_DontCollectStatistics
No statistics is collected for this module.
Definition: Module.h:84
@ c_ParallelProcessingCertified
This module can be run in parallel processing mode safely (All I/O must be done through the data stor...
Definition: Module.h:80
@ c_InternalSerializer
This module is an internal serializer/deserializer for parallel processing.
Definition: Module.h:82
@ c_Output
This module is an output module (writes data).
Definition: Module.h:79
@ c_TerminateInAllProcesses
When using parallel processing, call this module's terminate() function in all processes().
Definition: Module.h:83

Constructor & Destructor Documentation

◆ CDCTriggerTSFFirmwareModule()

Constructor.


Definition at line 40 of file CDCTriggerTSFFirmwareModule.cc.

40 :
41 Module(), m_cdcHits{""}
42
43{
44 for (unsigned iAx = 0; iAx < m_nSubModules; ++iAx) {
45 inputToTSF[iAx].resize(nAxialMergers[iAx]);
46 for (auto& clock : m_priorityHit) {
47 clock.insert({2 * iAx, priorityHitStructInSL(nAxialMergers[iAx])});
48 }
49 dataAcrossClocks.insert({2 * iAx, mergerStruct<5> (nAxialMergers[iAx])});
50 }
51 //Set module properties
52 setDescription("Firmware simulation of the Track Segment Finder for CDC trigger.");
53
54 // Define module parameters
55 addParam("hitCollectionName", m_hitCollectionName,
56 "Name of the input StoreArray of CDCHits.",
57 string("CDCHits"));
58 addParam("outputCollectionName", m_outputCollectionName,
59 "Name of the StoreArray holding the found TS hits.",
60 string("CDCTriggerFirmwareSegmentHits"));
61 addParam("outputBitstreamNameTo2D", m_outputBitstreamNameTo2D,
62 "Name of the StoreArray holding the raw bit content to 2D trackers",
63 string("BitstreamTSFto2D"));
64 addParam("mergerOnly", m_mergerOnly,
65 "Flag to only simulate merger and not TSF",
66 false);
67 addParam("simulateCC", m_simulateCC,
68 "Flag to run the front-end clock counter",
69 false);
70 std::vector<bool> defaultStub(m_nSubModules, false);
71 addParam("stubLUT", m_stubLUT,
72 "list of flags to run each TSF firmware simulation with dummy L/R LUT (to speed up loading)",
73 defaultStub);
74}
bool m_simulateCC
flag to simulate front-end clock counter
Belle2::StoreArray< CDCHit > m_cdcHits
CDCHit array.
priorityHitStruct m_priorityHit
list keeping the index of priority hit of a TS for making fastsim ts hit object
std::string m_outputCollectionName
Name of the StoreArray holding the found TS hits.
std::string m_outputBitstreamNameTo2D
Name of the StoreArray holding the raw bit content to 2D trackers.
static constexpr std::array< int, m_nSubModules > nAxialMergers
number of mergers in axial super layers
std::vector< bool > m_stubLUT
list of flags to run a TSF firmware simulation with dummy L/R LUT (to speed up loading)
inputToTSFArray inputToTSF
XSI compliant format of input to TSF.
bool m_mergerOnly
flag to only simulation merger and not TSF
std::map< unsigned, mergerStruct< 5 > > dataAcrossClocks
data structure to hold merger output
std::string m_hitCollectionName
Name of the StoreArray containing the input CDC hits.
static constexpr int m_nSubModules
number of TSF to simulate
std::vector< priorityHitInMerger > priorityHitStructInSL
priority hits map in Merger for a SL
void setDescription(const std::string &description)
Sets the description of the module.
Definition: Module.cc:214
Module()
Constructor.
Definition: Module.cc:30
void addParam(const std::string &name, T &paramVariable, const std::string &description, const T &defaultValue)
Adds a new parameter to the module.
Definition: Module.h:560

◆ ~CDCTriggerTSFFirmwareModule()

Definition at line 76 of file CDCTriggerTSFFirmwareModule.cc.

77{}

Member Function Documentation

◆ beginRun()

virtual void beginRun ( void  )
inlinevirtualinherited

Called when entering a new run.

Called at the beginning of each run, the method gives you the chance to change run dependent constants like alignment parameters, etc.

This method can be implemented by subclasses.

Reimplemented in ARICHBackgroundModule, BeamabortModule, BgoModule, CaveModule, ClawModule, CLAWSModule, DosiModule, FANGSModule, He3tubeModule, MicrotpcModule, Ph1bpipeModule, Ph1sustrModule, PindiodeModule, PlumeModule, QcsmonitorModule, SrsensorModule, GetEventFromSocketModule, CalibrationCollectorModule, EventsOfDoomBusterModule, CosmicsAlignmentValidationModule, EnergyBiasCorrectionModule, ChargedPidMVAModule, ChargedPidMVAMulticlassModule, CurlTaggerModule, LowEnergyPi0IdentificationExpertModule, LowEnergyPi0VetoExpertModule, ParticleVertexFitterModule, PhotonEfficiencySystematicsModule, TagVertexModule, TreeFitterModule, arichBtestModule, ARICHDigitizerModule, ARICHDQMModule, ARICHRateCalModule, ARICHReconstructorModule, B2BIIMCParticlesMonitorModule, B2BIIConvertBeamParamsModule, B2BIIConvertMdstModule, B2BIIFixMdstModule, B2BIIMdstInputModule, BelleMCOutputModule, BeamBkgGeneratorModule, BeamBkgHitRateMonitorModule, BeamBkgMixerModule, BeamBkgTagSetterModule, BGOverlayInputModule, AnalysisPhase1StudyModule, NtuplePhase1_v6Module, ReprocessorModule, BeamabortStudyModule, BeamDigitizerModule, BgoDigitizerModule, BgoStudyModule, ClawDigitizerModule, ClawStudyModule, ClawsDigitizerModule, ClawsStudyModule, CsiDigitizer_v2Module, CsIDigitizerModule, CsiModule, CsiStudy_v2Module, CsIStudyModule, DosiDigitizerModule, DosiStudyModule, FANGSDigitizerModule, FANGSStudyModule, He3DigitizerModule, He3tubeStudyModule, MicrotpcStudyModule, TpcDigitizerModule, PinDigitizerModule, PindiodeStudyModule, PlumeDigitizerModule, QcsmonitorDigitizerModule, QcsmonitorStudyModule, CDCCosmicAnalysisModule, CDCCRTestModule, cdcDQM7Module, CDCDQMModule, CDCPackerModule, CDCRecoTrackFilterModule, CDCUnpackerModule, DAQPerfModule, RxSocketModule, TxSocketModule, DqmHistoManagerModule, MonitorDataModule, TrackAnaModule, Ds2SampleModule, ReceiveEventModule, HLTDQM2ZMQModule, ElapsedTimeModule, DeSerializerPXDModule, GenRawSendModule, SerializerModule, CertifyParallelModule, Ds2RawModule, Ds2RbufModule, EvReductionModule, FastRbuf2DsModule, Raw2DsModule, RawInputModule, Rbuf2DsModule, Rbuf2RbufModule, Ds2RawFileModule, PartialSeqRootReaderModule, SeqRootMergerModule, StorageDeserializerModule, StorageSerializerModule, IPDQMModule, PhysicsObjectsDQMModule, PhysicsObjectsMiraBelleBhabhaModule, PhysicsObjectsMiraBelleDst2Module, PhysicsObjectsMiraBelleDstModule, PhysicsObjectsMiraBelleHadronModule, PhysicsObjectsMiraBelleModule, ECLBackgroundModule, ECLChargedPIDModule, ECLChargedPIDDataAnalysisModule, ECLChargedPIDDataAnalysisValidationModule, ECLChargedPIDMVAModule, ECLClusterPSDModule, ECLCovarianceMatrixModule, ECLCRFinderModule, ECLDataAnalysisModule, ECLDigitCalibratorModule, ECLDigitizerModule, ECLDigitizerPureCsIModule, EclDisplayModule, ECLDQMModule, ECLDQMConnectedRegionsModule, ECLDQMEXTENDEDModule, ECLDQMOutOfTimeDigitsModule, ECLFinalizerModule, ECLHitDebugModule, ECLLocalMaximumFinderModule, ECLLocalRunCalibratorModule, ECLLOMModule, ECLPackerModule, ECLShowerCorrectorModule, ECLShowerShapeModule, ECLSplitterN1Module, ECLSplitterN2Module, ECLUnpackerModule, ECLWaveformFitModule, HistoModule, SubEventModule, SwitchDataStoreModule, EventInfoPrinterModule, EventLimiterModule, IoVDependentConditionModule, ProgressModule, RandomBarrierModule, GearboxModule, HistoManagerModule, StatisticsSummaryModule, SeqRootInputModule, SeqRootOutputModule, RxModule, TxModule, EvtGenDecayModule, EvtGenInputModule, OverrideGenerationFlagsModule, KKGenInputModule, CreateFieldMapModule, ExportGeometryModule, SoftwareTriggerModule, SoftwareTriggerHLTDQMModule, StatisticsTimingHLTDQMModule, BKLMAnaModule, BKLMDigitAnalyzerModule, BKLMSimHistogrammerModule, BKLMTrackingModule, EKLMDataCheckerModule, KLMClusterAnaModule, KLMClusterEfficiencyModule, KLMClustersReconstructorModule, KLMDigitizerModule, KLMDigitTimeShifterModule, KLMDQMModule, KLMDQM2Module, KLMPackerModule, KLMReconstructorModule, KLMScintillatorSimulatorModule, KLMUnpackerModule, MVAExpertModule, MVAMultipleExpertsModule, MVAPrototypeModule, AWESOMEBasicModule, PXDBackgroundModule, PXDRawDQMChipsModule, PXDClustersFromTracksModule, PXDPerformanceModule, PXDClusterizerModule, Convert2RawDetModule, CDCDedxDQMModule, CDCDedxValidationModule, EventT0DQMModule, EventT0ValidationModule, DataWriterModule, ECLExpertModule, KLMExpertModule, KlongValidationModule, KLMMuonIDDNNExpertModule, FullSimModule, MaterialScanModule, SVDBackgroundModule, SVDClusterCalibrationsMonitorModule, SVDHotStripFinderModule, SVDLatencyCalibrationModule, SVDLocalCalibrationsCheckModule, SVDLocalCalibrationsMonitorModule, SVDPositionErrorScaleFactorImporterModule, SVDTimeCalibrationsMonitorModule, SVDDQMHitTimeModule, svdDumpModule, SVDPackerModule, SVDB4CommissioningPlotsModule, SVDClusterEvaluationModule, SVDClusterEvaluationTrueInfoModule, SVDClusterFilterModule, SVDMaxStripTTreeModule, SVDOccupancyAnalysisModule, SVDPerformanceModule, SVDPerformanceTTreeModule, SVDShaperDigitsFromTracksModule, SVDClusterizerModule, SVDCoGTimeEstimatorModule, SVDDataFormatCheckModule, SVDMissingAPVsClusterCreatorModule, SVDRecoDigitCreatorModule, SVD3SamplesEmulatorModule, SVDDigitizerModule, SVDEventInfoSetterModule, SVDTriggerQualityGeneratorModule, SVDSpacePointCreatorModule, SVDTimeGroupingModule, SVDUnpackerModule, TOPBackgroundModule, TOPBunchFinderModule, TOPChannelMaskerModule, TOPChannelT0MCModule, TOPDigitizerModule, TOPTriggerDigitizerModule, TOPDoublePulseGeneratorModule, TOPDQMModule, TOPGainEfficiencyCalculatorModule, TOPLaserHitSelectorModule, TOPInterimFENtupleModule, TOPLaserCalibratorModule, TOPMCTrackMakerModule, TOPModuleT0CalibratorModule, TOPNtupleModule, TOPPackerModule, TOPRawDigitConverterModule, TOPTBCComparatorModule, TOPTimeBaseCalibratorModule, TOPTimeRecalibratorModule, TOPUnpackerModule, TOPWaveformFeatureExtractorModule, TOPXTalkChargeShareSetterModule, DQMHistoModuleBase, SVDEventT0EstimatorModule, ExtModule, FlipQualityModule, BeamSpotMonitorModule, KinkFinderModule, MCV0MatcherModule, MCTrackCandClassifierModule, MuidModule, PXDROIFinderModule, SVDROIFinderAnalysisModule, SVDROIFinderModule, SPTCmomentumSeedRetrieverModule, SPTCvirtualIPRemoverModule, TrackCreatorModule, TrackFinderMCTruthRecoTracksModule, EffPlotsModule, HitXPModule, TrackingPerformanceEvaluationModule, V0findingPerformanceEvaluationModule, TrackQETrainingDataCollectorModule, TrackQualityEstimatorMVAModule, SecMapTrainerBaseModule, SecMapTrainerVXDTFModule, TrackFinderVXDAnalizerModule, VXDSimpleClusterizerModule, QualityEstimatorVXDModule, VXDQETrainingDataCollectorModule, VXDQualityEstimatorMVAModule, SectorMapBootstrapModule, SegmentNetworkProducerModule, TrackFinderVXDBasicPathFinderModule, TrackFinderVXDCellOMatModule, VXDTFTrainingDataCollectorModule, FindletModule< AFindlet >, FindletModule< HitBasedT0Extractor >, FindletModule< CKFToSVDSeedFindlet >, FindletModule< CKFToSVDFindlet >, FindletModule< CosmicsTrackMergerFindlet >, FindletModule< DATCONFPGAFindlet >, FindletModule< MCVXDCDCTrackMergerFindlet >, FindletModule< vxdHoughTracking::SVDHoughTracking >, FindletModule< CKFToCDCFindlet >, FindletModule< CKFToCDCFromEclFindlet >, FindletModule< CKFToPXDFindlet >, FindletModule< AsicBackgroundLibraryCreator >, FindletModule< CDCTrackingEventLevelMdstInfoFillerFindlet >, FindletModule< AxialSegmentPairCreator >, FindletModule< AxialStraightTrackFinder >, FindletModule< AxialTrackCreatorMCTruth >, FindletModule< AxialTrackCreatorSegmentHough >, FindletModule< AxialTrackFinderHough >, FindletModule< AxialTrackFinderLegendre >, FindletModule< ClusterBackgroundDetector >, FindletModule< ClusterPreparer >, FindletModule< ClusterRefiner< BridgingWireHitRelationFilter > >, FindletModule< FacetCreator >, FindletModule< HitReclaimer >, FindletModule< MonopoleAxialTrackFinderLegendre >, FindletModule< MonopoleStereoHitFinder >, FindletModule< MonopoleStereoHitFinderQuadratic >, FindletModule< SegmentCreatorFacetAutomaton >, FindletModule< SegmentCreatorMCTruth >, FindletModule< SegmentFinderFacetAutomaton >, FindletModule< SegmentFitter >, FindletModule< SegmentLinker >, FindletModule< SegmentOrienter >, FindletModule< SegmentPairCreator >, FindletModule< SegmentRejecter >, FindletModule< SegmentTrackCombiner >, FindletModule< SegmentTripleCreator >, FindletModule< StereoHitFinder >, FindletModule< SuperClusterCreator >, FindletModule< TrackCombiner >, FindletModule< TrackCreatorSegmentPairAutomaton >, FindletModule< TrackCreatorSegmentTripleAutomaton >, FindletModule< TrackCreatorSingleSegments >, FindletModule< TrackExporter >, FindletModule< TrackFinderAutomaton >, FindletModule< TrackFinderCosmics >, FindletModule< TrackFinder >, FindletModule< TrackFinderSegmentPairAutomaton >, FindletModule< TrackFinderSegmentTripleAutomaton >, FindletModule< TrackFlightTimeAdjuster >, FindletModule< TrackLinker >, FindletModule< TrackOrienter >, FindletModule< TrackQualityAsserter >, FindletModule< TrackQualityEstimator >, FindletModule< TrackRejecter >, FindletModule< WireHitBackgroundDetector >, FindletModule< WireHitCreator >, FindletModule< WireHitPreparer >, CDCTriggerNeuroDQMModule, CDCTriggerNeuroDQMOnlineModule, CDCTriggerNDFinderModule, CDCTriggerTSFModule, TRGCDCModule, TRGCDCETFUnpackerModule, TRGCDCT2DDQMModule, TRGCDCT3DConverterModule, TRGCDCT3DDQMModule, TRGCDCT3DUnpackerModule, TRGCDCTSFDQMModule, TRGCDCTSFUnpackerModule, TRGCDCTSStreamModule, CDCTriggerUnpackerModule, MCMatcherTRGECLModule, TRGECLFAMModule, TRGECLModule, TRGECLBGTCHitModule, TRGECLDQMModule, TRGECLEventTimingDQMModule, TRGECLQAMModule, TRGECLRawdataAnalysisModule, TRGECLTimingCalModule, TRGECLUnpackerModule, TRGGDLModule, TRGGDLDQMModule, TRGGDLDSTModule, TRGGDLSummaryModule, TRGGDLUnpackerModule, TRGGRLMatchModule, TRGGRLModule, TRGGRLProjectsModule, TRGGRLDQMModule, TRGGRLUnpackerModule, KLMTriggerModule, TRGTOPDQMModule, TRGTOPTRD2TTSConverterModule, TRGTOPUnpackerModule, TRGTOPUnpackerWaveformModule, TRGTOPWaveformPlotterModule, TRGRAWDATAModule, VXDMisalignmentModule, DQMHistAnalysisARICHModule, DQMHistAnalysisCDCDedxModule, DQMHistAnalysisCDCEpicsModule, DQMHistAnalysisCDCMonObjModule, DQMHistAnalysisECLModule, DQMHistAnalysisECLConnectedRegionsModule, DQMHistAnalysisECLShapersModule, DQMHistAnalysisECLSummaryModule, DQMHistAnalysisEpicsExampleModule, DQMHistAnalysisEventT0EfficiencyModule, DQMHistAnalysisEventT0TriggerJitterModule, DQMHistAnalysisExampleModule, DQMHistAnalysisExampleFlagsModule, DQMHistAnalysisHLTModule, DQMHistAnalysisInput2Module, DQMHistAnalysisInputPVSrvModule, DQMHistAnalysisInputRootFileModule, DQMHistAnalysisInputTestModule, DQMHistAnalysisKLMModule, DQMHistAnalysisKLM2Module, DQMHistAnalysisMiraBelleModule, DQMHistAnalysisOutputMonObjModule, DQMHistAnalysisOutputRelayMsgModule, DQMHistAnalysisPeakModule, DQMHistAnalysisPXDERModule, DQMHistAnalysisPXDFitsModule, DQMHistAnalysisSVDDoseModule, DQMHistAnalysisSVDEfficiencyModule, DQMHistAnalysisSVDGeneralModule, DQMHistAnalysisSVDOnMiraBelleModule, DQMHistAnalysisTOPModule, DQMHistAnalysisTrackingAbortModule, DQMHistAnalysisTrackingHLTModule, DQMHistAnalysisTRGECLModule, DQMHistAutoCanvasModule, DQMHistComparitorModule, DQMHistDeltaHistoModule, DQMHistReferenceModule, DQMHistSnapshotsModule, DAQMonitorModule, DelayDQMModule, V0ObjectsDQMModule, ECLDQMInjectionModule, PyModule, PXDBgTupleProducerModule, PXDMCBgTupleProducerModule, PXDDAQDQMModule, PXDDQMClustersModule, PXDDQMCorrModule, PXDDQMEfficiencyModule, PXDDQMEfficiencySelftrackModule, PXDDQMExpressRecoModule, PXDGatedDHCDQMModule, PXDGatedModeDQMModule, PXDInjectionDQMModule, PXDRawDQMCorrModule, PXDRawDQMModule, PXDROIDQMModule, PXDTrackClusterDQMModule, PXDDigitizerModule, PXDPackerModule, PXDUnpackerModule, TTDDQMModule, SVDDQMClustersOnTrackModule, SVDDQMDoseModule, SVDDQMExpressRecoModule, SVDDQMInjectionModule, SVDUnpackerDQMModule, PXDclusterFilterModule, PXDdigiFilterModule, PXDROIFinderAnalysisModule, TrackingAbortDQMModule, VXDDQMExpressRecoModule, vxdDigitMaskingModule, DQMHistAnalysisDeltaEpicsMonObjExampleModule, DQMHistAnalysisDeltaTestModule, DQMHistAnalysisEpicsOutputModule, DQMHistAnalysisPhysicsModule, DQMHistAnalysisPXDChargeModule, DQMHistAnalysisPXDCMModule, DQMHistAnalysisPXDDAQModule, DQMHistAnalysisPXDEffModule, DQMHistAnalysisPXDInjectionModule, DQMHistAnalysisPXDReductionModule, DQMHistAnalysisPXDTrackChargeModule, DQMHistAnalysisRooFitExampleModule, DQMHistAnalysisRunNrModule, DQMHistAnalysisTRGModule, DQMHistInjectionModule, and DQMHistOutputToEPICSModule.

Definition at line 147 of file Module.h.

147{};

◆ clone()

std::shared_ptr< PathElement > clone ( ) const
overridevirtualinherited

Create an independent copy of this module.

Note that parameters are shared, so changing them on a cloned module will also affect the original module.

Implements PathElement.

Definition at line 179 of file Module.cc.

180{
182 newModule->m_moduleParamList.setParameters(getParamList());
183 newModule->setName(getName());
184 newModule->m_package = m_package;
185 newModule->m_propertyFlags = m_propertyFlags;
186 newModule->m_logConfig = m_logConfig;
187 newModule->m_conditions = m_conditions;
188
189 return newModule;
190}
std::shared_ptr< Module > registerModule(const std::string &moduleName, std::string sharedLibPath="") noexcept(false)
Creates an instance of a module and registers it to the ModuleManager.
static ModuleManager & Instance()
Exception is thrown if the requested module could not be created by the ModuleManager.
const ModuleParamList & getParamList() const
Return module param list.
Definition: Module.h:363
const std::string & getName() const
Returns the name of the module.
Definition: Module.h:187
const std::string & getType() const
Returns the type of the module (i.e.
Definition: Module.cc:41
unsigned int m_propertyFlags
The properties of the module as bitwise or (with |) of EModulePropFlags.
Definition: Module.h:512
LogConfig m_logConfig
The log system configuration of the module.
Definition: Module.h:514
std::vector< ModuleCondition > m_conditions
Module condition, only non-null if set.
Definition: Module.h:521
std::string m_package
Package this module is found in (may be empty).
Definition: Module.h:510
std::shared_ptr< Module > ModulePtr
Defines a pointer to a module object as a boost shared pointer.
Definition: Module.h:43

◆ computeEdges()

void computeEdges ( )
protected

Compute the map from merger cell ID to all its related edge fields.

Definition at line 192 of file CDCTriggerTSFFirmwareModule.cc.

193{
194 for (unsigned short iEdge = 0; iEdge < 5; ++iEdge) {
195 for (const auto& cell : innerInvEdge[iEdge]) {
196 m_edge[0][cell].push_back(iEdge);
197 }
198 }
199 for (unsigned short iEdge = 0; iEdge < 3; ++iEdge) {
200 for (const auto& cell : outerInvEdge[iEdge]) {
201 m_edge[1][cell].push_back(iEdge);
202 }
203 }
204}
std::array< edgeList, 2 > m_edge
map from cell ID to related edge ID
std::array< cellList, 5 > innerInvEdge
list of cell ID related to edge timing
std::array< cellList, 3 > outerInvEdge
list of cell ID related to edge timing

◆ def_beginRun()

virtual void def_beginRun ( )
inlineprotectedvirtualinherited

Wrapper method for the virtual function beginRun() that has the implementation to be used in a call from Python.

Reimplemented in PyModule.

Definition at line 426 of file Module.h.

426{ beginRun(); }
virtual void beginRun()
Called when entering a new run.
Definition: Module.h:147

◆ def_endRun()

virtual void def_endRun ( )
inlineprotectedvirtualinherited

This method can receive that the current run ends as a call from the Python side.

For regular C++-Modules that forwards the call to the regular endRun() method.

Reimplemented in PyModule.

Definition at line 439 of file Module.h.

439{ endRun(); }
virtual void endRun()
This method is called if the current run ends.
Definition: Module.h:166

◆ def_event()

virtual void def_event ( )
inlineprotectedvirtualinherited

Wrapper method for the virtual function event() that has the implementation to be used in a call from Python.

Reimplemented in PyModule.

Definition at line 432 of file Module.h.

432{ event(); }
virtual void event()
This method is the core of the module.
Definition: Module.h:157

◆ def_initialize()

virtual void def_initialize ( )
inlineprotectedvirtualinherited

Wrappers to make the methods without "def_" prefix callable from Python.

Overridden in PyModule. Wrapper method for the virtual function initialize() that has the implementation to be used in a call from Python.

Reimplemented in PyModule.

Definition at line 420 of file Module.h.

420{ initialize(); }
virtual void initialize()
Initialize the Module.
Definition: Module.h:109

◆ def_terminate()

virtual void def_terminate ( )
inlineprotectedvirtualinherited

Wrapper method for the virtual function terminate() that has the implementation to be used in a call from Python.

Reimplemented in PyModule.

Definition at line 445 of file Module.h.

445{ terminate(); }
virtual void terminate()
This method is called at the end of the event processing.
Definition: Module.h:176

◆ endRun()

virtual void endRun ( void  )
inlinevirtualinherited

This method is called if the current run ends.

Use this method to store information, which should be aggregated over one run.

This method can be implemented by subclasses.

Reimplemented in BeamabortModule, BgoModule, CaveModule, ClawModule, CLAWSModule, DosiModule, FANGSModule, He3tubeModule, MicrotpcModule, Ph1bpipeModule, Ph1sustrModule, PindiodeModule, PlumeModule, QcsmonitorModule, SrsensorModule, GetEventFromSocketModule, CalibrationCollectorModule, AlignDQMModule, CosmicsAlignmentValidationModule, CurlTaggerModule, LowEnergyPi0IdentificationExpertModule, LowEnergyPi0VetoExpertModule, arichBtestModule, ARICHDQMModule, B2BIIMCParticlesMonitorModule, B2BIIConvertMdstModule, B2BIIMdstInputModule, BelleMCOutputModule, BeamBkgGeneratorModule, BeamBkgHitRateMonitorModule, BeamBkgMixerModule, BeamBkgTagSetterModule, BGOverlayInputModule, AnalysisPhase1StudyModule, NtuplePhase1_v6Module, ReprocessorModule, BeamabortStudyModule, BeamDigitizerModule, BgoDigitizerModule, BgoStudyModule, ClawDigitizerModule, ClawStudyModule, ClawsDigitizerModule, ClawsStudyModule, CsiDigitizer_v2Module, CsIDigitizerModule, CsiModule, CsiStudy_v2Module, CsIStudyModule, DosiDigitizerModule, DosiStudyModule, FANGSDigitizerModule, FANGSStudyModule, He3DigitizerModule, He3tubeStudyModule, MicrotpcStudyModule, TpcDigitizerModule, TPCStudyModule, PinDigitizerModule, PindiodeStudyModule, PlumeDigitizerModule, QcsmonitorDigitizerModule, QcsmonitorStudyModule, CDCCosmicAnalysisModule, CDCCRTestModule, cdcDQM7Module, CDCDQMModule, CDCPackerModule, CDCRecoTrackFilterModule, CDCUnpackerModule, DAQPerfModule, RxSocketModule, TxSocketModule, DqmHistoManagerModule, MonitorDataModule, TrackAnaModule, Ds2SampleModule, ReceiveEventModule, HLTDQM2ZMQModule, HLTDs2ZMQModule, ElapsedTimeModule, DeSerializerPXDModule, GenRawSendModule, Root2RawModule, SerializerModule, CertifyParallelModule, Ds2RawModule, Ds2RbufModule, EvReductionModule, FastRbuf2DsModule, Raw2DsModule, RawInputModule, Rbuf2DsModule, Rbuf2RbufModule, Ds2RawFileModule, PartialSeqRootReaderModule, SeqRootMergerModule, StorageDeserializerModule, StorageRootOutputModule, StorageSerializerModule, PhysicsObjectsDQMModule, PhysicsObjectsMiraBelleBhabhaModule, PhysicsObjectsMiraBelleDst2Module, PhysicsObjectsMiraBelleDstModule, PhysicsObjectsMiraBelleHadronModule, PhysicsObjectsMiraBelleModule, ECLBackgroundModule, ECLChargedPIDModule, ECLChargedPIDDataAnalysisModule, ECLChargedPIDDataAnalysisValidationModule, ECLClusterPSDModule, ECLCovarianceMatrixModule, ECLCRFinderModule, ECLDataAnalysisModule, ECLDigitCalibratorModule, ECLDigitizerModule, ECLDigitizerPureCsIModule, EclDisplayModule, ECLDQMModule, ECLDQMEXTENDEDModule, ECLDQMOutOfTimeDigitsModule, ECLFinalizerModule, ECLHitDebugModule, ECLLocalMaximumFinderModule, ECLLocalRunCalibratorModule, ECLLOMModule, ECLPackerModule, ECLShowerCorrectorModule, ECLShowerShapeModule, ECLSplitterN1Module, ECLSplitterN2Module, ECLUnpackerModule, ECLWaveformFitModule, HistoModule, SubEventModule, SwitchDataStoreModule, EventInfoPrinterModule, RandomBarrierModule, HistoManagerModule, StatisticsSummaryModule, SeqRootInputModule, SeqRootOutputModule, RxModule, TxModule, ZMQTxInputModule, ZMQTxWorkerModule, EvtGenDecayModule, OverrideGenerationFlagsModule, BKLMAnaModule, BKLMDigitAnalyzerModule, BKLMSimHistogrammerModule, BKLMTrackingModule, EKLMDataCheckerModule, KLMClusterEfficiencyModule, KLMClustersReconstructorModule, KLMDigitizerModule, KLMDQMModule, KLMDQM2Module, KLMPackerModule, KLMReconstructorModule, KLMScintillatorSimulatorModule, KLMUnpackerModule, AWESOMEBasicModule, PXDBackgroundModule, PXDClustersFromTracksModule, PXDPerformanceModule, Convert2RawDetModule, PrintDataModule, PrintEventRateModule, Root2BinaryModule, CDCDedxDQMModule, CDCDedxValidationModule, EventT0ValidationModule, DataWriterModule, KlongValidationModule, KLMMuonIDDNNExpertModule, FullSimModule, SVDBackgroundModule, SVDClusterCalibrationsMonitorModule, SVDHotStripFinderModule, SVDLatencyCalibrationModule, SVDLocalCalibrationsMonitorModule, SVDPositionErrorScaleFactorImporterModule, SVDTimeCalibrationsMonitorModule, svdDumpModule, SVDPackerModule, SVDB4CommissioningPlotsModule, SVDClusterEvaluationModule, SVDClusterEvaluationTrueInfoModule, SVDClusterFilterModule, SVDOccupancyAnalysisModule, SVDPerformanceModule, SVDShaperDigitsFromTracksModule, SVDClusterizerModule, SVDCoGTimeEstimatorModule, SVDDataFormatCheckModule, SVDRecoDigitCreatorModule, SVD3SamplesEmulatorModule, SVDTriggerQualityGeneratorModule, SVDUnpackerModule, TOPBackgroundModule, TOPChannelT0MCModule, TOPTriggerDigitizerModule, TOPDoublePulseGeneratorModule, TOPGainEfficiencyCalculatorModule, TOPLaserHitSelectorModule, TOPInterimFENtupleModule, TOPLaserCalibratorModule, TOPMCTrackMakerModule, TOPNtupleModule, TOPPackerModule, TOPRawDigitConverterModule, TOPTBCComparatorModule, TOPTimeBaseCalibratorModule, TOPUnpackerModule, TOPWaveformFeatureExtractorModule, TOPWaveformQualityPlotterModule, TOPXTalkChargeShareSetterModule, ExtModule, GenfitVisModule, MCV0MatcherModule, MCTrackCandClassifierModule, MuidModule, MCSlowPionPXDROICreatorModule, PXDROIFinderModule, SVDROIDQMModule, SVDROIFinderAnalysisModule, SVDROIFinderModule, RT2SPTCConverterModule, SPTCmomentumSeedRetrieverModule, SPTCvirtualIPRemoverModule, TrackFinderMCTruthRecoTracksModule, EffPlotsModule, HitXPModule, TrackingPerformanceEvaluationModule, V0findingPerformanceEvaluationModule, SecMapTrainerBaseModule, SecMapTrainerVXDTFModule, TrackFinderVXDAnalizerModule, VXDSimpleClusterizerModule, NoKickCutsEvalModule, SectorMapBootstrapModule, VXDTFTrainingDataCollectorModule, FindletModule< AFindlet >, FindletModule< HitBasedT0Extractor >, FindletModule< CKFToSVDSeedFindlet >, FindletModule< CKFToSVDFindlet >, FindletModule< CosmicsTrackMergerFindlet >, FindletModule< DATCONFPGAFindlet >, FindletModule< MCVXDCDCTrackMergerFindlet >, FindletModule< vxdHoughTracking::SVDHoughTracking >, FindletModule< CKFToCDCFindlet >, FindletModule< CKFToCDCFromEclFindlet >, FindletModule< CKFToPXDFindlet >, FindletModule< AsicBackgroundLibraryCreator >, FindletModule< CDCTrackingEventLevelMdstInfoFillerFindlet >, FindletModule< AxialSegmentPairCreator >, FindletModule< AxialStraightTrackFinder >, FindletModule< AxialTrackCreatorMCTruth >, FindletModule< AxialTrackCreatorSegmentHough >, FindletModule< AxialTrackFinderHough >, FindletModule< AxialTrackFinderLegendre >, FindletModule< ClusterBackgroundDetector >, FindletModule< ClusterPreparer >, FindletModule< ClusterRefiner< BridgingWireHitRelationFilter > >, FindletModule< FacetCreator >, FindletModule< HitReclaimer >, FindletModule< MonopoleAxialTrackFinderLegendre >, FindletModule< MonopoleStereoHitFinder >, FindletModule< MonopoleStereoHitFinderQuadratic >, FindletModule< SegmentCreatorFacetAutomaton >, FindletModule< SegmentCreatorMCTruth >, FindletModule< SegmentFinderFacetAutomaton >, FindletModule< SegmentFitter >, FindletModule< SegmentLinker >, FindletModule< SegmentOrienter >, FindletModule< SegmentPairCreator >, FindletModule< SegmentRejecter >, FindletModule< SegmentTrackCombiner >, FindletModule< SegmentTripleCreator >, FindletModule< StereoHitFinder >, FindletModule< SuperClusterCreator >, FindletModule< TrackCombiner >, FindletModule< TrackCreatorSegmentPairAutomaton >, FindletModule< TrackCreatorSegmentTripleAutomaton >, FindletModule< TrackCreatorSingleSegments >, FindletModule< TrackExporter >, FindletModule< TrackFinderAutomaton >, FindletModule< TrackFinderCosmics >, FindletModule< TrackFinder >, FindletModule< TrackFinderSegmentPairAutomaton >, FindletModule< TrackFinderSegmentTripleAutomaton >, FindletModule< TrackFlightTimeAdjuster >, FindletModule< TrackLinker >, FindletModule< TrackOrienter >, FindletModule< TrackQualityAsserter >, FindletModule< TrackQualityEstimator >, FindletModule< TrackRejecter >, FindletModule< WireHitBackgroundDetector >, FindletModule< WireHitCreator >, FindletModule< WireHitPreparer >, CDCTriggerNeuroDQMModule, CDCTriggerNeuroDQMOnlineModule, CDCTriggerNDFinderModule, TRGCDCModule, TRGCDCETFUnpackerModule, TRGCDCT2DDQMModule, TRGCDCT3DConverterModule, TRGCDCT3DDQMModule, TRGCDCT3DUnpackerModule, TRGCDCTSFDQMModule, TRGCDCTSFUnpackerModule, TRGCDCTSStreamModule, MCMatcherTRGECLModule, TRGECLFAMModule, TRGECLModule, TRGECLBGTCHitModule, TRGECLDQMModule, TRGECLQAMModule, TRGECLRawdataAnalysisModule, TRGECLTimingCalModule, TRGECLUnpackerModule, TRGGDLModule, TRGGDLDQMModule, TRGGDLDSTModule, TRGGDLSummaryModule, TRGGDLUnpackerModule, TRGGRLMatchModule, TRGGRLModule, TRGGRLProjectsModule, TRGGRLDQMModule, TRGGRLUnpackerModule, KLMTriggerModule, TRGTOPDQMModule, TRGTOPTRD2TTSConverterModule, TRGTOPUnpackerModule, TRGTOPUnpackerWaveformModule, TRGTOPWaveformPlotterModule, TRGRAWDATAModule, DQMHistAnalysisARICHModule, DQMHistAnalysisARICHMonObjModule, DQMHistAnalysisCDCDedxModule, DQMHistAnalysisCDCEpicsModule, DQMHistAnalysisCDCMonObjModule, DQMHistAnalysisECLModule, DQMHistAnalysisECLConnectedRegionsModule, DQMHistAnalysisECLOutOfTimeDigitsModule, DQMHistAnalysisECLShapersModule, DQMHistAnalysisECLSummaryModule, DQMHistAnalysisEpicsExampleModule, DQMHistAnalysisExampleModule, DQMHistAnalysisExampleFlagsModule, DQMHistAnalysisHLTMonObjModule, DQMHistAnalysisInput2Module, DQMHistAnalysisInputPVSrvModule, DQMHistAnalysisInputTestModule, DQMHistAnalysisKLMModule, DQMHistAnalysisKLM2Module, DQMHistAnalysisMiraBelleModule, DQMHistAnalysisMonObjModule, DQMHistAnalysisOutputFileModule, DQMHistAnalysisOutputMonObjModule, DQMHistAnalysisOutputRelayMsgModule, DQMHistAnalysisPXDFitsModule, DQMHistAnalysisSVDDoseModule, DQMHistAnalysisSVDEfficiencyModule, DQMHistAnalysisSVDGeneralModule, DQMHistAnalysisSVDOnMiraBelleModule, DQMHistAnalysisTOPModule, DQMHistAnalysisTRGECLModule, DQMHistAnalysisTRGGDLModule, DQMHistComparitorModule, DQMHistDeltaHistoModule, DQMHistReferenceModule, DQMHistSnapshotsModule, PyModule, SVDUnpackerDQMModule, TrackSetEvaluatorHopfieldNNDEVModule, vxdDigitMaskingModule, DQMHistAnalysisDeltaEpicsMonObjExampleModule, DQMHistAnalysisDeltaTestModule, DQMHistAnalysisEpicsOutputModule, DQMHistAnalysisPhysicsModule, DQMHistAnalysisPXDChargeModule, DQMHistAnalysisPXDTrackChargeModule, DQMHistAnalysisRooFitExampleModule, DQMHistAnalysisTRGModule, and DQMHistOutputToEPICSModule.

Definition at line 166 of file Module.h.

166{};

◆ evalCondition()

bool evalCondition ( ) const
inherited

If at least one condition was set, it is evaluated and true returned if at least one condition returns true.

If no condition or result value was defined, the method returns false. Otherwise, the condition is evaluated and true returned, if at least one condition returns true. To speed up the evaluation, the condition strings were already parsed in the method if_value().

Returns
True if at least one condition and return value exists and at least one condition expression was evaluated to true.

Definition at line 96 of file Module.cc.

97{
98 if (m_conditions.empty()) return false;
99
100 //okay, a condition was set for this Module...
101 if (!m_hasReturnValue) {
102 B2FATAL("A condition was set for '" << getName() << "', but the module did not set a return value!");
103 }
104
105 for (const auto& condition : m_conditions) {
106 if (condition.evaluate(m_returnValue)) {
107 return true;
108 }
109 }
110 return false;
111}
int m_returnValue
The return value.
Definition: Module.h:519
bool m_hasReturnValue
True, if the return value is set.
Definition: Module.h:518

◆ event()

void event ( void  )
overridevirtual

Things to do for each event.

It gets the CDCHits from DataStore, simulate the Merger output, pass them to the firmware simulation process, and collect TSF firmware response.

Reimplemented from Module.

Definition at line 647 of file CDCTriggerTSFFirmwareModule.cc.

648{
649 // TODO: what if there is 0 CDC hit?
650 int status = 0;
652 try {
653 // clear accumulative merger output
654 for (unsigned iAx = 0; iAx < m_nSubModules; ++iAx) {
655 dataAcrossClocks[2 * iAx] = mergerStruct<5> (nAxialMergers[iAx]);
656 }
657 for (int iClock = 0; iClock < m_nClockPerEvent; iClock++) {
658 B2INFO(string(15, '=') << " clock #" << iClock << " " << string(15, '='));
659 if (iClock == m_nClockPerEvent - 1) {
660 cout << "Accumulative hitmap:" << "\n";
661 }
662 simulateMerger(iClock);
663 if (m_mergerOnly) {
664 cout << std::hex;
665 int iSL = 0;
666 for (const auto& sl : inputToTSF) {
667 int iMerger = 0;
668 for (const auto& mergerOut : sl) {
669 if (std::any_of(mergerOut.begin(), mergerOut.end(), [](char i) {
670 return i != zero_val;
671 })) {
672 cout << "Merger " << iSL * 2 << "-" << iMerger / 2 << " u" << iMerger % 2 << ": ";
673 display_hex(mergerOut);
674 }
675 // print accumulative hitmap
676 if (iClock == m_nClockPerEvent - 1) {
677 auto accuOut = dataAcrossClocks[2 * iSL][iMerger];
678 if (get<MergerOut::hitmap>(accuOut)[0].any()) {
679 cout << "Merger " << iSL * 2 << "-" << iMerger / 2 << " u" << iMerger % 2 << ": ";
680 cout << get<MergerOut::hitmap>(accuOut)[0] << "\n";
681 string priTime, fasTime;
682 for (int i = 0; i < 16; ++i) {
683 priTime += get<MergerOut::priorityTime>(accuOut)[i].to_string() + ",";
684 fasTime += get<MergerOut::fastestTime>(accuOut)[i].to_string() + ",";
685 }
686 cout << "pritime: " << priTime << "\n";
687 cout << "fastime: " << fasTime << "\n";
688 }
689 }
690 iMerger++;
691 }
692 iSL++;
693 }
694 cout << std::dec;
695 continue;
696 }
697
698 auto TSF0 = getData<0>(inputToTSF);
699 auto TSF2 = getData<1>(inputToTSF);
700 auto TSF4 = getData<2>(inputToTSF);
701 auto TSF6 = getData<3>(inputToTSF);
702 auto TSF8 = getData<4>(inputToTSF);
703 array<char*, m_nSubModules> rawInputToTSF = {TSF0, TSF2, TSF4, TSF6, TSF8};
704
705 for (unsigned iSL = 0; iSL < m_nSubModules; ++iSL) {
706 B2DEBUG(100, "input to TSF" << iSL * 2 << ": \n" <<
707 display_value(rawInputToTSF[iSL], nAxialMergers[iSL] * mergerWidth));
708 write(rawInputToTSF[iSL], stream[iSL][0]);
709 }
710 // don't mess up stdout order with child processes
711 if (m_debugLevel >= 50) {
712 usleep(2000 * m_debugLevel);
713 }
714 for (unsigned iSL = 0; iSL < m_nSubModules; ++iSL) {
715 B2DEBUG(50, "Reading buffer from TSF " << iSL * 2 << ":");
716 outputToTracker[iSL] = read(stream[iSL][1]);
717 B2DEBUG(30, "received TSF " << iSL * 2 << ":");
718 if (m_debugLevel >= 30) {
719 for (const auto& out : outputToTracker[iSL]) {
720 display_hex(out);
721 }
722 }
723 }
725 saveFastOutput(iClock);
726 }
727 } catch (std::exception& e) {
728 B2ERROR("ERROR: An exception occurred: " << e.what());
729 status = 2;
730 } catch (...) {
731 B2ERROR("ERROR: An unknown exception occurred.");
732 status = 3;
733 }
734 B2DEBUG(50, "status code:" << status);
735}
void initializeMerger()
Get CDC hits from the DataStore and distribute them to clocks.
int m_debugLevel
debug level specified in the steering file
outputArray read(FILE *instream)
write TSF output signals from the worker
static constexpr int m_nClockPerEvent
how many clocks to simulate per event
std::array< outputArray, m_nSubModules > outputToTracker
array holding TSF output data
void write(const char *message, FILE *outstream)
write TSF input signals to the worker
void saveFastOutput(short iclock)
save fast TSIM output
static constexpr int mergerWidth
merger output data width
void simulateMerger(unsigned iclock)
Simulate 1 clock of merger.
std::array< streamPair, m_nSubModules > stream
array holding file handlers of pipes
void display_hex(const std::array< char, N > &signal)
Display signal in hex.
Definition: Cosim.h:81
std::string display_value(const char *count, int size)
Display value of the signal.
Definition: Cosim.h:48

◆ exposePythonAPI()

void exposePythonAPI ( )
staticinherited

Exposes methods of the Module class to Python.

Definition at line 325 of file Module.cc.

326{
327 // to avoid confusion between std::arg and boost::python::arg we want a shorthand namespace as well
328 namespace bp = boost::python;
329
330 docstring_options options(true, true, false); //userdef, py sigs, c++ sigs
331
332 void (Module::*setReturnValueInt)(int) = &Module::setReturnValue;
333
334 enum_<Module::EAfterConditionPath>("AfterConditionPath",
335 R"(Determines execution behaviour after a conditional path has been executed:
336
337.. attribute:: END
338
339 End processing of this path after the conditional path. (this is the default for if_value() etc.)
340
341.. attribute:: CONTINUE
342
343 After the conditional path, resume execution after this module.)")
344 .value("END", Module::EAfterConditionPath::c_End)
345 .value("CONTINUE", Module::EAfterConditionPath::c_Continue)
346 ;
347
348 /* Do not change the names of >, <, ... we use them to serialize conditional pathes */
349 enum_<Belle2::ModuleCondition::EConditionOperators>("ConditionOperator")
356 ;
357
358 enum_<Module::EModulePropFlags>("ModulePropFlags",
359 R"(Flags to indicate certain low-level features of modules, see :func:`Module.set_property_flags()`, :func:`Module.has_properties()`. Most useful flags are:
360
361.. attribute:: PARALLELPROCESSINGCERTIFIED
362
363 This module can be run in parallel processing mode safely (All I/O must be done through the data store, in particular, the module must not write any files.)
364
365.. attribute:: HISTOGRAMMANAGER
366
367 This module is used to manage histograms accumulated by other modules
368
369.. attribute:: TERMINATEINALLPROCESSES
370
371 When using parallel processing, call this module's terminate() function in all processes. This will also ensure that there is exactly one process (single-core if no parallel modules found) or at least one input, one main and one output process.
372)")
373 .value("INPUT", Module::EModulePropFlags::c_Input)
374 .value("OUTPUT", Module::EModulePropFlags::c_Output)
375 .value("PARALLELPROCESSINGCERTIFIED", Module::EModulePropFlags::c_ParallelProcessingCertified)
376 .value("HISTOGRAMMANAGER", Module::EModulePropFlags::c_HistogramManager)
377 .value("INTERNALSERIALIZER", Module::EModulePropFlags::c_InternalSerializer)
378 .value("TERMINATEINALLPROCESSES", Module::EModulePropFlags::c_TerminateInAllProcesses)
379 ;
380
381 //Python class definition
382 class_<Module, PyModule> module("Module", R"(
383Base class for Modules.
384
385A module is the smallest building block of the framework.
386A typical event processing chain consists of a Path containing
387modules. By inheriting from this base class, various types of
388modules can be created. To use a module, please refer to
389:func:`Path.add_module()`. A list of modules is available by running
390``basf2 -m`` or ``basf2 -m package``, detailed information on parameters is
391given by e.g. ``basf2 -m RootInput``.
392
393The 'Module Development' section in the manual provides detailed information
394on how to create modules, setting parameters, or using return values/conditions:
395https://confluence.desy.de/display/BI/Software+Basf2manual#Module_Development
396
397)");
398 module
399 .def("__str__", &Module::getPathString)
400 .def("name", &Module::getName, return_value_policy<copy_const_reference>(),
401 "Returns the name of the module. Can be changed via :func:`set_name() <Module.set_name()>`, use :func:`type() <Module.type()>` for identifying a particular module class.")
402 .def("type", &Module::getType, return_value_policy<copy_const_reference>(),
403 "Returns the type of the module (i.e. class name minus 'Module')")
404 .def("set_name", &Module::setName, args("name"), R"(
405Set custom name, e.g. to distinguish multiple modules of the same type.
406
407>>> path.add_module('EventInfoSetter')
408>>> ro = path.add_module('RootOutput', branchNames=['EventMetaData'])
409>>> ro.set_name('RootOutput_metadata_only')
410>>> print(path)
411[EventInfoSetter -> RootOutput_metadata_only]
412
413)")
414 .def("description", &Module::getDescription, return_value_policy<copy_const_reference>(),
415 "Returns the description of this module.")
416 .def("package", &Module::getPackage, return_value_policy<copy_const_reference>(),
417 "Returns the package this module belongs to.")
418 .def("available_params", &_getParamInfoListPython,
419 "Return list of all module parameters as `ModuleParamInfo` instances")
420 .def("has_properties", &Module::hasProperties, (bp::arg("properties")),
421 R"DOCSTRING(Allows to check if the module has the given properties out of `ModulePropFlags` set.
422
423>>> if module.has_properties(ModulePropFlags.PARALLELPROCESSINGCERTIFIED):
424>>> ...
425
426Parameters:
427 properties (int): bitmask of `ModulePropFlags` to check for.
428)DOCSTRING")
429 .def("set_property_flags", &Module::setPropertyFlags, args("property_mask"),
430 "Set module properties in the form of an OR combination of `ModulePropFlags`.");
431 {
432 // python signature is too crowded, make ourselves
433 docstring_options subOptions(true, false, false); //userdef, py sigs, c++ sigs
434 module
435 .def("if_value", &Module::if_value,
436 (bp::arg("expression"), bp::arg("condition_path"), bp::arg("after_condition_path")= Module::EAfterConditionPath::c_End),
437 R"DOCSTRING(if_value(expression, condition_path, after_condition_path=AfterConditionPath.END)
438
439Sets a conditional sub path which will be executed after this
440module if the return value set in the module passes the given ``expression``.
441
442Modules can define a return value (int or bool) using ``setReturnValue()``,
443which can be used in the steering file to split the Path based on this value, for example
444
445>>> module_with_condition.if_value("<1", another_path)
446
447In case the return value of the ``module_with_condition`` for a given event is
448less than 1, the execution will be diverted into ``another_path`` for this event.
449
450You could for example set a special return value if an error occurs, and divert
451the execution into a path containing :b2:mod:`RootOutput` if it is found;
452saving only the data producing/produced by the error.
453
454After a conditional path has executed, basf2 will by default stop processing
455the path for this event. This behaviour can be changed by setting the
456``after_condition_path`` argument.
457
458Parameters:
459 expression (str): Expression to determine if the conditional path should be executed.
460 This should be one of the comparison operators ``<``, ``>``, ``<=``,
461 ``>=``, ``==``, or ``!=`` followed by a numerical value for the return value
462 condition_path (Path): path to execute in case the expression is fulfilled
463 after_condition_path (AfterConditionPath): What to do once the ``condition_path`` has been executed.
464)DOCSTRING")
465 .def("if_false", &Module::if_false,
466 (bp::arg("condition_path"), bp::arg("after_condition_path")= Module::EAfterConditionPath::c_End),
467 R"DOC(if_false(condition_path, after_condition_path=AfterConditionPath.END)
468
469Sets a conditional sub path which will be executed after this module if
470the return value of the module evaluates to False. This is equivalent to
471calling `if_value` with ``expression=\"<1\"``)DOC")
472 .def("if_true", &Module::if_true,
473 (bp::arg("condition_path"), bp::arg("after_condition_path")= Module::EAfterConditionPath::c_End),
474 R"DOC(if_true(condition_path, after_condition_path=AfterConditionPath.END)
475
476Sets a conditional sub path which will be executed after this module if
477the return value of the module evaluates to True. It is equivalent to
478calling `if_value` with ``expression=\">=1\"``)DOC");
479 }
480 module
481 .def("has_condition", &Module::hasCondition,
482 "Return true if a conditional path has been set for this module "
483 "using `if_value`, `if_true` or `if_false`")
484 .def("get_all_condition_paths", &_getAllConditionPathsPython,
485 "Return a list of all conditional paths set for this module using "
486 "`if_value`, `if_true` or `if_false`")
487 .def("get_all_conditions", &_getAllConditionsPython,
488 "Return a list of all conditional path expressions set for this module using "
489 "`if_value`, `if_true` or `if_false`")
490 .add_property("logging", make_function(&Module::getLogConfig, return_value_policy<reference_existing_object>()),
@ c_GE
Greater or equal than: ">=".
@ c_SE
Smaller or equal than: "<=".
@ c_GT
Greater than: ">"
@ c_NE
Not equal: "!=".
@ c_EQ
Equal: "=" or "=="
@ c_ST
Smaller than: "<"
Base class for Modules.
Definition: Module.h:72
LogConfig & getLogConfig()
Returns the log system configuration.
Definition: Module.h:225
void if_value(const std::string &expression, const std::shared_ptr< Path > &path, EAfterConditionPath afterConditionPath=EAfterConditionPath::c_End)
Add a condition to the module.
Definition: Module.cc:79
void setPropertyFlags(unsigned int propertyFlags)
Sets the flags for the module properties.
Definition: Module.cc:208
void if_true(const std::shared_ptr< Path > &path, EAfterConditionPath afterConditionPath=EAfterConditionPath::c_End)
A simplified version to set the condition of the module.
Definition: Module.cc:90
void setReturnValue(int value)
Sets the return value for this module as integer.
Definition: Module.cc:220
void setLogConfig(const LogConfig &logConfig)
Set the log system configuration.
Definition: Module.h:230
const std::string & getDescription() const
Returns the description of the module.
Definition: Module.h:202
void if_false(const std::shared_ptr< Path > &path, EAfterConditionPath afterConditionPath=EAfterConditionPath::c_End)
A simplified version to add a condition to the module.
Definition: Module.cc:85
bool hasCondition() const
Returns true if at least one condition was set for the module.
Definition: Module.h:311
const std::string & getPackage() const
Returns the package this module is in.
Definition: Module.h:197
void setName(const std::string &name)
Set the name of the module.
Definition: Module.h:214
bool hasProperties(unsigned int propertyFlags) const
Returns true if all specified property flags are available in this module.
Definition: Module.cc:160
std::string getPathString() const override
return the module name.
Definition: Module.cc:192

◆ getAfterConditionPath()

Module::EAfterConditionPath getAfterConditionPath ( ) const
inherited

What to do after the conditional path is finished.

(defaults to c_End if no condition is set)

Definition at line 133 of file Module.cc.

134{
135 if (m_conditions.empty()) return EAfterConditionPath::c_End;
136
137 //okay, a condition was set for this Module...
138 if (!m_hasReturnValue) {
139 B2FATAL("A condition was set for '" << getName() << "', but the module did not set a return value!");
140 }
141
142 for (const auto& condition : m_conditions) {
143 if (condition.evaluate(m_returnValue)) {
144 return condition.getAfterConditionPath();
145 }
146 }
147
148 return EAfterConditionPath::c_End;
149}

◆ getAllConditionPaths()

std::vector< std::shared_ptr< Path > > getAllConditionPaths ( ) const
inherited

Return all condition paths currently set (no matter if the condition is true or not).

Definition at line 150 of file Module.cc.

151{
152 std::vector<std::shared_ptr<Path>> allConditionPaths;
153 for (const auto& condition : m_conditions) {
154 allConditionPaths.push_back(condition.getPath());
155 }
156
157 return allConditionPaths;
158}

◆ getAllConditions()

const std::vector< ModuleCondition > & getAllConditions ( ) const
inlineinherited

Return all set conditions for this module.

Definition at line 324 of file Module.h.

325 {
326 return m_conditions;
327 }

◆ getCondition()

const ModuleCondition * getCondition ( ) const
inlineinherited

Return a pointer to the first condition (or nullptr, if none was set)

Definition at line 314 of file Module.h.

315 {
316 if (m_conditions.empty()) {
317 return nullptr;
318 } else {
319 return &m_conditions.front();
320 }
321 }

◆ getConditionPath()

std::shared_ptr< Path > getConditionPath ( ) const
inherited

Returns the path of the last true condition (if there is at least one, else reaturn a null pointer).


Definition at line 113 of file Module.cc.

114{
115 PathPtr p;
116 if (m_conditions.empty()) return p;
117
118 //okay, a condition was set for this Module...
119 if (!m_hasReturnValue) {
120 B2FATAL("A condition was set for '" << getName() << "', but the module did not set a return value!");
121 }
122
123 for (const auto& condition : m_conditions) {
124 if (condition.evaluate(m_returnValue)) {
125 return condition.getPath();
126 }
127 }
128
129 // if none of the conditions were true, return a null pointer.
130 return p;
131}
std::shared_ptr< Path > PathPtr
Defines a pointer to a path object as a boost shared pointer.
Definition: Path.h:35

◆ getData()

char * getData ( inputToTSFArray  input)
protected

get the XSI compliant format from the bits format TSF input

Definition at line 207 of file CDCTriggerTSFFirmwareModule.cc.

208{
209 static array<char, mergerWidth* nAxialMergers[iSL]> data;
210 // 2-D array in XSI is totally in LSB, like this
211 // ((012), (345), (678))
212 auto itr = data.end() - mergerWidth;
213 for (const auto& merger : input[iSL]) {
214 copy(merger.begin(), merger.end(), itr);
215 itr -= mergerWidth;
216 }
217 return data.data();
218}

◆ getDescription()

const std::string & getDescription ( ) const
inlineinherited

Returns the description of the module.

Definition at line 202 of file Module.h.

202{return m_description;}
std::string m_description
The description of the module.
Definition: Module.h:511

◆ getFileNames()

virtual std::vector< std::string > getFileNames ( bool  outputFiles)
inlinevirtualinherited

Return a list of output filenames for this modules.

This will be called when basf2 is run with "--dry-run" if the module has set either the c_Input or c_Output properties.

If the parameter outputFiles is false (for modules with c_Input) the list of input filenames should be returned (if any). If outputFiles is true (for modules with c_Output) the list of output files should be returned (if any).

If a module has sat both properties this member is called twice, once for each property.

The module should return the actual list of requested input or produced output filenames (including handling of input/output overrides) so that the grid system can handle input/output files correctly.

This function should return the same value when called multiple times. This is especially important when taking the input/output overrides from Environment as they get consumed when obtained so the finalized list of output files should be stored for subsequent calls.

Reimplemented in RootInputModule, StorageRootOutputModule, and RootOutputModule.

Definition at line 134 of file Module.h.

135 {
136 return std::vector<std::string>();
137 }

◆ getLogConfig()

LogConfig & getLogConfig ( )
inlineinherited

Returns the log system configuration.

Definition at line 225 of file Module.h.

225{return m_logConfig;}

◆ getModules()

std::list< ModulePtr > getModules ( ) const
inlineoverrideprivatevirtualinherited

no submodules, return empty list

Implements PathElement.

Definition at line 506 of file Module.h.

506{ return std::list<ModulePtr>(); }

◆ getName()

const std::string & getName ( ) const
inlineinherited

Returns the name of the module.

This can be changed via e.g. set_name() in the steering file to give more useful names if there is more than one module of the same type.

For identifying the type of a module, using getType() (or type() in Python) is recommended.

Definition at line 187 of file Module.h.

187{return m_name;}
std::string m_name
The name of the module, saved as a string (user-modifiable)
Definition: Module.h:508

◆ getPackage()

const std::string & getPackage ( ) const
inlineinherited

Returns the package this module is in.

Definition at line 197 of file Module.h.

197{return m_package;}

◆ getParamInfoListPython()

std::shared_ptr< boost::python::list > getParamInfoListPython ( ) const
inherited

Returns a python list of all parameters.

Each item in the list consists of the name of the parameter, a string describing its type, a python list of all default values and the description of the parameter.

Returns
A python list containing the parameters of this parameter list.

Definition at line 279 of file Module.cc.

280{
282}
std::shared_ptr< boost::python::list > getParamInfoListPython() const
Returns a python list of all parameters.
ModuleParamList m_moduleParamList
List storing and managing all parameter of the module.
Definition: Module.h:516

◆ getParamList()

const ModuleParamList & getParamList ( ) const
inlineinherited

Return module param list.

Definition at line 363 of file Module.h.

363{ return m_moduleParamList; }

◆ getPathString()

std::string getPathString ( ) const
overrideprivatevirtualinherited

return the module name.

Implements PathElement.

Definition at line 192 of file Module.cc.

193{
194
195 std::string output = getName();
196
197 for (const auto& condition : m_conditions) {
198 output += condition.getString();
199 }
200
201 return output;
202}

◆ getReturnValue()

int getReturnValue ( ) const
inlineinherited

Return the return value set by this module.

This value is only meaningful if hasReturnValue() is true

Definition at line 381 of file Module.h.

381{ return m_returnValue; }

◆ getType()

const std::string & getType ( ) const
inherited

Returns the type of the module (i.e.

class name minus 'Module')

Definition at line 41 of file Module.cc.

42{
43 if (m_type.empty())
44 B2FATAL("Module type not set for " << getName());
45 return m_type;
46}
std::string m_type
The type of the module, saved as a string.
Definition: Module.h:509

◆ hasCondition()

bool hasCondition ( ) const
inlineinherited

Returns true if at least one condition was set for the module.

Definition at line 311 of file Module.h.

311{ return not m_conditions.empty(); };

◆ hasProperties()

bool hasProperties ( unsigned int  propertyFlags) const
inherited

Returns true if all specified property flags are available in this module.

Parameters
propertyFlagsOred EModulePropFlags which should be compared with the module flags.

Definition at line 160 of file Module.cc.

161{
162 return (propertyFlags & m_propertyFlags) == propertyFlags;
163}

◆ hasReturnValue()

bool hasReturnValue ( ) const
inlineinherited

Return true if this module has a valid return value set.

Definition at line 378 of file Module.h.

378{ return m_hasReturnValue; }

◆ hasUnsetForcedParams()

bool hasUnsetForcedParams ( ) const
inherited

Returns true and prints error message if the module has unset parameters which the user has to set in the steering file.

Definition at line 166 of file Module.cc.

167{
169 std::string allMissing = "";
170 for (const auto& s : missing)
171 allMissing += s + " ";
172 if (!missing.empty())
173 B2ERROR("The following required parameters of Module '" << getName() << "' were not specified: " << allMissing <<
174 "\nPlease add them to your steering file.");
175 return !missing.empty();
176}
std::vector< std::string > getUnsetForcedParams() const
Returns list of unset parameters (if they are required to have a value.

◆ if_false()

void if_false ( const std::shared_ptr< Path > &  path,
EAfterConditionPath  afterConditionPath = EAfterConditionPath::c_End 
)
inherited

A simplified version to add a condition to the module.

Please note that successive calls of this function will add more than one condition to the module. If more than one condition results in true, only the last of them will be used.

Please be careful: Avoid creating cyclic paths, e.g. by linking a condition to a path which is processed before the path where this module is located in.

It is equivalent to the if_value() method, using the expression "<1". This method is meant to be used together with the setReturnValue(bool value) method.

Parameters
pathShared pointer to the Path which will be executed if the return value is false.
afterConditionPathWhat to do after executing 'path'.

Definition at line 85 of file Module.cc.

86{
87 if_value("<1", path, afterConditionPath);
88}

◆ if_true()

void if_true ( const std::shared_ptr< Path > &  path,
EAfterConditionPath  afterConditionPath = EAfterConditionPath::c_End 
)
inherited

A simplified version to set the condition of the module.

Please note that successive calls of this function will add more than one condition to the module. If more than one condition results in true, only the last of them will be used.

Please be careful: Avoid creating cyclic paths, e.g. by linking a condition to a path which is processed before the path where this module is located in.

It is equivalent to the if_value() method, using the expression ">=1". This method is meant to be used together with the setReturnValue(bool value) method.

Parameters
pathShared pointer to the Path which will be executed if the return value is true.
afterConditionPathWhat to do after executing 'path'.

Definition at line 90 of file Module.cc.

91{
92 if_value(">=1", path, afterConditionPath);
93}

◆ if_value()

void if_value ( const std::string &  expression,
const std::shared_ptr< Path > &  path,
EAfterConditionPath  afterConditionPath = EAfterConditionPath::c_End 
)
inherited

Add a condition to the module.

Please note that successive calls of this function will add more than one condition to the module. If more than one condition results in true, only the last of them will be used.

See https://confluence.desy.de/display/BI/Software+ModCondTut or ModuleCondition for a description of the syntax.

Please be careful: Avoid creating cyclic paths, e.g. by linking a condition to a path which is processed before the path where this module is located in.

Parameters
expressionThe expression of the condition.
pathShared pointer to the Path which will be executed if the condition is evaluated to true.
afterConditionPathWhat to do after executing 'path'.

Definition at line 79 of file Module.cc.

80{
81 m_conditions.emplace_back(expression, path, afterConditionPath);
82}

◆ initialize()

void initialize ( void  )
overridevirtual

spawn child process for workers, open pipes to pass data

Reimplemented from Module.

Definition at line 120 of file CDCTriggerTSFFirmwareModule.cc.

121{
122 m_cdcHits.isRequired(m_hitCollectionName);
124 if (m_mergerOnly) {
125 computeEdges();
126 return;
127 }
128 m_bitsTo2D.registerInDataStore(m_outputBitstreamNameTo2D);
130 for (unsigned i = 0; i < m_nSubModules; ++i) {
131 // i: input to worker (output from module)
132 // o: output from worker (input to module)
133 /* Create pipe and place the two-end pipe file descriptors*/
134 pipe(inputFileDescriptor[i].data());
135 pipe(outputFileDescriptor[i].data());
136 string str_fd[] = {to_string(inputFileDescriptor[i][0]), to_string(outputFileDescriptor[i][1])};
137 // spawn a child process
138 pid_t pid = fork();
139 // pid_t pid = 1;
140 if (pid < 0) {
141 B2FATAL("Fork failed!");
142 } else if (pid == (pid_t) 0) {
143 /* Child process (worker) */
144 // close the unused ends of the file descriptors
145 close(inputFileDescriptor[i][1]);
146 close(outputFileDescriptor[i][0]);
147 if (m_stubLUT[i]) {
149 }
150 string design = design_libname_pre + to_string(i * 2) + design_libname_post;
151 string waveform = wdbName_pre + to_string(i * 2) + wdbName_post;
152 // execute the standalone worker program
153 execlp("CDCTriggerTSFFirmwareWorker", "CDCTriggerTSFFirmwareWorker",
154 str_fd[0].c_str(), str_fd[1].c_str(), design.c_str(), waveform.c_str(),
155 to_string(nAxialMergers[i]).c_str(), nullptr);
156 B2FATAL("The firmware simulation program didn't launch!");
157 } else {
158 /* Parent process (basf2) */
159 B2DEBUG(100, "parent " << i);
160 m_pid[i] = pid;
161 // Close the copy of the fds read/write end
162 close(inputFileDescriptor[i][0]);
163 close(outputFileDescriptor[i][1]);
164 // open the fds
165 stream[i][0] = fdopen(inputFileDescriptor[i][1], "w");
166 stream[i][1] = fdopen(outputFileDescriptor[i][0], "r");
167 // ins = createInStreamFromFD(outputFileDescriptor[i][0]);
168 B2DEBUG(20, "pid for TSF" << i * 2 << ": " << m_pid[i]);
169 }
170 }
171 computeEdges();
172 B2INFO("It can take a while for TSF0 to load the LUT.");
173 for (unsigned i = 0; i < m_nSubModules; ++i) {
174 // wait for worker initialization
175 read(stream[i][1]);
176 }
177}
void computeEdges()
Compute the map from merger cell ID to all its related edge fields.
std::string design_libname_post
path to the simulation snapshot
StoreArray< CDCTriggerSegmentHit > m_tsHits
unpacked track segment hit
std::string design_libname_pre
path to the simulation snapshot
std::array< std::array< int, 2 >, m_nSubModules > inputFileDescriptor
array holding file descriptors of pipes
StoreArray< signalBitStream > m_bitsTo2D
bitstream of TSF output to 2D tracker
std::array< std::array< int, 2 >, m_nSubModules > outputFileDescriptor
array holding file descriptors of pipes
std::array< pid_t, m_nSubModules > m_pid
'1' in XSI VHDL simulation
int getDebugLevel() const
Returns the configured debug messaging level.
Definition: LogConfig.h:105
bool registerInDataStore(DataStore::EStoreFlags storeFlags=DataStore::c_WriteOut)
Register the object/array in the DataStore.

◆ initializeMerger()

void initializeMerger ( )
protected

Get CDC hits from the DataStore and distribute them to clocks.

Within each clock, faster hit has a smaller index

Definition at line 276 of file CDCTriggerTSFFirmwareModule.cc.

277{
278 /* The CDCHits array in DataStore contains all the hits in an event,
279 * regardless of when them at the trigger system. Their real timing behavior
280 * is replayed/simulated by looking at the TDC count (timestamp) of each hit.
281 */
282
283 vector<int> iAxialHit;
284 for (int i = 0; i < m_cdcHits.getEntries(); ++i) {
285 // discard hits in the layers unused by trigger
286 if ((m_cdcHits[i]->getISuperLayer() != 0 && m_cdcHits[i]->getILayer() == 5) ||
287 m_cdcHits[i]->getICLayer() < 3) {
288 continue;
289 }
290 if (m_cdcHits[i]->getISuperLayer() % 2 == 0) {
291 iAxialHit.push_back(i);
292 }
293 }
294 // sort by TDC count: larger count comes first
295 std::sort(iAxialHit.begin(), iAxialHit.end(), [this](int i, int j) {
296 return m_cdcHits[i]->getTDCCount() > m_cdcHits[j]->getTDCCount();
297 });
298
299 // assign the hits to clock edges based on TDC count
300 iAxialHitInClock.clear();
301 iAxialHitInClock.resize(1 + trgTime(iAxialHit.back(), iAxialHit.front()) / clockPeriod);
302 auto itr = iAxialHitInClock.begin();
303 int clockEdge = 1;
304 for (const auto& ihit : iAxialHit) {
305 B2DEBUG(20, "sorted TDC count: " << m_cdcHits[ihit]->getTDCCount() <<
306 ", SL" << m_cdcHits[ihit]->getISuperLayer() << ", layer" << m_cdcHits[ihit]->getILayer() <<
307 ", wire " << m_cdcHits[ihit]->getIWire() << ", ihit: " << ihit);
308 // if (m_cdcHits[ihit]->getTDCCount() >= 4999) {
309 // B2DEBUG(20, "skipping this hit");
310 // continue;
311 // }
312 // if (trgTime(ihit, iAxialHit.front()) >= clockEdge * clockPeriod) {
313 while (trgTime(ihit, iAxialHit.front()) >= clockEdge * clockPeriod) {
314 ++clockEdge;
315 ++itr;
316 }
317 itr->push_back(ihit);
318 }
319 m_iFirstHit = iAxialHit.front();
320
321 // In addition, clear the list holding priority hit indices
322 for (auto& clock : m_priorityHit) {
323 for (auto& sl : clock) {
324 for (auto& merger : sl.second) {
325 merger.clear();
326 }
327 }
328 }
329}
int m_iFirstHit
ID of the earlist CDC hit in an event.
unsigned short trgTime(int index, int iFirstHit)
Get the trigger time of the CDC hit.
static constexpr int clockPeriod
data clock period (32ns) in unit of 2ns
std::vector< std::vector< int > > iAxialHitInClock
CDC hit ID in each clock.

◆ mergerCellID()

unsigned short mergerCellID ( int  index)
protected

Get the cell ID in the merger.

Parameters
indexindex of the CDC hit in question
Returns
the cell ID (0-79)

Definition at line 235 of file CDCTriggerTSFFirmwareModule.cc.

236{
237 const CDCHit& hit = (*m_cdcHits[index]);
238 const unsigned offset = (hit.getISuperLayer() == 0) ? 3 : 0;
239 return (hit.getILayer() - offset) * nSegmentsInMerger +
240 hit.getIWire() % nSegmentsInMerger;
241}
Class containing the result of the unpacker in raw data and the result of the digitizer in simulation...
Definition: CDCHit.h:40
static constexpr int nSegmentsInMerger
number of track segments in a single merger unit

◆ mergerNumber()

unsigned short mergerNumber ( int  index)
protected

Get the merger unit ID in a super layer.

Parameters
indexindex of the CDC hit in question
Returns
the merger unit ID

Definition at line 243 of file CDCTriggerTSFFirmwareModule.cc.

244{
245 const CDCHit& hit = (*m_cdcHits[index]);
246 return hit.getIWire() / nSegmentsInMerger;
247}

◆ notHit()

bool notHit ( CDCTrigger::MergerOut  field,
unsigned  iTS,
TSF::registeredStructElement reg 
)
protected

Whether a time field in a merger has been hit in the clock cycle.

Parameters
fieldone of (priority, fastest, edge) time
iTSindex of the track segment or edge
regrecord of the timing fields in merger
Returns
true if the TS has not been hit

Definition at line 331 of file CDCTriggerTSFFirmwareModule.cc.

332{
333 return ! reg[field][iTS];
334}

◆ pack()

void pack ( inputVector::reverse_iterator &  rInput,
unsigned  number,
mergerStructElement< 5 > &  output 
)
protected

Pack the merger output data structure to TSF input vector.

template with field as the type of output to be packed and width as the bit width of a single output unit

Parameters
rInputiterator of the TSF input vector
numbertotal number of the output units in a merger unit
outputmerger output data structre

Definition at line 518 of file CDCTriggerTSFFirmwareModule.cc.

520{
521 std::generate(input, input + number * width, [&, n = 0]() mutable {
522 int i = n++;
523 if (width == 1)
524 {
525 return (get<field>(output)[0][i]) ? one_val : zero_val;
526 } else
527 {
528 return (get<field>(output)[i / width][i % width]) ? one_val : zero_val;
529 }});
530 input += number * width;
531}
const char one_val
'1' in XSI VHDL simulation
Definition: Cosim.h:43
const char zero_val
'0' in XSI VHDL simulation
Definition: Cosim.h:45

◆ priority()

Priority priority ( int  index)
protected

write TSF input signals to the worker

Parameters
indexindex of CDC hit
Returns
what type of priority hit it is

Definition at line 79 of file CDCTriggerTSFFirmwareModule.cc.

80{
81 CDCHit* hit = m_cdcHits[index];
82 int offset = (hit->getISuperLayer() == 0) ? 1 : 0;
83 switch (hit->getILayer() - 2 - offset) {
84 case 0: return Priority::first;
85 case 1: return Priority::second;
86 default: return Priority::nothing;
87 }
88}

◆ read()

TSF::outputArray read ( FILE *  instream)
protected

write TSF output signals from the worker

Parameters
instreaminput file descriptor
Returns
array holding TSF output

Definition at line 97 of file CDCTriggerTSFFirmwareModule.cc.

98{
99 // read output from TSF firmware
100 array<char, 2048> buffer;
101 outputArray output;
102 buffer.fill(one_val);
103 if (fgets(buffer.data(), buffer.size(), instream) == NULL) {
104 B2ERROR("fgets reached end unexpectedly");
105 return output;
106 }
107 // ins->getline(buffer.data(), buffer.size());
108 for (auto i2d = 0; i2d < 4; ++i2d) {
109 B2DEBUG(50, display_value(buffer.data() + width_out * i2d, width_out));
110 }
111 auto bufferItr = buffer.cbegin();
112 // for (int iTracker = 0; iTracker < nTrackers; ++iTracker) {
113 for (int iTracker = nTrackers - 1; iTracker >= 0; --iTracker) {
114 copy(bufferItr, bufferItr + width_out, output[iTracker].begin());
115 bufferItr += width_out;
116 }
117 return output;
118}
static constexpr int nTrackers
number of trackers
std::array< outputVector, nTrackers > outputArray
output array
static constexpr int width_out
width of output data width

◆ registerHit()

void registerHit ( CDCTrigger::MergerOut  field,
unsigned  iTS,
TSF::registeredStructElement reg 
)
protected

Register the timing field so that later hits won't overwrite it.

Parameters
fieldone of (priority, fastest, edge) time
iTSindex of the track segment or edge
regrecord of the timing fields in merger

Definition at line 336 of file CDCTriggerTSFFirmwareModule.cc.

337{
338 reg[field].set(iTS);
339}

◆ saveFastOutput()

void saveFastOutput ( short  iclock)
protected

save fast TSIM output

Definition at line 540 of file CDCTriggerTSFFirmwareModule.cc.

541{
542 const int ccWidth = 9;
543 // number of widended clocks in TSF
544 const int widenedClocks = 16;
545 // TSF latency in unit of data clocks
546 const int latency = 3;
547 // N.B. widenedClocks and latency might be inaccurate
548
549 int iAx = 0;
550 for (const auto& sl : outputToTracker) {
551 // keep a list of found TS hit in the same SL so that outputs to different
552 // trackers won't be recorded twice
553 std::map<unsigned, int> foundTS;
554 unsigned short iTracker = 0;
555 for (auto& tracker : sl) {
556 string output = slv_to_bin_string(tracker);
557 // loop through all TS hits in the output
558 for (int i = ccWidth; i < width_out; i += tsInfoWidth) {
559 string ts = output.substr(i, tsInfoWidth);
560 tsOut decoded = decodeTSHit(ts);
561 // finish if no more TS hit is present
562 if (decoded[3] == 0) {
563 break;
564 }
565 const unsigned nCellsInSL = nAxialMergers[iAx] * nCellsInLayer;
566 // get global TS ID
567 unsigned iTS = decoded[0] + nCellsInSL * iTracker / nTrackers;
568 // periodic ID overflow when phi0 > 0 for the 4th tracker
569 if (iTS >= nCellsInSL) {
570 iTS -= nCellsInSL;
571 }
572 // ID in SL8 is shifted by 16
573 if (iAx == 4) {
574 if (iTS < 16) {
575 iTS += nCellsInSL;
576 }
577 iTS -= 16;
578 }
579 int iHit = -1;
580 int firstClock = iclock - widenedClocks - latency;
581 if (firstClock < 0) {
582 firstClock = 0;
583 }
584 int lastClock = iclock - latency;
585 B2DEBUG(10, "iAx:" << iAx << ", iTS:" << iTS << ", iTracker: " << iTracker);
586 // scan through all CDC hits to get the priority hit
587 for (int iclkPri = firstClock; iclkPri < lastClock; ++iclkPri) {
588 // get the map storing the hit index in the corresponding merger
589 auto priMap = m_priorityHit[iclkPri][2 * iAx][iTS / nSegmentsInMerger];
590 unsigned itsInMerger = iTS % nSegmentsInMerger;
591 // Pick up the first CDCHit which agrees to the priority position
592 // of firmware sim output
593 if (priMap.find(itsInMerger) != priMap.end() &&
594 toPriority(decoded[3]) == priority(priMap[itsInMerger])) {
595 iHit = priMap[itsInMerger];
596 B2DEBUG(10, "iHit:" << iHit);
597 B2DEBUG(10, "TDC: " << m_cdcHits[iHit]->getTDCCount() << ", TSF: " << decoded[1]);
598 break;
599 }
600 }
601 // check if the same TS hit to another tracker is already there
602 // TODO: some duplicates are from different clocks,
603 // so they won't be caught here
604 // This mostly likely means the wrong phase of TSF firmware output is used
605 if (foundTS.find(iTS) != foundTS.end()) {
606 if (iHit != foundTS[iTS]) {
607 B2WARNING("Same TS ID exists, but they point to different CDC hit");
608 }
609 continue;
610 }
611 foundTS.insert({iTS, iHit});
612 if (iHit < 0) {
613 B2WARNING("No corresponding priority CDC hit can be found.");
614 B2WARNING("Maybe the latency and number of widened clocks are wrong.");
615 B2WARNING("In event " << StoreObjPtr<EventMetaData>()->getEvent());
616 B2DEBUG(20, "priority " << decoded[3]);
617 for (int iclkPri = 0; iclkPri < m_nClockPerEvent; ++iclkPri) {
618 auto priMap = m_priorityHit[iclkPri][2 * iAx][iTS / 16];
619 for (auto& m : priMap) {
620 B2DEBUG(20, "iWire: " << m.first << ", iLayer: " <<
621 m_cdcHits[m.second]->getILayer() << ", iClock: " << iclkPri);
622 }
623 }
624 if (iclock < 15) {
625 B2WARNING("It could be the left over TS hits from the last event.\n" <<
626 "Try increasing m_nClockPerEvent");
627 }
628 }
629 CDCHit cdchit = (iHit < 0) ? CDCHit() : *m_cdcHits[iHit];
630 m_tsHits.appendNew(cdchit,
631 globalSegmentID(iTS, 2 * iAx),
632 decoded[3], // priority position
633 decoded[2], // L/R
634 // TODO: pri time should be the same as the CDCHit in 1st arg
635 // when the proper clock counter is given to firmware TSF
636 decoded[1],
637 // TODO: fastest time from ETF output
638 0,
639 iclock);
640 }
641 ++iTracker;
642 }
643 ++iAx;
644 }
645}
static constexpr int nCellsInLayer
Number of wire/cells in a single layer per merger unit.
CDCTrigger::Priority priority(int index)
write TSF input signals to the worker
T * appendNew()
Construct a new T object at the end of the array.
Definition: StoreArray.h:246
Type-safe access to single objects in the data store.
Definition: StoreObjPtr.h:96
std::string slv_to_bin_string(std::array< char, N > signal, bool padding=false)
Transform into string.
Definition: Cosim.h:64

◆ saveFirmwareOutput()

void saveFirmwareOutput ( )
protected

save firmware output

Definition at line 533 of file CDCTriggerTSFFirmwareModule.cc.

534{
535 m_bitsTo2D.appendNew(outputToTracker);
536}

◆ segmentID()

TSF::WireSet segmentID ( int  iHit)
protected

Get the list of associated track segments with a hit.

Parameters
iHitindex of the CDC hit in question
Returns
list of TS ID (0-15) containing the hit

Definition at line 252 of file CDCTriggerTSFFirmwareModule.cc.

253{
254 const bool innerMost = (m_cdcHits[iHit]->getISuperLayer() == 0);
255 const unsigned short iLayer = m_cdcHits[iHit]->getILayer();
256 const unsigned short iCell = mergerCellID(iHit);
257 TSMap& tsMap = m_tsMap[static_cast<int>(! innerMost)];
258 tsMap.reserve(nWiresInMerger);
259 if (tsMap.find(iCell) != tsMap.end()) {
260 return tsMap[iCell];
261 } else {
262 WireSet id;
263 // distance to the first priority layer: 0-4 (SL0) or 0-2 (outer)
264 // The further it is, the more TS it would be involved in.
265 const unsigned short distance = (innerMost) ? iLayer - 3 : abs(iLayer - 2);
266 id.resize(distance + 1);
267 std::iota(id.begin(), id.end(), (iCell - distance / 2) % nCellsInLayer);
268 id.erase(std::remove_if(id.begin(), id.end(), [](short i) {
269 return (i < 0 || i >= nCellsInLayer);
270 }), id.end());
271 tsMap.insert({iCell, id});
272 return id;
273 }
274}
std::array< TSMap, 2 > m_tsMap
map from cell ID to TS ID, for inner and outer Merger
static constexpr int nWiresInMerger
number of wire/cell in a single merger unit
unsigned short mergerCellID(int index)
Get the cell ID in the merger.

◆ setAbortLevel()

void setAbortLevel ( int  abortLevel)
inherited

Configure the abort log level.

Definition at line 67 of file Module.cc.

68{
69 m_logConfig.setAbortLevel(static_cast<LogConfig::ELogLevel>(abortLevel));
70}
ELogLevel
Definition of the supported log levels.
Definition: LogConfig.h:26
void setAbortLevel(ELogLevel abortLevel)
Configure the abort level.
Definition: LogConfig.h:112

◆ setDebugLevel()

void setDebugLevel ( int  debugLevel)
inherited

Configure the debug messaging level.

Definition at line 61 of file Module.cc.

62{
63 m_logConfig.setDebugLevel(debugLevel);
64}
void setDebugLevel(int debugLevel)
Configure the debug messaging level.
Definition: LogConfig.h:98

◆ setDescription()

void setDescription ( const std::string &  description)
protectedinherited

Sets the description of the module.

Parameters
descriptionA description of the module.

Definition at line 214 of file Module.cc.

215{
216 m_description = description;
217}

◆ setLogConfig()

void setLogConfig ( const LogConfig logConfig)
inlineinherited

Set the log system configuration.

Definition at line 230 of file Module.h.

230{m_logConfig = logConfig;}

◆ setLogInfo()

void setLogInfo ( int  logLevel,
unsigned int  logInfo 
)
inherited

Configure the printed log information for the given level.

Parameters
logLevelThe log level (one of LogConfig::ELogLevel)
logInfoWhat kind of info should be printed? ORed combination of LogConfig::ELogInfo flags.

Definition at line 73 of file Module.cc.

74{
75 m_logConfig.setLogInfo(static_cast<LogConfig::ELogLevel>(logLevel), logInfo);
76}
void setLogInfo(ELogLevel logLevel, unsigned int logInfo)
Configure the printed log information for the given level.
Definition: LogConfig.h:127

◆ setLogLevel()

void setLogLevel ( int  logLevel)
inherited

Configure the log level.

Definition at line 55 of file Module.cc.

56{
57 m_logConfig.setLogLevel(static_cast<LogConfig::ELogLevel>(logLevel));
58}
void setLogLevel(ELogLevel logLevel)
Configure the log level.
Definition: LogConfig.cc:25

◆ setName()

void setName ( const std::string &  name)
inlineinherited

Set the name of the module.

Note
The module name is set when using the REG_MODULE macro, but the module can be renamed before calling process() using the set_name() function in your steering file.
Parameters
nameThe name of the module

Definition at line 214 of file Module.h.

214{ m_name = name; };

◆ setParamList()

void setParamList ( const ModuleParamList params)
inlineprotectedinherited

Replace existing parameter list.

Definition at line 501 of file Module.h.

501{ m_moduleParamList = params; }

◆ setParamPython()

void setParamPython ( const std::string &  name,
const boost::python::object &  pyObj 
)
privateinherited

Implements a method for setting boost::python objects.

The method supports the following types: list, dict, int, double, string, bool The conversion of the python object to the C++ type and the final storage of the parameter value is done in the ModuleParam class.

Parameters
nameThe unique name of the parameter.
pyObjThe object which should be converted and stored as the parameter value.

Definition at line 234 of file Module.cc.

235{
236 LogSystem& logSystem = LogSystem::Instance();
237 logSystem.updateModule(&(getLogConfig()), getName());
238 try {
240 } catch (std::runtime_error& e) {
241 throw std::runtime_error("Cannot set parameter '" + name + "' for module '"
242 + m_name + "': " + e.what());
243 }
244
245 logSystem.updateModule(nullptr);
246}
Class for logging debug, info and error messages.
Definition: LogSystem.h:46
void updateModule(const LogConfig *moduleLogConfig=nullptr, const std::string &moduleName="")
Sets the log configuration to the given module log configuration and sets the module name This method...
Definition: LogSystem.h:191
static LogSystem & Instance()
Static method to get a reference to the LogSystem instance.
Definition: LogSystem.cc:31
void setParamPython(const std::string &name, const PythonObject &pyObj)
Implements a method for setting boost::python objects.

◆ setParamPythonDict()

void setParamPythonDict ( const boost::python::dict &  dictionary)
privateinherited

Implements a method for reading the parameter values from a boost::python dictionary.

The key of the dictionary has to be the name of the parameter and the value has to be of one of the supported parameter types.

Parameters
dictionaryThe python dictionary from which the parameter values are read.

Definition at line 249 of file Module.cc.

250{
251
252 LogSystem& logSystem = LogSystem::Instance();
253 logSystem.updateModule(&(getLogConfig()), getName());
254
255 boost::python::list dictKeys = dictionary.keys();
256 int nKey = boost::python::len(dictKeys);
257
258 //Loop over all keys in the dictionary
259 for (int iKey = 0; iKey < nKey; ++iKey) {
260 boost::python::object currKey = dictKeys[iKey];
261 boost::python::extract<std::string> keyProxy(currKey);
262
263 if (keyProxy.check()) {
264 const boost::python::object& currValue = dictionary[currKey];
265 setParamPython(keyProxy, currValue);
266 } else {
267 B2ERROR("Setting the module parameters from a python dictionary: invalid key in dictionary!");
268 }
269 }
270
271 logSystem.updateModule(nullptr);
272}
void setParamPython(const std::string &name, const boost::python::object &pyObj)
Implements a method for setting boost::python objects.
Definition: Module.cc:234

◆ setPropertyFlags()

void setPropertyFlags ( unsigned int  propertyFlags)
inherited

Sets the flags for the module properties.

Parameters
propertyFlagsbitwise OR of EModulePropFlags

Definition at line 208 of file Module.cc.

209{
210 m_propertyFlags = propertyFlags;
211}

◆ setReturnValue() [1/2]

void setReturnValue ( bool  value)
protectedinherited

Sets the return value for this module as bool.

The bool value is saved as an integer with the convention 1 meaning true and 0 meaning false. The value can be used in the steering file to divide the analysis chain into several paths.

Parameters
valueThe value of the return value.

Definition at line 227 of file Module.cc.

228{
229 m_hasReturnValue = true;
230 m_returnValue = value;
231}

◆ setReturnValue() [2/2]

void setReturnValue ( int  value)
protectedinherited

Sets the return value for this module as integer.

The value can be used in the steering file to divide the analysis chain into several paths.

Parameters
valueThe value of the return value.

Definition at line 220 of file Module.cc.

221{
222 m_hasReturnValue = true;
223 m_returnValue = value;
224}

◆ setSecondPriority()

void setSecondPriority ( unsigned  priTS,
unsigned  iHit,
timeVec  hitTime,
unsigned  lr,
mergerStructElement< 5 > &  mergerData,
registeredStructElement registeredCell,
priorityHitInMerger priorityHit 
)
protected

set 2nd priority info

Definition at line 341 of file CDCTriggerTSFFirmwareModule.cc.

348{
349 timeVec& priorityTime = (get<MergerOut::priorityTime>(mergerData))[priTS];
350 // when there is not already a (1st or 2nd priority) hit
351 if (notHit(MergerOut::priorityTime, priTS, registeredCell)) {
352 priorityTime = hitTime;
353 registerHit(MergerOut::priorityTime, priTS, registeredCell);
354 get<MergerOut::secondPriorityHit>(mergerData)[0].set(priTS, ! lr);
355 priorityHit.insert({priTS, iHit});
356 // set the 2nd pri bit to right when T_left == T_right
357 } else if (priority(priorityHit[priTS]) == Priority::second &&
358 hitTime.to_ulong() == priorityTime.to_ulong() && lr == 1) {
359 get<MergerOut::secondPriorityHit>(mergerData)[0].reset(priTS);
360 priorityHit[priTS] = iHit;
361 }
362}
bool notHit(CDCTrigger::MergerOut field, unsigned iTS, registeredStructElement &reg)
Whether a time field in a merger has been hit in the clock cycle.
std::bitset< timeWidth > timeVec
element of data structure to hold merger output
void registerHit(CDCTrigger::MergerOut field, unsigned iTS, registeredStructElement &reg)
Register the timing field so that later hits won't overwrite it.

◆ setType()

void setType ( const std::string &  type)
protectedinherited

Set the module type.

Only for use by internal modules (which don't use the normal REG_MODULE mechanism).

Definition at line 48 of file Module.cc.

49{
50 if (!m_type.empty())
51 B2FATAL("Trying to change module type from " << m_type << " is not allowed, the value is assumed to be fixed.");
52 m_type = type;
53}

◆ simulateMerger()

void simulateMerger ( unsigned  iclock)
protected

Simulate 1 clock of merger.

Parameters
iclockindex of data clock

Definition at line 364 of file CDCTriggerTSFFirmwareModule.cc.

365{
366 // clean up TSF input signals
367 for (auto& sl : inputToTSF) {
368 for (auto& merger : sl) {
369 merger.fill(zero_val);
370 }
371 }
372 // don't do simulation if there are no more CDC hits
373 if (iClock >= iAxialHitInClock.size()) {
374 return;
375 }
376 // mergerStruct<5> innerDataInClock(nAxialMergers[0]);
377 // map<unsigned, mergerStruct<3> > outerDataInClock;
378 // mergers in outer super layer has only 3 edge fields,
379 // but for the sake of coding simplicity and consistency,
380 // let's declare them as the same type of SL0,
381 // at the cost of 2 wasted slots.
382 map<unsigned, mergerStruct<5> > dataInClock;
383 map<unsigned, registeredStruct> registered;
384 for (int iAx = 0; iAx < m_nSubModules; ++iAx) {
385 dataInClock.insert({2 * iAx, mergerStruct<5> (nAxialMergers[iAx])});
386 registered.insert({2 * iAx, registeredStruct(nAxialMergers[iAx])});
387 }
388 auto clock = iAxialHitInClock[iClock];
389 // move first priority hits forward, so that we can just use the 1st hit
390 // but still preserve order in each group
391 std::stable_partition(clock.begin(), clock.end(),
392 [this](int hit) {return priority(hit) == Priority::first;});
393 for (const auto& iHit : clock) {
394 const CDCHit& hit = *m_cdcHits[iHit];
395 const unsigned short iSL = hit.getISuperLayer();
396 const short outer = (iSL == 0) ? 0 : 1;
397 const unsigned short iMerger = mergerNumber(iHit);
398 const unsigned short iCell = mergerCellID(iHit);
399 const WireSet tsList = segmentID(iHit);
400 const timeVec hitTime = timeStamp(iHit, m_iFirstHit);
401 auto& mergerData = dataInClock[iSL][iMerger];
402 auto& registeredCell = registered[iSL][iMerger];
403 // register the priority hit in the corresponding merger
404 auto& priorityHit = m_priorityHit[iClock][iSL][iMerger];
405 B2DEBUG(50, "iHit: " << iHit << ", Merger" << iSL << "-" << iMerger <<
406 ", iCell: " << iCell);
407 // update hit map
408 get<MergerOut::hitmap>(mergerData)[0].set(iCell);
409 // update fastest time
410 for (const auto& iTS : tsList) {
411 timeVec& fastestTime = (get<MergerOut::fastestTime>(mergerData))[iTS];
412 // when there is not already a hit
413 if (notHit(MergerOut::fastestTime, iTS, registeredCell) ||
414 // or when this one is faster
415 hitTime.to_ulong() < fastestTime.to_ulong()) {
416 // note: if we move this up to before partition, we won't need to
417 // compare timing, since they are already sorted. However,
418 // leaving it here makes the code a bit cleaner.
419 fastestTime = hitTime;
420 registerHit(MergerOut::fastestTime, iTS, registeredCell);
421 }
422 }
423 // get edge hit timing or local fastest time
424 if (m_edge[outer].find(iCell) != m_edge[outer].end()) {
425 for (auto& iEdgeTime : m_edge[outer][iCell]) {
426 timeVec& edgeTime = (get<MergerOut::edgeTime>(mergerData))[iEdgeTime];
427 if (notHit(MergerOut::edgeTime, iEdgeTime, registeredCell) ||
428 hitTime.to_ulong() < edgeTime.to_ulong()) {
429 edgeTime = hitTime;
430 registerHit(MergerOut::edgeTime, iEdgeTime, registeredCell);
431 }
432 }
433 }
434 switch (priority(iHit)) {
435 case Priority::first: {
436 // update priority time
437 unsigned priTS = iCell % nSegmentsInMerger;
438 // cppcheck-suppress variableScope
439 timeVec& priorityTime = (get<MergerOut::priorityTime>(mergerData))[priTS];
440 // when there is not already a (first priority) hit
441 if (notHit(MergerOut::priorityTime, priTS, registeredCell)) {
442 priorityTime = hitTime;
443 registerHit(MergerOut::priorityTime, priTS, registeredCell);
444 get<MergerOut::secondPriorityHit>(mergerData)[0].reset(priTS);
445 priorityHit.insert({priTS, iHit});
446 }
447 break;
448 }
449 case Priority::second: {
450 // update the 2 priority times and the sc bits
451 for (unsigned i = 0; i < 2; ++i) {
452 unsigned priTS = iCell % nSegmentsInMerger + i;
453 if (priTS == nSegmentsInMerger) {
454 // crossing the left edge
455 // set the 2nd priority left of the first TS in the next merger
456 priTS = 0;
457 const unsigned short iMergerPlus1 = (iMerger == nMergers[iSL] - 1) ? 0 : iMerger + 1;
458 auto& nextMergerData = dataInClock[iSL][iMergerPlus1];
459 auto& nextRegisteredCell = registered[iSL][iMergerPlus1];
460 auto& nextPriorityHit = m_priorityHit[iClock][iSL][iMergerPlus1];
461 setSecondPriority(priTS, iHit, hitTime, i, nextMergerData, nextRegisteredCell, nextPriorityHit);
462 } else {
463 setSecondPriority(priTS, iHit, hitTime, i, mergerData, registeredCell, priorityHit);
464 }
465 }
466 break;
467 }
468 default:
469 break;
470 }
471 }
472 // pack the output from merger into input to TSF
473 for (auto iAx = 0; iAx < m_nSubModules; ++iAx) {
474 unsigned nEdges = (iAx == 0) ? 5 : 3;
475 for (unsigned iMerger = 0; iMerger < inputToTSF[iAx].size(); ++iMerger) {
476 auto input = inputToTSF[iAx][iMerger].rbegin();
477 auto& output = dataInClock[2 * iAx][iMerger];
478 pack<MergerOut::hitmap, 1> (input, nWiresInMerger, output);
479 pack<MergerOut::priorityTime, timeWidth> (input, nCellsInLayer, output);
480 pack<MergerOut::fastestTime, timeWidth> (input, nCellsInLayer, output);
481 pack<MergerOut::secondPriorityHit, 1> (input, nCellsInLayer, output);
482 pack<MergerOut::edgeTime, timeWidth> (input, nEdges, output);
483 // cppcheck-suppress variableScope
484 auto& outputAcrossClocks = dataAcrossClocks[2 * iAx][iMerger];
485 if (get<MergerOut::hitmap>(output)[0].any()) {
486 string priTime, fasTime, edgTime;
487 for (int i = 0; i < nSegmentsInMerger; ++i) {
488 priTime += get<MergerOut::priorityTime>(output)[i].to_string() + ",";
489 fasTime += get<MergerOut::fastestTime>(output)[i].to_string() + ",";
490 edgTime += get<MergerOut::edgeTime>(output)[i].to_string() + ",";
491 get<MergerOut::priorityTime>(outputAcrossClocks)[i] |=
492 get<MergerOut::priorityTime>(output)[i];
493 get<MergerOut::fastestTime>(outputAcrossClocks)[i] |=
494 get<MergerOut::fastestTime>(output)[i];
495 }
496 B2DEBUG(150, "merger " << iAx * 2 << "-" << iMerger <<
497 "\nhitmap: " << get<MergerOut::hitmap>(output)[0] <<
498 "\nsecond hit: " << get<MergerOut::secondPriorityHit>(output)[0] <<
499 "\nprioiry Time: " << priTime <<
500 "\nfastest Time: " << fasTime <<
501 "\nedge Time: " << edgTime);
502 get<MergerOut::hitmap>(outputAcrossClocks)[0] |= get<MergerOut::hitmap>(output)[0];
503 }
504 // simulate clock counter
505 if (m_simulateCC) {
506 bitset<9> cc(iClock);
507 const int nBitsReserved = (iAx == 0) ? 3 : 4;
508 generate(inputToTSF[iAx][iMerger].rend() - 9 - nBitsReserved,
509 inputToTSF[iAx][iMerger].rend() - nBitsReserved,
510 [&cc, i = 0]() mutable {
511 return (cc[i++]) ? one_val : zero_val;});
512 }
513 }
514 }
515}
static constexpr std::array< int, 9 > nMergers
number of mergers in each super layer
std::bitset< 4 > timeStamp(int index, int iFirstHit)
Get the trigger time stamp of a hit.
std::vector< registeredStructElement > registeredStruct
vector of registeredStructElement
WireSet segmentID(int iHit)
Get the list of associated track segments with a hit.
void setSecondPriority(unsigned priTS, unsigned iHit, timeVec hitTime, unsigned lr, mergerStructElement< 5 > &mergerData, registeredStructElement &registeredCell, priorityHitInMerger &priorityHit)
set 2nd priority info
unsigned short mergerNumber(int index)
Get the merger unit ID in a super layer.

◆ terminate()

void terminate ( void  )
overridevirtual

close the pipes and wait for children to die.

Reimplemented from Module.

Definition at line 179 of file CDCTriggerTSFFirmwareModule.cc.

180{
181 B2DEBUG(10, "Waiting for TSF firmware termination...");
182 for (unsigned i = 0; i < m_nSubModules; ++i) {
183 close(inputFileDescriptor[i][1]);
184 close(outputFileDescriptor[i][0]);
185 }
186 // wait for all processes to exit
187 for (unsigned i = 0; i < m_nSubModules; ++i) {
188 wait(nullptr);
189 }
190}

◆ timeStamp()

std::bitset< 4 > timeStamp ( int  index,
int  iFirstHit 
)
protected

Get the trigger time stamp of a hit.

Parameters
indexindex of the CDC hit in question
iFirstHitindex of the first hit
Returns
trigger time stamp (least significant 4 bits)

Definition at line 230 of file CDCTriggerTSFFirmwareModule.cc.

231{
232 return std::bitset<4> (trgTime(index, iFirstHit) % clockPeriod);
233}

◆ trgTime()

unsigned short trgTime ( int  index,
int  iFirstHit 
)
protected

Get the trigger time of the CDC hit.

Parameters
indexindex of the CDC hit in question
iFirstHitindex of the first hit
Returns
the trigger time of the hit (in unit of about 2ns)

Definition at line 220 of file CDCTriggerTSFFirmwareModule.cc.

221{
222 if (m_allPositiveTime) {
223 return (m_cdcHits[iFirstHit]->getTDCCount() / 2 - m_cdcHits[index]->getTDCCount() / 2);
224 } else {
225 short time = (m_TDCCountForT0 / 2 - m_cdcHits[index]->getTDCCount() / 2);
226 return (time < 0) ? time + (1 << 9) : time;
227 }
228}
bool m_allPositiveTime
switch If true, the trigger time of the hit with largest TDC count becomes 0.

◆ write()

void write ( const char *  message,
FILE *  outstream 
)
protected

write TSF input signals to the worker

Parameters
messagewords to write
outstreamoutput file descriptor

Definition at line 90 of file CDCTriggerTSFFirmwareModule.cc.

91{
92 // write input to TSF firmware
93 fprintf(outstream, "%s\n", message);
94 fflush(outstream);
95}

Member Data Documentation

◆ clockPeriod

constexpr int clockPeriod = 16
staticconstexpr

data clock period (32ns) in unit of 2ns

Definition at line 111 of file CDCTriggerTSFFirmwareModule.h.

◆ cwd

std::string cwd = getcurrentdir()
protected

current diretory

Definition at line 169 of file CDCTriggerTSFFirmwareModule.h.

◆ dataAcrossClocks

std::map<unsigned, mergerStruct<5> > dataAcrossClocks
protected

data structure to hold merger output

Definition at line 268 of file CDCTriggerTSFFirmwareModule.h.

◆ design_libname_post

std::string design_libname_post = "/xsimk" + lib_extension
protected

path to the simulation snapshot

Definition at line 173 of file CDCTriggerTSFFirmwareModule.h.

◆ design_libname_pre

std::string design_libname_pre = cwd + "/xsim.dir/tsf"
protected

path to the simulation snapshot

Definition at line 171 of file CDCTriggerTSFFirmwareModule.h.

◆ iAxialHitInClock

std::vector<std::vector<int> > iAxialHitInClock
protected

CDC hit ID in each clock.

Definition at line 287 of file CDCTriggerTSFFirmwareModule.h.

◆ innerInvEdge

std::array<cellList, 5> innerInvEdge
protected
Initial value:
= {cellList {31},
cellList {64},
cellList {32, 48, 64, 65},
cellList {31, 47, 62, 63, 78},
cellList {63, 79}
}
std::vector< unsigned short > cellList
cell list

list of cell ID related to edge timing

Definition at line 301 of file CDCTriggerTSFFirmwareModule.h.

◆ inputFileDescriptor

std::array<std::array<int, 2>, m_nSubModules> inputFileDescriptor
protected

array holding file descriptors of pipes

Definition at line 220 of file CDCTriggerTSFFirmwareModule.h.

◆ inputToTSF

inputToTSFArray inputToTSF
protected

XSI compliant format of input to TSF.

Definition at line 205 of file CDCTriggerTSFFirmwareModule.h.

◆ ins

std::istream* ins = nullptr
protected

data stream

Definition at line 243 of file CDCTriggerTSFFirmwareModule.h.

◆ lib_extension

std::string lib_extension = ".so"
protected

extension of lib

Definition at line 167 of file CDCTriggerTSFFirmwareModule.h.

◆ m_allPositiveTime

bool m_allPositiveTime = true
protected

switch If true, the trigger time of the hit with largest TDC count becomes 0.

Otherwise, m_TDCCountForT0 becomes 0 (as in the fast TSIM).

Definition at line 164 of file CDCTriggerTSFFirmwareModule.h.

◆ m_bitsTo2D

StoreArray<signalBitStream> m_bitsTo2D
protected

bitstream of TSF output to 2D tracker

Definition at line 140 of file CDCTriggerTSFFirmwareModule.h.

◆ m_cdcHits

Belle2::StoreArray<CDCHit> m_cdcHits
protected

CDCHit array.

Definition at line 127 of file CDCTriggerTSFFirmwareModule.h.

◆ m_conditions

std::vector<ModuleCondition> m_conditions
privateinherited

Module condition, only non-null if set.

Definition at line 521 of file Module.h.

◆ m_debugLevel

int m_debugLevel = 0
protected

debug level specified in the steering file

Definition at line 155 of file CDCTriggerTSFFirmwareModule.h.

◆ m_description

std::string m_description
privateinherited

The description of the module.

Definition at line 511 of file Module.h.

◆ m_edge

std::array<edgeList, 2> m_edge
protected

map from cell ID to related edge ID

Definition at line 316 of file CDCTriggerTSFFirmwareModule.h.

◆ m_hasReturnValue

bool m_hasReturnValue
privateinherited

True, if the return value is set.

Definition at line 518 of file Module.h.

◆ m_hitCollectionName

std::string m_hitCollectionName
protected

Name of the StoreArray containing the input CDC hits.

Definition at line 115 of file CDCTriggerTSFFirmwareModule.h.

◆ m_iFirstHit

int m_iFirstHit = std::numeric_limits<int>::quiet_NaN()
protected

ID of the earlist CDC hit in an event.

Definition at line 319 of file CDCTriggerTSFFirmwareModule.h.

◆ m_logConfig

LogConfig m_logConfig
privateinherited

The log system configuration of the module.

Definition at line 514 of file Module.h.

◆ m_mergerOnly

bool m_mergerOnly
protected

flag to only simulation merger and not TSF

Definition at line 146 of file CDCTriggerTSFFirmwareModule.h.

◆ m_moduleParamList

ModuleParamList m_moduleParamList
privateinherited

List storing and managing all parameter of the module.

Definition at line 516 of file Module.h.

◆ m_name

std::string m_name
privateinherited

The name of the module, saved as a string (user-modifiable)

Definition at line 508 of file Module.h.

◆ m_nClockPerEvent

constexpr int m_nClockPerEvent = 44
staticconstexpr

how many clocks to simulate per event

Definition at line 108 of file CDCTriggerTSFFirmwareModule.h.

◆ m_nSubModules

constexpr int m_nSubModules = 5
staticconstexpr

number of TSF to simulate

Definition at line 78 of file CDCTriggerTSFFirmwareModule.h.

◆ m_outputBitstreamNameTo2D

std::string m_outputBitstreamNameTo2D
protected

Name of the StoreArray holding the raw bit content to 2D trackers.

Definition at line 121 of file CDCTriggerTSFFirmwareModule.h.

◆ m_outputBitstreamNameToETF

std::string m_outputBitstreamNameToETF
protected

Name of the StoreArray holding the raw bit content to ETF.

Definition at line 124 of file CDCTriggerTSFFirmwareModule.h.

◆ m_outputCollectionName

std::string m_outputCollectionName
protected

Name of the StoreArray holding the found TS hits.

Definition at line 118 of file CDCTriggerTSFFirmwareModule.h.

◆ m_package

std::string m_package
privateinherited

Package this module is found in (may be empty).

Definition at line 510 of file Module.h.

◆ m_pid

std::array<pid_t, m_nSubModules> m_pid
protected

'1' in XSI VHDL simulation

'0' in XSI VHDL simulation array holding child process ID

Definition at line 187 of file CDCTriggerTSFFirmwareModule.h.

◆ m_priorityHit

priorityHitStruct m_priorityHit
protected

list keeping the index of priority hit of a TS for making fastsim ts hit object

Definition at line 285 of file CDCTriggerTSFFirmwareModule.h.

◆ m_propertyFlags

unsigned int m_propertyFlags
privateinherited

The properties of the module as bitwise or (with |) of EModulePropFlags.

Definition at line 512 of file Module.h.

◆ m_returnValue

int m_returnValue
privateinherited

The return value.

Definition at line 519 of file Module.h.

◆ m_simulateCC

bool m_simulateCC
protected

flag to simulate front-end clock counter

Definition at line 149 of file CDCTriggerTSFFirmwareModule.h.

◆ m_stubLUT

std::vector<bool> m_stubLUT
protected

list of flags to run a TSF firmware simulation with dummy L/R LUT (to speed up loading)

Definition at line 152 of file CDCTriggerTSFFirmwareModule.h.

◆ m_TDCCountForT0

int m_TDCCountForT0 = 4988
protected

TDC count value from T0.

Definition at line 158 of file CDCTriggerTSFFirmwareModule.h.

◆ m_tsHits

StoreArray<CDCTriggerSegmentHit> m_tsHits
protected

unpacked track segment hit

Definition at line 143 of file CDCTriggerTSFFirmwareModule.h.

◆ m_tsMap

std::array<TSMap, 2> m_tsMap
protected

map from cell ID to TS ID, for inner and outer Merger

Definition at line 294 of file CDCTriggerTSFFirmwareModule.h.

◆ m_type

std::string m_type
privateinherited

The type of the module, saved as a string.

Definition at line 509 of file Module.h.

◆ mergerWidth

constexpr int mergerWidth = 256
staticconstexpr

merger output data width

Definition at line 90 of file CDCTriggerTSFFirmwareModule.h.

◆ nAxialMergers

constexpr std::array< int, TSF::m_nSubModules > nAxialMergers = {10, 12, 16, 20, 24}
staticconstexpr

number of mergers in axial super layers

Definition at line 84 of file CDCTriggerTSFFirmwareModule.h.

◆ nCellsInLayer

constexpr int nCellsInLayer = 16
staticconstexpr

Number of wire/cells in a single layer per merger unit.

Definition at line 99 of file CDCTriggerTSFFirmwareModule.h.

◆ nMergers

constexpr std::array< int, 9 > nMergers = {10, 10, 12, 14, 16, 18, 20, 22, 24}
staticconstexpr

number of mergers in each super layer

Definition at line 81 of file CDCTriggerTSFFirmwareModule.h.

◆ nSegmentsInMerger

constexpr int nSegmentsInMerger = 16
staticconstexpr

number of track segments in a single merger unit

Definition at line 102 of file CDCTriggerTSFFirmwareModule.h.

◆ nTrackers

constexpr int nTrackers = 4
staticconstexpr

number of trackers

Definition at line 87 of file CDCTriggerTSFFirmwareModule.h.

◆ nWiresInMerger

constexpr int nWiresInMerger = 80
staticconstexpr

number of wire/cell in a single merger unit

Definition at line 96 of file CDCTriggerTSFFirmwareModule.h.

◆ outerInvEdge

std::array<cellList, 3> outerInvEdge
protected
Initial value:
= {cellList {63},
cellList {0, 64},
cellList {15, 31, 63, 79}
}

list of cell ID related to edge timing

Definition at line 309 of file CDCTriggerTSFFirmwareModule.h.

◆ outputFileDescriptor

std::array<std::array<int, 2>, m_nSubModules> outputFileDescriptor
protected

array holding file descriptors of pipes

Definition at line 222 of file CDCTriggerTSFFirmwareModule.h.

◆ outputFromMerger

mergerOutArray outputFromMerger
protected

bits format of merger output / TSF input

Definition at line 196 of file CDCTriggerTSFFirmwareModule.h.

◆ outputToTracker

std::array<outputArray, m_nSubModules> outputToTracker
protected

array holding TSF output data

Definition at line 208 of file CDCTriggerTSFFirmwareModule.h.

◆ simengine_libname

std::string simengine_libname = "librdi_simulator_kernel" + lib_extension
protected

path to the simulation engine

Definition at line 175 of file CDCTriggerTSFFirmwareModule.h.

◆ stream

std::array<streamPair, m_nSubModules> stream
protected

array holding file handlers of pipes

Definition at line 217 of file CDCTriggerTSFFirmwareModule.h.

◆ timeWidth

constexpr size_t timeWidth = 4
staticconstexpr

bit width for priority time and fast time

Definition at line 105 of file CDCTriggerTSFFirmwareModule.h.

◆ wdbName_post

std::string wdbName_post = ".wdb"
protected

wdb name extension

Definition at line 179 of file CDCTriggerTSFFirmwareModule.h.

◆ wdbName_pre

std::string wdbName_pre = "tsf"
protected

wdb name prefix

Definition at line 177 of file CDCTriggerTSFFirmwareModule.h.

◆ width_out

constexpr int width_out = 429
staticconstexpr

width of output data width

Definition at line 93 of file CDCTriggerTSFFirmwareModule.h.


The documentation for this class was generated from the following files: