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