Commit in GeomConverter/src/org/lcsim/geometry/compact/converter/lcdd on MAIN
PolyhedraBarrelCalorimeter.java+178added 1.1
Added PolyhedraBarrelCalorimeter for octagonal calorimeters.  Polyhedra and trapezoid staves written to LCDD.  (WIP)

GeomConverter/src/org/lcsim/geometry/compact/converter/lcdd
PolyhedraBarrelCalorimeter.java added at 1.1
diff -N PolyhedraBarrelCalorimeter.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ PolyhedraBarrelCalorimeter.java	25 Aug 2005 07:58:56 -0000	1.1
@@ -0,0 +1,178 @@
+package org.lcsim.geometry.compact.converter.lcdd;
+
+import java.util.Iterator;
+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.Rotation;
+import org.lcsim.geometry.compact.converter.lcdd.util.Trapezoid;
+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;
+
+/**
+ *
+ * @author jeremym
+ */
+public class PolyhedraBarrelCalorimeter extends LCDDSubdetector
+{
+    private Element node;
+    
+    public PolyhedraBarrelCalorimeter(Element node) throws JDOMException
+    {
+        super(node);
+        this.node = node;
+    }
+    
+    public void addToLCDD(LCDD lcdd, SensitiveDetector sens) throws JDOMException
+    {
+        String detName = node.getAttributeValue("name");
+        int id = node.getAttribute("id").getIntValue();
+        
+        Solids solids = lcdd.getSolids();
+        Structure structure = lcdd.getStructure();
+        Volume motherVolume = lcdd.pickMotherVolume(this);
+        Material air = lcdd.getMaterial("Air");
+        Define define = lcdd.getDefine();
+        
+        Element dimensions = node.getChild("dimensions");
+        double z = dimensions.getAttribute("z").getDoubleValue();
+        double rmin = dimensions.getAttribute("rmin").getDoubleValue();
+        int numsides = dimensions.getAttribute("numsides").getIntValue();
+        
+        double zrot = Math.PI / numsides;
+        Rotation rot = new Rotation(detName + "_rotation");
+        rot.setZ(zrot);
+        define.addRotation(rot);
+        
+        double totalThickness = org.lcsim.geometry.layer.LayerFromCompactCnv.computeDetectorTotalThickness(node);
+        
+        PolyhedraRegular polyhedra = new PolyhedraRegular(
+                detName + "_polyhedra",
+                numsides, rmin, rmin+totalThickness, z);
+        solids.addSolid(polyhedra);
+        
+        Volume envelopeVolume = new Volume(detName + "_envelope");
+        envelopeVolume.setSolid(polyhedra);
+        envelopeVolume.setMaterial(air);
+        
+        PhysVol envelopePhysvol = new PhysVol(envelopeVolume);
+        envelopePhysvol.setRotation(rot);
+        envelopePhysvol.addPhysVolID("system",id);
+        envelopePhysvol.addPhysVolID("barrel",0);
+        //motherVolume.addPhysVol(envelopePhysvol);
+        
+        double innerAngle = Math.PI * 2 / numsides;
+        double halfInnerAngle = innerAngle/2;
+        
+        Trapezoid sectTrd = new Trapezoid(detName + "_stave_trapezoid");
+        sectTrd.setY2(z);
+        sectTrd.setY1(z);
+        sectTrd.setZ(totalThickness);
+        
+        double innerFaceLength = rmin * tan(halfInnerAngle) * 2;
+        sectTrd.setX1(innerFaceLength);
+        double rmax = rmin + totalThickness;
+        double outerFaceLength = rmax * tan(halfInnerAngle) * 2;
+        sectTrd.setX2(outerFaceLength);
+        
+        solids.addSolid(sectTrd);
+        Volume sectVolume = new Volume(detName + "_stave");
+        sectVolume.setMaterial(air);
+        sectVolume.setSolid(sectTrd);
+        structure.addVolume(sectVolume);
+        
+        /*
+       <constant name="inner_face" value="( inner_radius * tan( half_inner_angle * deg ) ) * 2" />
+        <constant name="outer_face" value="( outer_radius * tan( half_inner_angle * deg ) ) * 2" />
+         
+         <trd name="sect_trd"
+           x1="inner_face"
+           x2="outer_face"
+           y1="sect_long_dim"
+           y2="sect_long_dim"
+           z="sect_thickness" />
+         */
+        
+        double innerRotation = innerAngle;
+        double offsetRotation = -innerRotation / 2;
+        double placementRotation = -offsetRotation;
+        
+        double sectCenterRadius = rmin + totalThickness / 2;
+        double rotY = -offsetRotation;
+        double rotX = PI / 2;
+        double posX = -sectCenterRadius * sin(rotY);
+        double posY = sectCenterRadius * cos(rotY);
+        for ( int i=0; i < numsides; i++)
+        {
+            int moduleNumber=i;
+            
+            Position position = new Position(detName + "_stave0_module" + moduleNumber + "_position");
+            position.setX(posX);
+            position.setY(posY);
+            
+            Rotation rotation = new Rotation(detName + "_stave0_module" + moduleNumber + "_rotation");
+            rotation.setX(rotX);
+            rotation.setY(rotY);
+            
+            define.addPosition(position);
+            define.addRotation(rotation);
+            
+            PhysVol sectPhysVol = new PhysVol(sectVolume);
+            sectPhysVol.setPosition(position);
+            sectPhysVol.setRotation(rotation);
+        
+            motherVolume.addPhysVol(sectPhysVol);
+//            envelopeVolume.addPhysVol(sectPhysVol);
+            sectPhysVol.addPhysVolID("stave",0);
+            sectPhysVol.addPhysVolID("module",moduleNumber);
+            
+            /*
+              <constant name="irot" value="inner_angle * deg" />
+              <constant name="offrot" value="-irot / 2" />
+              <constant name="placerot" value="-offrot" />
+             
+              <constant name="sect0_rot_y" value="-offrot" />
+              <constant name="sect0_pos_x" value="-sect_center_radius * sin( sect0_rot_y )" />
+              <constant name="sect0_pos_y" value="sect_center_radius * cos( sect0_rot_y )" />
+             
+              <constant name="sect1_rot_y" value="sect0_rot_y - irot" />
+              <constant name="sect1_pos_x" value="-sect_center_radius * sin( sect1_rot_y )" />
+              <constant name="sect1_pos_y" value="sect_center_radius * cos( sect1_rot_y )" />
+             */
+            
+            rotY -= innerRotation;
+            posX = -sectCenterRadius * sin(rotY);
+            posY = sectCenterRadius * cos(rotY);
+        }
+        
+        /*
+        for (Iterator i = node.getChildren("layer").iterator(); i.hasNext();)
+        {
+            Element layer = (Element) i.next();
+            int repeat = layer.getAttribute("repeat").getIntValue();
+            for ( int j=0; j<repeat; j++)
+            {
+                for ( Iterator k = layer.getChildren("slice").iterator(); k.hasNext();)
+                {
+                    Element slice = (Element) k.next();
+                    totalThickness += slice.getAttribute("thickness").getDoubleValue();
+                }
+            }
+        }
+         */
+        
+        structure.addVolume(envelopeVolume);
+    }
+}
\ No newline at end of file
CVSspam 0.2.8