Commit in GeomConverter on MAIN
src/org/lcsim/detector/converter/compact/HPSTracker2Converter.java+383added 1.1
                                        /DetectorConverter.java+2-11.54 -> 1.55
src/org/lcsim/geometry/compact/converter/lcdd/HPSTracker2.java+354added 1.1
                                             /HPSTracker.java+36-81.9 -> 1.10
src/org/lcsim/geometry/subdetector/HPSTracker2.java+27added 1.1
test/org/lcsim/detector/converter/compact/HPSTracker2ConverterTest.java+37added 1.1
testResources/org/lcsim/geometry/subdetector/HPSTracker2Test.xml+145added 1.1
+984-9
5 added + 2 modified, total 7 files
new detector component that allows explicit placement of HPS tracker modules by global position and rotation

GeomConverter/src/org/lcsim/detector/converter/compact
HPSTracker2Converter.java added at 1.1
diff -N HPSTracker2Converter.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ HPSTracker2Converter.java	11 Apr 2012 23:07:34 -0000	1.1
@@ -0,0 +1,383 @@
+package org.lcsim.detector.converter.compact;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.jdom.DataConversionException;
+import org.jdom.Element;
+import org.jdom.JDOMException;
+import org.lcsim.detector.DetectorElement;
+import org.lcsim.detector.DetectorIdentifierHelper;
+import org.lcsim.detector.DetectorIdentifierHelper.SystemMap;
+import org.lcsim.detector.IDetectorElement;
+import org.lcsim.detector.ILogicalVolume;
+import org.lcsim.detector.IPhysicalVolume;
+import org.lcsim.detector.IRotation3D;
+import org.lcsim.detector.ITranslation3D;
+import org.lcsim.detector.LogicalVolume;
+import org.lcsim.detector.PhysicalVolume;
+import org.lcsim.detector.RotationGeant;
+import org.lcsim.detector.Transform3D;
+import org.lcsim.detector.Translation3D;
+import org.lcsim.detector.identifier.ExpandedIdentifier;
+import org.lcsim.detector.identifier.IExpandedIdentifier;
+import org.lcsim.detector.identifier.IIdentifier;
+import org.lcsim.detector.identifier.IIdentifierDictionary;
+import org.lcsim.detector.identifier.IIdentifierHelper;
+import org.lcsim.detector.material.IMaterial;
+import org.lcsim.detector.material.MaterialStore;
+import org.lcsim.detector.solids.Box;
+import org.lcsim.detector.tracker.silicon.SiSensor;
+import org.lcsim.detector.tracker.silicon.SiTrackerIdentifierHelper;
+import org.lcsim.detector.tracker.silicon.SiTrackerModule;
+import org.lcsim.geometry.compact.Detector;
+import org.lcsim.geometry.compact.Subdetector;
+import org.lcsim.geometry.subdetector.HPSTracker2;
+
+public class HPSTracker2Converter extends AbstractSubdetectorConverter {
+    
+    Map<String, ModuleParameters> moduleParameters = new HashMap<String, ModuleParameters>();
+    Map<String, LogicalVolume> modules = new HashMap<String, LogicalVolume>();
+    IMaterial trackingMaterial;
+    
+    public Class getSubdetectorType() {
+        return HPSTracker2.class;
+    }
+    
+    public IIdentifierHelper makeIdentifierHelper(Subdetector subdetector, SystemMap systemMap) {
+        return new SiTrackerIdentifierHelper(subdetector.getDetectorElement(), makeIdentifierDictionary(subdetector), systemMap);
+    }
+
+    public void convert(Subdetector subdet, Detector detector) {
+        trackingMaterial = MaterialStore.getInstance().get("TrackingMaterial");
+        if (trackingMaterial == null) {
+            trackingMaterial = MaterialStore.getInstance().get("Air");
+        }
+        
+        // Get the tracking volume for module placement.
+        ILogicalVolume trackingVolume = detector.getTrackingVolume().getLogicalVolume();
+                
+        // Get ID helper and dictionary for subdetector.
+        DetectorIdentifierHelper helper = (DetectorIdentifierHelper) subdet.getDetectorElement().getIdentifierHelper();
+        IIdentifierDictionary iddict = subdet.getDetectorElement().getIdentifierHelper().getIdentifierDictionary();
+        int nfields = helper.getIdentifierDictionary().getNumberOfFields();
+        
+        // Get XML node for this subdetector.
+        Element node = subdet.getNode();
+        
+        // Create the module logical volumes.
+        for (Iterator i = node.getChildren("module").iterator(); i.hasNext();) {
+            Element module = (Element) i.next();
+            String moduleName = module.getAttributeValue("name");
+            moduleParameters.put(moduleName, new ModuleParameters(module));
+            modules.put(moduleName, makeModule(moduleParameters.get(moduleName)));
+        }
+        
+        try {
+            for (Iterator i = node.getChildren("layer").iterator(); i.hasNext();) {
+                
+                Element layerElement = (Element) i.next();
+                int layerId = -1;
+                layerId = layerElement.getAttribute("id").getIntValue();
+                
+                // Layer identifier.
+                IExpandedIdentifier layerPosId = new ExpandedIdentifier(nfields);
+                layerPosId.setValue(helper.getFieldIndex("system"), subdet.getSystemID());
+                layerPosId.setValue(helper.getFieldIndex("barrel"), helper.getBarrelValue());
+                layerPosId.setValue(helper.getFieldIndex("layer"), layerId);
+                
+                // DetectorElement for layer.
+                IDetectorElement layerDe = new DetectorElement(subdet.getName() + "_layer" + layerId, subdet.getDetectorElement(), helper.pack(layerPosId));
+
+                // Loop over modules within layer.
+                for (Iterator j = layerElement.getChildren("module_placement").iterator(); j.hasNext();) {
+
+                    Element modulePlacementElement = (Element)j.next();
+                    String moduleName = modulePlacementElement.getAttributeValue("name");
+                    int moduleNumber = modulePlacementElement.getAttribute("id").getIntValue();
+
+                    // Get the position and rotation parameters.  All must be explicitly specified.
+                    double x, y, z;
+                    double rx, ry, rz;
+                    x = modulePlacementElement.getAttribute("x").getDoubleValue();
+                    y = modulePlacementElement.getAttribute("y").getDoubleValue();
+                    z = modulePlacementElement.getAttribute("z").getDoubleValue();
+                    rx = modulePlacementElement.getAttribute("rx").getDoubleValue();
+                    ry = modulePlacementElement.getAttribute("ry").getDoubleValue();
+                    rz = modulePlacementElement.getAttribute("rz").getDoubleValue();
+                    
+                    ITranslation3D pos = new Translation3D(x, y, z);
+                    IRotation3D rot = new RotationGeant(rx, ry, rz);
+                    
+                    String modulePlacementName = subdet.getName() + "_" + moduleName + "_layer" + layerId + "_module" + moduleNumber;
+                    
+                    LogicalVolume lv = modules.get(moduleName);
+                    IPhysicalVolume modulePhysVol = new PhysicalVolume(new Transform3D(pos,rot), modulePlacementName, lv, trackingVolume, 0);
+                    
+                    System.out.println("made module: " + modulePhysVol.getName());
+                    
+                    // Module DetectorElement.
+                    String modulePath = "/" + detector.getTrackingVolume().getName() + "/" + modulePlacementName;                                                        
+                    SiTrackerModule moduleDe = new SiTrackerModule(modulePlacementName, layerDe, modulePath, moduleNumber);
+                    
+                    System.out.println("created new SiTrackerModule called " + modulePlacementName + " with path: " + modulePath);
+                                        
+                    // Make SiSensor DetectorElements.
+                    int sensorNumber = 0;
+                    for (IPhysicalVolume componentPhysVol : modulePhysVol.getLogicalVolume().getDaughters()) {
+                        // Setup the sensor.
+                        if (componentPhysVol.getLogicalVolume().getDaughters().size() != 0) {
+                            
+                            // Sensor physical volume.
+                            IPhysicalVolume sensorPhysVol = componentPhysVol.getLogicalVolume().getDaughters().get(0);
+                            
+                            ExpandedIdentifier expId = new ExpandedIdentifier(iddict.getNumberOfFields());
+                            
+                            // Setup SiSensor's identifier.
+                            expId.setValue(iddict.getFieldIndex("system"), subdet.getSystemID());
+                            expId.setValue(iddict.getFieldIndex("barrel"), 0);                            
+                            expId.setValue(iddict.getFieldIndex("layer"), helper.getValue(layerDe.getIdentifier(), "layer"));
+                            expId.setValue(iddict.getFieldIndex("module"), ((SiTrackerModule) moduleDe).getModuleId());
+                            expId.setValue(iddict.getFieldIndex("sensor"), sensorNumber);
+
+                            // Packed identifier.
+                            IIdentifier sensorId = iddict.pack(expId);
+
+                            // Sensor paths.
+                            String sensorPath = modulePath.toString() + "/" + componentPhysVol.getName() + "/" + sensorPhysVol.getName();
+                            String sensorName = moduleDe.getName() + "_sensor" + sensorNumber;
+                            
+                            // Create the sensor.
+                            SiSensor sensor = new SiSensor(sensorNumber, sensorName, moduleDe, sensorPath, sensorId);
+                                                        
+                            System.out.println("created sensor " + sensor.getName());
+                            
+                            // Increment sensor numbering.
+                            ++sensorNumber;
+                        }
+                    }
+                }
+            }
+        } 
+        catch (DataConversionException e) {
+            throw new RuntimeException(e);
+        }
+    }    
+    
+    private LogicalVolume makeModule(ModuleParameters params)
+    {
+        double thickness = params.getThickness();
+        double x, y;
+        //x = params.getDimension(0);
+        //y = params.getDimension(1);        
+        y = params.getDimension(0); // Y is long dimension along world's X axis.
+        x = params.getDimension(1); // X is short dimension along world Y axis.
+        
+        Box box = new Box(params.getName() + "Box", x / 2, y / 2, thickness / 2);
+        LogicalVolume volume = new LogicalVolume(params.getName() + "Volume", box, trackingMaterial);
+        
+        makeModuleComponents(volume, params);
+        
+        return volume;
+    }
+
+    private void makeModuleComponents(LogicalVolume moduleVolume, ModuleParameters moduleParameters)
+    {
+        //double moduleX = moduleParameters.getDimension(0);
+        //double moduleY = moduleParameters.getDimension(1);        
+        double moduleY = moduleParameters.getDimension(0);
+        double moduleX = moduleParameters.getDimension(1);
+        Box box = (Box)moduleVolume.getSolid();
+        double moduleZ = box.getZHalfLength() * 2;                        
+        double posZ = -moduleZ / 2;
+        String moduleName = moduleVolume.getName();
+        int sensorNumber = 0;       
+        for (ModuleComponentParameters component : moduleParameters)
+        {
+            double componentThickness = component.getThickness();
+            IMaterial material = MaterialStore.getInstance().get(component.getMaterialName());
+            if (material == null)
+            {
+                throw new RuntimeException("The material " + component.getMaterialName() + " does not exist in the materials database.");
+            }           
+            boolean sensitive = component.isSensitive();            
+            int componentNumber = component.getComponentNumber();
+            posZ += componentThickness / 2;
+            String componentName = moduleName + "_component" + componentNumber;
+            Box componentBox = new Box(componentName + "Box", moduleX / 2, moduleY / 2, componentThickness / 2);
+            LogicalVolume componentVolume = new LogicalVolume(componentName, componentBox, material);
+            double zrot = 0;
+            if (sensitive)
+            {
+                if (sensorNumber > 1)
+                {
+                    throw new RuntimeException("Exceeded maximum of 2 sensors per module.");
+                }
+                // Flip 180 deg for 1st sensor.
+                if (sensorNumber == 0)
+                {
+                    zrot = Math.PI;
+                }                
+                String sensorName = componentName + "Sensor" + sensorNumber;
+                double sensorX = component.getDimensionY(); // Flipped so X is actually Y.
+                //if (sensorX > moduleX)
+                //    throw new RuntimeException("Sensor X dimension " + sensorX + " is too big for module.");
+                double sensorY = component.getDimensionX(); // Flipped so Y is actually X.
+                //if (sensorY > moduleY)
+                //    throw new RuntimeException("Sensor Y dimension " + sensorY + " is too big for module.");
+                Box sensorBox = new Box(sensorName + "Box", sensorX / 2, sensorY / 2, componentThickness / 2);
+                LogicalVolume sensorVol = new LogicalVolume(sensorName, sensorBox, material);                
+                Translation3D sensorPosition = new Translation3D(0, 0, 0);
+                RotationGeant sensorRotation = new RotationGeant(0, 0, zrot);
+                //PhysicalVolume sensorPhysVol = 
+                new PhysicalVolume(new Transform3D(sensorPosition, sensorRotation), sensorName, sensorVol, componentVolume, sensorNumber);                
+                // TODO Could make sensors here?
+                ++sensorNumber;
+            }
+            Translation3D position = new Translation3D(0., 0., posZ);
+            RotationGeant rotation = new RotationGeant(0, 0, zrot);
+            PhysicalVolume pv = new PhysicalVolume(new Transform3D(position, rotation), componentName, componentVolume, moduleVolume, componentNumber);
+            pv.setSensitive(sensitive);
+            posZ += componentThickness / 2;
+        }
+    }
+    
+    static class ModuleComponentParameters {
+        protected String materialName;
+        protected double thickness;
+        protected boolean sensitive;
+        protected int componentNumber;
+        protected String vis;
+        protected double dimX, dimY;
+
+        public ModuleComponentParameters(double dimX, double dimY, double thickness, String materialName, int componentNumber, boolean sensitive, String vis) {
+            this.dimX = dimX;
+            this.dimY = dimY;
+            this.thickness = thickness;
+            this.materialName = materialName;
+            this.sensitive = sensitive;
+            this.componentNumber = componentNumber;
+            this.vis = vis;
+        }
+
+        public double getThickness() {
+            return thickness;
+        }
+
+        public double getDimensionX() {
+            return dimX;
+        }
+
+        public double getDimensionY() {
+            return dimY;
+        }
+
+        public String getMaterialName() {
+            return materialName;
+        }
+
+        public boolean isSensitive() {
+            return sensitive;
+        }
+
+        public int getComponentNumber() {
+            return componentNumber;
+        }
+
+        public String getVis() {
+            return vis;
+        }
+    }
+
+    static class ModuleParameters extends ArrayList<ModuleComponentParameters> {
+        double thickness;
+        String name;
+        double dimensions[] = new double[3];
+        String vis;
+
+        public ModuleParameters(Element element) {
+            name = element.getAttributeValue("name");
+            if (element.getAttribute("vis") != null)
+                this.vis = element.getAttribute("vis").getValue();
+            // Optional dimension parameters (not always present).
+            if (element.getChild("trd") != null) {
+                Element trd = element.getChild("trd");
+                try {
+                    dimensions[0] = trd.getAttribute("x1").getDoubleValue();
+                    dimensions[1] = trd.getAttribute("x2").getDoubleValue();
+                    dimensions[2] = trd.getAttribute("z").getDoubleValue();
+                } catch (DataConversionException x) {
+                    throw new RuntimeException(x);
+                }
+            } else if (element.getChild("box") != null) {
+                Element box = element.getChild("box");
+                try {
+                    dimensions[0] = box.getAttribute("x").getDoubleValue();
+                    dimensions[1] = box.getAttribute("y").getDoubleValue();
+                } catch (DataConversionException x) {
+                    throw new RuntimeException(x);
+                }
+            }
+            int cntr = 0;
+            for (Object o : element.getChildren("module_component")) {
+                try {
+
+                    Element e = (Element) o;
+
+                    double thickness = e.getAttribute("thickness").getDoubleValue();
+
+                    String materialName = e.getAttributeValue("material");
+
+                    boolean sensitive = false;
+                    if (e.getAttribute("sensitive") != null)
+                        sensitive = e.getAttribute("sensitive").getBooleanValue();
+                    String componentVis = null;
+                    if (e.getAttribute("vis") != null)
+                        componentVis = e.getAttribute("vis").getValue();
+
+                    // Sensors may have reduced dimensions for dead area.
+                    double x = dimensions[0]; // default
+                    double y = dimensions[1]; // default
+                    if (sensitive && e.getChild("dimensions") != null) {
+                        Element dimensions = e.getChild("dimensions");
+                        x = dimensions.getAttribute("x").getDoubleValue();
+                        y = dimensions.getAttribute("y").getDoubleValue();
+                        // System.out.println("x,y="+x+","+y);
+                    }
+                    add(new ModuleComponentParameters(x, y, thickness, materialName, cntr, sensitive, componentVis));
+                } catch (JDOMException x) {
+                    throw new RuntimeException(x);
+                }
+                ++cntr;
+            }
+            calculateThickness();
+        }
+
+        public void calculateThickness() {
+            thickness = 0.; // reset thickness
+            for (ModuleComponentParameters p : this) {
+                thickness += p.getThickness();
+            }
+        }
+
+        public double getThickness() {
+            return thickness;
+        }
+
+        public String getName() {
+            return name;
+        }
+
+        public double getDimension(int i) {
+            if (i > (dimensions.length - 1) || i < 0)
+                throw new RuntimeException("Invalid dimensions index: " + i);
+            return dimensions[i];
+        }
+
+        public String getVis() {
+            return vis;
+        }
+    }
+}

