Commit in GeomConverter on MAIN
src/org/lcsim/geometry/compact/converter/lcdd/PolyhedraEndcapCalorimeter.java+119-791.7 -> 1.8
test/org/lcsim/geometry/compact/converter/lcdd/PolyhedraEndcapCalorimeterConverterTest.java+3-11.1 -> 1.2
test/org/lcsim/geometry/subdetector/PolyhedraEndcapCalorimeterTest.xml+2-11.3 -> 1.4
+124-81
3 modified files
JM: Place slice volumes into layers.  Fix bug where layers and slices were built in wrong direction w.r.t. to layer and slice numbering and orientation.

GeomConverter/src/org/lcsim/geometry/compact/converter/lcdd
PolyhedraEndcapCalorimeter.java 1.7 -> 1.8
diff -u -r1.7 -r1.8
--- PolyhedraEndcapCalorimeter.java	11 Oct 2006 23:57:44 -0000	1.7
+++ PolyhedraEndcapCalorimeter.java	17 Oct 2006 23:20:03 -0000	1.8
@@ -1,31 +1,35 @@
 package org.lcsim.geometry.compact.converter.lcdd;
 
+import static java.lang.Math.PI;
+import static java.lang.Math.cos;
+import static java.lang.Math.sin;
+import static java.lang.Math.tan;
+
 import java.util.Iterator;
-import org.jdom.Element;
+
 import org.jdom.Attribute;
+import org.jdom.Element;
 import org.jdom.JDOMException;
 import org.lcsim.geometry.compact.converter.lcdd.util.Define;
-import static java.lang.Math.PI;
-import static java.lang.Math.tan;
-import static java.lang.Math.sin;
-import static java.lang.Math.cos;
 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.SensitiveDetector;
-import org.lcsim.geometry.compact.converter.lcdd.util.Solids;
-import org.lcsim.geometry.compact.converter.lcdd.util.Structure;
 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;
+import org.lcsim.geometry.compact.converter.lcdd.util.Solids;
+import org.lcsim.geometry.compact.converter.lcdd.util.Structure;
 import org.lcsim.geometry.compact.converter.lcdd.util.Trapezoid;
-import org.lcsim.geometry.compact.converter.lcdd.util.Box;
 import org.lcsim.geometry.compact.converter.lcdd.util.Volume;
-import org.lcsim.geometry.compact.converter.lcdd.util.Position;
-import org.lcsim.geometry.compact.converter.lcdd.util.Rotation;
+import org.lcsim.geometry.layer.LayerStack;
+import org.lcsim.geometry.layer.Layering;
 
 /**
+ * Convert a PolyhedraEndcapCalorimeter to the LCDD format.
  *
- * @author jeremym
+ * @author Jeremy McCormick <[log in to unmask]>
+ * @version $id: $
  */
 public class PolyhedraEndcapCalorimeter extends LCDDSubdetector
 {
@@ -44,37 +48,37 @@
             throw new IllegalArgumentException("PolyhedraBarrelCalorimeter <" + getName() + " has null SD.");
         }
         
-        /* local refs to LCDD objects */
+        // Get important LCDD objects.
         Solids solids = lcdd.getSolids();
         Structure structure = lcdd.getStructure();
         Volume motherVolume = lcdd.pickMotherVolume(this);
         Material air = lcdd.getMaterial("Air");
         Define define = lcdd.getDefine();
         
-        /* name and id */
+        // Subdetector name and ID.
         String detName = node.getAttributeValue("name");
         int id = node.getAttribute("id").getIntValue();
         
-        /* get dimensions */
+        // Subdetector envelope dimensions.
         Element dimensions = node.getChild("dimensions");
         double zmin = dimensions.getAttribute("zmin").getDoubleValue();
         double rmin = dimensions.getAttribute("rmin").getDoubleValue();
         double rmax = dimensions.getAttribute("rmax").getDoubleValue();
         int numsides = dimensions.getAttribute("numsides").getIntValue();
         
-        /* polyhedra rotation so it lays "flat" */
+        // Rotation of polyhedra into correct frame.
         double zrot = Math.PI / numsides;
         Rotation envelopeRotation = new Rotation(detName + "_rotation");
         envelopeRotation.setZ(zrot);
         define.addRotation(envelopeRotation);
         
