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

Go to the documentation of this file.
00001 //------------------------------------------------------------------------------|
00002 //      [File  ]:                       MucFec.cxx                              |
00003 //      [Brief ]:       Source file of class MucFec 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/MucFec.h"
00015 #include "MucMappingAlg/MucGeoConst.h"
00016 
00017 // Constructor
00018 MucFec :: MucFec(int id )
00019 {
00020         //cout << "MucFec:: Create FEC : " << id << endl;
00021 
00022         if( (id < 0) || (id > STRIP_NUM-1) )
00023   {
00024                 cout << "Initialize failure, check id!" << endl;
00025                 m_ID = 0;
00026         }
00027         else    m_ID = id;
00028         
00029         m_Part          = 0;
00030   m_Segment       = 0;
00031   m_Layer         = 0;
00032   m_FirstStripID  = 0;
00033   m_StripOrder    = DEFAULT_STRIP_ORDER;
00034         m_ChainName     = "NoName";
00035   m_VmeRecord     = 0;
00036 
00037         MucFec::Initialize();
00038 }
00039 
00040 MucFec :: MucFec( int id, int stripOrder, int part, int segment, int layer, int firstStripID, 
00041                   unsigned int vmeRecord, string chainName)
00042 {
00043 //      cout << "MucFec:: Create FEC : " << endl;
00044 //      cout << "ID: " << id << "\tPart: " << part << "\tSegment: " << segment << "\tLayer: " << layer 
00045 //           << "\tfirstStripID: " << firstStripID << "\tvmeRecord: " << vmeRecord<<endl;
00046 
00047         // Check parameters     
00048         if( (id < 0) || (id > STRIP_NUM-1) ) 
00049         {
00050                 m_ID =  0; 
00051                 cout << "MucFec::Check id:\t" << id << "!" << endl;
00052         }else
00053         if( (stripOrder != 1) && (stripOrder != -1) )
00054         {
00055                 m_StripOrder = 0;
00056                 cout << "MucFec::Check stripOrder:\t" << stripOrder << "!" << endl;
00057         }else
00058         if( (part < 0) || ( part > PART_MAX-1) )
00059         {
00060                 m_Part =  0;
00061                 cout << "MucFec::Check part:\t" << part << "!" << endl;
00062         }else
00063         if( (segment < 0) || ( segment > ((part==BRID)?(B_SEG_NUM-1):(E_SEG_NUM-1)) ) )
00064         {
00065                 m_Segment =  0;
00066                 cout << "MucFec::Check segment:\t" << segment << "!" << endl;
00067         }else
00068         if( (layer <0) || ( layer > ((part==BRID)?(B_LAY_NUM-1):(E_LAY_NUM-1)) ) )
00069         {
00070                 m_Layer = 0;
00071                 cout << "MucFec::Check layer:\t" << layer << "!" << endl;
00072         }else
00073         if( sizeof(vmeRecord) < 4 )
00074         {
00075                 m_VmeRecord = 0;
00076                 cout << "MucFec::Check record:\t" << vmeRecord << "!" << endl;
00077         }else
00078         {
00079     m_ID            = id;
00080           m_StripOrder    = stripOrder;
00081                 m_Part                                  = part;
00082                 m_Segment                               = segment;
00083                 m_Layer                                 = layer;
00084                 m_FirstStripID  = firstStripID;
00085                 m_ChainName                     = chainName;
00086     m_VmeRecord     = vmeRecord;
00087         }
00088         
00089         MucFec::Initialize();   
00090 }
00091 
00092 void MucFec :: Initialize()
00093 {
00094         MucFec::DecodeData();
00095   MucFec::DecodeVmeAddress();
00096         MucFec::SetFiredStripNumber();
00097   MucFec::SetFiredStripVect();
00098   MucFec::EncodePowerpcRecord();
00099 }
00100 
00101 //----------------------------------Set methods---------------------------------------
00102 void MucFec :: DecodeData()
00103 {
00104         m_Data = (unsigned short)m_VmeRecord;
00105 }       
00106 
00107 void MucFec :: DecodeVmeAddress() 
00108 {
00109   m_VmeAddress = (unsigned short)(m_VmeRecord >> LENGTH);       // high 16 bits, 10 bits used
00110         m_Module     = (m_VmeAddress >> MODULE_BIT) & 0xF;      // 4 bits
00111         m_Socket     = (m_VmeAddress >> SOCKET_BIT) & 0x3;      // 2 bits
00112         m_FecID      = m_VmeAddress & 0xF;                      // 4 bits       
00113 }
00114 
00115 void MucFec :: SetFiredStripNumber() 
00116 {
00117         m_FiredStripNumber = 0;
00118         for(int i=0; i<STRIP_NUM; i++)
00119         {
00120                 if( (m_Data>>i) & 1 ) 
00121                         m_FiredStripNumber++;
00122         }       
00123 }
00124 
00125 void MucFec :: SetFiredStripVect()
00126 {
00127         m_FiredStripVect.clear();
00128         int tempID[STRIP_NUM];
00129         int tempFired=0;
00130 
00131   for(int i=0; i<STRIP_NUM; i++)
00132   {
00133         if( (m_Data>>i) & 1 )
00134     {
00135                 tempID[tempFired] = i;  
00136                         tempFired++;
00137                 }       
00138   }
00139         
00140         int stripID = 0;        
00141         for(int i=0; i<tempFired; i++)
00142         {
00143                 stripID = ((1 - m_StripOrder)/2) * (STRIP_NUM - 1) + (m_StripOrder * tempID[i]);
00144                 stripID += m_FirstStripID;
00145                 m_FiredStripVect.push_back( stripID );
00146         }       
00147 }
00148 
00149 void MucFec :: EncodePowerpcRecord()
00150 {       
00151         unsigned int address = ( (m_Part<<PART_BIT) | (m_Segment<<SEG_BIT) | (m_Layer<<LAY_BIT) | m_FirstStripID );
00152         m_GeoAddress = (unsigned short)address;
00153         m_PowerpcRecord = ( address << LENGTH ) | m_Data;
00154 }
00155 
00156 void MucFec :: SetStripOrder( int stripOrder )
00157 {
00158         m_StripOrder = stripOrder;
00159         
00160         MucFec::SetFiredStripVect();    
00161 }
00162 
00163 void MucFec :: SetLocation( int part, int segment, int layer )
00164 {
00165         m_Part = part;
00166         m_Segment = segment;
00167         m_Layer = layer;
00168 
00169         MucFec::Initialize();
00170 }
00171 
00172 void MucFec :: SetFirstStripID( int firstStripID )
00173 {
00174         m_FirstStripID = firstStripID;
00175         MucFec :: EncodePowerpcRecord();
00176         MucFec :: SetFiredStripVect();
00177 }
00178 
00179 void MucFec :: SetData( unsigned short data )
00180 {
00181         m_Data      = data;
00182         m_VmeRecord = (m_VmeRecord | m_Data);
00183         MucFec :: EncodePowerpcRecord();
00184         MucFec :: SetFiredStripNumber();
00185         MucFec :: SetFiredStripVect();
00186 }
00187 
00188 
00189 
00190 //-------------------------- Get methods --------------------------------
00191 int          MucFec :: GetFiredStripNumber()   { return m_FiredStripNumber;    }
00192 
00193 unsigned int MucFec :: GetPowerpcRecord()      { return m_PowerpcRecord;       }
00194 
00195 vector< int >*  MucFec :: GetFiredStripVect()  { return &m_FiredStripVect;     }
00196 
00197 string MucFec :: GetBin( unsigned int record )
00198 {
00199         const int SIZE = sizeof( unsigned int ) * 8;
00200 
00201   string Bin;
00202   unsigned int temp = 0;
00203   for(int i=0; i<SIZE; i++)
00204   {
00205         temp = record >> SIZE-i-1;
00206     Bin += ( temp & 1 ) ? "1" : "0";
00207   }
00208 
00209   return Bin;
00210 }
00211 
00212 string MucFec :: GetBin( unsigned short record )
00213 {
00214         const int SIZE = sizeof( unsigned short ) * 8;
00215 
00216   string Bin;
00217   unsigned short temp = 0;
00218   for(int i=0; i<SIZE; i++)
00219   {
00220         temp = record >> SIZE-i-1;
00221     Bin += ( temp & 1 ) ? "1" : "0";
00222   }
00223 
00224   return Bin;
00225 }
00226 
00227 string MucFec :: GetVmeBin()
00228 {
00229         return MucFec::GetBin( m_VmeAddress );
00230 }
00231 
00232 string MucFec :: GetGeoBin()
00233 {
00234         return MucFec::GetBin( m_GeoAddress );
00235 }
00236 
00237 string MucFec :: GetDataBin()
00238 {
00239         return MucFec::GetBin( m_Data );
00240 }
00241 
00242 
00243 
00244 // END

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