Belle II Software development
KLMPackerModule.cc
1/**************************************************************************
2 * basf2 (Belle II Analysis Software Framework) *
3 * Author: The Belle II Collaboration *
4 * *
5 * See git log for contributors and copyright holders. *
6 * This file is licensed under LGPL-3.0, see LICENSE.md. *
7 **************************************************************************/
8
9/* Own header. */
10#include <klm/modules/KLMPacker/KLMPackerModule.h>
11
12/* Basf2 headers. */
13#include <framework/logging/Logger.h>
14
15using namespace Belle2;
16
17REG_MODULE(KLMPacker);
18
20 Module(),
22{
23 setDescription("KLM raw data packer (creates RawKLM from KLMDigits).");
25}
26
30
32{
33 m_Digits.isRequired();
34 m_EventMetaData.isRequired();
35 m_RawKLMs.registerInDataStore();
36}
37
39{
40 if (!m_ElectronicsMap.isValid())
41 B2FATAL("KLM electronics map is not available.");
42}
43
45{
46 /* Indices: copper, data concentrator.
47 * Coppers from 0 to 3 are BKLM;
48 * coppers from 4 to 7 are EKLM.
49 */
50 std::vector<uint32_t> dataWords[8][4];
51
52 /* Pack KLM digits. */
53 for (const KLMDigit& digit : m_Digits) {
54 uint32_t buf[2] = {0};
55 uint16_t bword1 = 0;
56 uint16_t bword2 = 0;
57 uint16_t bword3 = 0;
58 uint16_t bword4 = 0;
59 int channel =
60 m_ElementNumbers->channelNumber(
61 digit.getSubdetector(), digit.getSection(), digit.getSector(),
62 digit.getLayer(), digit.getPlane(), digit.getStrip());
63 const KLMElectronicsChannel* electronicsChannel =
64 m_ElectronicsMap->getElectronicsChannel(channel);
65 if (electronicsChannel == nullptr)
66 B2FATAL("Incomplete KLM electronics map.");
67 int flag;
68 if (digit.inRPC())
69 flag = 2; // RPC
70 else
71 flag = 4; // Scintillator
72 int lane = electronicsChannel->getLane();
73 int plane = electronicsChannel->getAxis();
74 int strip = electronicsChannel->getChannel();
75 formatData(flag, lane, plane, strip,
76 digit.getCharge(), digit.getCTime(), digit.getTDC(),
77 bword1, bword2, bword3, bword4);
78 buf[0] |= bword2;
79 buf[0] |= ((bword1 << 16));
80 buf[1] |= bword4;
81 buf[1] |= ((bword3 << 16));
82 if (digit.getSubdetector() == KLMElementNumbers::c_BKLM) {
83 int copper = electronicsChannel->getCopper() - BKLM_ID - 1;
84 int dataConcentrator = electronicsChannel->getSlot() - 1;
85 dataWords[copper][dataConcentrator].push_back(buf[0]);
86 dataWords[copper][dataConcentrator].push_back(buf[1]);
87 } else {
88 int copper = electronicsChannel->getCopper() - EKLM_ID - 1;
89 int dataConcentrator = electronicsChannel->getSlot() - 1;
90 dataWords[copper + 4][dataConcentrator].push_back(buf[0]);
91 dataWords[copper + 4][dataConcentrator].push_back(buf[1]);
92 }
93 }
94
95 /* Create RawKLM objects. */
96 RawCOPPERPackerInfo packerInfo;
97 packerInfo.exp_num = m_EventMetaData->getExperiment();
98 packerInfo.run_subrun_num = (m_EventMetaData->getRun() << 8) +
99 (m_EventMetaData->getSubrun() & 0xFF);
100 packerInfo.eve_num = m_EventMetaData->getEvent();
101 packerInfo.tt_ctime = 0;
102 packerInfo.tt_utime = 0;
103 packerInfo.b2l_ctime = 0;
104 int* detectorBuf[4];
105 int nWords[4];
106 for (int i = 0; i < 8; i++) {
107 if (i < 4) // BKLM
108 packerInfo.node_id = BKLM_ID + 1 + i;
109 else // EKLM
110 packerInfo.node_id = EKLM_ID + 1 + i - 4;
111 RawKLM* rawKlm = m_RawKLMs.appendNew();
112 for (int j = 0; j < 4; j++) {
113 nWords[j] = dataWords[i][j].size();
114 detectorBuf[j] = new int[nWords[j] + 1];
115 for (int k = 0; k < nWords[j]; k++)
116 detectorBuf[j][k] = dataWords[i][j][k];
117 detectorBuf[j][nWords[j]] = 0;
118 }
119 rawKlm->PackDetectorBuf(detectorBuf[0], nWords[0] + 1,
120 detectorBuf[1], nWords[1] + 1,
121 detectorBuf[2], nWords[2] + 1,
122 detectorBuf[3], nWords[3] + 1,
123 packerInfo);
124 for (int j = 0; j < 4; j++)
125 delete[] detectorBuf[j];
126 }
127}
128
129/*
130 * Data format:
131 * Word 1: Bit 0-6 -> strip number.
132 * Bit 7 -> plane number.
133 * Bit 8-12 -> lane in the data concentrator.
134 * Bit 13-15 -> data type: RPC=0x010; scintillator=0x100.
135 * Word 2: 15 bits of ctime.
136 * Word 3: 10 bits of TDC.
137 * Word 4: 12 bits of charge.
138 */
139void KLMPackerModule::formatData(int flag, int lane, int plane, int strip, int charge, uint16_t ctime, uint16_t tdc,
140 uint16_t& bword1, uint16_t& bword2, uint16_t& bword3, uint16_t& bword4)
141{
142 bword1 = 0;
143 bword2 = 0;
144 bword3 = 0;
145 bword4 = 0;
146 bword1 |= (strip & 0x7F);
147 bword1 |= ((plane & 1) << 7);
148 bword1 |= ((lane & 0x1F) << 8);
149 bword1 |= (flag << 13);
150 bword2 |= (ctime & 0xFFFF);
151 bword3 |= (tdc & 0x3FF);
152 bword4 |= (charge & 0xFFF);
153}
154
KLM digit (class representing a digitized hit in RPCs or scintillators).
Definition KLMDigit.h:29
StoreArray< KLMDigit > m_Digits
KLM digits.
void initialize() override
Initializer.
void event() override
This method is called for each event.
const KLMElementNumbers * m_ElementNumbers
Element numbers.
static void formatData(int flag, int lane, int plane, int strip, int charge, uint16_t ctime, uint16_t tdc, uint16_t &bword1, uint16_t &bword2, uint16_t &bword3, uint16_t &bword4)
Creation of raw data.
void beginRun() override
Called when entering a new run.
DBObjPtr< KLMElectronicsMap > m_ElectronicsMap
Electronics map.
StoreArray< RawKLM > m_RawKLMs
Raw data.
~KLMPackerModule() override
Destructor.
StoreObjPtr< EventMetaData > m_EventMetaData
Event meta data.
void setDescription(const std::string &description)
Sets the description of the module.
Definition Module.cc:214
void setPropertyFlags(unsigned int propertyFlags)
Sets the flags for the module properties.
Definition Module.cc:208
Module()
Constructor.
Definition Module.cc:30
@ 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
struct to contain header information used by RawCOPPERFormat::Packer()
unsigned int b2l_ctime
32bit unitx time at trigger timing distributed by FTSW. For details, see Nakao-san's belle2link user ...
unsigned int eve_num
Run # and subrun # ( 22bit )
unsigned int tt_ctime
Node ID (32bit)
unsigned int tt_utime
27bit clock ticks at trigger timing distributed by FTSW. For details, see Nakao-san's belle2link user...
unsigned int node_id
Event Number (32bit)
unsigned int run_subrun_num
Experiment number (10bit)
unsigned int exp_num
Experiment number (10bit)
void PackDetectorBuf(int *detector_buf_1st, int nwords_1st, int *detector_buf_2nd, int nwords_2nd, int *detector_buf_3rd, int nwords_3rd, int *detector_buf_4th, int nwords_4th, RawCOPPERPackerInfo rawcprpacker_info)
Packer for RawCOPPER class Pack data (format ver.
Definition RawCOPPER.cc:183
The Raw KLM class Class for RawCOPPER class data taken by KLM.
Definition RawKLM.h:27
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Definition Module.h:649
Abstract base class for different kinds of events.