Commit in GeomConverter on MAIN
src/org/lcsim/detector/converter/compact/PolyhedraBarrelCalorimeter2Converter.java+364added 1.1
                                        /DetectorConverter.java+10-21.48 -> 1.49
src/org/lcsim/detector/converter/heprep/DetectorElementToHepRepConverter.java+191.23 -> 1.24
src/org/lcsim/geometry/subdetector/PolyhedraBarrelCalorimeter2.java+38added 1.1
test/org/lcsim/detector/converter/compact/PolyhedraBarrelCalorimeter2HepRepTest.java+56added 1.1
testResources/org/lcsim/geometry/subdetector/PolyhedraBarrelCalorimeter2Test.xml+191.2 -> 1.3
+506-2
3 added + 3 modified, total 6 files
detailed geometry implementation of PolyhedraBarrelCalorimeter2

GeomConverter/src/org/lcsim/detector/converter/compact
PolyhedraBarrelCalorimeter2Converter.java added at 1.1
diff -N PolyhedraBarrelCalorimeter2Converter.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ PolyhedraBarrelCalorimeter2Converter.java	3 May 2010 18:01:40 -0000	1.1
@@ -0,0 +1,364 @@
+package org.lcsim.detector.converter.compact;
+
+import static java.lang.Math.PI;
+import static java.lang.Math.tan;
+
+import java.util.Iterator;
+
+import org.jdom.Attribute;
+import org.jdom.DataConversionException;
+import org.jdom.Element;
+import org.lcsim.detector.DetectorElement;
+import org.lcsim.detector.IDetectorElement;
+import org.lcsim.detector.ILogicalVolume;
+import org.lcsim.detector.IPhysicalVolume;
+import org.lcsim.detector.IRotation3D;
+import org.lcsim.detector.ITransform3D;
+import org.lcsim.detector.ITranslation3D;
+import org.lcsim.detector.LogicalVolume;
+import org.lcsim.detector.PhysicalVolume;
+import org.lcsim.detector.RotationPassiveXYZ;
+import org.lcsim.detector.Transform3D;
+import org.lcsim.detector.Translation3D;
+import org.lcsim.detector.identifier.ExpandedIdentifier;
+import org.lcsim.detector.identifier.IExpandedIdentifier;
+import org.lcsim.detector.identifier.IIdentifier;
+import org.lcsim.detector.identifier.IIdentifierHelper;
+import org.lcsim.detector.material.IMaterial;
+import org.lcsim.detector.material.MaterialStore;
+import org.lcsim.detector.solids.Box;
+import org.lcsim.detector.solids.Trd;
+import org.lcsim.geometry.compact.Detector;
+import org.lcsim.geometry.compact.Subdetector;
+import org.lcsim.geometry.layer.Layer;
+import org.lcsim.geometry.layer.Layering;
+import org.lcsim.geometry.subdetector.PolyhedraBarrelCalorimeter2;
+
+/**
+ * 
+ * This converter makes a detailed geometry for the
+ * {@link org.lcsim.geometry.subdetector.PolyhedraBarrelCalorimeter2}
+ * subdetector type.
+ * 
+ * @author Jeremy McCormick <[log in to unmask]>
+ * @version $Id: PolyhedraBarrelCalorimeter2Converter.java,v 1.1 2010/05/03 18:01:40 jeremy Exp $
+ */
+public class PolyhedraBarrelCalorimeter2Converter extends AbstractSubdetectorConverter
+{
+    public void convert(Subdetector subdet, Detector detector)
+    {
+        // Subdetector parameters.
+        int sysId = subdet.getSystemID();
+        String subdetName = subdet.getName();
+        PolyhedraBarrelCalorimeter2 cal = (PolyhedraBarrelCalorimeter2) subdet;
+        int nsides = cal.getNumberOfSides();
+        double innerR = cal.getInnerR();
+        Layering layering = cal.getLayering();
+        double thickness = layering.getThickness();
+        double z = cal.getZLength();
+
+        // Gap size.
+        double gap = 0;
+        if (subdet.getNode().getAttribute("gap") != null)
+        {
+            try
+            {
+                gap = subdet.getNode().getAttribute("gap").getDoubleValue();
+            }
+            catch (DataConversionException e)
+            {
+                throw new RuntimeException(e);
+            }
+        }
+
+        // Get the gap material or use air as the default.
+        IMaterial air = MaterialStore.getInstance().get("Air");
+        IMaterial gapMaterial = air;
+        if (subdet.getNode().getAttribute("material") != null)
+        {
+            gapMaterial = MaterialStore.getInstance().get(
+                    subdet.getNode().getAttributeValue("material"));
+        }
+
+        // Parameters for trd stave.
+        double innerAngle = Math.PI * 2 / nsides;
+        double halfInnerAngle = innerAngle / 2;
+        double innerFaceLength = innerR * tan(halfInnerAngle) * 2;
+        double rmax = innerR + thickness;
+        double outerFaceLength = rmax * tan(halfInnerAngle) * 2;
+        double sectCenter = innerR + thickness / 2;
+        double layerOuterAngle = (PI - innerAngle) / 2;
+        double layerInnerAngle = (PI / 2 - layerOuterAngle);
+
+        // Make outer stave trd.
+        Trd staveTrdOuter = new Trd(
+                                    subdet.getName() + "_stave_trap_outer",
+                                    innerFaceLength / 2,
+                                    outerFaceLength / 2,
+                                    z / 2,
+                                    z / 2,
+                                    thickness / 2);
+
+        // Make outer stave volume.
+        ILogicalVolume staveOuterLogicalVolume = new LogicalVolume(
+                                                                   subdetName + "_stave_outer",
+                                                                   staveTrdOuter,
+                                                                   gapMaterial);
+
+        // Make inner stave trd.
+        Trd staveTrdInner = new Trd(
+                                    subdet.getName() + "_stave_trap_inner",
+                                    innerFaceLength / 2 - gap,
+                                    outerFaceLength / 2 - gap,
+                                    z / 2,
+                                    z / 2,
+                                    thickness / 2);
+
+        // Make inner stave volume.
+        ILogicalVolume staveInnerLogicalVolume = new LogicalVolume(
+                                                                   subdetName + "_stave_inner",
+                                                                   staveTrdInner,
+                                                                   air);
+
+        // Place inner stave inside of outer. 
+        new PhysicalVolume(
+                           new Transform3D(),
+                           subdetName,
+                           staveInnerLogicalVolume,
+                           staveOuterLogicalVolume,
+                           0);
+
+        // Layer parameters.
+        double staveThickness = thickness;
+        int layerNumber = 0;
+        double layerZ = -(staveThickness / 2);
+        double layerX = staveTrdInner.getXHalfLength1() * 2;
+
+        // Loop over layer elements.
+        for (Iterator i = subdet.getNode().getChildren("layer").iterator(); i.hasNext();)
+        {
+            Element layer_element = (Element) i.next();
+
+            // Get the layer from the layering engine.
+            Layer layer = layering.getLayer(layerNumber);
+
+            // Get number of times to repeat this layer.
+            int repeat;
+            try
+            {
+                repeat = (int) layer_element.getAttribute("repeat").getDoubleValue();
+            }
+            catch (Exception x)
+            {
+                throw new RuntimeException(x);
+            }
+
+            // Loop over repeats for this layer.
+            for (int j = 0; j < repeat; j++)
+            {
+                // Name of the layer.
+                String layerName = subdetName + "_stave_layer" + layerNumber;
+
+                // Layer thickness, which is Z in the trd coordinate system.
+                double layerThickness = layer.getThickness();
+
+                // Layer position in Z within the stave.
+                layerZ += layerThickness / 2;
+
+                // Position of layer.
+                ITranslation3D layer_position = new Translation3D(0, 0, layerZ);
+
+                // Layer box.
+                Box layerBox = new Box(layerName + "_box", layerX / 2, z / 2, layerThickness / 2);
+
+                // Layer volume.
+                ILogicalVolume layerVolume = new LogicalVolume(layerName, layerBox, air);
+
+                // Starting Z of slice.
+                double sliceZ = -(layerThickness / 2);
+
+                // Slice ID.
+                int sliceNumber = 0;
+
+                // Create the slices within the layer.
+                for (Iterator k = layer_element.getChildren("slice").iterator(); k.hasNext();)
+                {
+                    Element sliceElement = (Element) k.next();
+
+                    String sliceName = layerName + "_slice" + sliceNumber;
+
+                    // Sensitivity.
+                    boolean sensitive = false;
+                    try
+                    {
+                        if (sliceElement.getAttribute("sensitive") != null)
+                        {
+                            Attribute s = sliceElement.getAttribute("sensitive");
+                            sensitive = s != null && s.getBooleanValue();
+                        }
+                    }
+                    catch (Exception x)
+                    {
+                        throw new RuntimeException(x);
+                    }
+
+                    // Thickness of slice.
+                    double sliceThickness;
+                    try
+                    {
+                        sliceThickness = sliceElement.getAttribute("thickness").getDoubleValue();
+                    }
+                    catch (Exception x)
+                    {
+                        throw new RuntimeException(x);
+                    }
+
+                    // Increment Z position to place next slice.
+                    sliceZ += sliceThickness / 2;
+
+                    // Get the slice material.
+                    IMaterial sliceMaterial = MaterialStore.getInstance().get(
+                            sliceElement.getAttributeValue("material"));
+
+                    // Slice position.
+                    ITranslation3D slicePosition = new Translation3D(0, 0, sliceZ);
+                    ITransform3D sliceTrans = new Transform3D(slicePosition);
+
+                    // Slice box.
+                    Box sliceBox = new Box(
+                                           sliceName + "_box",
+                                           layerX / 2,
+                                           z / 2,
+                                           sliceThickness / 2);
+
+                    // Slice volume.
+                    ILogicalVolume sliceVolume = new LogicalVolume(
+                                                                   sliceName,
+                                                                   sliceBox,
+                                                                   sliceMaterial);
+
+                    // Slice placement.
+                    PhysicalVolume slicePlacement = new PhysicalVolume(
+                                                                       sliceTrans,
+                                                                       sliceName,
+                                                                       sliceVolume,
+                                                                       layerVolume,
+                                                                       sliceNumber);
+
+                    // Set sensitivity.
+                    if (sensitive)
+                        slicePlacement.setSensitive(true);
+
+                    // Increment z position.
+                    sliceZ += sliceThickness / 2;
+
+                    // Increment slice ID.
+                    ++sliceNumber;
+                }
+
+                // Layer PhysicalVolume.
+                new PhysicalVolume(
+                                   new Transform3D(layer_position),
+                                   layerName,
+                                   layerVolume,
+                                   staveInnerLogicalVolume,
+                                   layerNumber);
+
+                // Increment the layer X dimension.
+                layerX += layerThickness * tan(layerInnerAngle) * 2;
+
+                // Increment the layer Z position.
+                layerZ += layerThickness / 2;
+
+                // Increment the layer number.
+                ++layerNumber;
+            }
+        }
+
+        // Place staves and make DetectorElements for them.
+        for (int i = 0; i < nsides; i++)
+        {
+            // Compute stave position and rotation parameters.
+            double phi = -(2 * Math.PI * ((double) i) / nsides - Math.PI / 2);
+            double zc = -phi + Math.PI / 2;
+            double x = sectCenter * Math.cos(phi);
+            double y = sectCenter * Math.sin(phi);
+
+            // Make stave position and rotation.
+            ITranslation3D trans = new Translation3D(x, y, 0);
+            IRotation3D rotate = new RotationPassiveXYZ(Math.PI / 2, 0, zc);
+            ITransform3D transform = new Transform3D(trans, rotate);
+
+            // Stave placement.
+            String name = subdetName + "_module" + i;
+            new PhysicalVolume(transform, name, staveOuterLogicalVolume, detector
+                    .getDetectorElement().getGeometry().getLogicalVolume(), i);
+
+            // Stave DetectorElement.
+            new DetectorElement(
+                                subdet.getName() + "_module" + i,
+                                subdet.getDetectorElement(),
+                                "/" + name);
+        }
+
+        // Get the identifier helper for the subdetector for ID packing.
+        IIdentifierHelper helper = cal.getDetectorElement().getIdentifierHelper();
+
+        // Create DetectorElements for sensitive slices.
+
+        // Loop over outer staves.
+        for (IDetectorElement outerStave : subdet.getDetectorElement().getChildren())
+        {
+            // Loop over inner staves (just one per outer stave).
+            for (IPhysicalVolume innerStave : outerStave.getGeometry().getLogicalVolume()
+                    .getDaughters())
+            {
+                // Get the stave number.
+                int staveNum = outerStave.getGeometry().getPhysicalVolume().getCopyNumber();
+
+                // Loop over the layer placements.
+                for (IPhysicalVolume layer : innerStave.getLogicalVolume().getDaughters())
+                {
+                    // Loop over the slice placements.
+                    for (IPhysicalVolume slice : layer.getLogicalVolume().getDaughters())
+                    {
+                        // Create a new expanded identifier with correct number of fields.
+                        IExpandedIdentifier expId = new ExpandedIdentifier(helper
+                                .getIdentifierDictionary().getNumberOfFields());
+
+                        // Fill in the identifier field values from the geometry values.
+                        expId.setValue(helper.getFieldIndex("system"), sysId);
+                        expId.setValue(helper.getFieldIndex("barrel"), 0);
+                        expId.setValue(helper.getFieldIndex("module"), outerStave.getGeometry()
+                                .getPhysicalVolume().getCopyNumber());
+                        expId.setValue(helper.getFieldIndex("layer"), layer.getCopyNumber());
+                        expId.setValue(helper.getFieldIndex("slice"), slice.getCopyNumber());
+
+                        // Pack the identifier.
+                        IIdentifier id = helper.pack(expId);
+
+                        // Make a DetectorElement if the slice is sensitive.
+                        if (slice.isSensitive())
+                        {
+                            new DetectorElement(
+                                                subdetName + "_module" + staveNum + "_layer" + layer
+                                                        .getCopyNumber() + "_slice" + slice
+                                                        .getCopyNumber(),
+                                                outerStave,
+                                                "/" + outerStave.getGeometry().getPhysicalVolume()
+                                                        .getName() + "/" + innerStave.getName() + "/" + layer
+                                                        .getName() + "/" + slice.getName(),
+                                                id);
+                        }
+                    }
+                }
+            }
+        }
+
+    }
+
+    public Class getSubdetectorType()
+    {
+        return PolyhedraBarrelCalorimeter2.class;
+    }
+}
\ No newline at end of file

