Commit in GeomConverter on MAIN | |||
src/org/lcsim/detector/converter/compact/HPSTracker2Converter.java | +383 | added 1.1 | |
/DetectorConverter.java | +2 | -1 | 1.54 -> 1.55 |
src/org/lcsim/geometry/compact/converter/lcdd/HPSTracker2.java | +354 | added 1.1 | |
/HPSTracker.java | +36 | -8 | 1.9 -> 1.10 |
src/org/lcsim/geometry/subdetector/HPSTracker2.java | +27 | added 1.1 | |
test/org/lcsim/detector/converter/compact/HPSTracker2ConverterTest.java | +37 | added 1.1 | |
testResources/org/lcsim/geometry/subdetector/HPSTracker2Test.xml | +145 | added 1.1 | |
+984 | -9 |
new detector component that allows explicit placement of HPS tracker modules by global position and rotation
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; + } + } +}
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)
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
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);
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
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
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>
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