/home/bes3soft/bes3soft/Boss/7.0.2/dist/7.0.2/Muc/MucGeoCreateAlg/MucGeoCreateAlg-00-01-00/src/MucBoxCover.cxx

Go to the documentation of this file.
00001 //------------------------------------------------------------------------------|
00002 //      [File  ]:                       MucBoxCover.cxx                         |
00003 //      [Brief ]:       MUC geometry box cover creating class                   |
00004 //      [Author]:       Xie Yuguang, <ygxie@mail.ihep.ac.cn>                    |
00005 //      [Date  ]:       May 22, 2005                                            |
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 // Constructor
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 // Copy constructor             
00023 MucBoxCover::MucBoxCover( const MucBoxCover &other ) : MucEntity( other ) { ; }
00024 
00025 // Operator =
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 // Destructor
00037 MucBoxCover::~MucBoxCover()
00038 {       
00039         ;
00040 }
00041 
00042 // Initialize
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 //------------------------------- Set motheds -------------------------
00063 // theta of local( box )
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 // Rin of local( box )
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 // Rout of local( box )
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 // Rc of local( box )
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    // top segment
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 ) // virtual encap gap 
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 ) // virtual encap gap
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 // top segment
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 )     // virtual box 
00180                         m_Wu = m_W;
00181                 else if( m_ID == 1 ) // center fraction
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 )     // virtual box
00197                         m_Wd = m_W;
00198                 else if( m_ID == 1 ) // center fraction
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 // local is box
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         } // barrel
00220         else
00221         {
00222                 //------------ set x and y ---------------
00223                 // segment 0 as reference
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                 // sign different by segment
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                 //------------- set z --------------------
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         }// endcap
00243 
00244         m_LocOrgInBes[0] = x;
00245         m_LocOrgInBes[1] = y;
00246         m_LocOrgInBes[2] = z;
00247 
00248         // limit cut
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 ) // barrel
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 // top segment
00270                 {
00271                         // set x
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                         // set y
00276                         y = m_Rc + (1-2*m_UpDown)*(BOX_TH - BOX_COVER_TH) / 2.0;
00277                         
00278                         // set z
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 // endcap 
00284         {
00285                 //------------- set x, y --------------------------
00286                 // segment 0 as reference 
00287                 if( m_ID == -1 ) // box cover
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 ) // box cover panels
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 // m_ID == 2
00303                 {
00304                         x = ( m_Rc / tan( m_Theta ) + E_GP_DX ) / 2.0;
00305                         y = m_Rc;
00306                 }
00307 
00308                 // sign different by segment
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                 //---------- set z --------------------
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         } // else, endcap 
00321 
00322         m_ObjOrgInBes[0] = x;
00323         m_ObjOrgInBes[1] = y;   
00324         m_ObjOrgInBes[2] = z;
00325 
00326         // limit cut
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                 // set local x
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                 // set local y
00345                 m_ObjOrgInLoc[1] = (1-2*m_UpDown)*(BOX_TH - BOX_COVER_TH)/2.0;
00346 //              m_ObjOrgInLoc[1] = 0.;
00347                 
00348                 // set local z
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 // endcap 
00358         {
00359                 for(int i=0; i<3; i++)
00360                         m_ObjOrgInLoc[i] = m_ObjOrgInBes[i] - m_LocOrgInBes[i];
00361         }
00362 
00363         // limit cut
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 void MucBoxCover::SetAlignment( double dx, double dy, double dz )
00372 {
00373         m_ObjOrgInLoc[0] += dx;
00374         m_ObjOrgInLoc[1] += dy;
00375         m_ObjOrgInLoc[2] += dz;
00376 }
00377 */
00378 
00379 // END

Generated on Tue Nov 29 23:12:56 2016 for BOSS_7.0.2 by  doxygen 1.4.7