16 #include "CLHEP/Units/PhysicalConstants.h"
17 #include "CLHEP/Units/SystemOfUnits.h"
23 LogDebug(
"PixelGeom") <<
"DDPixBarTPGStackLayerAlgo info: Creating an instance";
44 number = int(nArgs[
"Ladders"]);
51 coolZ = nArgs[
"CoolZ"];
55 coolMat = sArgs[
"CoolMaterial"];
56 tubeMat = sArgs[
"CoolTubeMaterial"];
62 layout = int(nArgs[
"LayoutType"]);
67 LogDebug(
"PixelGeom") <<
"DDPixBarTPGStackLayerAlgo debug: Parent " << parentName
69 <<
"\tLadders " <<
number <<
"\tGeneral Material "
71 <<
sensorEdge <<
"\tSpecification of Cooling Pieces:\n"
73 <<
" Side " <<
coolSide <<
" Thickness of Shell "
77 LogDebug(
"PixelGeom") <<
"DDPixBarTPGStackLayerAlgo debug: Ladder "
88 std::cout <<
"\nAsking for an invalid layout ... Adjusting the number of ladders to compensate.\n";
91 double phi_coverage = 0.0;
93 double dphi = CLHEP::twopi/
number;
95 double radius_offset = 0.0;
96 double deltaX, deltaY;
97 double deltaX2, deltaY2;
98 double r_vol_inner = 0.0;
99 double r_vol_outer = 0.0;
100 double phi_coverage_pinn =0.0;
101 double phi_left = 0.0;
102 double phi_right = 0.0;
110 double r_right =
sqrt( d3*d3 + d4*d4 + 2*d3*d4*
sin(phi_offset)) ;
111 phi_right=acos( (r_right*r_right + d3*d3 - d4*d4)/
114 double d5 =
sqrt(d1*d1+d2*d2);
116 double r_left =
sqrt ( d4*d4 + d6*d6 - 2*d4*d6*
sin(phi_offset) ) ;
117 phi_left=acos( (r_left*r_left + d6*d6 - d4*d4)/
120 if (r_right> r_left ) {r_vol_outer=r_right;r_vol_inner=r_left;}
121 if (r_left > r_right) {r_vol_outer=r_left;r_vol_inner=r_right;}
123 phi_coverage_pinn=phi_left+phi_right;
128 phi_coverage_pinn = 0.0;
133 radius_offset = (r1-
r2)/2.0;
141 if(r_vol_inner>r_vol_outer) {
142 r_vol_innerT=r_vol_inner;
143 r_vol_inner=r_vol_outer-30;
144 r_vol_outer=r_vol_innerT+30;
149 int component_copy_no=1;
150 double phi0 = 90*CLHEP::deg;
151 double phi =0*CLHEP::deg;
152 double phix=0*CLHEP::deg;
153 double phiy=0*CLHEP::deg;
175 LogDebug(
"PixelGeom") <<
"DDPixBarTPGStackLayerAlgo test: "
178 <<
" with Rin " << r_vol_inner <<
" Rout " << r_vol_outer
184 name = idName +
"CoolTube";
185 solid =
DDSolidFactory::trap(
DDName(name,
idNameSpace), 0.5*
coolDz, 0, 0,
coolWidth/2,
coolSide/2,
coolSide/2, 0,
coolWidth/2,
coolSide/2,
coolSide/2, 0);
190 LogDebug(
"PixelGeom") <<
"DDPixBarTPGStackLayerAlgo test: " <<solid.
name()
191 <<
" Trap made of " <<
tubeMat <<
" of dimensions "
200 name = idName +
"Coolant";
202 solid =
DDSolidFactory::trap(
DDName(name,
idNameSpace), 0.5*
coolDz, 0, 0,
coolWidth/2-
coolThick,
coolSide/2-
coolThick,
coolSide/2-
coolThick, 0,
coolWidth/2-
coolThick,
coolSide/2-
coolThick,
coolSide/2-
coolThick, 0);
206 LogDebug(
"PixelGeom") <<
"DDPixBarTPGStackLayerAlgo test: " <<solid.
name()
207 <<
" Trap made of " <<
tubeMat <<
" of dimensions "
218 LogDebug(
"PixelGeom") <<
"DDPixBarTPGStackLayerAlgo test: " << cool.name()
219 <<
" number 1 positioned in " << coolTube.name()
220 <<
" at (0,0,0) with no rotation";
235 double phi_coverage_i=0.0;
238 phix = phi + (90*CLHEP::deg) - phi_offset ;
239 phiy = phix + (90*CLHEP::deg) ;
250 name = idName + std::to_string(component_copy_no);
253 cpv.
position (ladderFullDown, layer, component_copy_no, tran, rot);
255 LogDebug(
"PixelGeom") <<
"DDPixBarTPGStackLayerAlgo test: " << ladderFullDown
256 <<
" number " << component_copy_no
257 <<
" positioned in " << layer.
name()
265 name = idName + std::to_string(component_copy_no);
268 cpv.
position (ladderFullUp, layer, component_copy_no, tran, rot);
270 LogDebug(
"PixelGeom") <<
"DDPixBarTPGStackLayerAlgo test: " << ladderFullUp
271 <<
" number " << component_copy_no
272 <<
" positioned in " << layer.
name()
277 phi_coverage_i=phi_coverage_pinn;
282 phi_coverage += phi_coverage_i;
284 if (phi_coverage>CLHEP::twopi&&covered==0) {
292 if (phi_coverage<CLHEP::twopi) {
throw cms::Exception(
"DDPixBarTPGStackLayerAlgo")
293 <<
"\nAsking for a Geometry with gaps in phi.\n";}
303 phix = phi + (90*CLHEP::deg) - phi_offset;
304 phiy = phix + (90*CLHEP::deg) ;
306 deltaX= coolOffset*
cos(90*CLHEP::deg-phi+phi_offset);
307 deltaY= coolOffset*
sin(90*CLHEP::deg-phi+phi_offset);
308 deltaX2= coolOffset2*
cos(90*CLHEP::deg-phi+phi_offset);
309 deltaY2= coolOffset2*
sin(90*CLHEP::deg-phi+phi_offset);
318 name = idName +
"xxx" + std::to_string(
i+10000);
321 cpv.
position (coolTube, layer,
i*2+1, tran, rot);
322 LogDebug(
"PixelGeom") <<
"DDPixBarTPGStackLayerAlgo test: " << coolTube.name()
323 <<
" number " <<
i*2+1 <<
" positioned in "
324 << layer.name() <<
" at " << tran <<
" with "<<
rot;
325 cpv.
position (coolTube, layer,
i*2+2, tran2, rot);
326 LogDebug(
"PixelGeom") <<
"DDPixBarTPGStackLayerAlgo test: " << coolTube.name()
327 <<
" number " <<
i*2+2 <<
" positioned in "
328 << layer.name() <<
" at " << tran2 <<
" with "<<
rot;
334 name = idName +
"xxx2" + std::to_string(
i+10000);
337 cpv.
position (coolTube, layer, number*2+
i*2+1, tran, rot);
338 LogDebug(
"PixelGeom") <<
"DDPixBarTPGStackLayerAlgo test: " << coolTube.name()
339 <<
" number " << number*2+
i*2+1 <<
" positioned in "
340 << layer.name() <<
" at " << tran <<
" with "<<
rot;
341 cpv.
position (coolTube, layer, number*2+
i*2+2, tran2, rot);
342 LogDebug(
"PixelGeom") <<
"DDPixBarTPGStackLayerAlgo test: " << coolTube.name()
343 <<
" number " << number*2+
i*2+2 <<
" positioned in "
344 << layer.name() <<
" at " << tran2 <<
" with "<<
rot;
DDPixBarTPGStackLayerAlgo()
DDMaterial is used to define and access material information.
std::string ladderNameDown
Sin< T >::type sin(const T &t)
void initialize(const DDNumericArguments &nArgs, const DDVectorArguments &vArgs, const DDMapArguments &mArgs, const DDStringArguments &sArgs, const DDStringVectorArguments &vsArgs)
void position(const DDLogicalPart &self, const DDLogicalPart &parent, std::string copyno, const DDTranslation &trans, const DDRotation &rot, const DDDivision *div=NULL)
DDName is used to identify DDD entities uniquely.
static std::string & ns()
type of data representation of DDCompactView
A DDSolid represents the shape of a part.
ROOT::Math::DisplacementVector3D< ROOT::Math::Cartesian3D< double > > DDTranslation
Represents a uniquely identifyable rotation matrix.
U second(std::pair< T, U > const &p)
Cos< T >::type cos(const T &t)
Tan< T >::type tan(const T &t)
A DDLogicalPart aggregates information concerning material, solid and sensitveness ...
static DDSolid tubs(const DDName &name, double zhalf, double rIn, double rOut, double startPhi, double deltaPhi)
virtual ~DDPixBarTPGStackLayerAlgo()
static DDSolid trap(const DDName &name, double pDz, double pTheta, double pPhi, double pDy1, double pDx1, double pDx2, double pAlp1, double pDy2, double pDx3, double pDx4, double pAlp2)
std::string VolumeMaterial
void execute(DDCompactView &cpv)
std::pair< std::string, std::string > DDSplit(const std::string &n)
split into (name,namespace), separator = ':'
const std::string & name() const
Returns the name.