Belle II Software  release-05-02-19
CDCTriggerUnpackerModule.h
1 /**************************************************************************
2  * BASF2 (Belle Analysis Framework 2) *
3  * Copyright(C) 2017 - Belle II Collaboration *
4  * *
5  * Author: The Belle II Collaboration *
6  * Contributors: Tzu-An Sheng *
7  * *
8  * This software is provided "as is" without any warranty. *
9  **************************************************************************/
10 
11 #ifndef CDCTRIGGERUNPACKERMODULE_H
12 #define CDCTRIGGERUNPACKERMODULE_H
13 
14 #include <framework/core/Module.h>
15 #include <rawdata/dataobjects/RawTRG.h>
16 #include <framework/datastore/StoreArray.h>
17 #include <framework/database/DBObjPtr.h>
18 
19 #include <trg/cdc/dataobjects/Bitstream.h>
20 #include <trg/cdc/Unpacker.h>
21 #include <trg/cdc/dataobjects/CDCTriggerTrack.h>
22 #include <trg/cdc/dataobjects/CDCTriggerSegmentHit.h>
23 #include <trg/cdc/dataobjects/CDCTriggerFinderClone.h>
24 #include <trg/cdc/dataobjects/CDCTriggerMLPInput.h>
25 #include <trg/cdc/dbobjects/CDCTrigger2DConfig.h>
26 #include <trg/cdc/dataobjects/CDCTriggerMLP.h>
27 #include <trg/cdc/dbobjects/CDCTriggerNeuroConfig.h>
28 
29 #include <array>
30 #include <bitset>
31 #include <vector>
32 #include <string>
33 #include <iomanip>
34 
35 namespace Belle2 {
41  using NodeList = std::vector<std::vector<int> >;
43 
45  static constexpr int mergerWidth = 256;
47  static constexpr int nAllMergers = 146;
49  static constexpr int wordWidth = 32;
51  static constexpr int nFinesse = 4;
53  using MergerBus = std::array<std::bitset<mergerWidth>, nAllMergers>;
56 
58  struct SubTrigger {
60  SubTrigger(std::string inName,
61  unsigned inEventWidth, unsigned inOffset,
62  int inHeaderSize, std::vector<int> inNodeID,
63  int& inDelay, int& inCnttrg, int inDebugLevel = 0) :
64  name(inName), eventWidth(inEventWidth), offset(inOffset),
65  headerSize(inHeaderSize), iNode(inNodeID.front()),
66  iFinesse(inNodeID.back()), delay(inDelay),
67  cnttrg(inCnttrg),
68  debugLevel(inDebugLevel) {};
69 
71  std::string name;
73  unsigned eventWidth;
75  unsigned offset;
77  int headerSize;
79  int iNode;
81  int iFinesse;
82 
83  /* information from Belle2Link header */
85  std::string firmwareType;
87  std::string firmwareVersion;
89  int& delay;
91  int& cnttrg;
92 
94  int debugLevel;
95 
104  virtual void reserve(int, std::array<int, nFinesse>) {};
105 
115  virtual void unpack(int,
116  std::array<int*, nFinesse>,
117  std::array<int, nFinesse>) {};
118 
130  virtual int getHeaders(int subDetectorId,
131  std::array<int*, 4> data32tab,
132  std::array<int, 4> nWords)
133  {
134  if (subDetectorId != iNode) {
135  return 0;
136  }
137  // int nWordsize = 3075; // temporary solution to hard coded the correct event size (for 2D only?)
138  // empty data buffer
139  if (nWords[iFinesse] < headerSize) {
140  B2WARNING("The module " << name << " does not have enough data (" <<
141  nWords[iFinesse] << "). Nothing will be unpacked.");
142  return 0;
143  } else if (nWords[iFinesse] == headerSize) {
144  B2DEBUG(20, "The module " << name <<
145  " contains only the header. Nothing will be unpacked.");
146  return 0;
147  }
148 
149  // need one more check, give a warning if the event has wrong data size
150 
151  // event data block header:
152  // 0xdddd --> correct event data (for 2D only?)
153  // 0xbbbb --> dummy buffer supposed to be used for only suppressed events.
154  if (nWords[iFinesse] > headerSize) {
155  //dataHeader = CDCTriggerUnpacker::rawIntToAscii(data32tab.at(iFinesse)[headerSize]&0xFFFF0000 >> 16);
156  //bool dataHeader = ( (data32tab.at(iFinesse)[headerSize]&0xffff0000) == 0xdddd0000);
157  long dataHeader = (data32tab.at(iFinesse)[headerSize] & 0xffff0000);
158  if (dataHeader != 0xdddd0000) {
159  B2DEBUG(30, "The module " << name << " has an event data header " << std::hex << std::setfill('0') << std::setw(4) <<
160  (dataHeader >> 16) <<
161  " in this event. It will be ignore.");
162  return 0;
163  }
164  B2DEBUG(50, "subdet and head size " << std::setfill('0') << std::hex << std::setw(8) << iNode << ", " << std::dec << std::setw(
165  0) << nWords[iFinesse] <<
166  " : " << std::hex << std::setw(8) << data32tab.at(iFinesse)[0] << " " << data32tab.at(iFinesse)[1] << " " << data32tab.at(
167  iFinesse)[2] <<
168  " " << data32tab.at(iFinesse)[3] << " dataheader = " << dataHeader);
169  }
170 
171  /* get event header information
172  * Ideally, these parameters should not change in the same run,
173  * so it is more efficiency to do it in beginRun().
174  * However, since they are present in all events,
175  * let's check if they really remain unchanged.
176  */
177  if (headerSize >= 2) {
178  // supposedly these two Words will stay for all the versions
179  firmwareType = CDCTriggerUnpacker::rawIntToAscii(data32tab.at(iFinesse)[0]);
180  firmwareVersion = CDCTriggerUnpacker::rawIntToString(data32tab.at(iFinesse)[1]);
181  //int cnttrg = 0; // temporary solution, this should be one as a reference for comparison
182  int l1_revoclk = -1;
183 
184  if (headerSize >= 3) {
185  std::bitset<wordWidth> thirdWord(data32tab.at(iFinesse)[2]);
186  l1_revoclk = CDCTriggerUnpacker::subset<32, 0, 11>(thirdWord).to_ulong();
187 
188  if (firmwareType == "2D ") { // temporary solcuion, the following version number check is valid only for 2D
189 
190  if (firmwareVersion > "19041700") { // started since 19041705
191  // the third word is cnttrg and L1_revoclk
192  int newCnttrg = CDCTriggerUnpacker::subset<32, 12, 31>(thirdWord).to_ulong();
193  cnttrg = newCnttrg;
194  } else if (firmwareVersion > "17121900") { // upto that version, headerSize == 2?
195  // the third word is b2l delay and L1_revoclk
196  int newDelay = CDCTriggerUnpacker::subset<32, 12, 20>
197  (thirdWord).to_ulong(); // or should be <32,12,19>? bit 31-20 are for prescale?
198  if (delay > 0 && delay != newDelay) {
199  B2WARNING(" the Belle2Link delay for " << name <<
200  "has changed from " << delay << " to " << newDelay << "!");
201  }
202  delay = newDelay;
203  }
204  }
205  }
206 
207  B2DEBUG(20, name << ": " << firmwareType << ", version " <<
208  firmwareVersion << ", node " << std::hex << iNode <<
209  ", finesse " << iFinesse << ", delay: " << delay <<
210  ", cnttrg: " << cnttrg << std::dec << " == " << cnttrg << ", L1_revoclk " << l1_revoclk);
211 
212 
213  }
214  return 1;
215  };
217  virtual ~SubTrigger() {};
218  };
219 
230  class CDCTriggerUnpackerModule : public Module {
231 
232  public:
233 
238 
240  virtual void initialize() override;
241 
243  virtual void terminate() override;
244 
246  virtual void beginRun();
247 
249  virtual void event() override;
250 
252  std::vector<float> unscaleNNOutput(std::vector<float> input) const;
255  static constexpr std::array<int, 9> nMergers = {10, 10, 12, 14, 16, 18, 20, 22, 24};
256 
257  private:
259  int m_headerSize;
260 
264  bool m_unpackMerger;
268  bool m_decodeTSHit;
270  bool m_unpackTracker2D;
274  int m_n2DTS;
280  std::vector<int> m_delayNNOutput;
281  std::vector<int> m_delayNNSelect;
285 
288 
291 
294 
297 
298 
301 
304 
307 
310 
313 
316 
318  int m_debugLevel = 0;
319 
321  int m_mergerDelay = 0;
322 
324  //int m_2DFinderDelay = 0;
325  // since version 19041705, the B2L delay is removed, it should a fixed number for a long period and recorded in database.
326  int m_2DFinderDelay = 45; // 0x2d: changed from 0x28 since some time in 201902-03
327 
329  int m_NeuroDelay = 0;
330 
332  // int m_Cnttrg = 0; // not used, commented out at 2019/07/31 by ytlai
334  int m_mergerCnttrg = 0;
336  int m_2DFinderCnttrg = 0;
338  int m_NeuroCnttrg = 0;
339 
341  unsigned m_exp = 0;
343  unsigned m_run = 0;
344 
346  std::vector<SubTrigger*> m_subTrigger;
347 
348  //condition database for number of TS in 2D
353  std::vector<float> m_NNOutputScale;
357  bool m_useDB;
359  bool m_sim13dt;
360  };
361 
362 
364 }
365 
366 #endif /* CDCTRIGGERUNPACKERMODULE_H */
Belle2::CDCTriggerUnpackerModule::m_2DFinderClones
StoreArray< CDCTriggerFinderClone > m_2DFinderClones
additional information of the 2D finder track
Definition: CDCTriggerUnpackerModule.h:304
Belle2::CDCTriggerUnpackerModule::beginRun
virtual void beginRun()
begin Run
Definition: CDCTriggerUnpackerModule.cc:627
Belle2::nFinesse
static constexpr int nFinesse
Number of FINESSE in the copper.
Definition: CDCTriggerUnpackerModule.h:59
Belle2::SubTrigger
enum class SubTriggerType : unsigned char {Merger, TSF, T2D, T3D, Neuro, ETF};
Definition: CDCTriggerUnpackerModule.h:66
Belle2::wordWidth
static constexpr int wordWidth
width of a single word in the raw int buffer
Definition: CDCTriggerUnpackerModule.h:57
Belle2::CDCTriggerUnpackerModule::m_sim13dt
bool m_sim13dt
bool value wether to simulate 13 bit drift time by using 2dcc
Definition: CDCTriggerUnpackerModule.h:367
Belle2::MergerBus
std::array< std::bitset< mergerWidth >, nAllMergers > MergerBus
Merger data bus.
Definition: CDCTriggerUnpackerModule.h:61
Belle2::SubTrigger::delay
int & delay
Reference to the variable of its Belle2Link delay.
Definition: CDCTriggerUnpackerModule.h:97
Belle2::CDCTriggerUnpackerModule::m_bits2DTo3D
StoreArray< CDCTriggerUnpacker::T2DOutputBitStream > m_bits2DTo3D
bitstream of 2D output to 3D/Neuro
Definition: CDCTriggerUnpackerModule.h:298
Belle2::CDCTriggerUnpackerModule::m_headerSize
int m_headerSize
number of words (number of bits / 32) of the B2L header
Definition: CDCTriggerUnpackerModule.h:267
Belle2::CDCTriggerUnpackerModule::m_NeuroTracks
StoreArray< CDCTriggerTrack > m_NeuroTracks
decoded Neuro tracks
Definition: CDCTriggerUnpackerModule.h:311
Belle2::CDCTriggerUnpackerModule::m_NeuroDelay
int m_NeuroDelay
Belle2Link delay of the neurotrigger.
Definition: CDCTriggerUnpackerModule.h:337
Belle2::SubTrigger::debugLevel
int debugLevel
debug level in the steering file
Definition: CDCTriggerUnpackerModule.h:102
Belle2::CDCTriggerUnpackerModule::m_subTrigger
std::vector< SubTrigger * > m_subTrigger
vector holding the pointers to all the dynamically allocated SubTriggers
Definition: CDCTriggerUnpackerModule.h:354
Belle2::Bitstream< MergerBus >
Belle2::CDCTriggerUnpackerModule::m_unpackTracker2D
bool m_unpackTracker2D
flag to unpack 2D tracker data
Definition: CDCTriggerUnpackerModule.h:278
Belle2::CDCTriggerUnpackerModule::m_debugLevel
int m_debugLevel
debug level specified in the steering file
Definition: CDCTriggerUnpackerModule.h:326
Belle2::CDCTriggerUnpackerModule::m_NNInputTSHitsAll
StoreArray< CDCTriggerSegmentHit > m_NNInputTSHitsAll
all decoded stereo track segment hits from the neural network input
Definition: CDCTriggerUnpackerModule.h:323
Belle2::SubTrigger::~SubTrigger
virtual ~SubTrigger()
destructor
Definition: CDCTriggerUnpackerModule.h:225
Belle2::CDCTriggerUnpackerModule::m_unpackMerger
bool m_unpackMerger
flag to unpack merger data (recorded by Merger Reader / TSF)
Definition: CDCTriggerUnpackerModule.h:272
Belle2::CDCTriggerUnpackerModule::m_2DFinderCnttrg
int m_2DFinderCnttrg
2D cnttrg
Definition: CDCTriggerUnpackerModule.h:344
Belle2::SubTrigger::reserve
virtual void reserve(int, std::array< int, nFinesse >)
Calculate the number of clocks in the data, reserve that much of clocks in the Bitstream(s)
Definition: CDCTriggerUnpackerModule.h:112
Belle2::CDCTriggerUnpackerModule::m_run
unsigned m_run
run number
Definition: CDCTriggerUnpackerModule.h:351
Belle2::SubTrigger::firmwareType
std::string firmwareType
type of the FPGA firmware
Definition: CDCTriggerUnpackerModule.h:93
Belle2::CDCTriggerUnpackerModule::m_mergerDelay
int m_mergerDelay
Belle2Link delay of the merger reader.
Definition: CDCTriggerUnpackerModule.h:329
Belle2::CDCTriggerUnpackerModule::m_mlp_scale
CDCTriggerMLP m_mlp_scale
fake object to assign the user set scaling values to
Definition: CDCTriggerUnpackerModule.h:363
Belle2::SubTrigger::unpack
virtual void unpack(int, std::array< int *, nFinesse >, std::array< int, nFinesse >)
Unpack the Belle2Link data and fill the Bitstream.
Definition: CDCTriggerUnpackerModule.h:123
Belle2::CDCTriggerUnpackerModule::CDCTriggerUnpackerModule
CDCTriggerUnpackerModule()
Constructor: Sets the description, the properties and the parameters of the module.
Definition: CDCTriggerUnpackerModule.cc:475
Belle2::nAllMergers
static constexpr int nAllMergers
Number of Mergers.
Definition: CDCTriggerUnpackerModule.h:55
Belle2::CDCTriggerUnpackerModule::m_mergerCnttrg
int m_mergerCnttrg
cnttrg
Definition: CDCTriggerUnpackerModule.h:342
Belle2::SubTrigger::iFinesse
int iFinesse
FINESSE (HSLB) id) of the board.
Definition: CDCTriggerUnpackerModule.h:89
Belle2::DBObjPtr
Class for accessing objects in the database.
Definition: DBObjPtr.h:31
Belle2::CDCTriggerUnpackerModule::m_delayNNSelect
std::vector< int > m_delayNNSelect
delay of the NN selected TS clock cycle after the NN enable bit (by quadrant)
Definition: CDCTriggerUnpackerModule.h:289
Belle2::CDCTriggerUnpackerModule::nMergers
static constexpr std::array< int, 9 > nMergers
data width of a single merger unit
Definition: CDCTriggerUnpackerModule.h:263
Belle2::SubTrigger::getHeaders
virtual int getHeaders(int subDetectorId, std::array< int *, 4 > data32tab, std::array< int, 4 > nWords)
Get the Belle2Link header information.
Definition: CDCTriggerUnpackerModule.h:138
Belle2::SubTrigger::SubTrigger
SubTrigger(std::string inName, unsigned inEventWidth, unsigned inOffset, int inHeaderSize, std::vector< int > inNodeID, int &inDelay, int &inCnttrg, int inDebugLevel=0)
constructor
Definition: CDCTriggerUnpackerModule.h:68
Belle2::SubTrigger::offset
unsigned offset
The starting point of the data in an event.
Definition: CDCTriggerUnpackerModule.h:83
Belle2::CDCTriggerUnpackerModule::m_useDB
bool m_useDB
bool value for wether to use the conditions database
Definition: CDCTriggerUnpackerModule.h:365
Belle2::CDCTriggerUnpackerModule::terminate
virtual void terminate() override
Delete dynamically allocated variables.
Definition: CDCTriggerUnpackerModule.cc:620
Belle2::CDCTriggerUnpackerModule::initialize
virtual void initialize() override
Register input and output data.
Definition: CDCTriggerUnpackerModule.cc:534
Belle2::CDCTriggerUnpackerModule::m_alignFoundTime
bool m_alignFoundTime
flag to align found time in different sub-modules
Definition: CDCTriggerUnpackerModule.h:281
Belle2::mergerWidth
static constexpr int mergerWidth
Merger data width.
Definition: CDCTriggerUnpackerModule.h:53
Belle2::CDCTriggerUnpackerModule::m_tracker2DNodeID
NodeList m_tracker2DNodeID
list of (COPPER ID, HSLB ID) of 2D tracker
Definition: CDCTriggerUnpackerModule.h:277
Belle2::CDCTriggerUnpackerModule::m_unpackNeuro
bool m_unpackNeuro
flag to unpack neurotrigger data
Definition: CDCTriggerUnpackerModule.h:285
Belle2::CDCTriggerUnpackerModule::m_decodeTSHit
bool m_decodeTSHit
flag to decode track segment
Definition: CDCTriggerUnpackerModule.h:276
Belle2::SubTrigger::name
std::string name
Name of the UT3.
Definition: CDCTriggerUnpackerModule.h:76
Belle2::CDCTriggerUnpackerModule::m_2DFinderDelay
int m_2DFinderDelay
Belle2Link delay of the 2D finder.
Definition: CDCTriggerUnpackerModule.h:334
Belle2
Abstract base class for different kinds of events.
Definition: MillepedeAlgorithm.h:19
Belle2::SubTrigger::cnttrg
int & cnttrg
counter of trgger signal, total 32 bits, the 20 LSBs recorded in the event header
Definition: CDCTriggerUnpackerModule.h:99
Belle2::SubTrigger::iNode
int iNode
COPPER id of the board.
Definition: CDCTriggerUnpackerModule.h:87
Belle2::CDCTriggerUnpackerModule::m_bitsNN
StoreArray< CDCTriggerUnpacker::NNBitStream > m_bitsNN
bitstream of Neuro input and output (including intermediate results)
Definition: CDCTriggerUnpackerModule.h:308
Belle2::CDCTriggerUnpackerModule::m_neuroNodeID
NodeList m_neuroNodeID
list of (COPPER ID, HSLB ID) of neurotrigger
Definition: CDCTriggerUnpackerModule.h:284
Belle2::CDCTriggerUnpackerModule::m_2DFinderTracks
StoreArray< CDCTriggerTrack > m_2DFinderTracks
decoded 2D finder track
Definition: CDCTriggerUnpackerModule.h:301
Belle2::CDCTriggerUnpackerModule::m_mergerBits
StoreArray< MergerBits > m_mergerBits
merger output bitstream
Definition: CDCTriggerUnpackerModule.h:274
Belle2::CDCTriggerUnpackerModule::m_NNOutputScale
std::vector< float > m_NNOutputScale
output scale for the neural network output
Definition: CDCTriggerUnpackerModule.h:361
Belle2::CDCTriggerUnpackerModule::unscaleNNOutput
std::vector< float > unscaleNNOutput(std::vector< float > input) const
small function to rescale the NN output from -1, 1 to output scale
Belle2::SubTrigger::eventWidth
unsigned eventWidth
Size of an event in the Belle2Link data in 32-bit words.
Definition: CDCTriggerUnpackerModule.h:81
Belle2::CDCTriggerUnpackerModule::m_decodeNeuro
bool m_decodeNeuro
flag to decode neurotrigger data
Definition: CDCTriggerUnpackerModule.h:286
Belle2::CDCTriggerUnpackerModule::m_TSHits
StoreArray< CDCTriggerSegmentHit > m_TSHits
decoded track segment hit
Definition: CDCTriggerUnpackerModule.h:295
Belle2::SubTrigger::headerSize
int headerSize
Size of the B2L header in words.
Definition: CDCTriggerUnpackerModule.h:85
Belle2::NodeList
std::vector< std::vector< int > > NodeList
Node list.
Definition: CDCTriggerUnpackerModule.h:50
Belle2::CDCTriggerUnpackerModule::m_exp
unsigned m_exp
exp number
Definition: CDCTriggerUnpackerModule.h:349
Belle2::CDCTriggerUnpackerModule::m_decode2DFinderTrack
bool m_decode2DFinderTrack
flag to decode 2D finder track
Definition: CDCTriggerUnpackerModule.h:279
Belle2::CDCTriggerUnpackerModule::m_NeuroCnttrg
int m_NeuroCnttrg
NN cnttrg.
Definition: CDCTriggerUnpackerModule.h:346
Belle2::CDCTriggerUnpackerModule::m_rawTriggers
StoreArray< RawTRG > m_rawTriggers
array containing the raw trigger data object
Definition: CDCTriggerUnpackerModule.h:269
Belle2::CDCTriggerUnpackerModule::m_NNInput2DFinderTracks
StoreArray< CDCTriggerTrack > m_NNInput2DFinderTracks
decoded 2D finder tracks from the neural network input
Definition: CDCTriggerUnpackerModule.h:317
Belle2::CDCTriggerUnpackerModule::m_NNInputTSHits
StoreArray< CDCTriggerSegmentHit > m_NNInputTSHits
decoded track segment hits from the neural network input
Definition: CDCTriggerUnpackerModule.h:320
Belle2::StoreArray
Accessor to arrays stored in the data store.
Definition: ECLMatchingPerformanceExpertModule.h:33
Belle2::CDCTriggerUnpackerModule::m_n2DTS
int m_n2DTS
flag to unpack 2D tracker data with 15TS
Definition: CDCTriggerUnpackerModule.h:282
Belle2::CDCTriggerUnpackerModule::m_delayNNOutput
std::vector< int > m_delayNNOutput
delay of the NN output values clock cycle after the NN enable bit (by quadrant)
Definition: CDCTriggerUnpackerModule.h:288
Belle2::CDCTriggerUnpackerModule::event
virtual void event() override
convert raw data (in B2L buffer to bitstream)
Definition: CDCTriggerUnpackerModule.cc:647
Belle2::CDCTriggerUnpackerModule::m_NeuroInputs
StoreArray< CDCTriggerMLPInput > m_NeuroInputs
decoded input vector for neural network
Definition: CDCTriggerUnpackerModule.h:314
Belle2::CDCTriggerUnpackerModule::m_mergerBitsPerClock
MergerBits m_mergerBitsPerClock
Merger bits per clock.
Definition: CDCTriggerUnpackerModule.h:273
Belle2::SubTrigger::firmwareVersion
std::string firmwareVersion
version of the FPGA firmware
Definition: CDCTriggerUnpackerModule.h:95
Belle2::CDCTriggerUnpackerModule::m_decode2DFinderInputTS
bool m_decode2DFinderInputTS
flag to decode 2D finder input TS
Definition: CDCTriggerUnpackerModule.h:280
Belle2::CDCTriggerMLP
Class to keep all parameters of an expert MLP for the neuro trigger.
Definition: CDCTriggerMLP.h:13
Belle2::CDCTriggerUnpackerModule::m_mergerNodeID
NodeList m_mergerNodeID
list of (COPPER ID, HSLB ID) of Merger reader (TSF)
Definition: CDCTriggerUnpackerModule.h:271
Belle2::CDCTriggerUnpackerModule::m_bitsTo2D
StoreArray< CDCTriggerUnpacker::TSFOutputBitStream > m_bitsTo2D
bitstream of TSF output to 2D tracker
Definition: CDCTriggerUnpackerModule.h:292
Belle2::CDCTriggerUnpackerModule::m_cdctriggerneuroconfig
DBObjPtr< CDCTriggerNeuroConfig > m_cdctriggerneuroconfig
current neurotrigger config from database; used for unscaling network target
Definition: CDCTriggerUnpackerModule.h:359