BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
MucGas.cxx
Go to the documentation of this file.
1//------------------------------------------------------------------------------|
2// [File ]: MucGas.cxx |
3// [Brief ]: MUC geometry mixture gas creating class |
4// [Author]: Xie Yuguang, <ygxie@mail.ihep.ac.cn> |
5// [Date ]: May 22, 2005 |
6//------------------------------------------------------------------------------|
7
8#include <cmath>
9#include <iostream>
10
13
14using namespace std;
15
16// Constructor
17MucGas::MucGas( int part, int segment, int layer, int upDown, int rpcId, int id )
18 : MucEntity( part, segment, layer, upDown, rpcId, id ) {
20}
21
22// Copy constructor
23MucGas::MucGas( const MucGas& other ) : MucEntity( other ) { m_Phi = other.m_Phi; }
24
25// Operator =
27 if ( this == &other ) return *this;
28 MucEntity::operator=( other );
29 m_Phi = other.m_Phi;
30
31 return *this;
32}
33
34// Destructor
36
37// Initialize
39 SetPhi();
40 SetTheta();
41 SetRin();
42 SetRout();
43 SetRc();
44
45 SetThin();
46 SetW();
47 SetWu();
48 SetWd();
49 SetH();
50 SetL();
51
54
58}
59
60// -------------------------- Get methods ----------------------------
61
62double MucGas::GetPhi() { return m_Phi; }
63
64// ---------------------------Set motheds -----------------------------
65
66// Set inclination angle of local coordinate x axis and global coordinate x axis
68 if ( m_Part == BRID ) m_Phi = B_PHI[m_Segment] * ( MUC_PI / 4.0 );
69 else m_Phi = 0.;
70}
71
73 if ( m_Part == BRID ) m_Theta = m_Segment * ( MUC_PI / 4.0 );
74 else
75 {
76 if ( m_UpDown == SL_UP ) m_Theta = ( MUC_PI / 4.0 ) + ( 1 - m_RpcId ) * MUC_PI / 8.0;
77 else
78 {
79 if ( m_RpcId < 2 ) // RPC NO.1 and NO.2
80 m_Theta = ( MUC_PI / 4.0 ) + MUC_PI / 8.0;
81 else if ( m_RpcId == 2 ) // center RPC, NO.3
82 m_Theta = ( MUC_PI / 4.0 );
83 else m_Theta = ( MUC_PI / 4.0 ) - MUC_PI / 8.0;
84 }
85 }
86}
87
89 if ( m_Part == BRID ) // Rin of gas( same as which of RPC )
90 m_Rin = B_AS_RMIN[m_Layer] - AS_GAP / 2.0 +
91 ( 1 - 2 * m_UpDown ) * ( STR_TH + RPC_TH ) / 2.0 - GAS_TH / 2.0;
92 else // Rin of RPC
93 m_Rin = E_GP_RMIN[m_Layer] + E_STRPLN_DR + ( 1 - m_UpDown ) * RPC_SL_OFFSET;
94}
95
97 if ( m_Part == BRID )
98 m_Rout = B_AS_RMIN[m_Layer] - AS_GAP / 2.0 +
99 ( 1 - 2 * m_UpDown ) * ( STR_TH + RPC_TH ) / 2.0 + GAS_TH / 2.0;
100 else
101 m_Rout = E_AS_RMAX - E_BOX_DR - E_STRPLN_DB[( m_Layer == 0 ) ? 0 : 1] +
102 ( m_UpDown - 1 ) * RPC_SL_OFFSET;
103}
104
105void MucGas::SetRc() { m_Rc = ( m_Rin + m_Rout ) / 2.0; }
106
107void MucGas::SetThin() { m_Thin = GAS_TH; }
108
110 if ( m_Part == BRID )
111 {
112 if ( m_Segment == B_TOP && m_RpcId < 2 ) // the first 2 gases in top segment
113 {
114 if ( ( m_Layer + 1 ) % 2 == 1 ) // odd layer
115 m_W = ( B_BOX_WT[m_Layer] - 2 * B_BOX_DT[m_UpDown] - 2 * B_BOX_DZ[m_UpDown] -
116 B_BOX_SLOT_WT ) /
117 2.0;
118 else // even layer
119 m_W = ( B_BOX_WT[m_Layer] - 4 * B_BOX_DZ[m_UpDown] - B_BOX_SLOT_WT ) / 2.0;
120 }
121 else // other gases
122 {
123 if ( ( m_Layer + 1 ) % 2 == 1 ) // odd layer
124 m_W = B_BOX_WT[m_Layer] - 2 * B_BOX_DT[m_UpDown];
125 else // even layer
126 m_W = B_BOX_WT[m_Layer] - 2 * B_BOX_DZ[m_UpDown];
127 }
128 } // End barrel
129 else
130 {
131 if ( m_UpDown == SL_UP ) // up layer
132 {
133 if ( m_RpcId == 0 ) m_W = VALUE * m_Rc - E_GP_DX - E_STRPLN_DA - RPC_SL_OFFSET;
134 else if ( m_RpcId == 1 ) m_W = 2 * VALUE * m_Rc;
135 else m_W = VALUE * m_Rc - E_GP_DY - E_STRPLN_DA - RPC_SL_OFFSET;
136 }
137 else // down layer
138 {
139 switch ( m_RpcId )
140 {
141 case 0: m_W = VALUE * m_Rc - E_GP_DX - E_STRPLN_DA; break;
142 case 1:
143 case 3: m_W = VALUE * ( m_Rc - m_Rin ); break;
144 case 2: m_W = 2 * VALUE * m_Rin; break;
145 case 4: m_W = VALUE * m_Rc - E_GP_DY - E_STRPLN_DA; break;
146 default:;
147 }
148 }
149 } // else, endcap
150
151 // cut rpc chamber death edge
152 if ( m_Part == BRID ) m_W -= RPC_DEATH_EDGE * 2.0;
153 else
154 {
155 if ( m_UpDown == SL_UP )
156 {
157 if ( m_RpcId == 1 ) m_W -= RPC_DEATH_EDGE * 2.0; // center rpc
158 else m_W -= ( 1 + 1.0 / cos( MUC_PI / 8.0 ) ) * RPC_DEATH_EDGE;
159 }
160 else
161 {
162 if ( m_RpcId == 2 ) // center rpc
163 m_W -= RPC_DEATH_EDGE * 2.0;
164 else // DOWN 0,1,3,4 RPC
165 m_W -= RPC_DEATH_EDGE;
166 }
167 }
168}
169
171 if ( m_Part == BRID ) m_H = GAS_TH;
172 else
173 {
174 m_H = m_Rout - m_Rin;
175
176 // cut rpc chamber death edge
177 if ( m_UpDown == SL_DOWN && ( m_ID == 1 || m_ID == 3 ) )
178 m_H -= RPC_DEATH_EDGE * ( 1 + 1.0 / VALUE );
179 else m_H -= RPC_DEATH_EDGE * 2.0;
180 }
181}
182
184 if ( m_Part == BRID ) // barrel
185 {
186 if ( m_Segment != B_TOP ) // not top segment
187 {
188 // the first rpc of SL_DOWN is constructed as the same as the last rpc of SL_UP
189 if ( ( m_UpDown == SL_UP && m_RpcId == 3 ) || ( m_UpDown == SL_DOWN && m_RpcId == 0 ) )
190 {
191 if ( m_Layer != 1 ) // not layer NO.2
192 m_L = B_BOX_LT - 2 * B_BOX_DZ[m_UpDown] - 3 * B_RPC_LTN;
193 else // layer NO.2 is special
194 m_L = B_BOX_LT - 2 * B_BOX_DZ[m_UpDown] - 3 * B_RPC_LTS;
195 }
196 else
197 {
198 if ( m_Layer != 1 ) // not layer NO.2
199 m_L = B_RPC_LTN;
200 else // layer NO.2 is special
201 m_L = B_RPC_LTS;
202 }
203 }
204 else // top segment
205 {
206 if ( m_RpcId < 2 ) // RPC NO.1 and NO.2
207 m_L = B_TOPRPC_LTS[( ( m_Layer == 0 ) ? 1 : ( m_Layer % 2 ) )];
208 else if ( ( m_UpDown == SL_UP && m_RpcId == 4 ) ||
209 ( m_UpDown == SL_DOWN && m_RpcId == 2 ) )
210 m_L = B_BOX_LT - B_TOPRPC_LTS[( ( m_Layer == 0 ) ? 1 : ( m_Layer % 2 ) )] -
211 2 * ( B_BOX_DZ[m_UpDown] + B_RPC_LTN );
212 else m_L = B_RPC_LTN;
213 } // else, top segment
214
215 m_L -= RPC_DEATH_EDGE * 2.0; // cut rpc chamber death edge
216
217 } // End barrel
218 else // endcap
219 m_L = GAS_TH;
220}
221
223 if ( m_Part == BRID ) m_Wu = m_W;
224 else
225 {
226 if ( m_UpDown == SL_UP )
227 {
228 if ( m_RpcId == 0 ) m_Wu = VALUE * m_Rin - E_GP_DX - E_STRPLN_DA - RPC_SL_OFFSET;
229 else if ( m_RpcId == 1 ) m_Wu = 2.0 * VALUE * m_Rin;
230 else m_Wu = VALUE * m_Rin - E_GP_DY - E_STRPLN_DA - RPC_SL_OFFSET;
231 }
232 else
233 {
234 switch ( m_RpcId )
235 {
236 case 0: m_Wu = VALUE * m_Rin - E_GP_DX - E_STRPLN_DA; break;
237 case 1:
238 case 3: m_Wu = 0.; break;
239 case 2: m_Wu = 2.0 * VALUE * m_Rin; break;
240 case 4: m_Wu = VALUE * m_Rin - E_GP_DY - E_STRPLN_DA; break;
241 default:;
242 }
243 }
244
245 // cut rpc chamber death edge
246 if ( m_Wu > 0.0 )
247 {
248 if ( m_UpDown == SL_UP )
249 {
250 if ( m_RpcId == 1 ) m_Wu -= RPC_DEATH_EDGE * 2.0; // center rpc
251 else m_Wu -= ( 1 + 1.0 / cos( MUC_PI / 8.0 ) ) * RPC_DEATH_EDGE;
252 }
253 else
254 {
255 if ( m_RpcId == 2 ) // center rpc
256 m_Wu -= RPC_DEATH_EDGE * 2.0;
257 else // DOWN 0,4 RPC
258 m_W -= RPC_DEATH_EDGE;
259 }
260 }
261 } // else, endcap
262}
263
265 if ( m_Part == BRID ) m_Wd = m_W;
266 else
267 {
268 if ( m_UpDown == SL_UP )
269 {
270 if ( m_RpcId == 0 ) m_Wd = VALUE * m_Rout - E_GP_DX - E_STRPLN_DA - RPC_SL_OFFSET;
271 else if ( m_RpcId == 1 ) m_Wd = 2.0 * VALUE * m_Rout;
272 else m_Wd = VALUE * m_Rout - E_GP_DY - E_STRPLN_DA - RPC_SL_OFFSET;
273 }
274 else
275 {
276 switch ( m_RpcId )
277 {
278 case 0: m_Wd = VALUE * m_Rout - E_GP_DX - E_STRPLN_DA; break;
279 case 1:
280 case 3: m_Wd = VALUE * ( m_Rout - m_Rin ); break;
281 case 2: m_Wd = 2.0 * VALUE * m_Rin; break;
282 case 4: m_Wd = VALUE * m_Rout - E_GP_DY - E_STRPLN_DA; break;
283 default:;
284 }
285 }
286
287 // cut rpc chamber death edge
288 if ( m_UpDown == SL_UP )
289 {
290 if ( m_RpcId == 1 ) m_Wd -= RPC_DEATH_EDGE * 2.0; // center rpc
291 else m_Wd -= ( 1 + 1.0 / cos( MUC_PI / 8.0 ) ) * RPC_DEATH_EDGE;
292 }
293 else
294 {
295 if ( m_RpcId == 2 ) // center rpc
296 m_Wd -= RPC_DEATH_EDGE * 2.0;
297 else // DOWN 0,4 RPC
298 m_Wd -= RPC_DEATH_EDGE;
299 }
300 } // else, endcap
301}
302
303// Set barrel rpc in BES CS
305 if ( m_Part != BRID ) return 0;
306
307 double x, y, z;
308 x = y = z = 0.;
309
310 if ( m_Segment != B_TOP )
311 {
312 // set x and y
313 double r;
314 r = ( B_AS_RMIN[m_Layer] - AS_GAP / 2.0 ) +
315 ( 1 - 2 * m_UpDown ) * ( STR_TH + RPC_TH ) / 2.0;
316 x = r * cos( m_Theta );
317 y = r * sin( m_Theta );
318
319 // set z
320 if ( ( m_UpDown == SL_UP && m_RpcId == 3 ) || ( m_UpDown == SL_DOWN && m_RpcId == 0 ) )
321 {
322 if ( m_Layer != 1 ) // not layer NO.2
323 z = ( 2 * m_UpDown - 1 ) * 3 * B_RPC_LTN / 2.0;
324 else z = ( 2 * m_UpDown - 1 ) * 3 * B_RPC_LTS / 2.0;
325 }
326 else if ( m_UpDown == SL_UP )
327 z = B_BOX_LT / 2.0 - B_BOX_DZ[m_UpDown] - ( 1 + 2 * m_RpcId ) * B_RPC_LTN / 2.0;
328 else
329 z = -B_BOX_LT / 2.0 + B_BOX_DZ[m_UpDown] + ( 1 + 2 * ( 3 - m_RpcId ) ) * B_RPC_LTN / 2.0;
330
331 } // end not top segment
332 else // top segment
333 {
334 //---------- set x--------
335 if ( m_RpcId > 1 ) // NO.3, 4, 5
336 x = 0.;
337 else // NO.1 and NO.2
338 x = ( 1 - 2 * m_RpcId ) * ( ( B_BOX_WT[m_Layer] + B_BOX_SLOT_WT ) / 4.0 +
339 ( B_BOX_DZ[m_UpDown] - B_BOX_DT[m_UpDown] ) / 2.0 );
340
341 //---------- set y--------
342 y = ( B_AS_RMIN[m_Layer] - AS_GAP / 2.0 ) +
343 ( 1 - 2 * m_UpDown ) * ( STR_TH + RPC_TH ) / 2.0;
344
345 //---------- set z--------
346 if ( m_RpcId < 2 ) // rpc NO.1 and NO.2
347 z = B_BOX_LT / 2.0 - B_BOX_DZ[m_UpDown] -
348 B_TOPRPC_LTS[( ( m_Layer == 0 ) ? 1 : ( m_Layer % 2 ) )];
349 else if ( m_UpDown == SL_UP && m_RpcId == 4 ) // up NO.5
350 z = -B_RPC_LTN - B_TOPRPC_LTS[( ( m_Layer == 0 ) ? 1 : ( m_Layer % 2 ) )];
351 else if ( m_UpDown == SL_DOWN && m_RpcId == 2 ) // down NO.3
352 z = B_RPC_LTN - B_TOPRPC_LTS[( ( m_Layer == 0 ) ? 1 : ( m_Layer % 2 ) )];
353 else if ( m_UpDown == SL_UP ) // up NO.3 and NO.4
354 z = B_BOX_LT / 2.0 - B_BOX_DZ[m_UpDown] -
355 B_TOPRPC_LTS[( ( m_Layer == 0 ) ? 1 : ( m_Layer % 2 ) )] +
356 ( 3 - 2 * m_RpcId ) * B_RPC_LTN / 2.0;
357 else // down NO.4 and NO.5
358 z = -B_BOX_LT / 2.0 - B_BOX_DZ[m_UpDown] + ( 1 + 2 * ( 4 - m_RpcId ) ) * B_RPC_LTN / 2.0;
359 } // end top segment
360
361 m_LocOrgInBes[0] = x;
362 m_LocOrgInBes[1] = y;
363 m_LocOrgInBes[2] = z;
364
365 // limit cut
366 for ( int i = 0; i < 2; i++ )
367 if ( fabs( m_LocOrgInBes[i] ) < ERR_LIMIT ) m_LocOrgInBes[i] = 0.0;
368
369 return 0;
370}
371
373 if ( m_Part == BRID ) return 0;
374
375 double x, y, z;
376 x = y = z = 0.;
377
378 //------------ set x and y ---------------
379 if ( m_UpDown == SL_UP )
380 {
381 if ( m_RpcId == 0 )
382 {
383 x = ( VALUE * m_Rc + E_GP_DX + E_STRPLN_DA + RPC_SL_OFFSET ) / 2.0;
384 y = m_Rc;
385 }
386 else if ( m_RpcId == 1 )
387 {
388 x = m_Rc * cos( MUC_PI / 4.0 );
389 y = m_Rc * sin( MUC_PI / 4.0 );
390 }
391 else
392 {
393 x = m_Rc;
394 y = ( VALUE * m_Rc + E_GP_DY + E_STRPLN_DA + RPC_SL_OFFSET ) / 2.0;
395 }
396 }
397 else
398 {
399 switch ( m_RpcId )
400 {
401 case 0:
402 x = ( VALUE * m_Rc + E_GP_DX + E_STRPLN_DA ) / 2.0 + RPC_DEATH_EDGE / 2.0;
403 y = m_Rc;
404 break;
405 case 1:
406 x = VALUE * m_Rc + sin( MUC_PI / 4.0 ) * m_Wd / 4.0;
407 x += RPC_DEATH_EDGE * ( 3 - 2 * sqrt( 2.0 ) ) / 4.0;
408 y = m_Rc - cos( MUC_PI / 4.0 ) * m_Wd / 4.0;
409 y += RPC_DEATH_EDGE * ( 1 + 4.0 / sqrt( 2.0 ) ) / 4.0;
410 break;
411 case 2:
412 x = m_Rc * cos( MUC_PI / 4.0 );
413 y = m_Rc * sin( MUC_PI / 4.0 );
414 break;
415 case 3:
416 x = m_Rc - cos( MUC_PI / 4.0 ) * m_Wd / 4.0;
417 x += RPC_DEATH_EDGE * ( 1 + 4.0 / sqrt( 2.0 ) ) / 4.0;
418 y = VALUE * m_Rc + sin( MUC_PI / 4.0 ) * m_Wd / 4.0;
419 y += RPC_DEATH_EDGE * ( 3 - 2 * sqrt( 2.0 ) ) / 4.0;
420 break;
421 case 4:
422 x = m_Rc;
423 y = ( VALUE * m_Rc + E_GP_DY + E_STRPLN_DA ) / 2.0 + RPC_DEATH_EDGE / 2.0;
424 }
425 }
426
427 // sign different by segment
428 if ( m_Segment == 0 ) { ; }
429 else if ( m_Segment == 1 ) { x = -x; }
430 else if ( m_Segment == 2 )
431 {
432 x = -x;
433 y = -y;
434 }
435 else { y = -y; }
436
437 //------------ set z ---------------------
438 for ( int i = 0; i < m_Layer + 1; i++ ) z += E_AS_TH[i];
439 z += m_Layer * AS_GAP;
440 z += ( ( E_AS_ZMAX - E_AS_TOTAL_TH ) + AS_GAP / 2.0 );
441 z += ( 1 - 2 * m_UpDown ) * ( STR_TH + RPC_TH ) / 2.0;
442 z *= cos( m_Part * MUC_PI / 2.0 );
443
444 m_LocOrgInBes[0] = x;
445 m_LocOrgInBes[1] = y;
446 m_LocOrgInBes[2] = z;
447
448 // limit cut
449 for ( int i = 0; i < 2; i++ )
450 if ( fabs( m_LocOrgInBes[i] ) < ERR_LIMIT ) m_LocOrgInBes[i] = 0.;
451
452 return 0;
453}
454
455// Set local origin(RPC) in BES CS
457 if ( m_Part == BRID ) SetBarrelRpcInBes();
458 else SetEndcapRpcInBes();
459}
460
461// Set gas origin in RPC CS, all is 0
463 for ( int i = 0; i < 3; i++ ) m_ObjOrgInLoc[i] = 0.;
464}
465
468 // limit cut
469 for ( int i = 0; i < 3; i++ )
470 if ( fabs( m_ObjOrgInBes[i] ) < ERR_LIMIT ) m_ObjOrgInBes[i] = 0.0;
471}
472
473/*
474void MucGas::SetAlignment( double dx, double dy, double dz )
475{
476 m_ObjOrgInLoc[0] += dx;
477 m_ObjOrgInLoc[1] += dy;
478 m_ObjOrgInLoc[2] += d;
479}
480*/
481
482// END
int m_RpcId
Definition MucEntity.h:91
MucEntity(int part, int segment, int layer)
Definition MucEntity.cxx:17
double m_W
Definition MucEntity.h:101
MucEntity & operator=(const MucEntity &other)
Definition MucEntity.cxx:87
double m_Thin
Definition MucEntity.h:100
double m_Rin
Definition MucEntity.h:97
double m_H
Definition MucEntity.h:102
int m_Layer
Definition MucEntity.h:89
double m_ObjOrgInLoc[3]
Definition MucEntity.h:118
double m_Rout
Definition MucEntity.h:98
double m_Wd
Definition MucEntity.h:105
int m_Segment
Definition MucEntity.h:88
double m_Theta
Definition MucEntity.h:94
int m_Part
Definition MucEntity.h:87
double m_LocOrgInBes[3]
Definition MucEntity.h:108
double m_Rc
Definition MucEntity.h:99
double m_ObjOrgInBes[3]
Definition MucEntity.h:117
int m_UpDown
Definition MucEntity.h:90
void TransLocToBes(double LocCoord[], double BesCoord[], double LocOrgInBes[], double Rot_z)
double m_Wu
Definition MucEntity.h:104
double m_L
Definition MucEntity.h:103
virtual void SetTheta()
Definition MucGas.cxx:72
virtual void SetWd()
Definition MucGas.cxx:264
virtual void SetRc()
Definition MucGas.cxx:105
virtual void SetWu()
Definition MucGas.cxx:222
~MucGas()
Definition MucGas.cxx:35
MucGas(int part, int segment, int layer, int upDown, int rpcId, int id)
Definition MucGas.cxx:17
virtual void SetH()
Definition MucGas.cxx:170
double GetPhi()
Definition MucGas.cxx:62
virtual void SetW()
Definition MucGas.cxx:109
virtual void SetThin()
Definition MucGas.cxx:107
virtual void SetRout()
Definition MucGas.cxx:96
virtual void Init()
Definition MucGas.cxx:38
MucGas & operator=(const MucGas &other)
Definition MucGas.cxx:26
int SetEndcapRpcInBes()
Definition MucGas.cxx:372
virtual void SetL()
Definition MucGas.cxx:183
virtual void SetRin()
Definition MucGas.cxx:88
int SetBarrelRpcInBes()
Definition MucGas.cxx:304
virtual void SetObjOrgInLoc()
Definition MucGas.cxx:462
void SetPhi()
Definition MucGas.cxx:67
virtual void SetObjOrgInBes()
Definition MucGas.cxx:466
virtual void SetLocOrgInBes()
Definition MucGas.cxx:456