5 added + 2 modified, total 7 files
GeomConverter/src/org/lcsim/detector/converter/compact
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
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
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
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
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
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
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