GeomConverter/src/org/lcsim/geometry/compact/converter/lcdd
diff -N AbstractTestBeam.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ AbstractTestBeam.java 26 Sep 2005 18:13:28 -0000 1.1
@@ -0,0 +1,211 @@
+package org.lcsim.geometry.compact.converter.lcdd;
+
+import org.jdom.Attribute;
+import org.jdom.Element;
+import org.jdom.JDOMException;
+import org.lcsim.geometry.compact.converter.lcdd.util.Box;
+import org.lcsim.geometry.compact.converter.lcdd.util.Define;
+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.PhysVol;
+import org.lcsim.geometry.compact.converter.lcdd.util.Position;
+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.Volume;
+import org.lcsim.geometry.layer.LayerFromCompactCnv;
+
+/**
+ *
+ * @author tonyj
+ */
+abstract class AbstractTestBeam extends LCDDSubdetector
+{
+ AbstractTestBeam(Element node) throws JDOMException
+ {
+ super(node);
+ }
+
+ public void addToLCDD(LCDD lcdd, SensitiveDetector sens) throws JDOMException
+ {
+ String detectorName = node.getAttributeValue("name");
+ int id = node.getAttribute("id").getIntValue();
+
+ Material air = lcdd.getMaterial("Air");
+ Solids solids = lcdd.getSolids();
+ Structure structure = lcdd.getStructure();
+ Volume motherVolume = lcdd.pickMotherVolume(this);
+ Define define = lcdd.getDefine();
+
+ Element dimensions = node.getChild("dimensions");
+ double xdim = dimensions.getAttribute("x").getDoubleValue();
+ double ydim = dimensions.getAttribute("y").getDoubleValue();
+ double zdim = LayerFromCompactCnv.computeDetectorTotalThickness(node);
+
+ Box envelopeBox = new Box(detectorName + "_box");
+ envelopeBox.setX(xdim);
+ envelopeBox.setY(ydim);
+ envelopeBox.setZ(zdim);
+ solids.addSolid(envelopeBox);
+ Volume envelopeVolume = new Volume(detectorName + "_envelope");
+ envelopeVolume.setSolid(envelopeBox);
+ envelopeVolume.setMaterial(air);
+
+ double xpos = 0;
+ double ypos = 0;
+ double zpos = 0;
+
+ Element positionElement = node.getChild("position");
+
+ if ( positionElement != null )
+ {
+ Attribute posAttribute = positionElement.getAttribute("x");
+ if ( posAttribute != null )
+ {
+ xpos = posAttribute.getDoubleValue();
+ }
+
+ posAttribute = positionElement.getAttribute("y");
+ if ( posAttribute != null )
+ {
+ ypos = posAttribute.getDoubleValue();
+ }
+
+ posAttribute = positionElement.getAttribute("z");
+ if ( posAttribute != null )
+ {
+ zpos = posAttribute.getDoubleValue();
+ }
+ }
+
+ Position envelopePosition = new Position(detectorName + "_position");
+ envelopePosition.setX(xpos);
+ envelopePosition.setY(ypos);
+ envelopePosition.setZ(zpos);
+ define.addPosition(envelopePosition);
+
+ double layerZPos = -zdim / 2;
+
+ int layerCount = 0;
+ int layerTypeCount = 0;
+ double maxLayerX = 0;
+ double maxLayerY = 0;
+ for ( Object lo : node.getChildren("layer") )
+ {
+ Element layer = (Element) lo;
+
+ double layerX = xdim;
+ Attribute xattrib = layer.getAttribute("x");
+ if ( xattrib != null )
+ {
+ layerX = xattrib.getDoubleValue();
+ }
+
+ double layerY = ydim;
+ Attribute yattrib = layer.getAttribute("y");
+ if ( yattrib != null )
+ {
+ layerY = yattrib.getDoubleValue();
+ }
+
+ double layerZ = LayerFromCompactCnv.computeSingleLayerThickness(layer);
+
+ int repeat = 1;
+ Attribute repeatAttrib = layer.getAttribute("repeat");
+ if ( repeatAttrib != null )
+ {
+ repeat = repeatAttrib.getIntValue();
+ }
+
+ String layerVolumeName = detectorName + "_layerType" + layerTypeCount;
+ Box layerBox = new Box(layerVolumeName + "_box");
+ layerBox.setX(layerX);
+ layerBox.setY(layerY);
+ layerBox.setZ(layerZ);
+ solids.addSolid(layerBox);
+
+ Volume layerVolume = new Volume(layerVolumeName);
+ layerVolume.setMaterial(air);
+ layerVolume.setSolid(layerBox);
+
+ int sliceCount = 0;
+ double slicePosZ = -layerZ / 2;
+ for ( Object so : layer.getChildren("slice"))
+ {
+ Element slice = (Element) so;
+ double sliceX = layerX;
+ double sliceY = layerY;
+ xattrib = slice.getAttribute("x");
+ if ( xattrib != null )
+ {
+ sliceX = xattrib.getDoubleValue();
+ }
+
+ yattrib = slice.getAttribute("y");
+ if ( yattrib != null )
+ {
+ sliceY = yattrib.getDoubleValue();
+ }
+ double sliceZ = slice.getAttribute("thickness").getDoubleValue();
+
+ Attribute s = slice.getAttribute("sensitive");
+ boolean sensitive = s != null && s.getBooleanValue();
+
+ String sliceName = layerVolumeName + "_slice" + sliceCount;
+
+ Box sliceBox = new Box(sliceName + "_box");
+ sliceBox.setX(sliceX);
+ sliceBox.setY(sliceY);
+ sliceBox.setZ(sliceZ);
+ solids.addSolid(sliceBox);
+
+ Volume sliceVolume = new Volume(sliceName);
+ sliceVolume.setSolid(sliceBox);
+ Material sliceMaterial = lcdd.getMaterial(slice.getAttributeValue("material"));
+ sliceVolume.setMaterial(sliceMaterial);
+ if ( sensitive ) sliceVolume.setSensitiveDetector(sens);
+ structure.addVolume(sliceVolume);
+
+ PhysVol slicePhysVol = new PhysVol(sliceVolume);
+ slicePhysVol.addPhysVolID("slice", sliceCount);
+ Position slicePosition = new Position(sliceName + "_position");
+ slicePosZ += sliceZ / 2;
+ slicePosition.setZ(slicePosZ);
+ slicePosZ += sliceZ / 2;
+ define.addPosition(slicePosition);
+ slicePhysVol.setPosition(slicePosition);
+ layerVolume.addPhysVol(slicePhysVol);
+
+ ++sliceCount;
+ }
+
+ structure.addVolume(layerVolume);
+
+ for ( int i=0; i<repeat; i++)
+ {
+ String layerPhysVolName = detectorName + "_layer" + layerCount;
+
+ PhysVol layerPhysVol = new PhysVol(layerVolume);
+ layerPhysVol.addPhysVolID("layer", layerCount);
+
+ layerZPos += layerZ / 2;
+ Position layerPosition = new Position(layerPhysVolName + "_position");
+ define.addPosition(layerPosition);
+ layerPosition.setZ(layerZPos);
+ layerPhysVol.setPosition(layerPosition);
+ layerZPos += layerZ / 2;
+
+ envelopeVolume.addPhysVol(layerPhysVol);
+
+ ++layerCount;
+ }
+ ++layerTypeCount;
+ }
+
+ structure.addVolume(envelopeVolume);
+ PhysVol envelopePhysVol = new PhysVol(envelopeVolume);
+ envelopePhysVol.addPhysVolID("system", id);
+ envelopePhysVol.setPosition(envelopePosition);
+ motherVolume.addPhysVol(envelopePhysVol);
+ }
+}
GeomConverter/src/org/lcsim/geometry/compact/converter/lcdd
diff -N TestBeamTracker.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ TestBeamTracker.java 26 Sep 2005 18:13:28 -0000 1.1
@@ -0,0 +1,33 @@
+package org.lcsim.geometry.compact.converter.lcdd;
+
+import org.jdom.Attribute;
+import org.jdom.Element;
+import org.jdom.JDOMException;
+import org.lcsim.geometry.compact.converter.lcdd.util.Box;
+import org.lcsim.geometry.compact.converter.lcdd.util.Define;
+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.PhysVol;
+import org.lcsim.geometry.compact.converter.lcdd.util.Position;
+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.Volume;
+import org.lcsim.geometry.layer.LayerFromCompactCnv;
+
+/**
+ *
+ * @author tonyj
+ */
+class TestBeamTracker extends AbstractTestBeam
+{
+ TestBeamTracker(Element node) throws JDOMException
+ {
+ super(node);
+ }
+
+ public boolean isTracker()
+ {
+ return true;
+ }
+}
GeomConverter/src/org/lcsim/geometry/subdetector
diff -N AbstractTestBeam.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ AbstractTestBeam.java 26 Sep 2005 18:13:29 -0000 1.1
@@ -0,0 +1,133 @@
+/*
+ * TestBeamCalorimeter.java
+ *
+ * Created on September 2, 2005, 3:43 PM
+ *
+ */
+
+package org.lcsim.geometry.subdetector;
+
+import hep.physics.vec.Hep3Vector;
+import hep.physics.vec.BasicHep3Vector;
+import org.jdom.Attribute;
+import org.jdom.Element;
+import org.jdom.JDOMException;
+import hep.graphics.heprep.HepRep;
+import hep.graphics.heprep.HepRepFactory;
+import hep.graphics.heprep.HepRepInstance;
+import hep.graphics.heprep.HepRepInstanceTree;
+import hep.graphics.heprep.HepRepType;
+import hep.graphics.heprep.HepRepTypeTree;
+
+/**
+ * @author jeremym
+ */
+/* FIXME: Another instance where "is a" should be "has a" w.r.t. shape/topology of the subdetector. */
+abstract class AbstractTestBeam extends AbstractLayeredSubdetector
+{
+ double x;
+ double y;
+ double z;
+
+ Hep3Vector position;
+
+ public AbstractTestBeam(Element node) throws JDOMException
+ {
+ super(node);
+ build(node);
+ }
+
+ private void build(Element node) throws JDOMException
+ {
+ Element dimensions = node.getChild("dimensions");
+
+ x = dimensions.getAttribute("x").getDoubleValue();
+ y = dimensions.getAttribute("y").getDoubleValue();
+ z = getLayering().getThickness();
+
+ Element position = node.getChild("position");
+
+ double posX=0;
+ double posY=0;
+ double posZ=0;
+ if ( position != null )
+ {
+ Attribute posAttrib = position.getAttribute("x");
+ if ( posAttrib != null )
+ {
+ posX = posAttrib.getDoubleValue();
+ }
+ posAttrib = position.getAttribute("y");
+ if ( posAttrib != null )
+ {
+ posY = posAttrib.getDoubleValue();
+ }
+
+ posAttrib = position.getAttribute("z");
+ if ( posAttrib != null )
+ {
+ posZ = posAttrib.getDoubleValue();
+ }
+ }
+
+ setPosition(new BasicHep3Vector(posX, posY, posZ));
+ }
+
+ /** @return full maximum dimension in X */
+ public double getX()
+ {
+ return x;
+ }
+
+ /** @return full maximum dimension in Y */
+ public double getY()
+ {
+ return y;
+ }
+
+ /**
+ * @return full maximum dimension in Z, computed and cached at build time from
+ * layering thickness
+ */
+ public double getZ()
+ {
+ return z;
+ }
+
+ public Hep3Vector getPosition()
+ {
+ return position;
+ }
+
+ public void setPosition(Hep3Vector position)
+ {
+ this.position = position;
+ }
+
+ public void appendHepRep(HepRepFactory factory, HepRep heprep)
+ {
+ HepRepInstanceTree instanceTree = heprep.getInstanceTreeTop("Detector","1.0");
+ HepRepTypeTree typeTree = heprep.getTypeTree("DetectorType","1.0");
+ HepRepType barrel = typeTree.getType("Barrel");
+
+ HepRepType type = factory.createHepRepType(barrel, getName());
+ type.addAttValue("drawAs","Prism");
+
+ HepRepInstance instance = factory.createHepRepInstance(instanceTree, type);
+
+ Hep3Vector position = getPosition();
+ double x = getX()/2 + position.x();
+ double y = getY()/2 + position.y();
+ double z = getZ()/2 + position.z();
+
+ factory.createHepRepPoint(instance, x, y, -z);
+ factory.createHepRepPoint(instance, x, -y, -z);
+ factory.createHepRepPoint(instance, -x, -y, -z);
+ factory.createHepRepPoint(instance, -x, y, -z);
+
+ factory.createHepRepPoint(instance, x, y, z);
+ factory.createHepRepPoint(instance, x, -y, z);
+ factory.createHepRepPoint(instance, -x, -y, z);
+ factory.createHepRepPoint(instance, -x, y, z);
+ }
+}
\ No newline at end of file
GeomConverter/src/org/lcsim/geometry/subdetector
diff -N TestBeamTracker.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ TestBeamTracker.java 26 Sep 2005 18:13:29 -0000 1.1
@@ -0,0 +1,36 @@
+/*
+ * TestBeamCalorimeter.java
+ *
+ * Created on September 2, 2005, 3:43 PM
+ *
+ */
+
+package org.lcsim.geometry.subdetector;
+
+import org.lcsim.geometry.Tracker;
+import hep.physics.vec.Hep3Vector;
+import org.jdom.Element;
+import org.jdom.JDOMException;
+
+
+/**
+ * @author jeremym
+ */
+public class TestBeamTracker extends AbstractTestBeam
+ implements Tracker
+{
+ public TestBeamTracker(Element node) throws JDOMException
+ {
+ super(node);
+ }
+
+ public org.lcsim.geometry.TrackerIDDecoder getTrackerIDDecoder()
+ {
+ return (org.lcsim.geometry.TrackerIDDecoder)(getReadout().getIDDecoder() );
+ }
+
+ public boolean isTracker()
+ {
+ return true;
+ }
+}
\ No newline at end of file