GeomConverter/src/org/lcsim/detector/converter/compact
DetectorConverter.java 1.54 -> 1.55
diff -u -r1.54 -r1.55
--- DetectorConverter.java	13 Jan 2012 00:03:48 -0000	1.54
+++ DetectorConverter.java	11 Apr 2012 23:07:34 -0000	1.55
@@ -109,13 +109,14 @@
 
         // HPS
         addSubdetectorConverter(new HPSTrackerConverter());
+        addSubdetectorConverter(new HPSTracker2Converter());
         addSubdetectorConverter(new HPSEcalConverter());
         addSubdetectorConverter(new HPSEcal2Converter());
         addSubdetectorConverter(new HPSEcal3Converter());
 
         // Support structures.
         addSubdetectorConverter(new PolyconeSupportConverter());
-        addSubdetectorConverter(new TubeSegmentConverter());
+        addSubdetectorConverter(new TubeSegmentConverter());        
     }
 
     private void addSubdetectorConverter(ISubdetectorConverter s)

GeomConverter/src/org/lcsim/geometry/compact/converter/lcdd
HPSTracker2.java added at 1.1
diff -N HPSTracker2.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ HPSTracker2.java	11 Apr 2012 23:07:34 -0000	1.1
@@ -0,0 +1,354 @@
+package org.lcsim.geometry.compact.converter.lcdd;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.jdom.DataConversionException;
+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.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.Rotation;
+import org.lcsim.geometry.compact.converter.lcdd.util.SensitiveDetector;
+import org.lcsim.geometry.compact.converter.lcdd.util.Volume;
+
+/**
+ * 
+ * SVT geometry for HPS Test Run.
+ * 
+ * @author Jeremy McCormick <[log in to unmask]>
+ * @author Matt Graham <[log in to unmask]>
+ */
+public class HPSTracker2 extends LCDDSubdetector {
+
+    Map<String, ModuleParameters> moduleParameters = new HashMap<String, ModuleParameters>();
+    Map<String, Volume> modules = new HashMap<String, Volume>();
+    Material vacuum;
+
+    public HPSTracker2(Element node) throws JDOMException {
+        super(node);
+    }
+    
+    public boolean isTracker() {
+        return true;
+    }
+
+    void addToLCDD(LCDD lcdd, SensitiveDetector sd) throws JDOMException {
+        
+        // Get parameters.
+        int sysId = node.getAttribute("id").getIntValue();
+        String subdetName = node.getAttributeValue("name");
+        vacuum = lcdd.getMaterial("Vacuum");
+   
+        // Create module logical volumes.
+        createModules(lcdd, sd);
+        
+        // Create module placements in tracking volume.
+        createModulePlacements(lcdd, sysId, subdetName);
+    }
+
+    // Place modules within the tracking volume.
+	private void createModulePlacements(LCDD lcdd, int sysId, String subdetName) throws DataConversionException {
+		Volume trackingVolume = lcdd.getTrackingVolume();
+		// Loop over layers.
+        for (Iterator i = node.getChildren("layer").iterator(); i.hasNext();) {        
+        	Element layerElement = (Element)i.next();
+        	int layerNumber = layerElement.getAttribute("id").getIntValue();
+        	// Loop over modules within layer.
+        	for (Iterator j = layerElement.getChildren("module_placement").iterator(); j.hasNext();) {
+        	    
+        		Element modulePlacementElement = (Element)j.next();
+        		String moduleName = modulePlacementElement.getAttributeValue("name");
+        		int moduleNumber = modulePlacementElement.getAttribute("id").getIntValue();
+        		
+        		// Get the position and rotation parameters.  All must be explicitly specified.
+        		double x, y, z;
+        		double rx, ry, rz;
+        		x = modulePlacementElement.getAttribute("x").getDoubleValue();
+        		y = modulePlacementElement.getAttribute("y").getDoubleValue();
+        		z = modulePlacementElement.getAttribute("z").getDoubleValue();
+        		rx = modulePlacementElement.getAttribute("rx").getDoubleValue();
+        		ry = modulePlacementElement.getAttribute("ry").getDoubleValue();
+        		rz = modulePlacementElement.getAttribute("rz").getDoubleValue();
+        		
+        		// Place the module with position and rotation from above.
+        		String modulePlacementName = subdetName + "_" + moduleName + "_layer" + layerNumber + "_module" + moduleNumber;
+        		Position p = new Position(modulePlacementName + "_position", x, y, z);
+        		Rotation r = new Rotation(modulePlacementName + "_rotation", rx, ry, rz);
+        		lcdd.add(p);
+        		lcdd.add(r);        		        		
+        		PhysVol modulePhysVol = new PhysVol(modules.get(moduleName), trackingVolume, p, r);
+        		
+        		// Add identifier values to the placement volume.
+        		modulePhysVol.addPhysVolID("system", sysId);
+        		modulePhysVol.addPhysVolID("barrel", 0);
+        		modulePhysVol.addPhysVolID("layer", layerNumber);
+        		modulePhysVol.addPhysVolID("module", moduleNumber);        		
+        	}
+        }
+	}
+
+    // Create the module logical volumes.
+	private void createModules(LCDD lcdd, SensitiveDetector sd) {
+        for (Iterator i = node.getChildren("module").iterator(); i.hasNext();) {
+            Element module = (Element) i.next();
+            String moduleName = module.getAttributeValue("name");
+            moduleParameters.put(moduleName, new ModuleParameters(module));
+            modules.put(moduleName, makeModule(moduleParameters.get(moduleName), sd, lcdd));
+        }
+	}
+
+	private Volume makeModule(ModuleParameters params, SensitiveDetector sd, LCDD lcdd) {
+		double thickness = params.getThickness();
+		double x, y;
+		// x = params.getDimension(0);
+		// y = params.getDimension(1);
+		y = params.getDimension(0); // Y is in X plane in world coordinates.
+		x = params.getDimension(1); // X is in Y plane in world coordinates.
+		// System.out.println("making module with x = " + x + " and y = " + y);
+		Box box = new Box(params.getName() + "Box", x, y, thickness);
+		lcdd.add(box);
+
+		Volume moduleVolume = new Volume(params.getName() + "Volume", box, vacuum);
+		makeModuleComponents(moduleVolume, params, sd, lcdd);
+		lcdd.add(moduleVolume);
+
+		if (params.getVis() != null) {
+			moduleVolume
+					.setVisAttributes(lcdd.getVisAttributes(params.getVis()));
+		}
+
+		return moduleVolume;
+	}
+
+    private void makeModuleComponents(Volume moduleVolume, ModuleParameters moduleParameters, SensitiveDetector sd, LCDD lcdd) {
+        Box envelope = (Box) lcdd.getSolid(moduleVolume.getSolidRef());
+
+        double moduleX = envelope.getX();
+        double moduleY = envelope.getY();
+
+        double posZ = -moduleParameters.getThickness() / 2;
+
+        String moduleName = moduleVolume.getVolumeName();
+
+        int sensor = 0;
+        for (ModuleComponentParameters component : moduleParameters) {
+
+            double thickness = component.getThickness();
+
+            Material material = null;
+            try {
+                material = lcdd.getMaterial(component.getMaterialName());
+            } catch (JDOMException except) {
+                throw new RuntimeException(except);
+            }
+            boolean sensitive = component.isSensitive();
+            int componentNumber = component.getComponentNumber();
+
+            posZ += thickness / 2;
+
+            String componentName = moduleName + "_component" + componentNumber;
+
+            Box componentBox = new Box(componentName + "Box", moduleX, moduleY, thickness);
+            lcdd.add(componentBox);
+
+            Volume componentVolume = new Volume(componentName, componentBox, material);
+
+            Position position = new Position(componentName + "_position", 0., 0., posZ);
+            lcdd.add(position);
+            Rotation rotation = new Rotation(componentName + "_rotation", 0., 0., 0.);
+            lcdd.add(rotation);
+
+            PhysVol pv = new PhysVol(componentVolume, moduleVolume, position, rotation);
+            pv.addPhysVolID("component", componentNumber);
+
+            if (sensitive) {
+                if (sensor > 1) {
+                    throw new RuntimeException("Maximum of 2 sensors per module.");
+                }
+
+                // Build a child sensor volume to allow dead areas.
+
+                String sensorName = componentName + "Sensor" + sensor;
+
+                // Flipped these around!!!
+                double sensorX = component.getDimensionY();
+                double sensorY = component.getDimensionX();
+                
+                Box sensorBox = new Box(sensorName + "Box", sensorX, sensorY, thickness);
+                lcdd.add(sensorBox);
+
+                Volume sensorVol = new Volume(sensorName, sensorBox, material);
+                sensorVol.setSensitiveDetector(sd);
+                lcdd.add(sensorVol);
+
+                Position sensorPosition = new Position(sensorName + "Position", 0, 0, 0);
+                lcdd.add(sensorPosition);
+                Rotation sensorRotation = new Rotation(sensorName + "Rotation", 0, 0, 0);
+                lcdd.add(sensorRotation);
+
+                PhysVol sensorPhysVol = new PhysVol(sensorVol, componentVolume, sensorPosition, sensorRotation);
+                sensorPhysVol.addPhysVolID("sensor", sensor);
+
+                ++sensor;
+            }
+
+            // Add component volume after (possible) sensor child volume.
+            lcdd.add(componentVolume);
+
+            // Set vis attributes of component.
+            if (component.getVis() != null) {
+                componentVolume.setVisAttributes(lcdd.getVisAttributes(component.getVis()));
+            }
+
+            // Step to next component placement position.
+            posZ += thickness / 2;
+        }
+    }
+
+    private static class ModuleComponentParameters {
+        protected String materialName;
+        protected double thickness;
+        protected boolean sensitive;
+        protected int componentNumber;
+        protected String vis;
+        protected double dimX, dimY;
+
+        ModuleComponentParameters(double dimX, double dimY, double thickness, String materialName, int componentNumber, boolean sensitive, String vis) {
+            this.dimX = dimX;
+            this.dimY = dimY;
+            this.thickness = thickness;
+            this.materialName = materialName;
+            this.sensitive = sensitive;
+            this.componentNumber = componentNumber;
+            this.vis = vis;
+        }
+
+        double getThickness() {
+            return thickness;
+        }
+
+        double getDimensionX() {
+            return dimX;
+        }
+
+        double getDimensionY() {
+            return dimY;
+        }
+
+        String getMaterialName() {
+            return materialName;
+        }
+
+        boolean isSensitive() {
+            return sensitive;
+        }
+
+        int getComponentNumber() {
+            return componentNumber;
+        }
+
+        String getVis() {
+            return vis;
+        }
+    }
+
+    private static class ModuleParameters extends ArrayList<ModuleComponentParameters> {
+        double thickness;
+        String name;
+        double dimensions[] = new double[3];
+        String vis;
+
+        public ModuleParameters(Element element) {
+            name = element.getAttributeValue("name");
+
+            if (element.getAttribute("vis") != null)
+                this.vis = element.getAttribute("vis").getValue();
+
+            // Optional dimension parameters (not always present).
+            if (element.getChild("trd") != null) {
+                Element trd = element.getChild("trd");
+                try {
+                    dimensions[0] = trd.getAttribute("x1").getDoubleValue();
+                    dimensions[1] = trd.getAttribute("x2").getDoubleValue();
+                    dimensions[2] = trd.getAttribute("z").getDoubleValue();
+                } catch (DataConversionException x) {
+                    throw new RuntimeException(x);
+                }
+            } else if (element.getChild("box") != null) {
+                Element box = element.getChild("box");
+                try {
+                    dimensions[0] = box.getAttribute("x").getDoubleValue();
+                    dimensions[1] = box.getAttribute("y").getDoubleValue();
+                } catch (DataConversionException x) {
+                    throw new RuntimeException(x);
+                }
+            }
+
+            int cntr = 0;
+            for (Object o : element.getChildren("module_component")) {
+                try {
+
+                    Element e = (Element) o;
+
+                    double thickness = e.getAttribute("thickness").getDoubleValue();
+
+                    String materialName = e.getAttributeValue("material");
+
+                    boolean sensitive = false;
+                    if (e.getAttribute("sensitive") != null)
+                        sensitive = e.getAttribute("sensitive").getBooleanValue();
+                    String componentVis = null;
+                    if (e.getAttribute("vis") != null)
+                        componentVis = e.getAttribute("vis").getValue();
+
+                    // Sensors may have reduced dimensions for dead area.
+                    double x = dimensions[0]; // default
+                    double y = dimensions[1]; // default
+                    if (sensitive && e.getChild("dimensions") != null) {
+                        Element dimensions = e.getChild("dimensions");
+                        x = dimensions.getAttribute("x").getDoubleValue();
+                        y = dimensions.getAttribute("y").getDoubleValue();
+                        // System.out.println("x,y="+x+","+y);
+                    }
+                    add(new ModuleComponentParameters(x, y, thickness, materialName, cntr, sensitive, componentVis));
+                } catch (JDOMException x) {
+                    throw new RuntimeException(x);
+                }
+                ++cntr;
+            }
+
+            calculateThickness();
+        }
+
+        void calculateThickness() {
+            thickness = 0.; // reset thickness
+            for (ModuleComponentParameters p : this) {
+                thickness += p.getThickness();
+            }
+        }
+
+        double getThickness() {
+            return thickness;
+        }
+
+        String getName() {
+            return name;
+        }
+
+        double getDimension(int i) {
+            if (i > (dimensions.length - 1) || i < 0)
+                throw new RuntimeException("Invalid dimensions index: " + i);
+            return dimensions[i];
+        }
+
+        String getVis() {
+            return vis;
+        }
+    }
+}
\ No newline at end of file

