BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
MdcConverter.cxx
Go to the documentation of this file.
1#include "RawDataCnv/Util/MdcConverter.h"
2#include "Identifier/MdcID.h"
3#include "RawDataCnv/SniperJSON.h"
4
5MdcConverter* MdcConverter::s_instance = 0;
6
7MdcConverter* MdcConverter::instance( int runMode ) {
8 if ( s_instance == 0 ) { s_instance = new MdcConverter( runMode ); }
9
10 return s_instance;
11}
12
14 if ( s_instance != 0 )
15 {
16 delete s_instance;
17 s_instance = 0;
18 }
19}
20
21void MdcConverter::init( const SniperJSON& config ) {
22 for ( SniperJSON::vec_iterator it = config.vec_begin(); it != config.vec_end(); ++it )
23 {
24 IdFixRule rule;
25 rule.run_from = ( *it )["RunFrom"].get<int>();
26 rule.run_to = ( *it )["RunTo"].get<int>();
27 rule.mask = ( *it )["Mask"].get<uint32_t>();
28 rule.reverse_mask = ~rule.mask;
29 rule.value1 = ( *it )["Value1"].get<uint32_t>();
30 rule.value2 = ( *it )["Value2"].get<uint32_t>();
31 m_idFixRules.push_back( rule );
32 }
33
34 memset( (void*)m_mdcTag, 0, 16384 * 4 * 4 );
35}
36
37StatusCode MdcConverter::convert( const BufferHolder& src, MdcDigiCol* des ) {
38 // int digiId = 0;
39 uint32_t TEId, REId, TEData, TEOverflow, TETorQ;
40
41 typedef pair<uint32_t, uint32_t> PairII;
42 vector<uint32_t> vHits;
43 vector<PairII> vmTDC;
44
45 uint32_t* curTag;
46 ////////////////////////////////////
47
48 uint32_t nbuf = src.nBuf();
49
50 for ( uint32_t i = 0; i < nbuf; ++i )
51 {
52 uint32_t* buf = src( i );
53 uint32_t* bufend = buf + src.bufSize( i );
54 for ( ; buf < bufend; ++buf /*, ++digiId*/ )
55 {
56 uint32_t digi = *buf;
57 if ( ( ( digi >> 18 ) & 0x3FFF ) == 0 )
58 {
59 // digiId--;
60 continue;
61 }
62
63 m_builder.unPack( digi, REId, TEData, TEOverflow, TETorQ );
64
65 TEId = m_builder.getTEID( REId );
66 if ( TEId == 0xFFFFFFFF ) continue;
67
68 curTag = m_mdcTag[REId];
69
70 if ( curTag[0] == 0 )
71 { // 1st signal from detector-unit-REId
72 curTag[1] = 0x7FFFFFFF;
73 curTag[2] = 0x7FFFFFFF;
74 curTag[3] = 0;
75
76 // uint32_t oTEId = TEId;
77
78 for ( std::vector<IdFixRule>::iterator it = m_idFixRules.begin();
79 it != m_idFixRules.end(); ++it )
80 {
81 IdFixRule& rule = ( *it );
82 if ( m_runId >= rule.run_from && m_runId <= rule.run_to )
83 {
84 if ( ( TEId & rule.mask ) == rule.value1 )
85 {
86 TEId = ( TEId & rule.reverse_mask ) | rule.value2;
87 curTag[3] |= 0x10;
88 }
89 else if ( ( TEId & rule.mask ) == rule.value2 )
90 {
91 TEId = ( TEId & rule.reverse_mask ) | rule.value1;
92 curTag[3] |= 0x10;
93 }
94 }
95 }
96
97 // if ( curTag[3] != 0 ) {
98 // std::cout << " From TEId 0x" << std::hex << oTEId << std::dec
99 // << " : " << MdcID::layer(Identifier(oTEId)) << " " <<
100 // MdcID::wire(Identifier(oTEId))
101 // << std::endl;
102 // std::cout << " To TEId 0x" << std::hex << TEId << std::dec
103 // << " : " << MdcID::layer(Identifier(TEId)) << " " <<
104 // MdcID::wire(Identifier(TEId))
105 // << std::endl;
106 // }
107
108 curTag[0] = ( TEId << 2 );
109
110 vHits.push_back( REId );
111 }
112
113 if ( TETorQ == 0 )
114 { // T
115 if ( ( curTag[0] & 1 ) == 0 )
116 { // 1st-found-T
117 curTag[0] |= 1;
118 curTag[1] = TEData;
119 curTag[3] |= TEOverflow; // 0 or 1
120 }
121 else
122 { // multi-T
123 curTag[3] |= 0xC; // 12, set the multi-T and 1st-T bits
124 if ( TEData >= curTag[1] )
125 {
126 if ( TEOverflow ) TEData |= ( 1 << 31 ); // LastBit
127 vmTDC.push_back( make_pair( REId, TEData ) );
128 }
129 else
130 {
131 if ( curTag[3] & 1 ) curTag[1] |= ( 1 << 31 );
132 vmTDC.push_back( make_pair( REId, curTag[1] ) );
133 curTag[1] = TEData;
134 curTag[3] &= ( 0xFFFFFFFF - 1 );
135 curTag[3] |= TEOverflow;
136 }
137 }
138 }
139 else
140 { // Q
141 curTag[0] |= 2;
142 curTag[2] = TEData;
143 if ( TEOverflow ) curTag[3] |= 2;
144 }
145 }
146 }
147
148 MdcDigi* mdcDigi;
149 if ( m_runMode == 1 )
150 { // OnlineMode, discard the hits that only have T or Q
151 for ( vector<PairII>::iterator it = vmTDC.begin(); it != vmTDC.end(); ++it )
152 {
153 curTag = m_mdcTag[it->first];
154 if ( ( curTag[0] & 3 ) == 3 )
155 {
156 uint32_t data = it->second;
157 if ( data >> 31 ) continue;
158 mdcDigi =
159 new MdcDigi( Identifier( curTag[0] >> 2 ), ( data & 0x7FFFFFFF ), curTag[2] );
160 mdcDigi->setOverflow( ( curTag[3] & 0x16 ) | ( data >> 31 ) );
161 des->push_back( mdcDigi );
162 }
163 }
164
165 for ( vector<uint32_t>::iterator it = vHits.begin(); it != vHits.end(); ++it )
166 {
167 curTag = m_mdcTag[*it];
168 if ( ( curTag[0] & 3 ) == 3 )
169 {
170 if ( ( ( curTag[3] & 3 ) > 0 ) ||
171 ( ( ( curTag[3] & 12 ) != 12 ) && ( ( curTag[3] & 12 ) != 0 ) ) )
172 {
173 curTag[0] = 0;
174 continue;
175 }
176 mdcDigi = new MdcDigi( Identifier( curTag[0] >> 2 ), curTag[1], curTag[2] );
177 mdcDigi->setOverflow( curTag[3] );
178 des->push_back( mdcDigi );
179 }
180 curTag[0] = 0;
181 }
182 }
183 else
184 { // Not OnlineMode, keep all the hits found
185 for ( vector<PairII>::iterator it = vmTDC.begin(); it != vmTDC.end(); ++it )
186 {
187 curTag = m_mdcTag[it->first];
188 uint32_t data = it->second;
189 mdcDigi = new MdcDigi( Identifier( curTag[0] >> 2 ), ( data & 0x7FFFFFFF ), curTag[2] );
190 mdcDigi->setOverflow( ( curTag[3] & 0x16 ) | ( data >> 31 ) );
191 des->push_back( mdcDigi );
192 }
193
194 for ( vector<uint32_t>::iterator it = vHits.begin(); it != vHits.end(); ++it )
195 {
196 curTag = m_mdcTag[*it];
197 mdcDigi = new MdcDigi( Identifier( curTag[0] >> 2 ), curTag[1], curTag[2] );
198 mdcDigi->setOverflow( curTag[3] );
199 des->push_back( mdcDigi );
200 curTag[0] = 0;
201 }
202 }
203
204 ////////////////////////////////////
205 return StatusCode::SUCCESS;
206}
207
209 return m_builder.pack( src, des );
210}
211
212MdcConverter::MdcConverter( int runMode ) : m_runMode( runMode ) {}
213
214MdcConverter::~MdcConverter() {}
TTree * data
eformat::write::FullEventFragment WriteRawEvent
static MdcConverter * instance(int runMode=2)
static void destroy()
StatusCode convert(const BufferHolder &src, MdcDigiCol *des)
void init(const SniperJSON &config)
std::vector< SniperJSON >::const_iterator vec_iterator