GeomConverter/src/org/lcsim/detector/converter/compact
DetectorConverter.java 1.48 -> 1.49
diff -u -r1.48 -r1.49
--- DetectorConverter.java	21 Jan 2010 21:26:31 -0000	1.48
+++ DetectorConverter.java	3 May 2010 18:01:40 -0000	1.49
@@ -87,20 +87,28 @@
 
     public DetectorConverter()
     {   
+        // Simple cylindrical detectors.
         addSubdetectorConverter(new CylindricalBarrelCalorimeterConverter());
         addSubdetectorConverter(new CylindricalEndcapCalorimeterConverter());
         addSubdetectorConverter(new MultiLayerTrackerConverter());
         addSubdetectorConverter(new DiskTrackerConverter());
-        addSubdetectorConverter(new SiTrackerBarrelConverter());
-        addSubdetectorConverter(new PolyconeSupportConverter());
+        
+        // Detailed tracker models.
+        addSubdetectorConverter(new SiTrackerBarrelConverter());        
         addSubdetectorConverter(new SiTrackerEndcapConverter());
         addSubdetectorConverter(new SiTrackerEndcap2Converter());
         addSubdetectorConverter(new SiTrackerFixedTargetConverter());
         addSubdetectorConverter(new SiTrackerFixedTarget2Converter());
+        
+        // Detailed calorimeter models.
         addSubdetectorConverter(new PolyhedraBarrelCalorimeterConverter());
+        addSubdetectorConverter(new PolyhedraBarrelCalorimeter2Converter());
         addSubdetectorConverter(new PolyhedraEndcapCalorimeter2Converter());
         addSubdetectorConverter(new PolyhedraEndcapCalorimeterConverter());
         addSubdetectorConverter(new EcalBarrelConverter());
+        
+        // Support structures.
+        addSubdetectorConverter(new PolyconeSupportConverter());
         addSubdetectorConverter(new TubeSegmentConverter());
     }
 

