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