-        /* total thickness of the detector */
-        double layersThickness = org.lcsim.geometry.layer.LayerFromCompactCnv.computeDetectorTotalThickness(node);
-        double zmax = zmin + layersThickness;
-        double radialThickness = rmax - rmin;
-        double detZ = layersThickness;
+        // Total thickness of the subdetector.
+        double subdetector_thickness = org.lcsim.geometry.layer.LayerFromCompactCnv.computeDetectorTotalThickness(node);
+        //double zmax = zmin + layersThickness;
+        double radial_thickness = rmax - rmin;
+        double detZ = subdetector_thickness;
         
-        /* envelope volume */
+        // The detector envelope volume.
         PolyhedraRegular polyhedra = new PolyhedraRegular(
                 detName + "_polyhedra",
                 numsides, rmin, rmax, detZ);
@@ -84,14 +88,14 @@
         envelopeVolume.setSolid(polyhedra);
         envelopeVolume.setMaterial(air);
         
-        /* single stave trapezoid */
+        // The stave's trapezoid.
         double innerAngle = Math.PI * 2 / numsides;
         double halfInnerAngle = innerAngle/2;
         
         Trapezoid sectTrd = new Trapezoid(detName + "_stave_trapezoid");
-        sectTrd.setY2(layersThickness);
-        sectTrd.setY1(layersThickness);
-        sectTrd.setZ(radialThickness);
+        sectTrd.setY2(subdetector_thickness);
+        sectTrd.setY1(subdetector_thickness);
+        sectTrd.setZ(radial_thickness);
         
         double innerFaceLength = rmin * tan(halfInnerAngle) * 2;
         sectTrd.setX1(innerFaceLength);
@@ -104,86 +108,122 @@
         sectVolume.setSolid(sectTrd);
         
         /* build the box layers in the stave */
-        double layerOuterAngle = (PI - innerAngle) / 2;
-        double layerInnerAngle = (PI/2 - layerOuterAngle);
+        //double layerOuterAngle = (PI - innerAngle) / 2;
+        //double layerInnerAngle = (PI/2 - layerOuterAngle);
+        
+        LayerStack layers = Layering.makeLayering(this.node).getLayerStack();
         
