Commit in GeomConverter/src/org/lcsim/geometry/compact/converter/lcdd on MAIN
PolyhedraBarrelCalorimeter.java+84-231.13 -> 1.14
JM: Snapshot of work in progress.

GeomConverter/src/org/lcsim/geometry/compact/converter/lcdd
PolyhedraBarrelCalorimeter.java 1.13 -> 1.14
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);
CVSspam 0.2.8