GeomConverter/src/org/lcsim/detector/converter/heprep
DetectorElementToHepRepConverter.java 1.23 -> 1.24
diff -u -r1.23 -r1.24
--- DetectorElementToHepRepConverter.java	22 Apr 2010 21:50:04 -0000	1.23
+++ DetectorElementToHepRepConverter.java	3 May 2010 18:01:40 -0000	1.24
@@ -49,6 +49,8 @@
      */
     public static void convert(IDetectorElement detelem, HepRepFactory factory, HepRep heprep, HepRepType parentType, int currentDepth, int maxDepth, boolean endcap)
     {        
+        //System.out.println("converting " + detelem.getName());
+        
         if (detelem == null)
             throw new RuntimeException("DetectorElement points to null!");
         
@@ -202,11 +204,28 @@
         }
     }
     
+    /**
+     * Convert from DetectorElements to HepRep using default depth parameters. 
+     * 
+     * @param detelem
+     * @param factory
+     * @param heprep
+     * @param endcap
+     */
     public static void convert(IDetectorElement detelem, HepRepFactory factory, HepRep heprep, boolean endcap)
     {
         convert(detelem, factory, heprep, -1, endcap);
     }
     
+    /**
+     * Convert from DetectorElements to HepRep, specifying the max depth parameter.
+     * 
+     * @param detelem
+     * @param factory
+     * @param heprep
+     * @param maxDepth
+     * @param endcap
+     */
     public static void convert(IDetectorElement detelem, HepRepFactory factory, HepRep heprep, int maxDepth, boolean endcap)
     {
         convert(detelem, factory, heprep, null, 0, maxDepth, endcap);

GeomConverter/src/org/lcsim/geometry/subdetector
PolyhedraBarrelCalorimeter2.java added at 1.1
diff -N PolyhedraBarrelCalorimeter2.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ PolyhedraBarrelCalorimeter2.java	3 May 2010 18:01:40 -0000	1.1
@@ -0,0 +1,38 @@
+/*
+ * PolyhedraBarrelCalorimeter.java
+ *
+ * Created on August 24, 2005, 9:37 PM
+ *
+ */
+package org.lcsim.geometry.subdetector;
+
+import hep.graphics.heprep.HepRep;
+import hep.graphics.heprep.HepRepFactory;
+
+import org.jdom.Element;
+import org.jdom.JDOMException;
+import org.lcsim.detector.converter.heprep.DetectorElementToHepRepConverter;
+
+/**
+ *
+ * @author jeremym
+ */
+public class PolyhedraBarrelCalorimeter2 extends AbstractPolyhedraCalorimeter
+{
+    public PolyhedraBarrelCalorimeter2(Element node) throws JDOMException
+    {
+        super(node);
+        zlength = node.getChild("dimensions").getAttribute("z").getDoubleValue();
+        orad = irad + getLayering().getThickness();
+    }   
+        
+    public boolean isBarrel()
+    {
+        return true;
+    }
+    
+    public void appendHepRep(HepRepFactory factory, HepRep heprep)
+    {
+        DetectorElementToHepRepConverter.convert(getDetectorElement(), factory, heprep, -1, false);
+    }
+}
\ No newline at end of file

GeomConverter/test/org/lcsim/detector/converter/compact
PolyhedraBarrelCalorimeter2HepRepTest.java added at 1.1
diff -N PolyhedraBarrelCalorimeter2HepRepTest.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ PolyhedraBarrelCalorimeter2HepRepTest.java	3 May 2010 18:01:40 -0000	1.1
@@ -0,0 +1,56 @@
+package org.lcsim.detector.converter.compact;
+
+import java.io.InputStream;
+
+import junit.framework.TestCase;
+
+import org.lcsim.detector.converter.heprep.DetectorElementToHepRepConverter;
+import org.lcsim.geometry.Detector;
+import org.lcsim.geometry.GeometryReader;
+import org.lcsim.util.test.TestUtil.TestOutputFile;
+
+/**
+ * 
+ * Write a HepRep for the {@link org.lcsim.geometry.subdetector.PolyhedraBarrelCalorimeter2}
+ * subdetector type.
+ * 
+ * @author Jeremy McCormick <[log in to unmask]>
+ * @version $Id: PolyhedraBarrelCalorimeter2HepRepTest.java,v 1.1 2010/05/03 18:01:40 jeremy Exp $
+ */
+public class PolyhedraBarrelCalorimeter2HepRepTest extends TestCase 
+{   
+    Detector detector;
+    
+    private static final String resource = 
+        "/org/lcsim/geometry/subdetector/PolyhedraBarrelCalorimeter2Test.xml";
+    
+    public void setUp()
+    {
+        InputStream in = 
+            this.getClass().
+            getResourceAsStream(resource);
+        
+        GeometryReader reader = new GeometryReader();
+        
+        try 
+        {
+            detector = reader.read(in);
+        }
+        catch (Throwable x)
+        {
+            throw new RuntimeException(x);
+        }               
+    }
+    
+    public void testWriteHepRep()
+    {
+        try 
+        {
+            DetectorElementToHepRepConverter.writeHepRep((new TestOutputFile("PolyhedraBarrelCalorimeter2Test.heprep")).getPath());
+        }
+        catch (Exception x)
+        {
+            throw new RuntimeException(x);
+        }
+    }
+}

GeomConverter/testResources/org/lcsim/geometry/subdetector
PolyhedraBarrelCalorimeter2Test.xml 1.2 -> 1.3
diff -u -r1.2 -r1.3
--- PolyhedraBarrelCalorimeter2Test.xml	30 Apr 2010 00:08:54 -0000	1.2
+++ PolyhedraBarrelCalorimeter2Test.xml	3 May 2010 18:01:40 -0000	1.3
@@ -25,6 +25,7 @@
   </materials>
 
   <detectors>
+<!--
     <detector id="1"
               name="PolyhedraBarrelCalorimeterSubdet"
               type="PolyhedraBarrelCalorimeter2"
@@ -37,6 +38,20 @@
            <slice material="Tungsten" thickness="10.0" sensitive="yes" />
          </layer>
     </detector>
+-->
+
+    <detector id="7" name="HcalBarrel" type="PolyhedraBarrelCalorimeter2" readout="HcalBarrelHits" calorimeterType="HAD_BARREL" gap="2.*cm" material="Steel235">
+            <comment>Hadron Calorimeter Barrel</comment>
+            <dimensions numsides="12" rmin="1404.0" z="3688.0 * 2"/>
+            <layer repeat="60">
+                <slice material = "Steel235" thickness = "1.89*cm" />
+                <slice material = "PyrexGlass" thickness = "0.11*cm" />
+                <slice material = "RPCGasDefault" thickness = "0.12*cm" sensitive = "yes" />
+                <slice material = "PyrexGlass" thickness = "0.11*cm" />
+                <slice material = "G10" thickness = "0.3*cm" />
+                <slice material = "Air" thickness = "0.16*cm" />
+            </layer>
+  </detector>
   </detectors>
 
   <readouts>
@@ -44,6 +59,10 @@
       <segmentation type="GridXYZ" gridSizeX="1.0" gridSizeY="1.0" />
       <id>system:6,barrel:3,module:5,layer:8,slice:5,x:32:-10,y:-10</id>
     </readout>
+    <readout name="HcalBarrelHits">
+            <segmentation type="CartesianGridXY" gridSizeX="1.0*cm" gridSizeY="1.0*cm" />
+            <id>system:6,barrel:3,module:4,layer:6,slice:5,x:32:-16,y:-16</id>
+        </readout>
   </readouts>
 
   <fields>
CVSspam 0.2.8