37 {
38
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 )
55 {
56 uint32_t digi = *buf;
57 if ( ( ( digi >> 18 ) & 0x3FFF ) == 0 )
58 {
59
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 {
72 curTag[1] = 0x7FFFFFFF;
73 curTag[2] = 0x7FFFFFFF;
74 curTag[3] = 0;
75
76
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
98
99
100
101
102
103
104
105
106
107
108 curTag[0] = ( TEId << 2 );
109
110 vHits.push_back( REId );
111 }
112
113 if ( TETorQ == 0 )
114 {
115 if ( ( curTag[0] & 1 ) == 0 )
116 {
117 curTag[0] |= 1;
118 curTag[1] = TEData;
119 curTag[3] |= TEOverflow;
120 }
121 else
122 {
123 curTag[3] |= 0xC;
124 if ( TEData >= curTag[1] )
125 {
126 if ( TEOverflow ) TEData |= ( 1 << 31 );
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 {
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 {
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] );
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] );
178 des->push_back( mdcDigi );
179 }
180 curTag[0] = 0;
181 }
182 }
183 else
184 {
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] );
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] );
199 des->push_back( mdcDigi );
200 curTag[0] = 0;
201 }
202 }
203
204
205 return StatusCode::SUCCESS;
206}
uint32_t bufSize(int i) const
void setOverflow(const unsigned int overflow)