GeomConverter/src/org/lcsim/geometry/compact/converter/lcdd
diff -u -r1.13 -r1.14
--- PolyhedraBarrelCalorimeter.java 26 Oct 2006 18:56:23 -0000 1.13
+++ PolyhedraBarrelCalorimeter.java 6 Dec 2006 01:09:16 -0000 1.14
@@ -36,9 +36,18 @@
{
private Element node;
- // 1 micro tolerance;
- double tolerance=0.001;
-
+ // Gaps between the stave and the polyhedra envelope. (10 micron)
+ private static final double STAVE_GAP = 0.1;
+
+ // Gap on the side of a layer within the stave. (1 micron)
+ private static final double LAYER_SIDE_GAP = STAVE_GAP + 0.01;
+
+ // Gap between layers in the stave. (1 micron)
+ private static final double INTER_LAYER_GAP = 0.01;
+
+ // Gap between slices. (1 micron)
+ private static final double SLICE_GAP = 0.01;
+
public PolyhedraBarrelCalorimeter(Element node) throws JDOMException
{
super(node);
@@ -75,9 +84,44 @@
// Total thickness of subdetector.
double total_thickness = layering.getLayerStack().getTotalThickness();
-
+
+ int total_repeat = 0;
+ int total_slices = 0;
+ for (Iterator i = node.getChildren("layer").iterator(); i.hasNext();)
+ {
+ Element layer_element = (Element) i.next();
+ int repeat = layer_element.getAttribute("repeat").getIntValue();
+ total_repeat += repeat;
+ total_slices += (layer_element.getChildren("slice").size() * total_repeat);
+ }
+
+ //System.out.println("total_slices="+total_slices);
+ //System.out.println("total_repeat="+total_repeat);
+
+ //System.out.println("total_thickness NO GAPS = " + total_thickness);
+
+ // Gap at front and back of stave.
+ total_thickness += 2.0 * STAVE_GAP;
+
+ //System.out.println("total_thickness="+total_thickness);
+
+ // Gaps between layers.
+ total_thickness += INTER_LAYER_GAP * total_repeat;
+
+ //System.out.println("total_thickness="+total_thickness);
+
+ // Gaps between slices and at the back of each layer.
+ total_thickness += (SLICE_GAP * ((double)(total_slices + total_repeat)));
+
+ //System.out.println("total_thickness WITH GAPS = " + total_thickness);
+
// Envelope volume for subdetector.
- PolyhedraRegular polyhedra = new PolyhedraRegular(detName + "_polyhedra", numsides, rmin, rmin + total_thickness, detZ);
+ PolyhedraRegular polyhedra = new PolyhedraRegular(
+ detName + "_polyhedra",
+ numsides,
+ rmin,
+ rmin + total_thickness,
+ detZ);
solids.addSolid(polyhedra);
Volume envelopeVolume = new Volume(detName + "_envelope");
@@ -90,19 +134,21 @@
envelopePhysvol.addPhysVolID("barrel", 0);
motherVolume.addPhysVol(envelopePhysvol);
- /* single stave trapezoid */
+ // A trapezoid stave.
double innerAngle = Math.PI * 2 / numsides;
double halfInnerAngle = innerAngle / 2;
double innerFaceLength = rmin * tan(halfInnerAngle) * 2;
double rmax = rmin + total_thickness;
double outerFaceLength = rmax * tan(halfInnerAngle) * 2;
+ double stave_thickness = total_thickness - STAVE_GAP * 2;
+
Trapezoid sectTrd = new Trapezoid(detName + "_stave_trapezoid");
- sectTrd.setY2(detZ-tolerance);
- sectTrd.setY1(detZ-tolerance);
- sectTrd.setZ(total_thickness-tolerance);
- sectTrd.setX1(innerFaceLength-tolerance);
- sectTrd.setX2(outerFaceLength-tolerance);
+ sectTrd.setY2(detZ);
+ sectTrd.setY1(detZ);
+ sectTrd.setZ(stave_thickness);
+ sectTrd.setX1(innerFaceLength - STAVE_GAP);
+ sectTrd.setX2(outerFaceLength - STAVE_GAP);
solids.addSolid(sectTrd);
Volume sectVolume = new Volume(detName + "_stave");
@@ -119,8 +165,11 @@
//System.out.println("total_thickness="+total_thickness);
int layer_number = 0;
- double layer_position_z = -(total_thickness / 2);
- double layer_dim_x = innerFaceLength;
+ //double layer_position_z = -(total_thickness / 2);
+ double layer_position_z = -(stave_thickness / 2);
+
+ double layer_dim_x = innerFaceLength;
+
for (Iterator i = node.getChildren("layer").iterator(); i.hasNext();)
{
Element layer_element = (Element) i.next();
@@ -142,11 +191,18 @@
// Layer thickness.
double layer_thickness = layer.getThickness();
+ int nslices = layer_element.getChildren("slices").size();
+
+ layer_thickness += (nslices + 1) * SLICE_GAP;
+
//System.out.println("layer_thickness="+layer_thickness);
// Layer position in Z within the stave.
layer_position_z += layer_thickness / 2;
-
+
+ // Insert the inter-layer gap.
+ layer_position_z += INTER_LAYER_GAP;
+
//System.out.println("layer_position_z="+layer_position_z);
// Position of layer.
@@ -156,9 +212,9 @@
// Layer box.
Box layer_box = new Box(layer_name + "_box");
- layer_box.setX(layer_dim_x-tolerance);
- layer_box.setY(detZ-tolerance);
- layer_box.setZ(layer_thickness-tolerance);
+ layer_box.setX(layer_dim_x - LAYER_SIDE_GAP);
+ layer_box.setY(detZ);
+ layer_box.setZ(layer_thickness);
solids.addSolid(layer_box);
// Layer volume.
@@ -169,6 +225,9 @@
// Create the slices (sublayers) within the layer.
double slice_position_z = -(layer_thickness / 2);
+ // Insert the inter-slice gap.
+ slice_position_z += SLICE_GAP;
+
//System.out.println("start slice_position_z="+slice_position_z);
int slice_number = 0;
@@ -196,9 +255,9 @@
// Slice box.
Box slice_box = new Box(slice_name + "_box");
- slice_box.setX(layer_dim_x-tolerance);
- slice_box.setY(detZ-tolerance);
- slice_box.setZ(slice_thickness-tolerance);
+ slice_box.setX(layer_dim_x - LAYER_SIDE_GAP);
+ slice_box.setY(detZ);
+ slice_box.setZ(slice_thickness);
solids.addSolid(slice_box);
// Slice volume.
@@ -211,7 +270,8 @@
// Set region, limitset, and vis.
setRegion(lcdd, slice_element, slice_volume);
- setLimitSet(lcdd, slice_element, slice_volume);
+ //setLimitSet(lcdd, slice_element, slice_volume);
+ setLimitSet(lcdd, node, slice_volume);
setVisAttributes(lcdd, node, slice_volume);
// slice PhysVol
@@ -229,7 +289,8 @@
// Set region, limitset, and vis.
setRegion(lcdd, layer_element, layer_volume);
- setLimitSet(lcdd, layer_element, layer_volume);
+ //setLimitSet(lcdd, layer_element, layer_volume);
+ setLimitSet(lcdd, node, layer_volume);
setVisAttributes(lcdd, node, layer_volume);
// Add the layer logical volume to the structure.
@@ -263,7 +324,7 @@
double offsetRotation = -innerRotation / 2;
//double placementRotation = -offsetRotation;
- double sectCenterRadius = rmin + total_thickness / 2;
+ double sectCenterRadius = rmin + total_thickness / 2 + STAVE_GAP;
double rotY = -offsetRotation;
double rotX = PI / 2;
double posX = -sectCenterRadius * sin(rotY);