Print

Print


Commit in GeomConverter/src/org/lcsim/geometry on MAIN
compact/converter/lcdd/AbstractTestBeam.java+211added 1.1
                      /TestBeamTracker.java+33added 1.1
subdetector/AbstractTestBeam.java+133added 1.1
           /TestBeamTracker.java+36added 1.1
+413
4 added files
Added files for TestBeamTracker requested by Norman.

GeomConverter/src/org/lcsim/geometry/compact/converter/lcdd
AbstractTestBeam.java added at 1.1
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
TestBeamTracker.java added at 1.1
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
AbstractTestBeam.java added at 1.1
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
TestBeamTracker.java added at 1.1
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
CVSspam 0.2.8