BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
MucFec.cxx
Go to the documentation of this file.
1//------------------------------------------------------------------------------|
2// [File ]: MucFec.cxx |
3// [Brief ]: Source file of class MucFec for electronics mapping |
4// [Author]: Xie Yuguang, <ygxie@mail.ihep.ac.cn> |
5// [Date ]: Jun 7, 2006 |
6// [Log ]: See ChangLog |
7//------------------------------------------------------------------------------|
8
9#include <iostream>
10#include <vector>
11
12using namespace std;
13
16
17// Constructor
18MucFec ::MucFec( int id ) {
19 // cout << "MucFec:: Create FEC : " << id << endl;
20
21 if ( ( id < 0 ) || ( id > STRIP_NUM - 1 ) )
22 {
23 cout << "Initialize failure, check id!" << endl;
24 m_ID = 0;
25 }
26 else m_ID = id;
27
28 m_Part = 0;
29 m_Segment = 0;
30 m_Layer = 0;
31 m_FirstStripID = 0;
32 m_StripOrder = DEFAULT_STRIP_ORDER;
33 m_ChainName = "NoName";
34 m_VmeRecord = 0;
35
36 MucFec::Initialize();
37}
38
39MucFec ::MucFec( int id, int stripOrder, int part, int segment, int layer, int firstStripID,
40 unsigned int vmeRecord, string chainName ) {
41 // cout << "MucFec:: Create FEC : " << endl;
42 // cout << "ID: " << id << "\tPart: " << part << "\tSegment: " << segment << "\tLayer: " <<
43 // layer
44 // << "\tfirstStripID: " << firstStripID << "\tvmeRecord: " << vmeRecord<<endl;
45
46 // Check parameters
47 if ( ( id < 0 ) || ( id > STRIP_NUM - 1 ) )
48 {
49 m_ID = 0;
50 cout << "MucFec::Check id:\t" << id << "!" << endl;
51 }
52 else if ( ( stripOrder != 1 ) && ( stripOrder != -1 ) )
53 {
54 m_StripOrder = 0;
55 cout << "MucFec::Check stripOrder:\t" << stripOrder << "!" << endl;
56 }
57 else if ( ( part < 0 ) || ( part > PART_MAX - 1 ) )
58 {
59 m_Part = 0;
60 cout << "MucFec::Check part:\t" << part << "!" << endl;
61 }
62 else if ( ( segment < 0 ) ||
63 ( segment > ( ( part == BRID ) ? ( B_SEG_NUM - 1 ) : ( E_SEG_NUM - 1 ) ) ) )
64 {
65 m_Segment = 0;
66 cout << "MucFec::Check segment:\t" << segment << "!" << endl;
67 }
68 else if ( ( layer < 0 ) ||
69 ( layer > ( ( part == BRID ) ? ( B_LAY_NUM - 1 ) : ( E_LAY_NUM - 1 ) ) ) )
70 {
71 m_Layer = 0;
72 cout << "MucFec::Check layer:\t" << layer << "!" << endl;
73 }
74 else if ( sizeof( vmeRecord ) < 4 )
75 {
76 m_VmeRecord = 0;
77 cout << "MucFec::Check record:\t" << vmeRecord << "!" << endl;
78 }
79 else
80 {
81 m_ID = id;
82 m_StripOrder = stripOrder;
83 m_Part = part;
84 m_Segment = segment;
85 m_Layer = layer;
86 m_FirstStripID = firstStripID;
87 m_ChainName = chainName;
88 m_VmeRecord = vmeRecord;
89 }
90
91 MucFec::Initialize();
92}
93
94void MucFec ::Initialize() {
95 MucFec::DecodeData();
96 MucFec::DecodeVmeAddress();
97 MucFec::SetFiredStripNumber();
98 MucFec::SetFiredStripVect();
99 MucFec::EncodePowerpcRecord();
100}
101
102//----------------------------------Set methods---------------------------------------
103void MucFec ::DecodeData() { m_Data = (unsigned short)m_VmeRecord; }
104
105void MucFec ::DecodeVmeAddress() {
106 m_VmeAddress = (unsigned short)( m_VmeRecord >> LENGTH ); // high 16 bits, 10 bits used
107 m_Module = ( m_VmeAddress >> MODULE_BIT ) & 0xF; // 4 bits
108 m_Socket = ( m_VmeAddress >> SOCKET_BIT ) & 0x3; // 2 bits
109 m_FecID = m_VmeAddress & 0xF; // 4 bits
110}
111
112void MucFec ::SetFiredStripNumber() {
113 m_FiredStripNumber = 0;
114 for ( int i = 0; i < STRIP_NUM; i++ )
115 {
116 if ( ( m_Data >> i ) & 1 ) m_FiredStripNumber++;
117 }
118}
119
120void MucFec ::SetFiredStripVect() {
121 m_FiredStripVect.clear();
122 int tempID[STRIP_NUM];
123 int tempFired = 0;
124
125 for ( int i = 0; i < STRIP_NUM; i++ )
126 {
127 if ( ( m_Data >> i ) & 1 )
128 {
129 tempID[tempFired] = i;
130 tempFired++;
131 }
132 }
133
134 int stripID = 0;
135 for ( int i = 0; i < tempFired; i++ )
136 {
137 stripID = ( ( 1 - m_StripOrder ) / 2 ) * ( STRIP_NUM - 1 ) + ( m_StripOrder * tempID[i] );
138 stripID += m_FirstStripID;
139 m_FiredStripVect.push_back( stripID );
140 }
141}
142
143void MucFec ::EncodePowerpcRecord() {
144 unsigned int address = ( ( m_Part << PART_BIT ) | ( m_Segment << SEG_BIT ) |
145 ( m_Layer << LAY_BIT ) | m_FirstStripID );
146 m_GeoAddress = (unsigned short)address;
147 m_PowerpcRecord = ( address << LENGTH ) | m_Data;
148}
149
150void MucFec ::SetStripOrder( int stripOrder ) {
151 m_StripOrder = stripOrder;
152 MucFec::SetFiredStripVect();
153}
154
155void MucFec ::SetLocation( int part, int segment, int layer ) {
156 m_Part = part;
157 m_Segment = segment;
158 m_Layer = layer;
159
160 MucFec::Initialize();
161}
162
163void MucFec ::SetFirstStripID( int firstStripID ) {
164 m_FirstStripID = firstStripID;
165 MucFec ::EncodePowerpcRecord();
166 MucFec ::SetFiredStripVect();
167}
168
169void MucFec ::SetData( unsigned short data ) {
170 m_Data = data;
171 m_VmeRecord = ( m_VmeRecord | m_Data );
172 MucFec ::EncodePowerpcRecord();
173 MucFec ::SetFiredStripNumber();
174 MucFec ::SetFiredStripVect();
175}
176
177//-------------------------- Get methods --------------------------------
178int MucFec ::GetFiredStripNumber() { return m_FiredStripNumber; }
179unsigned int MucFec ::GetPowerpcRecord() { return m_PowerpcRecord; }
180vector<int>* MucFec ::GetFiredStripVect() { return &m_FiredStripVect; }
181
182string MucFec ::GetBin( unsigned int record ) {
183 const int SIZE = sizeof( unsigned int ) * 8;
184
185 string Bin;
186 unsigned int temp = 0;
187 for ( int i = 0; i < SIZE; i++ )
188 {
189 temp = record >> SIZE - i - 1;
190 Bin += ( temp & 1 ) ? "1" : "0";
191 }
192
193 return Bin;
194}
195
196string MucFec ::GetBin( unsigned short record ) {
197 const int SIZE = sizeof( unsigned short ) * 8;
198
199 string Bin;
200 unsigned short temp = 0;
201 for ( int i = 0; i < SIZE; i++ )
202 {
203 temp = record >> SIZE - i - 1;
204 Bin += ( temp & 1 ) ? "1" : "0";
205 }
206
207 return Bin;
208}
209
210string MucFec ::GetVmeBin() { return MucFec::GetBin( m_VmeAddress ); }
211
212string MucFec ::GetGeoBin() { return MucFec::GetBin( m_GeoAddress ); }
213
214string MucFec ::GetDataBin() { return MucFec::GetBin( m_Data ); }
215
216// END
TTree * data
string GetBin(unsigned int record)
Definition MucFec.cxx:182