CMS 3D CMS Logo

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