-        int layerNum = 0;
-        double posY = -layersThickness / 2;
+        // Build the layers.
+        int layer_number = 0;
+        double layer_position_y = subdetector_thickness / 2;
         for (Iterator i = node.getChildren("layer").iterator(); i.hasNext();)
         {
-            Element layer = (Element) i.next();
-            int repeat = layer.getAttribute("repeat").getIntValue();
+            Element layer_element = (Element) i.next();
+            
+            int repeat = layer_element.getAttribute("repeat").getIntValue();
+            
             for ( int j=0; j<repeat; j++)
             {
-                int sliceNum = 0;
-                for ( Iterator k = layer.getChildren("slice").iterator(); k.hasNext();)
+            	String layer_name = detName + "_stave_layer" + layer_number;;
+        
+            	double layer_thickness = layers.getLayer(layer_number).getThickness();
+         
+            	layer_position_y -= layer_thickness / 2;
+            	
+            	// Layer position.
+                Position layer_position = new Position(layer_name + "_position");
+                layer_position.setY(layer_position_y);
+                define.addPosition(layer_position);
+            	
+                // Layer trapezoid.
+                Trapezoid layer_trd = new Trapezoid(layer_name + "_trapezoid");
+                layer_trd.setX1(innerFaceLength);
+                layer_trd.setX2(outerFaceLength);
+                layer_trd.setY1(layer_thickness);
+                layer_trd.setY2(layer_thickness);
+                layer_trd.setZ(radial_thickness);
+                solids.addSolid(layer_trd);
+                
+                Volume layer_volume = new Volume(layer_name);
+                layer_volume.setSolid(layer_trd);
+                layer_volume.setMaterial(lcdd.getMaterial("Air"));
+                
+                int slice_number = 0;
+                double slice_position_y = layer_thickness / 2;
+                for ( Iterator k = layer_element.getChildren("slice").iterator(); k.hasNext();)
                 {
-                    Element slice = (Element) k.next();
-                    
-                    String sliceName = detName + "_stave_layer" + layerNum + "_slice" + sliceNum;
-                    
-                    Attribute s = slice.getAttribute("sensitive");
+                	Element slice_element = (Element)k.next();
+                	
+                	String slice_name = layer_name + "_slice" + slice_number;
+                	
+                	Attribute s = slice_element.getAttribute("sensitive");
                     boolean sensitive = s != null && s.getBooleanValue();
-                    
-                    double thickness = slice.getAttribute("thickness").getDoubleValue();
-                    posY +=  thickness / 2;
-                    
-                    /* slice position */
-                    Position slicePosition = new Position(sliceName + "_position");
-                    slicePosition.setY(posY);
+
+                    double slice_thickness = slice_element.getAttribute("thickness").getDoubleValue();
+                    slice_position_y -=  slice_thickness / 2;
+                                  
+                    Position slicePosition = new Position(slice_name + "_position");
+                    slicePosition.setY(slice_position_y);
                     define.addPosition(slicePosition);
-                    
-                    /* slice box */
-                    Trapezoid sliceTrd = new Trapezoid(sliceName + "_trapezoid");
+
+                    Trapezoid sliceTrd = new Trapezoid(slice_name + "_trapezoid");
                     sliceTrd.setX1(innerFaceLength);
                     sliceTrd.setX2(outerFaceLength);
-                    sliceTrd.setY1(thickness);
-                    sliceTrd.setY2(thickness);
-                    sliceTrd.setZ(radialThickness);
+                    sliceTrd.setY1(slice_thickness);
+                    sliceTrd.setY2(slice_thickness);
+                    sliceTrd.setZ(radial_thickness);
                     solids.addSolid(sliceTrd);
                     
-                    /* slice volume */
-                    Volume sliceVolume = new Volume(sliceName);
+                    Volume sliceVolume = new Volume(slice_name);
                     sliceVolume.setSolid(sliceTrd);
-                    Material sliceMaterial = lcdd.getMaterial(slice.getAttributeValue("material"));
+                    Material sliceMaterial = lcdd.getMaterial(slice_element.getAttributeValue("material"));
                     sliceVolume.setMaterial(sliceMaterial);
-                    if ( sensitive ) sliceVolume.setSensitiveDetector(sens);
+                    if ( sensitive ) sliceVolume.setSensitiveDetector(sens);                    
                     
-                    /* FIXME: these need to be called automatically whenever a new volume is created --JM */
-                    setRegion(lcdd, slice, sliceVolume);
-                    setLimitSet(lcdd, slice, sliceVolume);                    
+                    setRegion(lcdd, slice_element, sliceVolume);
+                    setLimitSet(lcdd, slice_element, sliceVolume);                    
                     
                     setVisAttributes(lcdd, node, sliceVolume);
-                    structure.addVolume(sliceVolume);
+                    structure.addVolume(sliceVolume);    
                     
-                    /* slice PhysVol */
                     PhysVol slicePhysVol = new PhysVol(sliceVolume);
                     slicePhysVol.setPosition(slicePosition);
-                    slicePhysVol.addPhysVolID("layer", layerNum);
-                    slicePhysVol.addPhysVolID("slice", sliceNum);
-                    sectVolume.addPhysVol(slicePhysVol);
+                    slicePhysVol.addPhysVolID("slice", slice_number);
+                    layer_volume.addPhysVol(slicePhysVol);
                     
-                    /* incr Y position */
-                    posY += thickness / 2;
+                    slice_position_y -= slice_thickness / 2;
                     
-                    /* incr slice number */
-                    ++sliceNum;
+                    ++slice_number;                    
                 }
-                /* incr layer number */
-                ++layerNum;
+                
+                lcdd.add(layer_volume);
+                
+                setRegion(lcdd, layer_element, layer_volume);
+                setLimitSet(lcdd, layer_element, layer_volume);                    
+                
+                setVisAttributes(lcdd, node, layer_volume);              
+                                
+                PhysVol layer_physvol = new PhysVol(layer_volume);
+                layer_physvol.setPosition(layer_position);
+                layer_physvol.addPhysVolID("layer", layer_number);
+                sectVolume.addPhysVol(layer_physvol);
+                
+                layer_position_y -= layer_thickness / 2;
+                
+                ++layer_number;                               
             }
         }
         
-        /* add section volume after all slices */
+        // Add the section volume after layers created.
         setVisAttributes(lcdd, node, sectVolume);
         structure.addVolume(sectVolume);
         