GeomConverter/src/org/lcsim/geometry/compact/converter/lcdd
HPSTracker.java 1.9 -> 1.10
diff -u -r1.9 -r1.10
--- HPSTracker.java	20 Mar 2012 18:05:34 -0000	1.9
+++ HPSTracker.java	11 Apr 2012 23:07:34 -0000	1.10
@@ -74,6 +74,9 @@
 
             Element layerElement = (Element) i.next();
             int layerId = layerElement.getAttribute("id").getIntValue();
+            
+            System.out.println("<layer id=\"" + layerId + "\">");
+            
             int ringCount = 0;
 
             // quadrant (???)
@@ -132,8 +135,8 @@
                         p.setX(x);
                         p.setY(y);
                         p.setZ(z + dz);
-                        System.out.println("layer, module = " + layerId + ", " + moduleNumber);
-                        System.out.println("module pos = " + x + " " + y + " " + z);
+                        //System.out.println("layer, module = " + layerId + ", " + moduleNumber);
+                        //System.out.println("module pos = " + x + " " + y + " " + z);
                         Rotation rot = new Rotation(moduleBaseName + "_rotation");
                         rot.setX(0);
                         rot.setY(theta);
@@ -141,7 +144,7 @@
                         // Y side along world's X axis.  
                         // FIXME Should phi0 actually be subtracted???
                         rot.setZ(-(Math.PI / 2 + top_phi0));
