00001
00002
00003
00004
00005
00006
00007
00008 #include <iostream>
00009 #include <cmath>
00010
00011 #include "MucGeoCreateAlg/MucGeoConst.h"
00012 #include "MucGeoCreateAlg/MucBoxCover.h"
00013
00014 using namespace std;
00015
00016
00017 MucBoxCover::MucBoxCover( int part, int segment, int layer, int upDown, int id ) : MucEntity( part, segment, layer, upDown, id )
00018 {
00019 MucBoxCover::Init();
00020 }
00021
00022
00023 MucBoxCover::MucBoxCover( const MucBoxCover &other ) : MucEntity( other ) { ; }
00024
00025
00026 MucBoxCover& MucBoxCover::operator =( const MucBoxCover &other )
00027 {
00028 if( this == &other)
00029 return *this;
00030
00031 MucEntity::operator =(other);
00032
00033 return *this;
00034 }
00035
00036
00037 MucBoxCover::~MucBoxCover()
00038 {
00039 ;
00040 }
00041
00042
00043 void MucBoxCover::Init()
00044 {
00045 SetTheta();
00046 SetRin();
00047 SetRout();
00048 SetRc();
00049
00050 SetThin();
00051 SetW();
00052 SetWu();
00053 SetWd();
00054 SetH();
00055 SetL();
00056
00057 SetLocOrgInBes();
00058 SetObjOrgInBes();
00059 SetObjOrgInLoc();
00060 }
00061
00062
00063
00064 void MucBoxCover::SetTheta()
00065 {
00066 if( m_Part == BRID )
00067 m_Theta = m_Segment * ( MUC_PI/4.0 );
00068 else
00069 {
00070 if( m_ID == -1 )
00071 m_Theta = ( 2*m_Segment + 1 ) * ( MUC_PI/4.0 );
00072 else
00073 m_Theta = ( MUC_PI/4.0 ) + ( m_ID - 1) * MUC_PI / 8.0 ;
00074 }
00075 }
00076
00077
00078 void MucBoxCover::SetRin()
00079 {
00080 if( m_Part == BRID )
00081 m_Rin = B_AS_RMIN[m_Layer] - ( AS_GAP + BOX_TH ) / 2.0;
00082 else
00083 {
00084 if( m_ID == -1 )
00085 m_Rin = 0.0;
00086 else
00087 m_Rin = E_GP_RMIN[m_Layer];
00088 }
00089 }
00090
00091
00092 void MucBoxCover::SetRout()
00093 {
00094 if( m_Part == BRID )
00095 m_Rout = B_AS_RMIN[m_Layer] -( AS_GAP - BOX_TH ) / 2.0;
00096 else
00097 m_Rout = E_AS_RMAX - E_BOX_DR;
00098 }
00099
00100
00101 void MucBoxCover::SetRc()
00102 {
00103 if( m_Part == BRID )
00104 m_Rc = B_AS_RMIN[m_Layer] - AS_GAP/2.0;
00105 else
00106 {
00107 if( m_ID == -1 )
00108 m_Rc = sqrt(2.0) * ( E_AS_RMAX - E_BOX_DR ) / 2.0;
00109 else
00110 m_Rc = (m_Rin + m_Rout)/2.0;
00111 }
00112 }
00113
00114 void MucBoxCover::SetThin()
00115 {
00116 m_Thin = BOX_COVER_TH;
00117 }
00118
00119 void MucBoxCover::SetW()
00120 {
00121 if( m_Part == BRID)
00122 {
00123 if( m_Segment != B_TOP )
00124 m_W = B_BOX_WT[m_Layer];
00125 else
00126 {
00127 if( m_ID == -1 || m_ID == 2 )
00128 m_W = B_BOX_WT[m_Layer];
00129 else
00130 m_W = ( B_BOX_WT[m_Layer] - B_BOX_SLOT_WT )/2.0;
00131 }
00132 }
00133 else
00134 {
00135 if( m_ID == -1 )
00136 m_W = E_AS_RMAX - E_BOX_DR - E_GP_DX;
00137 else
00138 m_W = 0.;
00139 }
00140 }
00141
00142 void MucBoxCover::SetH()
00143 {
00144 if( m_Part == BRID )
00145 m_H = BOX_COVER_TH;
00146 else
00147 {
00148 if( m_ID == -1 )
00149 m_H = E_AS_RMAX - E_BOX_DR - E_GP_DY;
00150 else
00151 m_H = E_AS_RMAX - E_BOX_DR - E_GP_RMIN[m_Layer];
00152 }
00153 }
00154
00155 void MucBoxCover::SetL()
00156 {
00157 if( m_Part == BRID )
00158 {
00159 if( m_Segment != B_TOP || m_ID == -1 )
00160 m_L = B_BOX_LT;
00161 else
00162 {
00163 if( m_ID == 2 )
00164 m_L = B_BOX_LT - B_TOPRPC_LTS[(m_Layer==0)?1:(m_Layer%2)];
00165 else
00166 m_L = B_TOPRPC_LTS[(m_Layer==0)?1:(m_Layer%2)];
00167 }
00168 }
00169 else
00170 m_L = BOX_COVER_TH;
00171 }
00172
00173 void MucBoxCover::SetWu()
00174 {
00175 if( m_Part == BRID )
00176 m_Wu = m_W;
00177 else
00178 {
00179 if( m_ID == -1 )
00180 m_Wu = m_W;
00181 else if( m_ID == 1 )
00182 m_Wu = 2 * VALUE * m_Rin ;
00183 else if( m_ID == 0 )
00184 m_Wu = VALUE * m_Rin - E_GP_DY;
00185 else
00186 m_Wu = VALUE * m_Rin - E_GP_DX;
00187 }
00188 }
00189
00190 void MucBoxCover::SetWd()
00191 {
00192 if( m_Part == BRID )
00193 m_Wd = m_W;
00194 else
00195 {
00196 if( m_ID == -1 )
00197 m_Wd = m_W;
00198 else if( m_ID == 1 )
00199 m_Wd = 2 * VALUE * m_Rout;
00200 else if( m_ID == 0 )
00201 m_Wd = VALUE * m_Rout - E_GP_DY;
00202 else
00203 m_Wd = VALUE * m_Rout - E_GP_DX;
00204 }
00205 }
00206
00207
00208 void MucBoxCover::SetLocOrgInBes()
00209 {
00210 double x, y, z;
00211 x = y = z = 0.;
00212
00213 if( m_Part == BRID )
00214 {
00215 x = m_Rc*cos( m_Theta );
00216 y = m_Rc*sin( m_Theta );
00217 z = 0.;
00218
00219 }
00220 else
00221 {
00222
00223
00224 x = (E_AS_RMAX - E_BOX_DR + E_GP_DX) / 2.0;
00225 y = (E_AS_RMAX - E_BOX_DR + E_GP_DY) / 2.0;
00226
00227
00228 if ( m_Segment == 0 ) { ; }
00229 else if( m_Segment == 1 ) { x = -x; }
00230 else if( m_Segment == 2 ) { x = -x; y = -y; }
00231 else { y = -y; }
00232
00233
00234 for( int i=0; i<m_Layer+1; i++ ) z += E_AS_TH[i];
00235
00236 z += m_Layer * AS_GAP;
00237 z += (E_AS_ZMAX - E_AS_TOTAL_TH) + AS_GAP/2.0;
00238 z *= cos( m_Part*MUC_PI/2.0 );
00239
00240 if( m_ID != -1 ) z += (1-2*m_UpDown)*(BOX_TH - BOX_COVER_TH)/2.0;
00241
00242 }
00243
00244 m_LocOrgInBes[0] = x;
00245 m_LocOrgInBes[1] = y;
00246 m_LocOrgInBes[2] = z;
00247
00248
00249 for(int i=0;i<3;i++) {
00250 if( fabs(m_LocOrgInBes[i]) < ERR_LIMIT ) m_LocOrgInBes[i] = 0.;
00251 }
00252 }
00253
00254 void MucBoxCover::SetObjOrgInBes()
00255 {
00256 double x, y, z;
00257 x = y = z =0.;
00258
00259 if( m_Part == BRID )
00260 {
00261 if( m_Segment != B_TOP || m_ID ==-1 )
00262 {
00263 double r;
00264 r = m_Rc + (1-2*m_UpDown)*(BOX_TH - BOX_COVER_TH) / 2.0;
00265 x = r * cos( m_Theta );
00266 y = r * sin( m_Theta );
00267 z = 0.;
00268 }
00269 else
00270 {
00271
00272 if( m_ID == 2 ) x = 0.;
00273 else x = (1-2*m_ID) * ( B_BOX_WT[m_Layer] + B_BOX_SLOT_WT )/4.0;
00274
00275
00276 y = m_Rc + (1-2*m_UpDown)*(BOX_TH - BOX_COVER_TH) / 2.0;
00277
00278
00279 if( m_ID == 2 ) z = -B_TOPRPC_LTS[(m_Layer==0)?1:(m_Layer%2)] / 2.0;
00280 else z = ( B_BOX_LT - B_TOPRPC_LTS[(m_Layer==0)?1:(m_Layer%2)] )/2.0;
00281 }
00282 }
00283 else
00284 {
00285
00286
00287 if( m_ID == -1 )
00288 {
00289 x = (E_AS_RMAX - E_BOX_DR + E_GP_DX) / 2.0;
00290 y = (E_AS_RMAX - E_BOX_DR + E_GP_DY) / 2.0;
00291 }
00292 else if( m_ID == 0 )
00293 {
00294 x = m_Rc;
00295 y = ( m_Rc * tan( m_Theta ) + E_GP_DY ) / 2.0;
00296 }
00297 else if ( m_ID == 1 )
00298 {
00299 x = m_Rc * cos( m_Theta );
00300 y = m_Rc * sin( m_Theta );
00301 }
00302 else
00303 {
00304 x = ( m_Rc / tan( m_Theta ) + E_GP_DX ) / 2.0;
00305 y = m_Rc;
00306 }
00307
00308
00309 if ( m_Segment == 0 ) { ; }
00310 else if( m_Segment == 1 ) { x = -x; }
00311 else if( m_Segment == 2 ) { x = -x; y = -y; }
00312 else { y = -y; }
00313
00314
00315 if( m_ID == -1 )
00316 z = m_LocOrgInBes[2] + (1-2*m_UpDown)*(BOX_TH - BOX_COVER_TH)/2.0;
00317 else
00318 z = m_LocOrgInBes[2];
00319
00320 }
00321
00322 m_ObjOrgInBes[0] = x;
00323 m_ObjOrgInBes[1] = y;
00324 m_ObjOrgInBes[2] = z;
00325
00326
00327 for( int i=0; i<3; i++ ) {
00328 if( fabs(m_ObjOrgInBes[i]) < ERR_LIMIT ) m_ObjOrgInBes[i] = 0.;
00329 }
00330
00331 }
00332
00333 void MucBoxCover::SetObjOrgInLoc()
00334 {
00335 if( m_Part == BRID )
00336 {
00337
00338
00339 if( m_Segment != B_TOP || m_ID == -1 || m_ID == 2 )
00340 m_ObjOrgInLoc[0] = 0.;
00341 else
00342 m_ObjOrgInLoc[0] = (1-2*m_ID) * ( B_BOX_WT[m_Layer] + B_BOX_SLOT_WT )/4.0;
00343
00344
00345 m_ObjOrgInLoc[1] = (1-2*m_UpDown)*(BOX_TH - BOX_COVER_TH)/2.0;
00346
00347
00348
00349 if( m_Segment != B_TOP || m_ID == -1 )
00350 m_ObjOrgInLoc[2] = 0.;
00351 else
00352 {
00353 if( m_ID == 2 ) m_ObjOrgInLoc[2] = -B_TOPRPC_LTS[(m_Layer==0)?1:(m_Layer%2)] / 2.0;
00354 else m_ObjOrgInLoc[2] = ( B_BOX_LT - B_TOPRPC_LTS[(m_Layer==0)?1:(m_Layer%2)] )/2.0;
00355 }
00356 }
00357 else
00358 {
00359 for(int i=0; i<3; i++)
00360 m_ObjOrgInLoc[i] = m_ObjOrgInBes[i] - m_LocOrgInBes[i];
00361 }
00362
00363
00364 for( int i=0; i<3; i++ ) {
00365 if( fabs(m_ObjOrgInLoc[i]) < ERR_LIMIT ) m_ObjOrgInLoc[i] = 0.;
00366 }
00367
00368 }
00369
00370
00371
00372
00373
00374
00375
00376
00377
00378
00379