Commit in GeomConverter/src/org/lcsim/geometry/compact/converter/lcdd on MAIN
PolyhedraEndcapCalorimeter.java+84-491.15 -> 1.16
JM: Dev snapshot.

GeomConverter/src/org/lcsim/geometry/compact/converter/lcdd
PolyhedraEndcapCalorimeter.java 1.15 -> 1.16
diff -u -r1.15 -r1.16
--- PolyhedraEndcapCalorimeter.java	30 Oct 2006 07:39:03 -0000	1.15
+++ PolyhedraEndcapCalorimeter.java	26 Jan 2007 01:37:25 -0000	1.16
@@ -14,7 +14,6 @@
 import org.lcsim.geometry.compact.converter.lcdd.util.LCDD;
 import org.lcsim.geometry.compact.converter.lcdd.util.Material;
 import org.lcsim.geometry.compact.converter.lcdd.util.PhysVol;
-import org.lcsim.geometry.compact.converter.lcdd.util.PolyhedraRegular;
 import org.lcsim.geometry.compact.converter.lcdd.util.Position;
 import org.lcsim.geometry.compact.converter.lcdd.util.Rotation;
 import org.lcsim.geometry.compact.converter.lcdd.util.SensitiveDetector;
@@ -35,11 +34,20 @@
 {
     private Element node;
 
-    // 25 micron tolerance for staves and layers.
-    double tolerance=0.025;
+    // Tolerance applied to subdetector dimensions to avoid overlapping trapezoid faces.
+    private final double STAVE_ENVELOPE_TOLERANCE=10.0;
     
-    // 1 micron tolerance between sublayers.
-    double slice_tolerance=0.001;
+    // Subtract from layer dimensions.
+    private final double LAYER_ENVELOPE_TOLERANCE=1.0;
+    
+    // Subtract from slice dimensions.
+    private final double SLICE_ENVELOPE_TOLERANCE=1.0;
+    
+    // Small gap placed in front of each layer.
+    private final double INTER_LAYER_GAP=1.0;
+    
+    // Reduction in size of slice.  
+    private final double SLICE_TOLERANCE=0.01;
 
     public PolyhedraEndcapCalorimeter(Element node) throws JDOMException
     {
@@ -78,12 +86,20 @@
         envelopeRotation.setZ(zrot);
         define.addRotation(envelopeRotation);
 
+        LayerStack layers = Layering.makeLayering(this.node).getLayerStack();
+        
         // Total thickness of the subdetector.
         double subdetector_thickness = org.lcsim.geometry.layer.LayerFromCompactCnv.computeDetectorTotalThickness(node);
-        double radial_thickness = rmax - rmin;
-        double detZ = subdetector_thickness;
+        
+        // DEBUG
+        subdetector_thickness += layers.getNumberOfLayers() * INTER_LAYER_GAP;
+                
+        double radial_thickness = rmax - rmin;        
 
+        /*
         // The detector envelope volume.
+         * 
+        double detZ = subdetector_thickness;
         PolyhedraRegular polyhedra = new PolyhedraRegular(
                 detName + "_polyhedra",
                 numsides, rmin, rmax, detZ);
@@ -92,6 +108,7 @@
         Volume envelopeVolume = new Volume(detName + "_envelope");
         envelopeVolume.setSolid(polyhedra);
         envelopeVolume.setMaterial(air);
+        */
 
         // The stave's trapezoid.
         double innerAngle = Math.PI * 2 / numsides;
@@ -99,29 +116,33 @@
         double innerFaceLength = rmin * tan(halfInnerAngle) * 2;
         double outerFaceLength = rmax * tan(halfInnerAngle) * 2;
 
+        // Apply tolerance to dimensions.
+        radial_thickness -= STAVE_ENVELOPE_TOLERANCE;
+        innerFaceLength -= STAVE_ENVELOPE_TOLERANCE;
+        outerFaceLength -= STAVE_ENVELOPE_TOLERANCE;
+                       
+        //outerFaceLength = (innerFaceLength * outerFaceLength) / (innerFaceLength + STAVE_ENVELOPE_TOLERANCE);
+        //System.out.println("outerFaceLength="+outerFaceLength);
+        
         Trapezoid sectTrd = new Trapezoid(detName + "_stave_trapezoid");
-        sectTrd.setY2(subdetector_thickness - tolerance);
-        sectTrd.setY1(subdetector_thickness - tolerance);
-        sectTrd.setZ(radial_thickness - tolerance);
-        sectTrd.setX1(innerFaceLength - tolerance);
-        sectTrd.setX2(outerFaceLength - tolerance);
-
-        //sectTrd.setY2(subdetector_thickness);
-        //sectTrd.setY1(subdetector_thickness);
-        //sectTrd.setZ(radial_thickness);
-        //sectTrd.setX1(innerFaceLength);
-        //sectTrd.setX2(outerFaceLength);
+        sectTrd.setY2(subdetector_thickness);
+        sectTrd.setY1(subdetector_thickness);
+        sectTrd.setZ(radial_thickness);
+        sectTrd.setX1(innerFaceLength);
+        sectTrd.setX2(outerFaceLength);
         
         solids.addSolid(sectTrd);
         Volume sectVolume = new Volume(detName + "_stave");
         sectVolume.setMaterial(air);
         sectVolume.setSolid(sectTrd);
 
-        LayerStack layers = Layering.makeLayering(this.node).getLayerStack();
-
         // Build the layers.
         int layer_number = 0;
         double layer_position_y = subdetector_thickness / 2;
+        
+        // DEBUG
+        layer_position_y -= INTER_LAYER_GAP;
+               
         for (Iterator i = node.getChildren("layer").iterator(); i.hasNext();)
         {
             Element layer_element = (Element) i.next();
@@ -144,18 +165,16 @@
                 // Layer trapezoid.
                 Trapezoid layer_trd = new Trapezoid(layer_name + "_trapezoid");
                 
-                layer_trd.setX1(innerFaceLength - tolerance);
-                layer_trd.setX2(outerFaceLength - tolerance);
-                layer_trd.setY1(layer_thickness - tolerance);
-                layer_trd.setY2(layer_thickness - tolerance);
-                layer_trd.setZ(radial_thickness - tolerance);
-                
-                //layer_trd.setX1(innerFaceLength);
-                //layer_trd.setX2(outerFaceLength);
-                //layer_trd.setY1(layer_thickness);
-                //layer_trd.setY2(layer_thickness);
-                //layer_trd.setZ(radial_thickness);
+                double layerInnerFaceLength=innerFaceLength-LAYER_ENVELOPE_TOLERANCE;
+                double layerOuterFaceLength=outerFaceLength-LAYER_ENVELOPE_TOLERANCE;
+                double layerRadialThickness=radial_thickness-LAYER_ENVELOPE_TOLERANCE;
                 
+                layer_trd.setX1(layerInnerFaceLength);
+                layer_trd.setX2(layerOuterFaceLength);
+                layer_trd.setY1(layer_thickness);
+                layer_trd.setY2(layer_thickness);
+                layer_trd.setZ(layerRadialThickness);
+                                
                 solids.addSolid(layer_trd);
 
                 Volume layer_volume = new Volume(layer_name);
@@ -174,6 +193,10 @@
                     boolean sensitive = s != null && s.getBooleanValue();
 
                     double slice_thickness = slice_element.getAttribute("thickness").getDoubleValue();
+                    
+                    // Apply tolerance factor to given slice thickness.
+                    //slice_thickness -= SLICE_TOLERANCE;
+                    
                     slice_position_y -=  slice_thickness / 2;
 
                     Position slicePosition = new Position(slice_name + "_position");
@@ -181,18 +204,16 @@
                     define.addPosition(slicePosition);
 
                     Trapezoid sliceTrd = new Trapezoid(slice_name + "_trapezoid");
-
-                    sliceTrd.setX1(innerFaceLength - tolerance);
-                    sliceTrd.setX2(outerFaceLength - tolerance);
-                    sliceTrd.setY1(slice_thickness - slice_tolerance);
-                    sliceTrd.setY2(slice_thickness - slice_tolerance);
-                    sliceTrd.setZ(radial_thickness - tolerance);
                     
-                    //sliceTrd.setX1(innerFaceLength);
-                    //sliceTrd.setX2(outerFaceLength);
-                    //sliceTrd.setY1(slice_thickness);
-                    //sliceTrd.setY2(slice_thickness);
-                    //sliceTrd.setZ(radial_thickness);
+                    double sliceInnerFaceLength = layerInnerFaceLength - SLICE_ENVELOPE_TOLERANCE;
+                    double sliceOuterFaceLength = layerOuterFaceLength - SLICE_ENVELOPE_TOLERANCE;
+                    double sliceRadialThickness = layerRadialThickness - SLICE_ENVELOPE_TOLERANCE;
+                    
+                    sliceTrd.setX1(sliceInnerFaceLength);
+                    sliceTrd.setX2(sliceOuterFaceLength);
+                    sliceTrd.setY1(slice_thickness-SLICE_TOLERANCE);
+                    sliceTrd.setY2(slice_thickness-SLICE_TOLERANCE);
+                    sliceTrd.setZ(sliceRadialThickness);
                     
                     solids.addSolid(sliceTrd);
 
@@ -230,10 +251,15 @@
                 sectVolume.addPhysVol(layer_physvol);
 
                 layer_position_y -= layer_thickness / 2;
+                
+                // DEBUG
+                layer_position_y -= INTER_LAYER_GAP;
 
-                ++layer_number;               
-            }            
-        }
+                ++layer_number;                    
+            }
+            // DEBUG
+            //break;
+        }        
 
         // Add the section volume after layers created.
         setVisAttributes(lcdd, node, sectVolume);
