BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
MdcBuilder.cxx
Go to the documentation of this file.
1#include "RawDataCnv/EventManagement/MdcBuilder.h"
2#include "Identifier/MdcID.h"
3#include <fstream>
4#include <iostream>
5using namespace std;
6
8 // set vector size (2^14) and initialize to -1
9 m_re2te = new uint32_t[16384]; // we have 2^14 different REID
10 memset( (void*)m_re2te, 0xFF, 16384 * sizeof( uint32_t ) );
11
13}
14
15MdcBuilder::~MdcBuilder() { delete m_re2te; }
16
17void MdcBuilder::unPack( uint32_t reDigi, uint32_t& REId, uint32_t& TEData, uint32_t& overFlow,
18 uint32_t& TorQ ) {
19 REId = ( reDigi & m_idMask ) >> m_idIndex;
20 // cout << "MdcBuilder::unPack reDigi: 0x" << hex << reDigi << " reid: 0x" << reid << dec
21 // << endl;
22 TEData = reDigi & m_dataMask;
23 overFlow = ( reDigi & m_overflowMask ) >> m_overflowIndex;
24 TorQ = ( reDigi & m_TQMask ) >> m_TQIndex;
25 // cout << "reid" << hex << reid << endl;
26 // cout << "teid" << hex << TEId << endl;
27 return;
28}
29
30StatusCode MdcBuilder::pack( MdcDigiCol* digiCol, WriteRawEvent*& re ) {
31 if ( digiCol == 0 )
32 {
33 cerr << "MdcBuilder::pack can't get digiCol" << endl;
34 return StatusCode::FAILURE;
35 }
36
37 uint32_t size = 0;
38 uint32_t teid = 0, tetdc = 0, teadc = 0, reid = 0, redigi = 0, overflow = 0;
39
40 MdcDigiCol::const_iterator pMdcDigi = digiCol->begin();
41 for ( pMdcDigi; pMdcDigi != digiCol->end(); pMdcDigi++ )
42 {
43 // zoujh+++++++++++, be consistent with DAQ raw data
44 Identifier id = ( *pMdcDigi )->identify();
45 int layer = MdcID::layer( id ), wire = MdcID::wire( id );
46 if ( layer == 20 && wire < 8 ) { layer = 42; }
47 else if ( layer == 42 && wire < 8 ) { layer = 20; }
48 else if ( layer == 40 )
49 {
50 if ( wire >= 200 && wire < 208 ) { wire += 8; }
51 else if ( wire >= 208 && wire < 216 ) { wire -= 8; }
52 }
53 // teid = (*pMdcDigi)->getIntId();
54 teid = MdcID::getIntID( layer, wire );
55 // zoujh-----------
56 reid = getREID( teid );
57 tetdc = ( *pMdcDigi )->getTimeChannel();
58 teadc = ( *pMdcDigi )->getChargeChannel();
59 // overflow
60 uint32_t overflow_tmp = ( *pMdcDigi )->getOverflow();
61 // set tdc
62 if ( tetdc != 0x7FFFFFFF )
63 {
64 overflow = ( ( tetdc > m_dataMask ) ? 1 : 0 ) | ( overflow_tmp & 1 );
65 redigi = ( tetdc & m_dataMask ) | ( ( reid << m_idIndex ) & m_idMask ) |
66 ( ( overflow << m_overflowIndex ) & m_overflowMask ) |
67 ( ( 0 << m_TQIndex ) & m_TQMask );
68 m_buf[size++] = redigi;
69 }
70 // set adc
71 if ( teadc != 0x7FFFFFFF )
72 {
73 overflow = ( ( teadc > m_dataMask ) ? 1 : 0 ) | ( ( overflow_tmp >> 1 ) & 1 );
74 redigi = ( teadc & m_dataMask ) | ( ( reid << m_idIndex ) & m_idMask ) |
75 ( ( overflow << m_overflowIndex ) & m_overflowMask ) |
76 ( ( 1 << m_TQIndex ) & m_TQMask );
77 m_buf[size++] = redigi;
78 }
79 }
80
81 append2event( re, 0xa10000, size );
82
83 return StatusCode::SUCCESS;
84}
85
86// initialize re2te tables
87
88StatusCode MdcBuilder::initialize( string& initFile ) {
89 ifstream f;
90
91 uint32_t NRELAYERPOS, NREWIREPOS, NREEAWEPOS;
92 uint32_t NRELAYERMASK, NREWIREMASK, NREEAWEMASK;
93
94 //-----------------------------------------------------------
95 // read initFile
96 f.open( initFile.c_str() );
97
98 if ( f.bad() || !f.is_open() )
99 {
100 cerr << "Error: could not open file " << initFile << endl;
101 return StatusCode::FAILURE;
102 }
103
104 if ( !Builder::find( f, "##MdcDigiConf", initFile ) )
105 {
106 cerr << "Error: could not find '##MdcDigiConf' in file " << initFile << endl;
107 return StatusCode::FAILURE;
108 }
109
110 if ( !Builder::expect( f, "#Index,mask", initFile ) ||
111 !Builder::expectInt( f, "id", initFile, m_idIndex, m_idMask ) ||
112 !Builder::expectInt( f, "data", initFile, m_dataIndex, m_dataMask ) ||
113 !Builder::expectInt( f, "Overflow", initFile, m_overflowIndex, m_overflowMask ) ||
114 !Builder::expectInt( f, "T/Q", initFile, m_TQIndex, m_TQMask ) ||
115 !Builder::expectInt( f, "Wire", initFile, NREWIREPOS, NREWIREMASK ) ||
116 !Builder::expectInt( f, "Layer", initFile, NRELAYERPOS, NRELAYERMASK ) )
117 return StatusCode::FAILURE;
118
119 f.close();
120 //-----------------------------------------------------------
121 // Build re2te table
122 uint32_t nRELayerPos, nREWirePos, nREEaWePos;
123 uint32_t nRELayerMask, nREWireMask, nREEaWeMask;
124
125 uint32_t TELayerMax = MdcID::getAXIAL_LAYER_MAX() + MdcID::getSTEREO_LAYER_MAX() + 1;
126 uint32_t TEWireMax = MdcID::getAXIAL_WIRE_MAX();
127
128 int i = 0;
129
130 uint32_t layer, wire;
131
132 nRELayerPos = NRELAYERPOS;
133 nREWirePos = NREWIREPOS;
134 nRELayerMask = NRELAYERMASK;
135 nREWireMask = NREWIREMASK;
136
137 for ( uint32_t TELayer = 0; TELayer <= TELayerMax; TELayer++ )
138 {
139 layer = TELayer + 1;
140 // After Layer 32, there are changes in positions of Layers and wires
141 if ( layer >= 0x20 )
142 {
143 layer = layer + i;
144 i++;
145 nRELayerMask = nRELayerMask & 0xFFFFFBFF;
146 nREWireMask = nREWireMask | 0x00000400;
147 TEWireMax = MdcID::getAXIAL_WIRE_MAX();
148 }
149 else
150 {
151 // When Layer is less than 32, the number of wire is less than 240 to prevent overflow;
152 TEWireMax = 240;
153 }
154
155 for ( uint32_t TEWire = 0; TEWire <= TEWireMax; TEWire++ )
156 {
157 wire = TEWire + 1;
158 uint32_t reid = ( ( ( layer << nRELayerPos ) & nRELayerMask ) |
159 ( ( wire << nREWirePos ) & nREWireMask ) ) >>
160 2;
161 // cout << "TELayer" << hex << TELayer;
162 // cout << " TEWire" << hex << TEWire;
163 // cout << " layer" << hex << layer;
164 // cout << " wire" << hex << wire;
165
166 uint32_t teid = MdcID::getIntID( TELayer, TEWire );
167
168 if ( reid >= 16384 )
169 {
170 cerr << "Error: REID overflow !" << reid << endl;
171 exit( 8 );
172 }
173 // cout << " reid" << hex << reid;
174 // cout << " teid" << hex << teid << endl;
175 m_re2te[reid] = teid;
176 m_te2reMap.insert( TE2REMAP::value_type( teid, reid ) );
177 }
178 }
179
180 // return StatusCode::SUCCESSful initialization
181 return StatusCode::SUCCESS;
182}
183
184uint32_t MdcBuilder::getREID( uint32_t teid ) {
185 TE2REMAP::iterator itr = m_te2reMap.find( teid );
186
187 if ( itr == m_te2reMap.end() )
188 {
189 cout << "wrong teid in mdc " << teid << endl;
190 exit( 8 );
191 }
192
193 return itr->second;
194}
TFile f("ana_bhabha660a_dqa_mcPat_zy_old.root")
eformat::write::FullEventFragment WriteRawEvent
void append2event(WriteRawEvent *&re, uint32_t source_id, uint32_t size, uint32_t shift=0)
Definition Builder.cxx:69
static bool find(ifstream &f, string msg, string fname)
Definition Builder.cxx:52
static bool expect(ifstream &f, string msg, string fname)
Definition Builder.cxx:25
static bool expectInt(ifstream &f, string msg, string fname, uint32_t &val1, uint32_t &val2)
Definition Builder.cxx:39
Builder()
Definition Builder.cxx:11
virtual uint32_t getREID(uint32_t teid)
virtual ~MdcBuilder()
virtual StatusCode pack(MdcDigiCol *digiCol, WriteRawEvent *&re)
virtual StatusCode initialize(string &initFile)
virtual void unPack(uint32_t reDigi, uint32_t &REId, uint32_t &TEData, uint32_t &overFlow, uint32_t &TorQ)
static value_type getAXIAL_LAYER_MAX()
Definition MdcID.cxx:110
static int layer(const Identifier &id)
Values of different levels (failure returns 0).
Definition MdcID.cxx:47
static value_type getAXIAL_WIRE_MAX()
Definition MdcID.cxx:112
static int wire(const Identifier &id)
Definition MdcID.cxx:52
static value_type getIntID(unsigned int wireType, unsigned int layer, unsigned int wire)
Definition MdcID.cxx:102
static value_type getSTEREO_LAYER_MAX()
Definition MdcID.cxx:111