-                        System.out.println("module rot = " + 0 + ", " + theta + "," + -(Math.PI / 2 + top_phi0));
+                        //System.out.println("module rot = " + 0 + ", " + theta + "," + -(Math.PI / 2 + top_phi0));
 
                         lcdd.add(p);
                         lcdd.add(rot);
@@ -151,14 +154,26 @@
                         pv.addPhysVolID("barrel", 0);
                         pv.addPhysVolID("layer", layerId);
                         pv.addPhysVolID("module", moduleNumber);
-                        ++moduleNumber;                        
+                                                
+                        System.out.print("    <module_placement name=\"" + module + "\" ");
+                        System.out.print("id=\"" + moduleNumber + "\" ");
+                        System.out.print("x=\"" + p.getAttribute("x").getDoubleValue() + "\" ");
+                        System.out.print("y=\"" + p.getAttribute("y").getDoubleValue() + "\" ");
+                        System.out.print("z=\"" + p.getAttribute("z").getDoubleValue() + "\" ");
+                        System.out.print("rx=\"" + rot.getAttribute("x").getDoubleValue() + "\" ");
+                        System.out.print("ry=\"" + rot.getAttribute("y").getDoubleValue() + "\" ");
+                        System.out.print("rz=\"" + rot.getAttribute("z").getDoubleValue() + "\"/>");
+                        System.out.println();
+                        
+                        ++moduleNumber;     
+                        
                         if (reflect)
                         {
                             Position pr = new Position(moduleBaseName + "_reflect_position");
                             pr.setX(x);
                             pr.setY(-y);
                             pr.setZ(z + dz);
-                            System.out.println("module @ " + x + " " + -y + " " + z + dz);
+                            //System.out.println("module @ " + x + " " + -y + " " + (z + dz));
                             Rotation rotr = new Rotation(moduleBaseName + "_reflect_rotation");                          
                             rotr.setX(0);
                             rotr.setY(theta);
@@ -172,14 +187,27 @@
                             pvr.addPhysVolID("barrel", 0);
                             pvr.addPhysVolID("layer", layerId);
                             pvr.addPhysVolID("module", moduleNumber);
-                            ++moduleNumber;
+                            
+                            System.out.print("    <module_placement name=\"" + module + "\" ");
+                            System.out.print("id=\"" + moduleNumber + "\" ");
+                            System.out.print("x=\"" + pr.getAttribute("x").getDoubleValue() + "\" ");
+                            System.out.print("y=\"" + pr.getAttribute("y").getDoubleValue() + "\" ");
+                            System.out.print("z=\"" + pr.getAttribute("z").getDoubleValue() + "\" ");
+                            System.out.print("rx=\"" + rotr.getAttribute("x").getDoubleValue() + "\" ");
+                            System.out.print("ry=\"" + rotr.getAttribute("y").getDoubleValue() + "\" ");
+                            System.out.print("rz=\"" + rotr.getAttribute("z").getDoubleValue() + "\"/>");
+                            System.out.println();
+                            
+                            ++moduleNumber;                            
                         }
