00001
00002
00003
00004
00005
00006
00007
00008 #include <iostream>
00009 #include <cmath>
00010
00011 #include "MucGeoCreateAlg/MucGeoConst.h"
00012 #include "MucGeoCreateAlg/MucBakelite.h"
00013
00014 using namespace std;
00015
00016
00017 MucBakelite::MucBakelite( int part, int segment, int layer, int upDown, int rpcId, int id )
00018 : MucEntity( part, segment, layer, upDown, rpcId, id )
00019 {
00020 MucBakelite::Init();
00021 }
00022
00023
00024 MucBakelite::MucBakelite( const MucBakelite &other ) : MucEntity( other )
00025 {
00026 m_Phi = other.m_Phi;
00027 }
00028
00029
00030 MucBakelite& MucBakelite::operator =( const MucBakelite &other )
00031 {
00032 if( this == &other)
00033 return *this;
00034
00035 MucEntity::operator =(other);
00036
00037 m_Phi = other.m_Phi;
00038
00039 return *this;
00040 }
00041
00042
00043 MucBakelite::~MucBakelite() { ; }
00044
00045
00046 void MucBakelite::Init()
00047 {
00048 SetPhi();
00049 SetTheta();
00050 SetRin();
00051 SetRout();
00052 SetRc();
00053
00054 SetThin();
00055 SetW();
00056 SetWu();
00057 SetWd();
00058 SetH();
00059 SetL();
00060
00061 SetEndcapRpcInBes();
00062 SetBarrelRpcInBes();
00063
00064 SetLocOrgInBes();
00065 SetObjOrgInLoc();
00066 SetObjOrgInBes();
00067 }
00068
00069
00070
00071 double MucBakelite::GetPhi() { return m_Phi; }
00072
00073
00074
00075
00076 void MucBakelite::SetPhi()
00077 {
00078 if( m_Part == BRID )
00079 m_Phi = B_PHI[m_Segment] * (MUC_PI/4.0);
00080 else
00081 m_Phi = 0.;
00082 }
00083
00084 void MucBakelite::SetTheta()
00085 {
00086 if( m_Part == BRID )
00087 m_Theta = m_Segment * (MUC_PI/4.0);
00088 else
00089 {
00090 if( m_UpDown == SL_UP )
00091 m_Theta = ( MUC_PI/4.0 ) + (1 - m_RpcId) * MUC_PI / 8.0 ;
00092 else
00093 {
00094 if( m_RpcId < 2 )
00095 m_Theta = ( MUC_PI/4.0 ) + MUC_PI / 8.0 ;
00096 else if ( m_RpcId == 2 )
00097 m_Theta = ( MUC_PI/4.0 ) ;
00098 else
00099 m_Theta = ( MUC_PI/4.0 ) - MUC_PI / 8.0 ;
00100 }
00101 }
00102 }
00103
00104 void MucBakelite::SetRin()
00105 {
00106 if( m_Part == BRID )
00107 m_Rin = B_AS_RMIN[m_Layer] - AS_GAP/2.0 + (1-2*m_UpDown) * (STR_TH + RPC_TH)/2.0
00108 + (1-2*m_ID)*(GAS_TH + BKLT_TH)/2.0 - BKLT_TH/2.0;
00109 else
00110 m_Rin = E_GP_RMIN[m_Layer] + E_STRPLN_DR + (1-m_UpDown)*RPC_SL_OFFSET;
00111 }
00112
00113 void MucBakelite::SetRout()
00114 {
00115 if( m_Part == BRID )
00116 m_Rout = B_AS_RMIN[m_Layer] - AS_GAP/2.0 + (1-2*m_UpDown) * (STR_TH + RPC_TH)/2.0
00117 + (1-2*m_ID)*(GAS_TH + BKLT_TH)/2.0 + BKLT_TH/2.0;
00118 else
00119 {
00120 m_Rout = E_AS_RMAX - E_BOX_DR - E_STRPLN_DB[(m_Layer==0)?0:1] + (m_UpDown-1)*RPC_SL_OFFSET;
00121 }
00122 }
00123
00124 void MucBakelite::SetRc()
00125 {
00126 m_Rc = (m_Rin + m_Rout)/2.0;
00127 }
00128
00129 void MucBakelite::SetThin()
00130 {
00131 m_Thin = BKLT_TH;
00132 }
00133
00134 void MucBakelite::SetW()
00135 {
00136 if( m_Part == BRID)
00137 {
00138 if( m_Segment == B_TOP && m_RpcId < 2 )
00139 {
00140 if( (m_Layer+1)%2 == 1 )
00141 m_W = (B_BOX_WT[m_Layer] - 2*B_BOX_DT[m_UpDown] - 2*B_BOX_DZ[m_UpDown] - B_BOX_SLOT_WT)/2.0;
00142 else
00143 m_W = (B_BOX_WT[m_Layer] - 4*B_BOX_DZ[m_UpDown] - B_BOX_SLOT_WT)/2.0;
00144 }
00145 else
00146 {
00147 if( (m_Layer+1)%2 ==1 )
00148 m_W = B_BOX_WT[m_Layer] - 2 * B_BOX_DT[m_UpDown];
00149 else
00150 m_W = B_BOX_WT[m_Layer] - 2 * B_BOX_DZ[m_UpDown];
00151
00152 }
00153 }
00154 else
00155 {
00156 if( m_UpDown == SL_UP )
00157 { if( m_RpcId == 0 )
00158 m_W = VALUE * m_Rc - E_GP_DX - E_STRPLN_DA - RPC_SL_OFFSET;
00159 else if ( m_RpcId == 1 )
00160 m_W = 2 * VALUE * m_Rc;
00161 else
00162 m_W = VALUE * m_Rc - E_GP_DY - E_STRPLN_DA - RPC_SL_OFFSET;
00163 }
00164 else
00165 {
00166 switch( m_RpcId )
00167 {
00168 case 0:
00169 m_W = VALUE * m_Rc - E_GP_DX - E_STRPLN_DA;
00170 break;
00171 case 1:
00172 case 3:
00173 m_W = VALUE * ( m_Rc - m_Rin );
00174 break;
00175 case 2:
00176 m_W = 2 * VALUE * m_Rin;
00177 break;
00178 case 4:
00179 m_W = VALUE * m_Rc - E_GP_DY - E_STRPLN_DA;
00180 break;
00181 default: ;
00182 }
00183 }
00184
00185 }
00186
00187
00188 if( m_Part == BRID )
00189 m_W -= RPC_DEATH_EDGE * 2.0;
00190 else
00191 {
00192 if( m_UpDown == SL_UP )
00193 {
00194 if( m_RpcId == 1 ) m_W -= RPC_DEATH_EDGE * 2.0;
00195 else m_W -= ( 1 + 1.0/cos(MUC_PI/8.0) ) * RPC_DEATH_EDGE;
00196 }
00197 else
00198 {
00199 if( m_RpcId == 2 )
00200 m_W -= RPC_DEATH_EDGE * 2.0;
00201 else
00202 m_W -= RPC_DEATH_EDGE;
00203 }
00204 }
00205 }
00206
00207 void MucBakelite::SetH()
00208 {
00209 if( m_Part == BRID )
00210 m_H = BKLT_TH;
00211 else
00212 {
00213 m_H = m_Rout - m_Rin;
00214
00215
00216 if( m_UpDown == SL_DOWN && (m_ID == 1 || m_ID == 3) )
00217 m_H -= RPC_DEATH_EDGE * (1 + 1.0/VALUE);
00218 else
00219 m_H -= RPC_DEATH_EDGE * 2.0;
00220 }
00221 }
00222
00223 void MucBakelite::SetL()
00224 {
00225 if( m_Part == BRID )
00226 {
00227 if( m_Segment != B_TOP )
00228 {
00229
00230 if( (m_UpDown == SL_UP && m_RpcId == 3) || (m_UpDown == SL_DOWN && m_RpcId == 0) )
00231 {
00232 if( m_Layer != 1 )
00233 m_L = B_BOX_LT - 2*B_BOX_DZ[m_UpDown] - 3*B_RPC_LTN;
00234 else
00235 m_L = B_BOX_LT - 2*B_BOX_DZ[m_UpDown] - 3*B_RPC_LTS;
00236 }
00237 else
00238 {
00239 if( m_Layer != 1 )
00240 m_L = B_RPC_LTN;
00241 else
00242 m_L = B_RPC_LTS;
00243 }
00244 }
00245 else
00246 {
00247 if( m_RpcId < 2 )
00248 {
00249 m_L = B_TOPRPC_LTS[ ((m_Layer == 0)?1:(m_Layer%2)) ];
00250 }
00251 else if( (m_UpDown == SL_UP && m_RpcId == 4) || (m_UpDown == SL_DOWN && m_RpcId == 2) )
00252 {
00253 m_L = B_BOX_LT - B_TOPRPC_LTS[ ((m_Layer == 0)?1:(m_Layer%2)) ] - 2*(B_BOX_DZ[m_UpDown]+B_RPC_LTN);
00254 }
00255 else
00256 m_L = B_RPC_LTN;
00257
00258 }
00259
00260 m_L -= RPC_DEATH_EDGE * 2.0;
00261
00262 }
00263 else
00264 {
00265 m_L = BKLT_TH;
00266 }
00267
00268 }
00269
00270 void MucBakelite::SetWu()
00271 {
00272 if( m_Part == BRID )
00273 m_Wu = m_W;
00274 else
00275 {
00276 if( m_UpDown == SL_UP )
00277 {
00278 if( m_RpcId == 0 )
00279 m_Wu = VALUE * m_Rin - E_GP_DX - E_STRPLN_DA - RPC_SL_OFFSET;
00280 else if( m_RpcId == 1 )
00281 m_Wu = 2.0* VALUE * m_Rin;
00282 else
00283 m_Wu = VALUE * m_Rin - E_GP_DY - E_STRPLN_DA - RPC_SL_OFFSET;
00284 }
00285 else
00286 {
00287 switch( m_RpcId )
00288 {
00289 case 0:
00290 m_Wu = VALUE * m_Rin - E_GP_DX - E_STRPLN_DA;
00291 break;
00292 case 1:
00293 case 3:
00294 m_Wu = 0.0;
00295 break;
00296 case 2:
00297 m_Wu = 2.0* VALUE * m_Rin;
00298 break;
00299 case 4:
00300 m_Wu = VALUE * m_Rin - E_GP_DY - E_STRPLN_DA;
00301 break;
00302 default: ;
00303 }
00304 }
00305
00306
00307 if( m_Wu > 0.0 )
00308 {
00309 if( m_UpDown == SL_UP )
00310 {
00311 if( m_RpcId == 1 ) m_Wu -= RPC_DEATH_EDGE * 2.0;
00312 else m_Wu -= ( 1 + 1.0/cos(MUC_PI/8.0) ) * RPC_DEATH_EDGE;
00313 }
00314 else
00315 {
00316 if( m_RpcId == 2 )
00317 m_Wu -= RPC_DEATH_EDGE * 2.0;
00318 else
00319 m_W -= RPC_DEATH_EDGE;
00320 }
00321 }
00322 }
00323 }
00324
00325 void MucBakelite::SetWd()
00326 {
00327 if( m_Part == BRID )
00328 m_Wd = m_W;
00329 else
00330 {
00331 if( m_UpDown == SL_UP )
00332 {
00333 if( m_RpcId == 0 )
00334 m_Wd = VALUE * m_Rout - E_GP_DX - E_STRPLN_DA - RPC_SL_OFFSET;
00335 else if( m_RpcId == 1 )
00336 m_Wd = 2.0* VALUE * m_Rout;
00337 else
00338 m_Wd = VALUE * m_Rout - E_GP_DY - E_STRPLN_DA - RPC_SL_OFFSET;
00339 }
00340 else
00341 {
00342 switch( m_RpcId )
00343 {
00344 case 0:
00345 m_Wd = VALUE * m_Rout - E_GP_DX - E_STRPLN_DA;
00346 break;
00347 case 1:
00348 case 3:
00349 m_Wd = VALUE * (m_Rout - m_Rin);
00350 break;
00351 case 2:
00352 m_Wd = 2.0 * VALUE * m_Rin;
00353 break;
00354 case 4:
00355 m_Wd = VALUE * m_Rout - E_GP_DY - E_STRPLN_DA;
00356 break;
00357 default: ;
00358 }
00359 }
00360
00361
00362 if( m_UpDown == SL_UP )
00363 {
00364 if( m_RpcId == 1 ) m_Wd -= RPC_DEATH_EDGE * 2.0;
00365 else m_Wd -= ( 1 + 1.0/cos(MUC_PI/8.0) ) * RPC_DEATH_EDGE;
00366 }
00367 else
00368 {
00369 if( m_RpcId == 2 )
00370 m_Wd -= RPC_DEATH_EDGE * 2.0;
00371 else
00372 m_Wd -= RPC_DEATH_EDGE;
00373 }
00374
00375 }
00376 }
00377
00378
00379 int MucBakelite::SetBarrelRpcInBes()
00380 {
00381 if( m_Part != BRID ) return 0;
00382
00383 double x, y, z;
00384 x = y = z = 0.0;
00385
00386 if( m_Segment != B_TOP )
00387 {
00388
00389 double r;
00390 r = (B_AS_RMIN[m_Layer] - AS_GAP / 2.0) + (1-2*m_UpDown)*(STR_TH + RPC_TH)/2.0;
00391 x = r * cos( m_Theta );
00392 y = r * sin( m_Theta );
00393
00394
00395 if( (m_UpDown == SL_UP && m_RpcId == 3) || (m_UpDown == SL_DOWN && m_RpcId == 0) )
00396 {
00397 if( m_Layer != 1 )
00398 z = (2*m_UpDown - 1) * 3 * B_RPC_LTN/2.0;
00399 else
00400 z = (2*m_UpDown - 1) * 3 * B_RPC_LTS/2.0;
00401 }
00402 else if( m_UpDown == SL_UP )
00403 z = B_BOX_LT/2.0 - B_BOX_DZ[m_UpDown] - (1+2*m_RpcId)*B_RPC_LTN/2.0;
00404 else
00405 z = -B_BOX_LT/2.0 + B_BOX_DZ[m_UpDown] + (1+2*(3-m_RpcId))*B_RPC_LTN/2.0;
00406
00407 }
00408 else
00409 {
00410
00411 if( m_RpcId > 1 )
00412 x = 0.;
00413 else
00414 x = (1-2*m_RpcId) * ( (B_BOX_WT[m_Layer] + B_BOX_SLOT_WT)/4.0 + (B_BOX_DZ[m_UpDown] - B_BOX_DT[m_UpDown])/2.0 );
00415
00416
00417 y = (B_AS_RMIN[m_Layer] - AS_GAP / 2.0) + (1-2*m_UpDown)*(STR_TH + RPC_TH)/2.0;
00418
00419
00420 if( m_RpcId < 2 )
00421 z = B_BOX_LT/2.0 - B_BOX_DZ[m_UpDown] - B_TOPRPC_LTS[ ((m_Layer==0)?1:(m_Layer%2)) ];
00422 else if( m_UpDown == SL_UP && m_RpcId == 4 )
00423 z = -B_RPC_LTN - B_TOPRPC_LTS[ ((m_Layer==0)?1:(m_Layer%2)) ];
00424 else if( m_UpDown == SL_DOWN && m_RpcId == 2 )
00425 z = B_RPC_LTN - B_TOPRPC_LTS[ ((m_Layer==0)?1:(m_Layer%2)) ];
00426 else if( m_UpDown == SL_UP )
00427 z = B_BOX_LT/2.0 - B_BOX_DZ[m_UpDown] - B_TOPRPC_LTS[ ((m_Layer==0)?1:(m_Layer%2)) ] + (3-2*m_RpcId)*B_RPC_LTN/2.0;
00428 else
00429 z = -B_BOX_LT/2.0 - B_BOX_DZ[m_UpDown] + (1+2*(4-m_RpcId))*B_RPC_LTN/2.0;
00430
00431 }
00432
00433 m_LocOrgInBes[0] = x;
00434 m_LocOrgInBes[1] = y;
00435 m_LocOrgInBes[2] = z;
00436
00437
00438 for( int i=0; i<2; i++ ) {
00439 if( fabs(m_LocOrgInBes[i]) < ERR_LIMIT ) m_LocOrgInBes[i] = 0.0;
00440 }
00441
00442 return 0;
00443 }
00444
00445 int MucBakelite::SetEndcapRpcInBes()
00446 {
00447 if( m_Part == BRID ) return 0;
00448
00449 double x, y, z;
00450 x = y = z = 0.;
00451
00452
00453 if( m_UpDown == SL_UP )
00454 {
00455 if( m_RpcId == 0 )
00456 {
00457 x = ( VALUE*m_Rc + E_GP_DX + E_STRPLN_DA + RPC_SL_OFFSET ) / 2.0;
00458 y = m_Rc;
00459 }
00460 else if( m_RpcId == 1 )
00461 {
00462 x = m_Rc * cos( MUC_PI/4.0 );
00463 y = m_Rc * sin( MUC_PI/4.0 );
00464 }
00465 else
00466 {
00467 x = m_Rc;
00468 y = ( VALUE*m_Rc + E_GP_DY + E_STRPLN_DA + RPC_SL_OFFSET ) / 2.0;
00469 }
00470 }
00471 else
00472 {
00473 switch( m_RpcId )
00474 {
00475 case 0:
00476 x = ( VALUE*m_Rc + E_GP_DX + E_STRPLN_DA )/2.0 + RPC_DEATH_EDGE/2.0;
00477 y = m_Rc;
00478 break;
00479 case 1:
00480 x = VALUE*m_Rc + sin(MUC_PI/4.0)*m_Wd/4.0;
00481 x += RPC_DEATH_EDGE * ( 3 - 2*sqrt(2.0) )/4.0;
00482
00483 y = m_Rc - cos(MUC_PI/4.0)*m_Wd/4.0;
00484 y += RPC_DEATH_EDGE * ( 1 + 4.0/sqrt(2.0) )/4.0;
00485
00486 break;
00487 case 2:
00488 x = m_Rc * cos( MUC_PI/4.0 );
00489 y = m_Rc * sin( MUC_PI/4.0 );
00490 break;
00491 case 3:
00492 x = m_Rc - cos(MUC_PI/4.0)*m_Wd/4.0;
00493 x += RPC_DEATH_EDGE * ( 1 + 4.0/sqrt(2.0) )/4.0;
00494
00495 y = VALUE*m_Rc + sin(MUC_PI/4.0)*m_Wd/4.0;
00496 y += RPC_DEATH_EDGE * ( 3 - 2*sqrt(2.0) )/4.0;
00497
00498 break;
00499 case 4:
00500 x = m_Rc;
00501 y = ( VALUE*m_Rc + E_GP_DY + E_STRPLN_DA )/2.0 + RPC_DEATH_EDGE/2.0;
00502 }
00503
00504 }
00505
00506
00507 if ( m_Segment == 0 ) { ; }
00508 else if( m_Segment == 1 ) { x = -x; }
00509 else if( m_Segment == 2 ) { x = -x; y = -y; }
00510 else { y = -y; }
00511
00512
00513
00514 for( int i=0; i<m_Layer+1; i++ ) z += E_AS_TH[i];
00515
00516 z += m_Layer * AS_GAP;
00517 z += ( (E_AS_ZMAX - E_AS_TOTAL_TH ) + AS_GAP/2.0 );
00518 z += (1-2*m_UpDown) * ( STR_TH + RPC_TH ) / 2.0;
00519 z *= cos( m_Part*MUC_PI/2.0 );
00520
00521 m_LocOrgInBes[0] = x;
00522 m_LocOrgInBes[1] = y;
00523 m_LocOrgInBes[2] = z;
00524
00525
00526 for( int i=0; i<2; i++ ) {
00527 if( fabs(m_LocOrgInBes[i]) < ERR_LIMIT ) m_LocOrgInBes[i] = 0.;
00528 }
00529
00530 return 0;
00531 }
00532
00533
00534 void MucBakelite::SetLocOrgInBes()
00535 {
00536 if( m_Part == BRID )
00537 SetBarrelRpcInBes();
00538 else
00539 SetEndcapRpcInBes();
00540 }
00541
00542
00543 void MucBakelite::SetObjOrgInLoc()
00544 {
00545 if( m_Part == BRID )
00546 {
00547 m_ObjOrgInLoc[0] = 0.;
00548
00549 m_ObjOrgInLoc[1] = (1-2*m_ID) * (BKLT_TH + GAS_TH)/2.0;
00550
00551 m_ObjOrgInLoc[2] = 0.;
00552 }
00553 else
00554 {
00555 m_ObjOrgInLoc[0] = 0.;
00556 m_ObjOrgInLoc[1] = 0.;
00557 m_ObjOrgInLoc[2] = (1-2*m_ID) * (BKLT_TH + GAS_TH)/2.0;
00558 }
00559 }
00560
00561 void MucBakelite::SetObjOrgInBes()
00562 {
00563 MucEntity::TransLocToBes( m_ObjOrgInBes, m_ObjOrgInLoc, m_LocOrgInBes, m_Phi );
00564
00565
00566 for( int i=0; i<3; i++ ) {
00567 if( fabs(m_ObjOrgInBes[i]) < ERR_LIMIT ) m_ObjOrgInBes[i] = 0.;
00568 }
00569 }
00570
00571
00572
00573
00574
00575
00576
00577
00578
00579
00580
00581