00001
00002
00003
00004
00005
00006
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
00018 MucFec :: MucFec(int id )
00019 {
00020
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
00044
00045
00046
00047
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
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);
00110 m_Module = (m_VmeAddress >> MODULE_BIT) & 0xF;
00111 m_Socket = (m_VmeAddress >> SOCKET_BIT) & 0x3;
00112 m_FecID = m_VmeAddress & 0xF;
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
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