GeomConverter/src/org/lcsim/geometry/compact/converter/lcdd
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