@@ -241,11 +267,15 @@
 
         // Place the sections.
         double innerRotation = innerAngle;
-        double offsetRotation = -innerRotation / 2;
+        //double offsetRotation = -innerRotation / 2;
+        //double offsetRotation = 0.;
 
         double sectCenterRadius = rmin + radial_thickness / 2;
-        double rotY = -offsetRotation;
+        //double rotY = -offsetRotation;
+        double rotY = 0.;
+        //double rotY = 0.;
         double rotX = PI / 2;
+        //double rotX = PI / 4;
         double posX = -sectCenterRadius * sin(rotY);
         double sectPosY = sectCenterRadius * cos(rotY);
         for ( int i=0; i < numsides; i++)
@@ -257,6 +287,8 @@
             position.setY(sectPosY);
             position.setZ(zmin + subdetector_thickness/2);
 
+            //System.out.println("rotY="+rotY);
+            
             Rotation rotation = new Rotation(detName + "_stave0_module" + moduleNumber + "_rotation");
             rotation.setX(rotX);
             rotation.setY(rotY);
@@ -276,6 +308,7 @@
             sectPhysVol.addPhysVolID("module",moduleNumber);
             
             // Place the reflected subdetector envelope.
+
             boolean reflect = node.getAttribute("reflect").getBooleanValue();
             if (reflect)
             {
@@ -299,9 +332,7 @@
                 reflect_position.setZ(-zmin-subdetector_thickness/2);
                 define.addPosition(reflect_position);
                 
-                //PhysVol physvol2 = new PhysVol(envelopeVolume);
                 PhysVol physvol2 = new PhysVol(sectVolume);
-                //physvol2.setZ(-zmin-subdetector_thickness/2);
                 physvol2.setPosition(reflect_position);
                 physvol2.setRotation(envelopeRotationReflect);
                 physvol2.addPhysVolID("system",id);
@@ -314,6 +345,10 @@
             rotY -= innerRotation;
             posX = -sectCenterRadius * sin(rotY);
             sectPosY = sectCenterRadius * cos(rotY);
+            
+            // DEBUG
+            //if (i==1)
+            //	break;
         }
 
         /*
CVSspam 0.2.8