GeomConverter/src/org/lcsim/geometry/compact/converter/lcdd
diff -N SiTrackerEndcap2.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ SiTrackerEndcap2.java 22 Nov 2008 01:00:39 -0000 1.1
@@ -0,0 +1,204 @@
+package org.lcsim.geometry.compact.converter.lcdd;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.jdom.Element;
+import org.jdom.JDOMException;
+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.Trapezoid;
+import org.lcsim.geometry.compact.converter.lcdd.util.Volume;
+
+/**
+ * An LCDD converter for a Silicon endcap tracker model based on Bill Cooper's design from
+ * <a href="http://ilcagenda.linearcollider.org/materialDisplay.py?contribId=58&sessionId=1&materialId=slides&confId=2784">Boulder SiD Workshop 2008</a>.
+ *
+ * @author jeremym
+ */
+public class SiTrackerEndcap2 extends LCDDSubdetector
+{
+ Map<String,SiTrackerModuleParameters> moduleParameters = new HashMap<String,SiTrackerModuleParameters>();
+ Map<String,Volume> modules = new HashMap<String,Volume>();
+ Material vacuum;
+
+ public SiTrackerEndcap2(Element node) throws JDOMException
+ {
+ super(node);
+ }
+
+ void addToLCDD(LCDD lcdd, SensitiveDetector sd) throws JDOMException
+ {
+ int sysId = node.getAttribute("id").getIntValue();
+ String subdetName = node.getAttributeValue("name");
+ vacuum = lcdd.getMaterial("Vacuum");
+ boolean reflect;
+ if (node.getAttribute("reflect") != null)
+ reflect = node.getAttribute("reflect").getBooleanValue();
+ else
+ reflect = true;
+
+ for (Iterator i = node.getChildren("module").iterator(); i.hasNext();)
+ {
+ Element module = (Element)i.next();
+ String moduleName = module.getAttributeValue("name");
+ moduleParameters.put(moduleName, new SiTrackerModuleParameters(module));
+ modules.put(moduleName, makeModule(moduleParameters.get(moduleName), sd, lcdd));
+ }
+
+ for (Iterator i = node.getChildren("layer").iterator(); i.hasNext();)
+ {
+ Element layerElement = (Element) i.next();
+ int layerId = layerElement.getAttribute("id").getIntValue();
+ int ringCount = 0;
+ int moduleNumber = 0;
+ for (Iterator j = layerElement.getChildren("ring").iterator(); j.hasNext();)
+ {
+ Element ringElement = (Element) j.next();
+ double r = ringElement.getAttribute("r").getDoubleValue();
+ double phi0 = ringElement.getAttribute("phi0").getDoubleValue();
+ double zstart = ringElement.getAttribute("zstart").getDoubleValue();
+ double dz = Math.abs(ringElement.getAttribute("dz").getDoubleValue());
+ int nmodules = ringElement.getAttribute("nmodules").getIntValue();
+ String module = ringElement.getAttributeValue("module");
+ Volume moduleVolume = modules.get(module);
+ if (moduleVolume == null)
+ throw new RuntimeException("Module " + module + " was not found.");
+ double iphi = (2 * Math.PI) / nmodules;
+ double phi = phi0;
+ for (int k = 0; k < nmodules; k++)
+ {
+ String moduleBaseName = subdetName + "_layer" + layerId + "_module" + moduleNumber;
+
+ double x = r * Math.cos(phi);
+ double y = r * Math.sin(phi);
+
+ Position p = new Position(moduleBaseName + "_position");
+ p.setX(x);
+ p.setY(y);
+ p.setZ(zstart + dz);
+ Rotation rot = new Rotation(moduleBaseName + "_rotation");
+ rot.setX(-Math.PI/2);
+ rot.setY(-Math.PI/2 - phi);
+
+ lcdd.add(p);
+ lcdd.add(rot);
+
+ PhysVol pv = new PhysVol(moduleVolume, lcdd.getTrackingVolume(), p, rot);
+ pv.addPhysVolID("system", sysId);
+ pv.addPhysVolID("barrel", 1); // positive endcap
+ pv.addPhysVolID("layer", layerId);
+ pv.addPhysVolID("module", moduleNumber);
+
+ if (reflect)
+ {
+ Position pr = new Position(moduleBaseName + "_reflect_position");
+ pr.setX(x);
+ pr.setY(y);
+ pr.setZ(-zstart - dz);
+ Rotation rotr = new Rotation(moduleBaseName + "_reflect_rotation");
+ rotr.setX(-Math.PI/2);
+ rotr.setY((-Math.PI/2 - phi) + Math.PI);
+
+ lcdd.add(pr);
+ lcdd.add(rotr);
+
+ PhysVol pvr = new PhysVol(moduleVolume, lcdd.getTrackingVolume(), pr, rotr);
+ pvr.addPhysVolID("system", sysId);
+ pvr.addPhysVolID("barrel", 2);
+ pvr.addPhysVolID("layer", layerId);
+ pvr.addPhysVolID("module", moduleNumber);
+ }
+
+ dz = -dz;
+ phi += iphi;
+ ++ringCount;
+ ++moduleNumber;
+ }
+ }
+ }
+ }
+
+ private Volume makeModule(SiTrackerModuleParameters params, SensitiveDetector sd, LCDD lcdd)
+ {
+ double thickness = params.getThickness();
+ double dx1, dx2, dy1, dy2, dz;
+ dy1 = dy2 = thickness / 2;
+ dx1 = params.getDimension(0);
+ dx2 = params.getDimension(1);
+ dz = params.getDimension(2);
+ Trapezoid envelope = new Trapezoid(params.getName() + "Trd", dx1, dx2, dy1, dy2, dz);
+ lcdd.add(envelope);
+ Volume volume = new Volume(params.getName() + "Volume", envelope, vacuum);
+ makeModuleComponents(volume, params, sd, lcdd);
+ lcdd.add(volume);
+ return volume;
+ }
+
+ private void makeModuleComponents(Volume moduleVolume, SiTrackerModuleParameters moduleParameters, SensitiveDetector sd, LCDD lcdd)
+ {
+ Trapezoid trd = (Trapezoid)lcdd.getSolid(moduleVolume.getSolidRef());
+
+ double x1 = trd.x1();
+ double x2 = trd.x2();
+ double y1 = trd.y1();
+ double z = trd.z();
+
+ double posY = -y1;
+
+ String moduleName = moduleVolume.getVolumeName();
+
+ int sensor=0;
+ for (SiTrackerModuleComponentParameters component : moduleParameters)
+ {
+ double thickness = component.getThickness();
+
+ Material material = null;
+ try {
+ material = lcdd.getMaterial(component.getMaterialName());
+ }
+ catch (JDOMException x)
+ {
+ throw new RuntimeException(x);
+ }
+ boolean sensitive = component.isSensitive();
+ int componentNumber = component.getComponentNumber();
+
+ posY += thickness / 2;
+
+ String componentName = moduleName + "_component" + componentNumber;
+
+ Trapezoid sliceTrd = new Trapezoid(componentName + "_trd", x1, x2, thickness/2, thickness/2, z);
+ lcdd.add(sliceTrd);
+
+ Volume volume = new Volume(componentName, sliceTrd, material);
+ lcdd.add(volume);
+
+ Position position = new Position(componentName + "_position",0.,posY,0);
+ lcdd.add(position);
+ Rotation rotation = new Rotation(componentName + "_rotation");
+ lcdd.add(rotation);
+
+ PhysVol pv = new PhysVol(volume, moduleVolume, position, rotation);
+ pv.addPhysVolID("component", componentNumber);
+
+ if (sensitive)
+ {
+ if (sensor > 1)
+ {
+ throw new RuntimeException("Maximum of 2 sensors per module.");
+ }
+ pv.addPhysVolID("sensor", sensor);
+ volume.setSensitiveDetector(sd);
+ ++sensor;
+ }
+
+ posY += thickness / 2;
+ }
+ }
+}
\ No newline at end of file
GeomConverter/src/org/lcsim/geometry/compact/converter/lcdd
diff -u -r1.13 -r1.14
--- SiTrackerEndcap.java 5 May 2008 21:25:19 -0000 1.13
+++ SiTrackerEndcap.java 22 Nov 2008 01:00:39 -0000 1.14
@@ -23,7 +23,7 @@
public class SiTrackerEndcap extends LCDDSubdetector
{
- Map<String,ModuleParameters> moduleParameters = new HashMap<String,ModuleParameters>();
+ Map<String,SiTrackerModuleParameters> moduleParameters = new HashMap<String,SiTrackerModuleParameters>();
SensitiveDetector sd = null;
public SiTrackerEndcap(Element node) throws JDOMException
@@ -41,7 +41,7 @@
for (Object n : node.getChildren("module"))
{
Element e = (Element)n;
- moduleParameters.put(e.getAttributeValue("name"), new ModuleParameters(e));
+ moduleParameters.put(e.getAttributeValue("name"), new SiTrackerModuleParameters(e));
}
int sysId = node.getAttribute("id").getIntValue();
@@ -216,14 +216,14 @@
if (moduleref == null)
throw new RuntimeException("module reference is missing for layer number " + layerN);
- ModuleParameters module = moduleParameters.get(moduleref.getValue());
+ SiTrackerModuleParameters module = moduleParameters.get(moduleref.getValue());
makeModules(subdetElement, wedgeLV, layerElement.getChild("module_parameters"), module, layerN, lcdd);
return wedgeLV;
}
- private void makeModules(Element subdetElement, Volume wedgeLV, Element moduleParameters, ModuleParameters module, int layerN, LCDD lcdd)
+ private void makeModules(Element subdetElement, Volume wedgeLV, Element moduleParameters, SiTrackerModuleParameters module, int layerN, LCDD lcdd)
{
double r_size;
try
@@ -420,7 +420,7 @@
}
}
- void makeBoxModule(Volume moduleVolume, ModuleParameters moduleParameters, LCDD lcdd)
+ void makeBoxModule(Volume moduleVolume, SiTrackerModuleParameters moduleParameters, LCDD lcdd)
{
Box moduleBox = (Box)lcdd.getSolid(moduleVolume.getSolidRef());
@@ -432,7 +432,7 @@
int sensor=0;
- for (ModuleComponentParameters component : moduleParameters)
+ for (SiTrackerModuleComponentParameters component : moduleParameters)
{
double thickness = component.getThickness();
Material material = null;
@@ -479,7 +479,7 @@
}
}
- void makeTrdModule(Volume moduleVolume, ModuleParameters moduleParameters, LCDD lcdd)
+ void makeTrdModule(Volume moduleVolume, SiTrackerModuleParameters moduleParameters, LCDD lcdd)
{
Trapezoid trd = (Trapezoid)lcdd.getSolid(moduleVolume.getSolidRef());
@@ -493,7 +493,7 @@
String moduleName = moduleVolume.getVolumeName();
int sensor=0;
- for (ModuleComponentParameters component : moduleParameters)
+ for (SiTrackerModuleComponentParameters component : moduleParameters)
{
double thickness = component.getThickness();
@@ -541,7 +541,7 @@
}
}
- public void makeTrapModule(Volume module, ModuleParameters moduleParameters, LCDD lcdd)
+ public void makeTrapModule(Volume module, SiTrackerModuleParameters moduleParameters, LCDD lcdd)
{
Trap trap = (Trap)lcdd.getSolid(module.getSolidRef());
@@ -560,7 +560,7 @@
int sensor = 0;
- for (ModuleComponentParameters component : moduleParameters)
+ for (SiTrackerModuleComponentParameters component : moduleParameters)
{
double thickness = component.getThickness();
Material material = null;
@@ -611,91 +611,4 @@
{
return true;
}
-
- // FIXME: Duplicates class in org.lcsim.detector.converter.compact.SiTrackerEndcapConverter to avoid dependency.
- public static class ModuleComponentParameters
- {
- String materialName;
- double thickness;
- boolean sensitive;
- int componentNumber;
-
- public ModuleComponentParameters(double thickness, String materialName, int componentNumber, boolean sensitive)
- {
- this.thickness = thickness;
- this.materialName = materialName;
- this.sensitive = sensitive;
- this.componentNumber = componentNumber;
- }
-
- public double getThickness()
- {
- return thickness;
- }
-
- public String getMaterialName()
- {
- return materialName;
- }
-
- public boolean isSensitive()
- {
- return sensitive;
- }
-
- public int getComponentNumber()
- {
- return componentNumber;
- }
- }
-
- // FIXME: Duplicates class in org.lcsim.detector.converter.compact.SiTrackerEndcapConverter to avoid dependency.
- public static class ModuleParameters
- extends ArrayList<ModuleComponentParameters>
- {
- double thickness=0.;
- String name;
- public ModuleParameters(Element element)
- {
- name = element.getAttributeValue("name");
- 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();
- add(new ModuleComponentParameters(thickness, materialName, cntr, sensitive));
- }
- 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;
- }
- }
-
}