+                        
                         dz = -dz;
                         y += yStep;                        
                     }
                     x += xStep;
                 }
             }
+            System.out.println("</layer>");
         }
     }
 
@@ -191,7 +219,7 @@
         //y = params.getDimension(1);
         y = params.getDimension(0); // Y is in X plane in world coordinates.
         x = params.getDimension(1); // X is in Y plane in world coordinates.
-        System.out.println("making module with x = " + x + " and y = " + y);
+        //System.out.println("making module with x = " + x + " and y = " + y);
         Box box = new Box(params.getName() + "Box", x, y, thickness);
         lcdd.add(box);
 
@@ -240,7 +268,7 @@
 
             String componentName = moduleName + "_component" + componentNumber;
 
-            System.out.println("making " + componentName + " with x = " + moduleX + " and y = " + moduleY);
+            //System.out.println("making " + componentName + " with x = " + moduleX + " and y = " + moduleY);
             Box componentBox = new Box(componentName + "Box", moduleX, moduleY, thickness);
             lcdd.add(componentBox);
 

GeomConverter/src/org/lcsim/geometry/subdetector
HPSTracker2.java added at 1.1
diff -N HPSTracker2.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ HPSTracker2.java	11 Apr 2012 23:07:34 -0000	1.1
@@ -0,0 +1,27 @@
+package org.lcsim.geometry.subdetector;
+
+import hep.graphics.heprep.HepRep;
+import hep.graphics.heprep.HepRepFactory;
+
+import org.jdom.Element;
+import org.jdom.JDOMException;
+import org.lcsim.detector.converter.heprep.DetectorElementToHepRepConverter;
+
+public class HPSTracker2 extends AbstractTracker {
+    
+    HPSTracker2(Element node) throws JDOMException {
+        super(node);
+    }
+
+    public void appendHepRep(HepRepFactory factory, HepRep heprep) {
+        DetectorElementToHepRepConverter.convert(getDetectorElement(), factory, heprep, -1, false, getVisAttributes().getColor());
+    }
+
+    public boolean isEndcap() {
+        return false;
+    }
+
+    public boolean isBarrel() {
+        return true;
+    }
+}
\ No newline at end of file

