00001
00002
00003
00004
00005
00006
00007
00008
00009 #include<iostream>
00010 #include<vector>
00011
00012 using namespace std;
00013
00014 #include "MucMappingAlg/MucChain.h"
00015
00016
00017 MucChain :: MucChain( int id, std::string name, int module, int socket, int fecOrder )
00018 {
00019
00020
00021 m_ID = id;
00022 m_Name = name;
00023 m_Module = module;
00024 m_Socket = socket;
00025 m_FecOrder = fecOrder;
00026
00027 Mapping();
00028 }
00029
00030
00031 MucChain :: ~MucChain()
00032 {
00033
00034 delete []m_FirstStripID;
00035 delete []m_FecLayerID;
00036 delete []m_StripOrder;
00037
00038 m_FecVect.clear();
00039 }
00040
00041
00042 void MucChain :: ReMap( string name, int module, int socket )
00043 {
00044 m_Name = name;
00045 m_Module = module;
00046 m_Socket = socket;
00047
00048 MucChain::Mapping();
00049 }
00050
00051 void MucChain :: SetFecOrder( int fecOrder )
00052 {
00053 m_FecOrder = fecOrder;
00054
00055 MucChain::InitFecVect();
00056 }
00057
00058
00059 void MucChain :: SetStripOrder( int stripOrder )
00060 {
00061
00062 int order;
00063 if( stripOrder == 0 ) order = DEFAULT_STRIP_ORDER;
00064 else order = stripOrder;
00065
00066 for(int i=0; i<m_FecTotal; i++)
00067 m_StripOrder[ i ] = order;
00068 }
00069
00070 void MucChain :: SetStripOrder( int fecID, int stripOrder )
00071 {
00072
00073 int i = m_FecOrder * ( fecID - ((1-m_FecOrder)/2)*(m_FecTotal - 1) );
00074
00075 m_FecVect[i].SetStripOrder( stripOrder );
00076 }
00077
00078 void MucChain :: ArrayInvert( int* array, int number )
00079 {
00080 int temp;
00081 for(int i=0; i<number/2; i++)
00082 {
00083 temp = array[i];
00084 array[i] = array[number-1-i];
00085 array[number-1-i] = temp;
00086 }
00087 }
00088
00089
00090 void MucChain :: Mapping()
00091 {
00092 InitPart();
00093 InitSegment();
00094 InitFecTotal();
00095 InitFecPerLayer();
00096 InitFecLayerID();
00097 InitFirstStripID();
00098 InitStripOrder();
00099 InitFecVect();
00100 }
00101
00102 void MucChain :: InitPart()
00103 {
00104
00105 if( m_Name[0] == 'B' ) m_Part = BRID;
00106 else if( m_Name[1] == 'E' ) m_Part = EEID;
00107 else m_Part = WEID;
00108 }
00109
00110 void MucChain :: InitSegment()
00111 {
00112
00113 if( m_Part == BRID )
00114 {
00115 switch( m_Name[2] )
00116 {
00117 case '1' : m_Segment = 2; break;
00118 case '2' : m_Segment = 1; break;
00119 case '3' : m_Segment = 0; break;
00120 case '4' : m_Segment = 7; break;
00121 case '5' : m_Segment = 6; break;
00122 case '6' : m_Segment = 5; break;
00123 case '7' : m_Segment = 4; break;
00124 case '8' : m_Segment = 3; break;
00125 default : ;
00126 }
00127 }
00128 else if( m_Part == EEID )
00129 {
00130 switch( m_Name[2] )
00131 {
00132 case '1' : m_Segment = 0; break;
00133 case '2' : m_Segment = 3; break;
00134 case '3' : m_Segment = 2; break;
00135 case '4' : m_Segment = 1; break;
00136 }
00137 }
00138 else
00139 {
00140 switch( m_Name[2] )
00141 {
00142 case '1' : m_Segment = 1; break;
00143 case '2' : m_Segment = 2; break;
00144 case '3' : m_Segment = 3; break;
00145 case '4' : m_Segment = 0; break;
00146 }
00147 }
00148 }
00149
00150 void MucChain :: InitFecTotal()
00151 {
00152
00153 if( m_Part == BRID )
00154 {
00155 if( m_Name[1] == 'O' )
00156 {
00157 m_FecTotal = FEC_NUM - 1;
00158 }
00159 else
00160 {
00161 if( m_Segment == BRTOP && m_Name[1] == 'E' )
00162 {
00163 m_FecTotal = FEC_NUM ;
00164 }
00165 else
00166 {
00167 m_FecTotal = FEC_NUM - 4;
00168 }
00169 }
00170 }
00171 else
00172 {
00173 m_FecTotal = FEC_NUM;
00174 }
00175 }
00176
00177 void MucChain :: InitFecPerLayer()
00178 {
00179
00180 if( m_FecTotal != 0 )
00181 {
00182 if( m_FecTotal == FEC_NUM )
00183 m_FecPerLayer = 4;
00184 else
00185 m_FecPerLayer = 3;
00186 }
00187 else
00188 m_FecPerLayer = 0;
00189 }
00190
00191 void MucChain :: InitFecLayerID()
00192 {
00193
00194
00195 for(int i=0; i<FEC_NUM; i++)
00196 m_FecLayerID[i] = 0;
00197
00198
00199 if( m_Part == BRID )
00200 {
00201 if( m_Name[1] == 'O' )
00202 {
00203 for(int i=0; i<m_FecTotal; i++) {
00204 m_FecLayerID[i] = (i/m_FecPerLayer) * 2;
00205 }
00206 }
00207 else
00208 {
00209 for(int i=0; i<m_FecTotal; i++) {
00210 m_FecLayerID[i] = (i/m_FecPerLayer) * 2 + 1;
00211 }
00212 }
00213 }
00214 else
00215 {
00216 if( m_Name[3] == 'F' )
00217 {
00218 for(int i=0; i<m_FecTotal; i++) {
00219 m_FecLayerID[i] = 3 - (i/m_FecPerLayer);
00220 }
00221 }
00222 else
00223 {
00224 for(int i=0; i<m_FecTotal; i++) {
00225 m_FecLayerID[i] = 7 - (i/m_FecPerLayer);
00226 }
00227 }
00228 }
00229
00230
00231 if( m_FecOrder == -1 )
00232 MucChain::ArrayInvert( &m_FecLayerID[0], m_FecTotal );
00233
00234 }
00235
00236 void MucChain :: InitFirstStripID()
00237 {
00238
00239
00240 for(int i=0; i<FEC_NUM; i++)
00241 m_FirstStripID[i] = 0;
00242
00243
00244 if( m_Part== BRID )
00245 {
00246 if( m_Name[1] == 'E' )
00247 {
00248
00249
00250
00251 if(m_Segment==BRTOP)
00252 {
00253 for(int i=0; i<m_FecTotal; i++)
00254 m_FirstStripID[i] = FIRST_STRID_SQC_BETOP[i%m_FecPerLayer ];
00255 }
00256 else switch(m_Segment)
00257 {
00258 case 0: ;
00259 case 1: ;
00260 case 5:
00261 for(int i=0; i<m_FecTotal; i++)
00262 m_FirstStripID[i] = FIRST_STRID_SQC_BEA[i%m_FecPerLayer ];
00263 break;
00264 default :
00265 for(int i=0; i<m_FecTotal; i++)
00266 m_FirstStripID[i] = FIRST_STRID_SQC_BEB[i%m_FecPerLayer ];
00267
00268 }
00269
00270 }
00271 else if( m_Name[1] == 'W' )
00272 {
00273 switch(m_Segment)
00274 {
00275 case 0: ;
00276 case 1: ;
00277 case 2: ;
00278 case 5:
00279 for(int i=0; i<m_FecTotal; i++)
00280 m_FirstStripID[i] = FIRST_STRID_SQC_BWA[i%m_FecPerLayer ];
00281 break;
00282 default:
00283 for(int i=0; i<m_FecTotal; i++)
00284 m_FirstStripID[i] = FIRST_STRID_SQC_BWB[i%m_FecPerLayer ];
00285 }
00286 }
00287 else
00288 {
00289 switch(m_Segment)
00290 {
00291 case 0: ;
00292 case 1: ;
00293 case 2: ;
00294 case 5:
00295 for(int i=0; i<m_FecTotal; i++)
00296 m_FirstStripID[i] = FIRST_STRID_SQC_BWB[ i%m_FecPerLayer ];
00297 break;
00298 default :
00299 for(int i=0; i<m_FecTotal; i++)
00300 m_FirstStripID[i] = FIRST_STRID_SQC_BWA[ i%m_FecPerLayer ];
00301 }
00302 }
00303
00304
00305 for(int j=1; j<m_FecTotal/m_FecPerLayer; j+=2)
00306 MucChain::ArrayInvert( &m_FirstStripID[j*m_FecPerLayer], m_FecPerLayer );
00307 }
00308 else
00309 {
00310
00311 for(int i=0; i<m_FecTotal; i++)
00312 m_FirstStripID[i] = FIRST_STRID_SQC_EC[ i%m_FecPerLayer ];
00313 }
00314
00315
00316 if( m_FecOrder == -1 )
00317 {
00318 MucChain::ArrayInvert( m_FirstStripID, m_FecTotal );
00319 }
00320 }
00321
00322 unsigned int MucChain :: EncodeVmeRecord( int module, int socket, int fecID, unsigned short data)
00323 {
00324
00325 unsigned int record = ((module << MODULE_BIT) | (socket << SOCKET_BIT) | fecID);
00326 return ( (record << LENGTH) | data );
00327 }
00328
00329
00330 void MucChain :: InitStripOrder()
00331 {
00332
00333
00334
00335 for(int i=0; i<m_FecTotal; i++)
00336 {
00337 if( m_Part == BRID )
00338 {
00339 m_StripOrder[i] = -1;
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383
00384
00385
00386
00387
00388
00389
00390
00391 }
00392 else if( (m_Part==EEID && (m_Segment==0 || m_Segment==2))
00393 || (m_Part==WEID && (m_Segment==1 || m_Segment==3)) )
00394 m_StripOrder[ i ] = STRORDER_ECA[ m_FecLayerID[i] ];
00395 else
00396 m_StripOrder[ i ] = STRORDER_ECB[ m_FecLayerID[i] ];
00397
00398 }
00399
00400 }
00401
00402 void MucChain :: InitFecVect()
00403 {
00404
00405
00406 unsigned short data = 0;
00407
00408 int part = m_Part;
00409 int segment = m_Segment;
00410
00411 int id;
00412 int layer;
00413 int firstStripID;
00414 int stripOrder;
00415 string chainName;
00416
00417 unsigned int vmeRecord;
00418
00419 for(int i=0; i<m_FecTotal; i++)
00420 {
00421
00422 id =( (1 - m_FecOrder)/2 ) * ( m_FecTotal - 1 ) + (m_FecOrder * i);
00423
00424 layer = m_FecLayerID[ id ];
00425 firstStripID = m_FirstStripID[ id ];
00426 stripOrder = m_StripOrder[ id ];
00427 chainName = MucChain::m_Name;
00428 vmeRecord = EncodeVmeRecord( m_Module, m_Socket, id , data);
00429
00430
00431 MucFec aFec( id, stripOrder, part, segment, layer, firstStripID, vmeRecord, chainName );
00432 m_FecVect.push_back( aFec );
00433 }
00434 }
00435
00436
00437
00438
00439