17MucChain ::MucChain(
int id, std::string name,
int module,
int socket,
int fecOrder ) {
25 m_FecOrder = fecOrder;
31MucChain ::~MucChain() {
33 delete[] m_FirstStripID;
34 delete[] m_FecLayerID;
35 delete[] m_StripOrder;
41void MucChain ::ReMap(
string name,
int module,
int socket ) {
49void MucChain ::SetFecOrder(
int fecOrder ) {
50 m_FecOrder = fecOrder;
51 MucChain::InitFecVect();
55void MucChain ::SetStripOrder(
int stripOrder ) {
58 if ( stripOrder == 0 ) order = DEFAULT_STRIP_ORDER;
59 else order = stripOrder;
61 for (
int i = 0; i < m_FecTotal; i++ ) m_StripOrder[i] = order;
64void MucChain ::SetStripOrder(
int fecID,
int stripOrder ) {
66 int i = m_FecOrder * ( fecID - ( ( 1 - m_FecOrder ) / 2 ) * ( m_FecTotal - 1 ) );
67 m_FecVect[i].SetStripOrder( stripOrder );
70void MucChain ::ArrayInvert(
int* array,
int number ) {
72 for (
int i = 0; i < number / 2; i++ )
75 array[i] = array[number - 1 - i];
76 array[number - 1 - i] = temp;
81void MucChain ::Mapping() {
92void MucChain ::InitPart() {
94 if ( m_Name[0] ==
'B' ) m_Part = BRID;
95 else if ( m_Name[1] ==
'E' ) m_Part = EEID;
99void MucChain ::InitSegment() {
101 if ( m_Part == BRID )
105 case '1': m_Segment = 2;
break;
106 case '2': m_Segment = 1;
break;
107 case '3': m_Segment = 0;
break;
108 case '4': m_Segment = 7;
break;
109 case '5': m_Segment = 6;
break;
110 case '6': m_Segment = 5;
break;
111 case '7': m_Segment = 4;
break;
112 case '8': m_Segment = 3;
break;
116 else if ( m_Part == EEID )
120 case '1': m_Segment = 0;
break;
121 case '2': m_Segment = 3;
break;
122 case '3': m_Segment = 2;
break;
123 case '4': m_Segment = 1;
break;
130 case '1': m_Segment = 1;
break;
131 case '2': m_Segment = 2;
break;
132 case '3': m_Segment = 3;
break;
133 case '4': m_Segment = 0;
break;
138void MucChain ::InitFecTotal() {
140 if ( m_Part == BRID )
142 if ( m_Name[1] ==
'O' )
144 m_FecTotal = FEC_NUM - 1;
148 if ( m_Segment ==
BRTOP && m_Name[1] ==
'E' )
150 m_FecTotal = FEC_NUM;
154 m_FecTotal = FEC_NUM - 4;
160 m_FecTotal = FEC_NUM;
164void MucChain ::InitFecPerLayer() {
166 if ( m_FecTotal != 0 )
168 if ( m_FecTotal == FEC_NUM ) m_FecPerLayer = 4;
169 else m_FecPerLayer = 3;
171 else m_FecPerLayer = 0;
174void MucChain ::InitFecLayerID() {
177 for (
int i = 0; i < FEC_NUM; i++ ) m_FecLayerID[i] = 0;
180 if ( m_Part == BRID )
182 if ( m_Name[1] ==
'O' )
184 for (
int i = 0; i < m_FecTotal; i++ ) { m_FecLayerID[i] = ( i / m_FecPerLayer ) * 2; }
188 for (
int i = 0; i < m_FecTotal; i++ )
189 { m_FecLayerID[i] = ( i / m_FecPerLayer ) * 2 + 1; }
194 if ( m_Name[3] ==
'F' )
196 for (
int i = 0; i < m_FecTotal; i++ ) { m_FecLayerID[i] = 3 - ( i / m_FecPerLayer ); }
200 for (
int i = 0; i < m_FecTotal; i++ ) { m_FecLayerID[i] = 7 - ( i / m_FecPerLayer ); }
208void MucChain ::InitFirstStripID() {
211 for (
int i = 0; i < FEC_NUM; i++ ) m_FirstStripID[i] = 0;
214 if ( m_Part == BRID )
216 if ( m_Name[1] ==
'E' )
221 if ( m_Segment ==
BRTOP )
223 for (
int i = 0; i < m_FecTotal; i++ )
226 else switch ( m_Segment )
231 for (
int i = 0; i < m_FecTotal; i++ )
235 for (
int i = 0; i < m_FecTotal; i++ )
239 else if ( m_Name[1] ==
'W' )
247 for (
int i = 0; i < m_FecTotal; i++ )
251 for (
int i = 0; i < m_FecTotal; i++ )
263 for (
int i = 0; i < m_FecTotal; i++ )
267 for (
int i = 0; i < m_FecTotal; i++ )
273 for (
int j = 1; j < m_FecTotal / m_FecPerLayer; j += 2 )
279 for (
int i = 0; i < m_FecTotal; i++ )
287unsigned int MucChain ::EncodeVmeRecord(
int module,
int socket,
int fecID,
288 unsigned short data ) {
290 unsigned int record = ( (
module << MODULE_BIT ) | ( socket << SOCKET_BIT ) | fecID );
291 return ( ( record << LENGTH ) |
data );
295void MucChain ::InitStripOrder() {
297 for (
int i = 0; i < m_FecTotal; i++ )
299 if ( m_Part == BRID )
301 m_StripOrder[i] = -1;
351 else if ( ( m_Part == EEID && ( m_Segment == 0 || m_Segment == 2 ) ) ||
352 ( m_Part ==
WEID && ( m_Segment == 1 || m_Segment == 3 ) ) )
359void MucChain ::InitFecVect() {
362 unsigned short data = 0;
364 int segment = m_Segment;
371 unsigned int vmeRecord;
373 for (
int i = 0; i < m_FecTotal; i++ )
376 id = ( ( 1 - m_FecOrder ) / 2 ) * ( m_FecTotal - 1 ) + ( m_FecOrder * i );
378 layer = m_FecLayerID[id];
379 firstStripID = m_FirstStripID[id];
380 stripOrder = m_StripOrder[id];
381 chainName = MucChain::m_Name;
382 vmeRecord = EncodeVmeRecord( m_Module, m_Socket,
id,
data );
385 MucFec aFec(
id, stripOrder, part, segment, layer, firstStripID, vmeRecord, chainName );
386 m_FecVect.push_back( aFec );
const int STRORDER_ECA[E_LAY_NUM]
const int STRORDER_ECB[E_LAY_NUM]
const int FIRST_STRID_SQC_BEA[3]
const int FIRST_STRID_SQC_BEB[3]
const int FIRST_STRID_SQC_BWA[3]
const int FIRST_STRID_SQC_BWB[3]
const int FIRST_STRID_SQC_EC[4]
const int FIRST_STRID_SQC_BETOP[4]
void ArrayInvert(int *array, int number)