/home/bes3soft/bes3soft/Boss/7.0.2/dist/7.0.2/Muc/MucMappingAlg/MucMappingAlg-00-00-02/src/MucChain.cxx

Go to the documentation of this file.
00001 //------------------------------------------------------------------------------|
00002 //      [File  ]:                       MucChain.cxx                            |
00003 //      [Brief ]:       Source file of class MucChain for electronics mapping   |
00004 //      [Author]:       Xie Yuguang, <ygxie@mail.ihep.ac.cn>                    |
00005 //      [Date  ]:       Jun 7, 2006                                             |
00006 //      [Log   ]:       See ChangLog                                            |
00007 //------------------------------------------------------------------------------|
00008 
00009 #include<iostream>
00010 #include<vector>
00011 
00012 using namespace std;
00013 
00014 #include "MucMappingAlg/MucChain.h"
00015 
00016 // Constructor
00017 MucChain :: MucChain( int id, std::string name, int module, int socket, int fecOrder )
00018 {
00019 //      cout << "MucChain:: Create chain : " << endl;
00020 //      cout << "ID: " << id << "\tModule: " << module << "\tSocket: " << socket << "\tFecOrder: " << fecOrder << endl;
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 // Destructor
00031 MucChain :: ~MucChain()
00032 {
00033 //      cout << "MucChain:: Destructor()." <<endl;
00034         delete []m_FirstStripID; 
00035         delete []m_FecLayerID;
00036         delete []m_StripOrder;
00037 
00038         m_FecVect.clear();
00039 }  
00040 
00041 //----------------------- Set properties methods for public---------------
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 // All FECs
00059 void MucChain :: SetStripOrder( int stripOrder )
00060 {
00061 //      cout << "MucChain:: SetStripOrder( int )." << endl;
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         // Decode FecVect member number by fecID
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 //------------------------ set properties methods for private---------------
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 //      cout << "MucChain:: InitPart()." <<endl;
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 //      cout << "MucChain:: InitSegment()." <<endl;
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 //      cout << "MucChain:: InitFecTotal()." <<endl;
00153         if( m_Part == BRID )                            // Barrel 
00154         {
00155                 if( m_Name[1] == 'O' )                  // Odd layer chain
00156                 {
00157                         m_FecTotal = FEC_NUM - 1;       // 15 FECs
00158                 }
00159                 else                                    // Even layer chain
00160                 {
00161                         if( m_Segment == BRTOP && m_Name[1] == 'E' )    // Top segment
00162                         {
00163                                 m_FecTotal = FEC_NUM ;  // 16 FECs
00164                         }       
00165                         else                            // Not top segment
00166                         {
00167                                 m_FecTotal = FEC_NUM - 4; // 12 FECs
00168                         }
00169                 }
00170         }
00171         else                                            // Endcap
00172         {
00173                 m_FecTotal = FEC_NUM;                   // 16 FECs
00174         }
00175 }
00176 
00177 void MucChain :: InitFecPerLayer()
00178 {
00179 //      cout << "MucChain:: InitFecPerLayer()." <<endl;
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   //    cout << "MucChain:: InitLayer()." <<endl;
00194         // Init array
00195         for(int i=0; i<FEC_NUM; i++)
00196                 m_FecLayerID[i] = 0;
00197         
00198         // Set FEC layer id according to default order
00199         if( m_Part == BRID )            // Barral chains
00200         {       
00201                 if( m_Name[1] == 'O' )  // Odd layer chain, layer id: 0, 2, 4, 6, 8 
00202                 {
00203                         for(int i=0; i<m_FecTotal; i++) {
00204                                 m_FecLayerID[i] = (i/m_FecPerLayer) * 2;        
00205                         }
00206                 }
00207                 else                    // Even layer chain, layer id: 1, 3, 5, 7
00208                 {
00209                         for(int i=0; i<m_FecTotal; i++)  {
00210                                 m_FecLayerID[i] = (i/m_FecPerLayer) * 2 + 1;
00211                         }
00212                 }
00213         }
00214         else                            // Endcap chains
00215         {
00216                 if( m_Name[3] == 'F' )  // First chain, layer id: 0, 1, 2, 3
00217                 {
00218                         for(int i=0; i<m_FecTotal; i++) {
00219                                 m_FecLayerID[i] = 3 - (i/m_FecPerLayer);
00220                         }
00221                 }
00222                 else                    // Second chain, layer id: 4, 5, 6, 7
00223                 {
00224                         for(int i=0; i<m_FecTotal; i++) {
00225                                 m_FecLayerID[i] = 7 - (i/m_FecPerLayer);
00226                         }
00227                 }
00228         }
00229 
00230         // If inverting order  
00231         if( m_FecOrder == -1 )
00232                 MucChain::ArrayInvert( &m_FecLayerID[0], m_FecTotal );
00233 
00234 }
00235 
00236 void MucChain :: InitFirstStripID()
00237 {
00238 //      cout << "MucChain:: InitFirstStripID()." <<endl;
00239         // Init array
00240         for(int i=0; i<FEC_NUM; i++)
00241                 m_FirstStripID[i] = 0;
00242 
00243         // Set first strip ID according to default fecOrder
00244         if( m_Part== BRID )             // Barrel chains
00245         {
00246                 if( m_Name[1] == 'E' )  // East end, only even number layer chain, layer id: 1, 3, 5, 7
00247                 {
00248                         // Section number is defined by m_FecTotal/m_FecPerLayer
00249                         // Some sections of chain inverting default firstStripID sequence
00250                         
00251                         if(m_Segment==BRTOP)    // BRTOP segment is exceptive, FirstStripID sequence is 64,96,80,48
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: ;               // Segment 0, 1, 5, section 0, 2: (+), 1, 3: (-)
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 :       // Other segments 
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' ) // West end, even number layer chain, layer id: 1, 3, 5, 7
00272                 {
00273         switch(m_Segment)
00274       {
00275         case 0: ;               // Segment 0, 1, 2, 5
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:        // Other segments 
00283             for(int i=0; i<m_FecTotal; i++)
00284                                                         m_FirstStripID[i] = FIRST_STRID_SQC_BWB[i%m_FecPerLayer ];
00285       }
00286                 } 
00287                 else                    // West end, odd number layer chain, layer id: 0, 2, 4, 6
00288                 {       
00289       switch(m_Segment)
00290       {
00291         case 0: ;               // Segment 0, 1, 2, 5
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 :               // Other segments 
00299             for(int i=0; i<m_FecTotal; i++)
00300                                                         m_FirstStripID[i] = FIRST_STRID_SQC_BWA[ i%m_FecPerLayer ];
00301       }
00302                 }
00303 
00304                 // for all chains in Barrel, section 0, 2, 4: (+), 1, 3: (-), inverting 1, 3;
00305                 for(int j=1; j<m_FecTotal/m_FecPerLayer; j+=2) 
00306                         MucChain::ArrayInvert( &m_FirstStripID[j*m_FecPerLayer], m_FecPerLayer );
00307         }               // End barrel chains
00308         else            // Endcap chains
00309         {       
00310                 // Set default firstStripID order(+), no inverting
00311                 for(int i=0; i<m_FecTotal; i++)
00312                         m_FirstStripID[i] = FIRST_STRID_SQC_EC[ i%m_FecPerLayer ];
00313         }
00314 
00315         // If fecOrder inverting
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 //      cout << "MucChain:: EncodeVmeRecord()." <<endl;
00325         unsigned int record = ((module << MODULE_BIT) | (socket << SOCKET_BIT) | fecID);
00326         return ( (record << LENGTH) | data );
00327 }
00328 
00329 // All FECs
00330 void MucChain :: InitStripOrder()
00331 {
00332 //      cout << "MucChain:: InitStripOrder()." << endl;
00333 
00334         
00335   for(int i=0; i<m_FecTotal; i++)
00336         {       
00337                 if( m_Part == BRID ) // Barrel                  
00338                 {
00339                         m_StripOrder[i] = -1;
00340 /*                      
00341                         if( m_Name[1] == 'E' )  // East end, only even number layer chain, layer id: 1, 3, 5, 7
00342                         {       
00343                                 // Section number is defined by m_FecTotal/m_FecPerLayer
00344                                 // Some sections of chain inverting default strip order
00345                         
00346                                 if(m_Segment==BRTOP)    //Strip order is +1, -1, +1, -1
00347                                         
00348                                 {
00349                                         for(int i=0; i<m_FecTotal; i++)
00350                                                 m_StripOrder[i] = STRORDER_BETOP[i%m_FecPerLayer ];
00351                                 }
00352                                 else switch(m_Segment)
00353                                 {
00354                                         case 0: ;               // Segment 0, 1, 5, section 0, 2: (--+), 1, 3: (+--)
00355                                         case 1: ;
00356                                         case 5:
00357                                                 for(int i=0; i<m_FecTotal; i++)
00358                                                         m_StripOrder[i] = STRORDER_BEA[i%m_FecPerLayer ];
00359                                                 break;
00360                                         default :       // Other segments 
00361                                                 for(int i=0; i<m_FecTotal; i++)
00362                                                         m_StripOrder[i] = STRORDER_BEB[i%m_FecPerLayer ];
00363                                 }                       
00364                         }
00365                         else if( m_Name[1] == 'W' ) // West end, even number layer chain, layer id: 1, 3, 5, 7
00366                         {
00367                                 switch(m_Segment)
00368                                 {
00369                                         case 0: ;               // Segment 0, 1, 2, 5, --+
00370                                         case 1: ;
00371                                         case 2: ;
00372                                         case 5:
00373                                                 for(int i=0; i<m_FecTotal; i++)
00374                                                         m_StripOrder[i] = STRORDER_BEA[i%m_FecPerLayer ];
00375                                                 break;
00376                                         default :               // Other segments, +-- 
00377                                                 for(int i=0; i<m_FecTotal; i++)
00378                                                         m_StripOrder[i] = STRORDER_BEB[i%m_FecPerLayer ];
00379                                 }
00380                         } 
00381                         else                    // West end, odd number layer chain, layer id: 0, 2, 4, 6
00382                         {       
00383                                 for(int i=0; i<m_FecTotal; i++)
00384                                         m_StripOrder[i] = STRORDER_BWO[ i%m_FecPerLayer ];
00385                         }
00386 
00387                         // for all chains in Barrel, section 0, 2, 4: (+), 1, 3: (-), inverting 1, 3;
00388                         for(int j=1; j<m_FecTotal/m_FecPerLayer; j+=2) 
00389                                 MucChain::ArrayInvert( &m_StripOrder[j*m_FecPerLayer], m_FecPerLayer );
00390 */
00391                 } // End Barrel         
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         } // End FecTotal       
00399 
00400 } 
00401 
00402 void MucChain :: InitFecVect()
00403 {
00404 //      cout << "MucChain:: InitFecVect()." << endl;
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                 // Encode FEC id by FecVect member number       
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 //    cout << "FEC:\t" << id << "\t" << (vmeRecord>>LENGTH) << endl;
00430                 
00431                 MucFec aFec( id, stripOrder, part, segment, layer, firstStripID, vmeRecord, chainName );
00432                 m_FecVect.push_back( aFec );
00433         }                                       
00434 }
00435 
00436 // END
00437 
00438 
00439 

Generated on Tue Nov 29 23:12:58 2016 for BOSS_7.0.2 by  doxygen 1.4.7