CMS 3D CMS Logo

DDTBH4Algo.cc

Go to the documentation of this file.
00001 
00002 // File: DDTBH4Algo.cc
00003 // Description: Position inside the mother according to (eta,phi) 
00005 
00006 #include <cmath>
00007 #include <algorithm>
00008 
00009 namespace std{} using namespace std;
00010 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00011 #include "DetectorDescription/Base/interface/DDutils.h"
00012 #include "DetectorDescription/Core/interface/DDPosPart.h"
00013 #include "DetectorDescription/Core/interface/DDLogicalPart.h"
00014 #include "DetectorDescription/Core/interface/DDSolid.h"
00015 #include "DetectorDescription/Core/interface/DDCurrentNamespace.h"
00016 #include "DetectorDescription/Core/interface/DDSplit.h"
00017 #include "Geometry/EcalTestBeam/plugins/DDTBH4Algo.h"
00018 #include "CLHEP/Units/SystemOfUnits.h"
00019 
00020 DDTBH4Algo::DDTBH4Algo() :
00021    m_idNameSpace (""), 
00022    m_BLZBeg      (0),
00023    m_BLZEnd      (0),
00024    m_BLZPiv      (0),
00025    m_BLRadius    (0),
00026    m_VacName     (""), 
00027    m_VacMat      (""), 
00028    m_vecVacZBeg  (), 
00029    m_vecVacZEnd  (), 
00030    m_WinName    (""), 
00031    m_vecWinMat  (), 
00032    m_vecWinZBeg (), 
00033    m_vecWinThick(),
00034    m_TrgMat      (""), 
00035    m_HoleMat      (""), 
00036    m_TrgVetoHoleRadius    (0),
00037    m_vecTrgName  (), 
00038    m_vecTrgSide (), 
00039    m_vecTrgThick(), 
00040    m_vecTrgPhi  (), 
00041    m_vecTrgXOff (), 
00042    m_vecTrgYOff (), 
00043    m_vecTrgZPiv (),
00044    m_FibFibName  (""), 
00045    m_FibCladName (""), 
00046    m_FibFibMat   (""), 
00047    m_FibCladMat  (""), 
00048    m_FibSide  (0),
00049    m_FibCladThick(0),
00050    m_FibLength   (0),
00051    m_vecFibPhi   (), 
00052    m_vecFibXOff  (), 
00053    m_vecFibYOff  (), 
00054    m_vecFibZPiv  ()
00055 
00056 {
00057    std::cout<< "creating an instance if DDTBH4Algo" << std::endl ;
00058    LogDebug("EcalGeom") << "DDTBH4Algo test: Creating an instance";
00059 }
00060 
00061 DDTBH4Algo::~DDTBH4Algo() {}
00062 
00063 
00064 DDRotation
00065 DDTBH4Algo::myrot( const std::string&      s,
00066                    const HepRotation& r ) const 
00067 {
00068    return DDrot( ddname( idNameSpace() + ":" + s ), new DDRotationMatrix( r.xx(), r.xy(), r.xz(), r.yx(), r.yy(), r.yz(), r.zx(), r.zy(), r.zz() ) ) ; 
00069 }
00070 
00071  
00072 DDMaterial
00073 DDTBH4Algo::ddmat( const std::string& s ) const
00074 {
00075    return DDMaterial( ddname( s ) ) ; 
00076 }
00077 
00078 DDName
00079 DDTBH4Algo::ddname( const std::string& s ) const
00080 { 
00081    const pair<std::string,std::string> temp ( DDSplit(s) ) ;
00082    return DDName( temp.first,
00083                   temp.second ) ; 
00084 }  
00085 
00086 
00087 void DDTBH4Algo::initialize(const DDNumericArguments&      nArgs,
00088                             const DDVectorArguments&       vArgs,
00089                             const DDMapArguments&          mArgs,
00090                             const DDStringArguments&       sArgs,
00091                             const DDStringVectorArguments& vsArgs )
00092 {
00093    m_idNameSpace = DDCurrentNamespace::ns();
00094    m_BLZBeg      = nArgs["BLZBeg"];     
00095    m_BLZEnd      = nArgs["BLZEnd"];     
00096    m_BLZPiv      = nArgs["BLZPiv"];     
00097    m_BLRadius    = nArgs["BLRadius"];   
00098    m_VacName     = sArgs["VacName"]; 
00099    m_VacMat      = sArgs["VacMat"]; 
00100    m_vecVacZBeg  = vArgs["VacZBeg"]; 
00101    m_vecVacZEnd  = vArgs["VacZEnd"]; 
00102 
00103    m_WinName     = sArgs["WinName"]; 
00104    m_vecWinMat   = vsArgs["WinMat"]; 
00105    m_vecWinZBeg  = vArgs["WinZBeg"]; 
00106    m_vecWinThick = vArgs["WinThick"]; 
00107 
00108    m_TrgMat       = sArgs["TrgMat"]; 
00109    m_HoleMat      = sArgs["HoleMat"]; 
00110    m_TrgVetoHoleRadius = nArgs["TrgVetoHoleRadius"];    
00111    m_vecTrgName   = vsArgs["TrgName"]; 
00112    m_vecTrgSide  = vArgs["TrgSide"]; 
00113    m_vecTrgThick = vArgs["TrgThick"]; 
00114    m_vecTrgPhi   = vArgs["TrgPhi"]; 
00115    m_vecTrgXOff  = vArgs["TrgXOff"]; 
00116    m_vecTrgYOff  = vArgs["TrgYOff"]; 
00117    m_vecTrgZPiv  = vArgs["TrgZPiv"]; 
00118 
00119    m_FibFibName  = sArgs["FibFibName"]; 
00120    m_FibCladName = sArgs["FibCladName"]; 
00121    m_FibFibMat   = sArgs["FibFibMat"]; 
00122    m_FibCladMat  = sArgs["FibCladMat"]; 
00123    m_FibSide     = nArgs["FibSide"];    
00124    m_FibCladThick= nArgs["FibCladThick"];       
00125    m_FibLength   = nArgs["FibLength"];  
00126    m_vecFibPhi   = vArgs["FibPhi"]; 
00127    m_vecFibXOff  = vArgs["FibXOff"]; 
00128    m_vecFibYOff  = vArgs["FibYOff"]; 
00129    m_vecFibZPiv  = vArgs["FibZPiv"]; 
00130 }
00131 
00132 void DDTBH4Algo::execute() 
00133 {
00134   const unsigned int copyOne (1) ;
00135 
00136   const double halfZbl ( ( blZEnd() - blZBeg() )/2. ) ;
00137   for( unsigned int i ( 0 ) ; i != vecVacZBeg().size() ; ++i )
00138   {
00139      DDName vacNameNm ( ddname( vacName() + int_to_string(i+1) ) ) ;
00140      const double halfZvac ( ( vecVacZEnd()[i] - vecVacZBeg()[i] )/2. ) ;
00141      DDSolid vTubeSolid ( DDSolidFactory::tubs( vacNameNm ,
00142                                                 halfZvac,
00143                                                 0, 
00144                                                 blRadius(),
00145                                                 0*deg, 360*deg ) ) ;
00146      const DDLogicalPart vacLog ( vacNameNm, vacMat(), vTubeSolid ) ;
00147      
00148      DDpos( vacLog,
00149             parent().name(), 
00150             1+i, 
00151             DDTranslation(0,0,
00152                           - halfZbl
00153                           + halfZvac
00154                           + vecVacZBeg()[i]
00155                           - blZBeg()),
00156             DDRotation() ) ;
00157   }
00158 
00159   for( unsigned int i ( 0 ) ; i != vecWinZBeg().size() ; ++i )
00160   {
00161      DDName wName ( ddname( winName() + int_to_string(i+1)) ) ;
00162      DDSolid wTubeSolid ( DDSolidFactory::tubs( wName ,
00163                                                 vecWinThick()[i]/2.,
00164                                                 0, 
00165                                                 blRadius(),
00166                                                 0*deg, 360*deg ) ) ;
00167      const DDLogicalPart wLog ( wName, ddmat(vecWinMat()[i]), wTubeSolid ) ;
00168 
00169      const double off ( 0<vecWinZBeg()[i] ? vecWinZBeg()[i] :
00170                         fabs(vecWinZBeg()[i]) - vecWinThick()[i] ) ;
00171      
00172      DDpos( wLog,
00173             parent().name(), 
00174             1+i, 
00175             DDTranslation(0,0,
00176                           - halfZbl
00177                           + vecWinThick()[i]/2.
00178                           + off
00179                           - blZBeg() ),
00180             DDRotation() ) ;
00181   }
00182 
00183   for( unsigned int i ( 0 ) ; i != vecTrgName().size() ; ++i )
00184   {
00185      DDName tName ( ddname( vecTrgName()[i]) ) ;
00186      DDSolid tSolid ( DDSolidFactory::box( tName ,
00187                                            vecTrgSide()[ i]/2.,
00188                                            vecTrgSide()[ i]/2.,
00189                                            vecTrgThick()[i]/2.  ) ) ;
00190      const DDLogicalPart tLog ( tName, trgMat(), tSolid ) ;
00191 
00192      if( tName.name() == "VETO" )
00193      {
00194         DDName vName ( ddname( tName.name() + "Hole" ) ) ;
00195         DDSolid vTubeSolid ( DDSolidFactory::tubs( vName ,
00196                                                    vecTrgThick()[i]/2.,
00197                                                    0, 
00198                                                    trgVetoHoleRadius(),
00199                                                    0*deg, 360*deg ) ) ;
00200         const DDLogicalPart vLog ( vName, holeMat(), vTubeSolid ) ;
00201              
00202         DDpos( vLog,
00203                tName, 
00204                copyOne, 
00205                DDTranslation(0,0,0),
00206                DDRotation() ) ;
00207      }
00208 
00209      DDpos( tLog,
00210             parent().name(), 
00211             copyOne, 
00212             DDTranslation(   vecTrgXOff()[i],
00213                              vecTrgYOff()[i],
00214                              vecTrgZPiv()[i] - halfZbl + blZPiv() - blZBeg() ),
00215             myrot( tName.name()+"Rot",
00216                    HepRotationZ( vecTrgPhi()[i]) ) ) ;
00217   }
00218 
00219   DDName pName ( fibCladName() ) ;
00220   const double planeWidth ( 32.5*fibSide() +
00221                             33.5*fibCladThick() ) ;
00222   const double planeThick ( 2*fibSide() +
00223                             3*fibCladThick() ) ;
00224   DDSolid pSolid ( DDSolidFactory::box( pName ,
00225                                         planeWidth/2.,
00226                                         fibLength()/2.,
00227                                         planeThick/2. ) ) ;
00228   const DDLogicalPart pLog ( pName, fibCladMat(), pSolid ) ;
00229 
00230   DDSolid fSolid ( DDSolidFactory::box( fibFibName()  ,
00231                                         fibSide()  /2.,
00232                                         fibLength()/2.,
00233                                         fibSide()  /2.) ) ;
00234 
00235   const DDLogicalPart fLog ( fibFibName(), fibFibMat(), fSolid ) ;
00236 
00237   for( unsigned int j ( 0 ) ; j != 32 ; ++j )
00238   {
00239      const double xoff ( planeWidth/2. -
00240                          (1+  j)*fibCladThick() -
00241                          (1+  j)*fibSide()         ) ;
00242      const double zoff ( -planeThick/2 + fibCladThick() + fibSide()/2. ) ;
00243      DDpos( fLog,
00244             pName, 
00245             1+j, 
00246             DDTranslation( xoff, 0, zoff ),
00247             DDRotation() ) ;
00248      
00249      DDpos( fLog,
00250             pName, 
00251             33+j, 
00252             DDTranslation( xoff + (fibCladThick()+fibSide())/2.,0, -zoff),
00253             DDRotation() ) ;
00254   }
00255   for( unsigned int i ( 0 ) ; i != vecFibZPiv().size() ; ++i )
00256   {
00257      DDpos( pLog,
00258             parent().name(), 
00259             1+i, 
00260             DDTranslation(   vecFibXOff()[i] - 0.5*fibSide(),
00261                              vecFibYOff()[i],
00262                              vecFibZPiv()[i] - halfZbl + blZPiv() - blZBeg() ),
00263             myrot( pName.name()+"Rot" + int_to_string(i),
00264                    HepRotationZ( vecFibPhi()[i]) ) ) ;
00265   }
00266 }

Generated on Tue Jun 9 17:37:25 2009 for CMSSW by  doxygen 1.5.4