-        /* place the staves */
+        // Place the sections.
         double innerRotation = innerAngle;
         double offsetRotation = -innerRotation / 2;
-        double placementRotation = -offsetRotation;
+        //double placementRotation = -offsetRotation;
         
-        double sectCenterRadius = rmin + radialThickness / 2;
+        double sectCenterRadius = rmin + radial_thickness / 2;
         double rotY = -offsetRotation;
         double rotX = PI / 2;
         double posX = -sectCenterRadius * sin(rotY);
@@ -216,16 +256,16 @@
             sectPosY = sectCenterRadius * cos(rotY);
         }
         
-        /* place envelope physical volume */
+        // Place the subdetector envelope.
         PhysVol envelopePhysvol = new PhysVol(envelopeVolume);
-        envelopePhysvol.setZ(zmin + layersThickness/2);
+        envelopePhysvol.setZ(zmin + subdetector_thickness/2);
         envelopePhysvol.addPhysVolID("system",id);
         envelopePhysvol.setRotation(envelopeRotation);
         envelopePhysvol.addPhysVolID("barrel",1);
         
         motherVolume.addPhysVol(envelopePhysvol);
         
-        /* place reflected physical volume */
+        // Place the reflected subdetector envelope.
         boolean reflect = node.getAttribute("reflect").getBooleanValue();
         if (reflect)
         {
@@ -235,14 +275,14 @@
             define.addRotation(envelopeRotationReflect);
             
             PhysVol physvol2 = new PhysVol(envelopeVolume);
-            physvol2.setZ(-zmin-layersThickness/2);
+            physvol2.setZ(-zmin-subdetector_thickness/2);
             physvol2.setRotation(envelopeRotationReflect);
             physvol2.addPhysVolID("system",id);
             physvol2.addPhysVolID("barrel",2);
             motherVolume.addPhysVol(physvol2);
         }
         
-        /* add envelope volume after staves */
+        // Add the envelope volume to LCDD once staves are all created.
         setVisAttributes(lcdd, node, envelopeVolume);
         structure.addVolume(envelopeVolume);
     }

GeomConverter/test/org/lcsim/geometry/compact/converter/lcdd
PolyhedraEndcapCalorimeterConverterTest.java 1.1 -> 1.2
diff -u -r1.1 -r1.2
--- PolyhedraEndcapCalorimeterConverterTest.java	26 Aug 2005 02:37:05 -0000	1.1
+++ PolyhedraEndcapCalorimeterConverterTest.java	17 Oct 2006 23:20:04 -0000	1.2
@@ -1,6 +1,8 @@
 package org.lcsim.geometry.compact.converter.lcdd;
 
+import java.io.FileOutputStream;
 import java.io.InputStream;
+
 import junit.framework.TestCase;
 import junit.framework.TestSuite;
 
@@ -24,6 +26,6 @@
                 PolyhedraEndcapCalorimeterConverterTest.class.
                 getResourceAsStream(
                 "/org/lcsim/geometry/subdetector/PolyhedraEndcapCalorimeterTest.xml");
-        new Main(true).convert("PolyhedraEndcapCalorimeterTest",in,null);
+        new Main(true).convert("PolyhedraEndcapCalorimeterTest",in,new FileOutputStream("PolyhedraEndcapCalorimeterTest.lcdd"));
     }
 }
\ No newline at end of file

GeomConverter/test/org/lcsim/geometry/subdetector
PolyhedraEndcapCalorimeterTest.xml 1.3 -> 1.4
diff -u -r1.3 -r1.4
--- PolyhedraEndcapCalorimeterTest.xml	16 Feb 2006 00:57:14 -0000	1.3
+++ PolyhedraEndcapCalorimeterTest.xml	17 Oct 2006 23:20:04 -0000	1.4
@@ -31,8 +31,9 @@
               readout="CalHits"
               reflect="true">
          <dimensions numsides="8" zmin="1000.0" rmin="500.0" rmax="1000.0" />
-         <layer repeat="20">
+         <layer repeat="10">         
            <slice material="Silicon" thickness="5.0" sensitive="yes" />
+           <slice material="Tungsten" thickness="10.0" sensitive="yes" />
          </layer>
     </detector>
   </detectors>
CVSspam 0.2.8