GeomConverter/test/org/lcsim/detector/converter/compact
HPSTracker2ConverterTest.java added at 1.1
diff -N HPSTracker2ConverterTest.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ HPSTracker2ConverterTest.java	11 Apr 2012 23:07:34 -0000	1.1
@@ -0,0 +1,37 @@
+package org.lcsim.detector.converter.compact;
+
+import java.io.InputStream;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import org.lcsim.geometry.Detector;
+import org.lcsim.geometry.GeometryReader;
+
+public class HPSTracker2ConverterTest extends TestCase {
+    
+    Detector detector = null;
+    
+    public static Test suite() {
+        return new TestSuite(HPSTracker2ConverterTest.class);
+    }
+
+    private static final String resource = "/org/lcsim/geometry/subdetector/HPSTracker2Test.xml";
+    public void setUp() {
+        InputStream in = this.getClass().getResourceAsStream(resource);
+
+        GeometryReader reader = new GeometryReader();
+
+        try {
+            detector = reader.read(in);
+        }
+        catch (Throwable x) {
+            throw new RuntimeException(x);
+        }
+    }
+    
+    public void testSVT() {
+        
+    }
+}
\ No newline at end of file

GeomConverter/testResources/org/lcsim/geometry/subdetector
HPSTracker2Test.xml added at 1.1
diff -N HPSTracker2Test.xml
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ HPSTracker2Test.xml	11 Apr 2012 23:07:34 -0000	1.1
@@ -0,0 +1,145 @@
+<lccdd xmlns:compact="http://www.lcsim.org/schemas/compact/1.0"
+       xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
+       xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/compact/1.0/compact.xsd">
+    
+    <info name="HPS-Test-JLAB-v4pt0">
+        <comment>HPS Test Proposal detector</comment>
+    </info>
+
+    <define>
+        
+        <!-- world -->
+        <constant name="world_side" value="500.0*cm" />
+        <constant name="world_x" value="world_side" />
+        <constant name="world_y" value="world_side" />
+        <constant name="world_z" value="world_side" />
+
+        <!-- tracking region -->
+        <constant name="tracking_region_radius" value="200.0*cm"/>
+        <constant name="tracking_region_min" value="5.0*cm"/>
+        <constant name="tracking_region_zmax" value="100.0*cm"/>
+
+        <!-- SVT module dimensions -->
+        <constant name="moduleLength" value="100.0"/>
+        <constant name="moduleWidth" value="40.34"/>
+
+        <!-- SVT sensor dimensions -->
+        <constant name="sensorLength" value="98.33"/>
+        <!-- Sensor width is slightly under the real value of 38.34 mm so that sisim doesn't break. -->
+        <constant name="sensorWidth" value="38.3399"/>
+
+        <!-- module tilt for stereo angle -->
+        <constant name="SA"  value="0.10" />
+        <constant name="SA2"  value="0.05" />
+        
+        <constant name="pi"  value="3.14159" />
+        <!-- module z placement -->
+        <constant name="zCent1" value="10*cm"/>
+        <constant name="zCent2" value="20*cm"/>
+        <constant name="zCent3" value="30*cm"/>
+        <constant name="zCent4" value="50*cm"/>
+        <constant name="zCent5" value="70*cm"/>
+
+        <!-- module z gaps -->
+        <constant name="ygap1" value="0.30*cm" />
+        <constant name="ygap2" value="0.60*cm" />
+        <constant name="ygap3" value="0.90*cm" />
+        <constant name="ygap4" value="1.5*cm" />
+        <constant name="ygap5" value="2.1*cm" />
+
+        <!-- module z plane distance -->
+        <constant name="zPlaneDist" value="1.0*cm"/>
+
+        <!-- ecal -->
+        <constant name="ecal_front" value="13.3/2*mm" />
+        <constant name="ecal_back" value="16/2*mm" />
+        <constant name="ecal_z" value="160/2*mm" />
+
+    </define>
+    
+    <materials>
+
+        <!-- Set tracking material to vacuum. -->
+        <material name="TrackingMaterial">
+            <D type="density" unit="g/cm3" value="0.0000000000000001"/>
+            <fraction n="1.0" ref="Air" />
+        </material>
+        
+    </materials>
+      
+    <detectors>
+       
+        <detector id="1" name="Tracker" type="HPSTracker2" readout="TrackerHits" combineHits="true">
+            <comment> The Silicon Vertex Tracker.</comment>            
+            <module name="TestRunModule">
+                <box x="moduleLength" y="moduleWidth" />
+                <module_component thickness="0.032*cm" material = "Silicon" sensitive="true">
+                    <dimensions x="sensorLength" y="sensorWidth" /> 
+                </module_component>
+                <module_component thickness="0.02*cm" material = "Carbon" sensitive="false"/> 
+            </module>            
+            <layer id="1">
+                <module_placement name="TestRunModule" id="0" x="0.0" y="21.67" z="100.0" rx="0.0" ry="0.0" rz="-1.5707963267948966"/>
+                <module_placement name="TestRunModule" id="1" x="0.0" y="-21.67" z="100.0" rx="0.0" ry="0.0" rz="-1.6707963267948966"/>
+            </layer>
+            <layer id="2">
+                <module_placement name="TestRunModule" id="0" x="0.0" y="21.67" z="110.0" rx="0.0" ry="3.14159" rz="-4.812386326794897"/>
+                <module_placement name="TestRunModule" id="1" x="0.0" y="-21.67" z="110.0" rx="0.0" ry="3.14159" rz="-4.712386326794896"/>
+            </layer>
+            <layer id="3">
+                <module_placement name="TestRunModule" id="0" x="0.0" y="23.17" z="200.0" rx="0.0" ry="0.0" rz="-1.5707963267948966"/>
+                <module_placement name="TestRunModule" id="1" x="0.0" y="-23.17" z="200.0" rx="0.0" ry="0.0" rz="-1.6707963267948966"/>
+            </layer>
+            <layer id="4">
+                <module_placement name="TestRunModule" id="0" x="0.0" y="23.17" z="210.0" rx="0.0" ry="3.14159" rz="-4.812386326794897"/>
+                <module_placement name="TestRunModule" id="1" x="0.0" y="-23.17" z="210.0" rx="0.0" ry="3.14159" rz="-4.712386326794896"/>
+            </layer>
+            <layer id="5">
+                <module_placement name="TestRunModule" id="0" x="0.0" y="24.67" z="300.0" rx="0.0" ry="0.0" rz="-1.5707963267948966"/>
+                <module_placement name="TestRunModule" id="1" x="0.0" y="-24.67" z="300.0" rx="0.0" ry="0.0" rz="-1.6707963267948966"/>
+            </layer>
+            <layer id="6">
+                <module_placement name="TestRunModule" id="0" x="0.0" y="24.67" z="310.0" rx="0.0" ry="3.14159" rz="-4.812386326794897"/>
+                <module_placement name="TestRunModule" id="1" x="0.0" y="-24.67" z="310.0" rx="0.0" ry="3.14159" rz="-4.712386326794896"/>
+            </layer>
+            <layer id="7">
+                <module_placement name="TestRunModule" id="0" x="0.0" y="27.67" z="500.0" rx="0.0" ry="0.0" rz="-1.5707963267948966"/>
+                <module_placement name="TestRunModule" id="1" x="0.0" y="-27.67" z="500.0" rx="0.0" ry="0.0" rz="-1.6207963267948966"/>
+            </layer>
+            <layer id="8">
+                <module_placement name="TestRunModule" id="0" x="0.0" y="27.67" z="510.0" rx="0.0" ry="3.14159" rz="-4.762386326794896"/>
+                <module_placement name="TestRunModule" id="1" x="0.0" y="-27.67" z="510.0" rx="0.0" ry="3.14159" rz="-4.712386326794896"/>
+            </layer>
+            <layer id="9">
+                <module_placement name="TestRunModule" id="0" x="0.0" y="30.67" z="700.0" rx="0.0" ry="0.0" rz="-1.5707963267948966"/>
+                <module_placement name="TestRunModule" id="1" x="0.0" y="-30.67" z="700.0" rx="0.0" ry="0.0" rz="-1.6207963267948966"/>
+            </layer>
+            <layer id="10">
+                <module_placement name="TestRunModule" id="0" x="0.0" y="30.67" z="710.0" rx="0.0" ry="3.14159" rz="-4.762386326794896"/>
+                <module_placement name="TestRunModule" id="1" x="0.0" y="-30.67" z="710.0" rx="0.0" ry="3.14159" rz="-4.712386326794896"/>
+            </layer>                                      
+        </detector>     
+    </detectors>
+    
+    <readouts>   
+        <readout name="TrackerHits">
+            <id>system:6,barrel:3,layer:4,module:12,sensor:1,side:32:-2,strip:12</id> 
+        </readout>
+    </readouts>
+
+    <fields>
+        <field type="BoxDipole" 
+               name="AnalyzingDipole"
+               x="0*cm"
+               y="0*cm"
+               z="45.22*cm"
+               dx="22.86*cm"
+               dy="7.62*cm"
+               dz="46.22*cm"
+               bx="0.0"
+               by="-0.5"
+               bz="0.0">     
+        </field>
+    </fields>
+
+</lccdd>
CVSspam 0.2.12


Use REPLY-ALL to reply to list

To unsubscribe from the LCD-CVS list, click the following link:
https://listserv.slac.stanford.edu/cgi-bin/wa?SUBED1=LCD-CVS&A=1