BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
MucStripCal.cxx
Go to the documentation of this file.
1//------------------------------------------------------------------------------|
2// [File ]: MucStripCal.cxx |
3// [Brief ]: Class MucStripCal for MUC calibration |
4// [Author]: Xie Yuguang, <ygxie@mail.ihep.ac.cn> |
5// [Date ]: Apil 6, 2005 |
6//------------------------------------------------------------------------------|
7
8#include <cmath>
9#include <fstream>
10#include <iostream>
11
12using namespace std;
13
14#include "MucCalib/MucStripCal.h"
15#include "MucCalib/MucStructConst.h"
16
17// Constructor
18MucStripCal::MucStripCal( int part, int segment, int layer, int id )
19 : MucEntityCal( part, segment, layer, id ) {
21
22 // m_MucPadChain = NULL;
23}
24
25// Copy constructor
27 m_Type = other.m_Type;
28 m_CenterLine = other.m_CenterLine;
29 m_Head = other.m_Head;
30 m_Tail = other.m_Tail;
31 m_Phi = other.m_Phi;
32
33 // m_MucPadChain = other.m_MucPadChain;
34}
35
36// Operator =
38 if ( this == &other ) return *this;
39
41
42 m_Type = other.m_Type;
43 m_CenterLine = other.m_CenterLine;
44 m_Head = other.m_Head;
45 m_Tail = other.m_Tail;
46 m_Phi = other.m_Phi;
47
48 // m_MucPadChain = other.m_MucPadChain;
49
50 return *this;
51}
52
53// Destructor
55 // delete m_MucPadChain;
56 ;
57}
58
59// Initialize
61 SetType();
62 SetW();
63 SetWu();
64 SetWd();
65 SetCenterLine(); // use strip width
66 SetHead();
67 SetTail();
68 SetPhi();
69
70 SetThin();
71 SetH();
72 SetL();
73 SetArea();
75}
76
77// ---------------------------------Get methods ------------------------
78
79int MucStripCal::GetType() { return m_Type; }
80double MucStripCal::GetCenterLine() { return m_CenterLine; }
81double MucStripCal::GetHead() { return m_Head; }
82double MucStripCal::GetTail() { return m_Tail; }
83double MucStripCal::GetPhi() { return m_Phi; }
84int MucStripCal::GetPadNumber() { return m_PadNumber; }
85
86/*
87MucPadChain* MucStripCal::GetPadChain( )
88{
89 if( m_MucPadChain != NULL )
90 return m_MucPadChain;
91 else
92 return ( m_MucPadChain = new MucPadChain( m_Part, m_Segment, m_Layer, m_PadNumber ) );
93}
94*/
95
96//-----------------------------------Set methods-------------------------
97// Set strip type(readout direction)
99 if ( m_Part == BRID )
100 {
101 if ( ( m_Layer + 1 ) % 2 == 1 ) m_Type = ZSTR;
102 else m_Type = PHISTR;
103 }
104 else
105 {
106 if ( ( m_Layer + 1 ) % 2 == 1 ) m_Type = XSTR;
107 else m_Type = YSTR;
108 }
109}
110
111// Set x or y of endcap strip certerline in BES coordinate system
113 // Base on strips width and structure correlations
114 // Endcap only
115
116 int segFlag = 0;
117
118 if ( ( m_Layer + 1 ) % 2 == 1 ) // 1,3,5,7
119 {
120 if ( m_Segment < 2 ) segFlag = 1;
121 else segFlag = -1;
122
123 if ( m_ID != E_STR_NUM - 1 ) // NO.1~62
124 m_CenterLine = segFlag * ( E_XSTR_OFFSET + m_ID * E_STR_DST );
125 else // NO.63 end strip
126 m_CenterLine = segFlag * ( E_XSTR_OFFSET + ( E_STR_NUM - 2 ) * E_STR_DST +
127 ( E_STR_DST + m_W + STR_GAP ) / 2 );
128 }
129 else // 2,4,6,8
130 {
131 if ( m_Segment % 3 == 0 ) segFlag = 1;
132 else segFlag = -1;
133
134 if ( m_ID != E_STR_NUM - 1 ) // NO.1~62
135 m_CenterLine = segFlag * ( E_YSTR_OFFSET + m_ID * E_STR_DST );
136 else // NO.63 end strip
137 m_CenterLine = segFlag * ( E_YSTR_OFFSET + ( E_STR_NUM - 2 ) * E_STR_DST +
138 ( E_STR_DST + m_W + STR_GAP ) / 2 );
139 }
140}
141
142// Set x and y of the head of endcap strip in BES coordinate system
144 int segFlag = 0;
145
146 // base on strips width and correlations
147 if ( m_ID + 1 < TURN_STR_ID[m_Layer][0] ) m_Head = FIRST_TURN_HEAD[m_Layer][0];
148
149 if ( m_ID + 1 == TURN_STR_ID[m_Layer][0] ) m_Head = FIRST_TURN_HEAD[m_Layer][1];
150
151 if ( ( m_ID + 1 > TURN_STR_ID[m_Layer][0] ) && ( m_ID + 1 <= TURN_STR_ID[m_Layer][1] ) )
152 m_Head = FIRST_TURN_HEAD[m_Layer][1] - ( m_ID + 1 - TURN_STR_ID[m_Layer][0] ) * E_STR_DST;
153
154 if ( m_ID + 1 > TURN_STR_ID[m_Layer][1] ) m_Head = SECOND_TURN_HEAD[m_Layer % 2];
155
156 if ( ( m_Layer + 1 ) % 2 == 1 ) // 1,3,5,7
157 {
158 if ( m_Segment % 3 == 0 ) segFlag = 1;
159 else segFlag = -1;
160 }
161 else // 2,4,6,8
162 {
163 if ( m_Segment < 2 ) segFlag = 1;
164 else segFlag = -1;
165 }
166
167 m_Head *= segFlag;
168}
169
170// Set x and y of the tail of endcap strip in BES coordinate system
172 int segFlag = 0;
173
174 if ( ( m_Layer + 1 ) % 2 == 1 ) // 1,3,5,7
175 {
176 if ( m_Segment % 3 == 0 ) segFlag = 1;
177 else segFlag = -1;
178
179 if ( m_ID + 1 < TURN_POINT_NUM ) m_Tail = ODD_TURN_POINT_TAIL[( m_Layer == 0 ) ? 0 : 1][0];
180 if ( m_ID + 1 == TURN_POINT_NUM )
181 m_Tail = ODD_TURN_POINT_TAIL[( m_Layer == 0 ) ? 0 : 1][1];
182 if ( m_ID + 1 > TURN_POINT_NUM )
183 m_Tail = ODD_TURN_POINT_TAIL[( m_Layer == 0 ) ? 0 : 1][1] -
184 ( m_ID + 1 - TURN_POINT_NUM ) * E_STR_DST;
185 if ( m_ID == E_STR_NUM - 1 )
186 m_Tail = ODD_TURN_POINT_TAIL[( m_Layer == 0 ) ? 0 : 1][1] -
187 ( m_ID - TURN_POINT_NUM ) * E_STR_DST - ( E_STR_DST + m_W + STR_GAP ) / 2;
188 }
189 else // 2,4,6,8
190 {
191 if ( m_Segment < 2 ) segFlag = 1;
192 else segFlag = -1;
193
194 if ( m_ID + 1 < TURN_POINT_NUM ) m_Tail = EVEN_TURN_POINT_TAIL[0];
195 if ( m_ID + 1 == TURN_POINT_NUM ) m_Tail = EVEN_TURN_POINT_TAIL[1];
196 if ( m_ID + 1 > TURN_POINT_NUM )
197 m_Tail = EVEN_TURN_POINT_TAIL[1] - ( m_ID + 1 - TURN_POINT_NUM ) * E_STR_DST;
198 if ( m_ID == E_STR_NUM - 1 )
199 m_Tail = EVEN_TURN_POINT_TAIL[1] - ( m_ID - TURN_POINT_NUM ) * E_STR_DST -
200 ( E_STR_DST + m_W + STR_GAP ) / 2;
201 }
202
203 m_Tail *= segFlag;
204}
205
206// Set inclination angle of local coordinate x axis and global coordinate x axis
208 if ( m_Part == BRID ) // barrel
209 m_Phi = B_PHI[m_Segment] * ( PI / 4.0 );
210 else // endcap , all phi is zer
211 m_Phi = 0.;
212}
213
214// set strip thickness
215void MucStripCal::SetThin() { m_Thin = STR_TH; }
216
217// Set strip width
219 if ( m_Part == BRID )
220 {
221 // Set maximum strip
222 int maxStrip;
223 if ( ( m_Layer + 1 ) % 2 == 1 ) maxStrip = B_ZSTR_NUM; // odd layer
224 else if ( m_Segment != B_TOP ) maxStrip = B_PHISTR_NUM; // even layer not top segment
225 else maxStrip = B_TOPSTR_NUM; // even layer top segment
226
227 if ( ( m_Layer + 1 ) % 2 == 1 ) // odd layer, z
228 {
229 if ( m_ID > 0 && m_ID < ( maxStrip - 1 ) ) // not marginal strip
230 m_W = B_STR_DST[m_Layer] - STR_GAP;
231 else // marginal strip
232 m_W = ( B_BOX_WT[m_Layer] - 2 * B_BOX_DT[SL_DOWN] -
233 ( maxStrip - 2 ) * B_STR_DST[m_Layer] - STR_GAP ) /
234 2;
235 }
236 else // even layer, phi
237 {
238 if ( m_ID > 0 && m_ID < ( maxStrip - 1 ) ) // not marginal strip
239 m_W = B_STR_DST[m_Layer] - STR_GAP;
240 else // marginal strip
241 m_W = B_BOX_LT / 2 - B_BOX_DZ[SL_DOWN] - B_STR_DST[m_Layer] * ( B_PHISTR_NUM - 2 ) / 2;
242
243 if ( ( maxStrip == B_TOPSTR_NUM ) && ( m_ID == ( B_PHISTR_NUM - 1 ) ) ) // special
244 // marginal strip
245 m_W = B_BOX_LT / 2 - B_BOX_DZ[SL_DOWN] - B_STR_DST[m_Layer] * ( B_PHISTR_NUM - 2 ) / 2;
246 }
247 }
248 else
249 {
250 // Strip0~62: 33;
251 // Strip63: L0: 34; L2/4/6: 43; L1/3/5/7: 53
252 if ( m_ID != E_STR_NUM - 1 ) m_W = E_STR_WT; // NO.1~62
253 else // NO.63, end strip
254 {
255 if ( ( m_Layer + 1 ) % 2 != 0 ) // 0,2,4,6
256 {
257 if ( m_Layer == 0 ) m_W = 34;
258 else m_W = 43;
259 }
260 else m_W = 53; // 1,3,5,7
261 }
262 }
263}
264
265// Set strip Wu, no use
267
268// Set strip Wd, no use
270
271// Set strip height
272void MucStripCal::SetH() { m_H = STR_TH; }
273
274// Set strip length
276 if ( m_Part == BRID ) // barrel
277 {
278 int ZCUT_HEAD_NUM = B_ZSTR_NUM / 2 - B_ZSTR_CUT_NUM[m_Layer] - 1;
279 int ZCUT_TAIL_NUM = B_ZSTR_NUM / 2 + B_ZSTR_CUT_NUM[m_Layer];
280
281 if ( m_Segment != B_TOP ) // not top segment
282 {
283 if ( ( m_Layer + 1 ) % 2 == 1 ) // odd layer, Z
284 m_L = B_BOX_LT - 2 * B_BOX_DZ[SL_DOWN];
285 else // even layer, phi
286 m_L = B_BOX_WT[m_Layer] - 2 * B_BOX_DZ[SL_DOWN];
287 }
288 else // top segment
289 {
290 if ( ( m_Layer + 1 ) % 2 == 1 ) // odd layer, z
291 {
292 if ( m_ID > ZCUT_HEAD_NUM && m_ID < ZCUT_TAIL_NUM ) // be cut
293 {
294 if ( m_Layer == 0 ) m_L = B_BOX_LT - 2 * B_BOX_DZ[SL_DOWN] - B_ZSTR_CUT[1];
295 else m_L = B_BOX_LT - 2 * B_BOX_DZ[SL_DOWN] - B_ZSTR_CUT[0];
296 }
297 else // no cut
298 m_L = B_BOX_LT - 2 * B_BOX_DZ[SL_DOWN];
299 }
300 else // even layer, phi
301 {
302 if ( m_ID < B_PHISTR_CUT_NUM ) // no cut
303 m_L = B_BOX_WT[m_Layer] - 2 * B_BOX_DZ[SL_DOWN];
304 else // be cut
305 m_L = ( B_BOX_WT[m_Layer] - 2 * B_BOX_DZ[SL_DOWN] - B_PHISTR_CUT ) / 2;
306 }
307 }
308 }
309 else // endcap
310 { m_L = fabs( m_Head - m_Tail ); }
311}
312
313// Set area(cm^2)
314void MucStripCal::SetArea() { m_Area = m_W * m_L / 100; }
315
316// Set Pad number of strip
318 int n = 0;
319 double fn = 0;
320
321 if ( m_W == 0 )
322 {
323 cout << "Error, strip width = 0!" << endl;
324 m_PadNumber = 0;
325 }
326 else
327 {
328 fn = ( m_L / m_W );
329 n = (int)fn;
330
331 if ( ( fn - n ) > 0.3 ) m_PadNumber = n + 1;
332 else m_PadNumber = n;
333 }
334}
335
336// END
const Int_t n
#define PI
const double SECOND_TURN_HEAD[2]
const double EVEN_TURN_POINT_TAIL[2]
const double ODD_TURN_POINT_TAIL[2][2]
const int TURN_STR_ID[8][2]
const double FIRST_TURN_HEAD[8][2]
MucEntityCal(int part, int segment, int layer)
MucEntityCal & operator=(const MucEntityCal &other)
void SetPadNumber()
virtual void SetArea()
virtual void SetH()
double GetTail()
virtual void SetThin()
virtual void Init()
double GetPhi()
double GetCenterLine()
virtual void SetWu()
MucStripCal(int part, int segment, int layer, int id)
int GetPadNumber()
double GetHead()
virtual void SetW()
virtual void SetWd()
void SetCenterLine()
MucStripCal & operator=(const MucStripCal &other)
virtual ~MucStripCal()
virtual void SetL()