00001
00002
00003
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 }