GeomConverter/src/org/lcsim/detector/converter/compact
diff -u -r1.7 -r1.8
--- SiTrackerEndcapConverter.java 29 Oct 2007 21:36:37 -0000 1.7
+++ SiTrackerEndcapConverter.java 31 Oct 2007 00:33:54 -0000 1.8
@@ -5,6 +5,7 @@
import org.jdom.DataConversionException;
import org.jdom.Element;
+import org.jdom.JDOMException;
import org.lcsim.detector.DetectorElement;
import org.lcsim.detector.IDetectorElement;
import org.lcsim.detector.ILogicalVolume;
@@ -17,10 +18,11 @@
import org.lcsim.detector.Transform3D;
import org.lcsim.detector.Translation3D;
import org.lcsim.detector.material.IMaterial;
-import org.lcsim.detector.solids.Trd;
+import org.lcsim.detector.material.MaterialStore;
+import org.lcsim.detector.solids.Box;
import org.lcsim.detector.solids.Trap;
+import org.lcsim.detector.solids.Trd;
import org.lcsim.detector.solids.Tube;
-import org.lcsim.detector.solids.Box;
import org.lcsim.geometry.compact.Detector;
import org.lcsim.geometry.compact.Subdetector;
import org.lcsim.geometry.subdetector.SiTrackerEndcap;
@@ -29,12 +31,14 @@
* Converter for SiTrackerEndcap.
*
* @author Jeremy McCormick, Tim Nelson
- * @version $Id: SiTrackerEndcapConverter.java,v 1.7 2007/10/29 21:36:37 jeremy Exp $
+ * @version $Id: SiTrackerEndcapConverter.java,v 1.8 2007/10/31 00:33:54 jeremy Exp $
*/
public class SiTrackerEndcapConverter
implements ISubdetectorConverter
-{
+{
+ private ModuleParameters moduleParameters = null;
+
public void convert(Subdetector subdet, Detector detector)
{
IPhysicalVolume trackingPV = detector.getTrackingVolume();
@@ -42,6 +46,17 @@
Element node = subdet.getNode();
+ IDetectorElement endcapDE = new DetectorElement(subdet.getName(), detector.getDetectorElement());
+
+ // Positive endcap DE.
+ IDetectorElement endcapPosDE = new DetectorElement(subdet.getName() + "_positive", endcapDE);
+
+ // Negative endcap DE.
+ IDetectorElement endcapNegDE = new DetectorElement(subdet.getName() + "_negative", endcapDE);
+
+ // Set static module parameters.
+ moduleParameters = new ModuleParameters(node.getChild("module"));
+
for (Object o : node.getChildren("layer"))
{
Element layerElement = (Element)o;
@@ -75,19 +90,19 @@
double layerZ = innerZ + thickness / 2;
- // Positive endcap.
+ // Positive endcap layer.
ITransform3D layerTrans = new Transform3D(new Translation3D(0,0,layerZ));
String layerName = layerLV.getName() + "_positive";
new PhysicalVolume(layerTrans,layerName,layerLV,trackingLV,layern);
String layerPath = "/" + trackingPV.getName() + "/" + layerName;
- IDetectorElement layerDE = new DetectorElement(layerLV.getName(),null,detector.getNavigator().getPath(layerPath));
+ IDetectorElement layerDE = new DetectorElement(layerLV.getName(),endcapPosDE,detector.getNavigator().getPath(layerPath));
- // Negative endcap.
+ // Negative endcap layer.
ITransform3D layerTransReflect = new Transform3D(new Translation3D(0,0,-layerZ), new RotationPassiveXYZ(0,Math.PI,0));
String layerNameReflect = layerLV.getName() + "_negative";
new PhysicalVolume(layerTransReflect,layerNameReflect,layerLV,trackingLV,layern);
String layerPathReflect = "/" + trackingPV.getName() + "/" + layerNameReflect;
- IDetectorElement layerDEReflect = new DetectorElement(layerNameReflect,null,detector.getNavigator().getPath(layerPathReflect));
+ IDetectorElement layerDEReflect = new DetectorElement(layerNameReflect,endcapNegDE,detector.getNavigator().getPath(layerPathReflect));
// Wedge DE.
for (IPhysicalVolume wedge : layerLV.getDaughters())
@@ -105,18 +120,40 @@
// Module DEs.
for (IPhysicalVolume module : wedge.getLogicalVolume().getDaughters())
{
- // Positive endcap.
+ // Positive endcap module.
String modulePath = wedgePath + "/" + module.getName();
String moduleName = wedgeName + "_module" + module.getCopyNumber();
- new DetectorElement(moduleName,wedgeDE,detector.getNavigator().getPath(modulePath));
-
- // Negative endcap.
+ IDetectorElement moduleDE = new DetectorElement(moduleName,wedgeDE,detector.getNavigator().getPath(modulePath));
+
+ // Negative endcap module.
String modulePathReflect = wedgePathReflect + "/" + module.getName();
String moduleNameReflect = wedgeNameReflect + "_module" + module.getCopyNumber();
- new DetectorElement(moduleNameReflect,wedgeDEReflect,detector.getNavigator().getPath(modulePathReflect));
+ IDetectorElement moduleDEReflect = new DetectorElement(moduleNameReflect,wedgeDEReflect,detector.getNavigator().getPath(modulePathReflect));
+
+ // Module DEs.
+ for (IPhysicalVolume component : module.getLogicalVolume().getDaughters())
+ {
+ if (component.isSensitive())
+ {
+ // Positive endcap component.
+ new DetectorElement(
+ moduleName + "_component" + component.getCopyNumber(),
+ moduleDE,
+ detector.getNavigator().getPath(modulePath + "/" + component.getName()));
+
+ // Negative endcap component. (should have same physical layout as positive)
+ new DetectorElement(
+ moduleNameReflect + "_component" + component.getCopyNumber(),
+ moduleDEReflect,
+ detector.getNavigator().getPath(modulePathReflect + "/" + component.getName()));
+ }
+ }
}
}
}
+
+ // Set cached module parameters to null for GC.
+ moduleParameters = null;
}
private ILogicalVolume makeWedge(
@@ -189,7 +226,7 @@
// Place the wedges in the layer.
double r = (innerR + outerR) / 2;
- String wedgeName = wedgeLV.getName();
+ //String wedgeName = wedgeLV.getName();
for (int i=0; i<nwedges; i++)
{
double phi = i * 2 * Math.PI / nwedges;
@@ -311,6 +348,9 @@
ILogicalVolume sliceLV = new LogicalVolume(sliceName, sliceBox, sliceMaterial);
+ // Build the module substructure.
+ makeBoxModule(sliceLV, imodule);
+
Transform3D trans = new Transform3D(new Translation3D(xcenter,0,zcenters.get(i)));
new PhysicalVolume(
@@ -332,6 +372,9 @@
ILogicalVolume sliceLV = new LogicalVolume(sliceName, sliceTrd, sliceMaterial);
+ // Build the module substructure.
+ makeTrdModule(sliceLV, imodule);
+
Transform3D trans = new Transform3D(new Translation3D(0,0,zcenters.get(i)));
new PhysicalVolume(
@@ -365,6 +408,8 @@
Trap sliceTrap = new Trap(sliceName,zsizes.get(i),theta*ix,0.0,dy,xsize1,xsize1,0.0,dy,xsize2,xsize2,0.0);
ILogicalVolume sliceLV = new LogicalVolume(sliceName, sliceTrap, sliceMaterial);
+
+ makeTrapModule(sliceLV, imodule);
Transform3D trans = new Transform3D(new Translation3D(ix*xcenter,0,zcenters.get(i)));
@@ -377,14 +422,202 @@
imodule++;
}
- }
+ }
+ }
+ }
+
+ public void makeBoxModule(ILogicalVolume module, int moduleTypeId)
+ {
+ Box moduleBox = (Box)module.getSolid();
+ double posY = -moduleBox.getYHalfLength();
+ double moduleX = moduleBox.getXHalfLength();
+ double moduleZ = moduleBox.getZHalfLength();
+
+ for (ModuleComponentParameters component : moduleParameters)
+ {
+ double thickness = component.getThickness();
+ IMaterial material = component.getMaterial();
+ boolean sensitive = component.isSensitive();
+ int componentNumber = component.getComponentNumber();
+
+ posY += thickness / 2;
+
+ String componentName = "module" + moduleTypeId + "_component" + componentNumber;
+ Box sliceBox = new Box(componentName + "_box", moduleX, thickness / 2, moduleZ);
+
+ ILogicalVolume volume = new LogicalVolume(componentName, sliceBox, material);
+
+ Transform3D trans = new Transform3D(new Translation3D(0,posY,0));
+
+ PhysicalVolume pv = new PhysicalVolume(trans, componentName, volume, module, componentNumber);
+ pv.setSensitive(sensitive);
+
+ posY += thickness / 2;
}
+ }
+
+ public void makeTrdModule(ILogicalVolume module, int moduleTypeId)
+ {
+ Trd trd = (Trd)module.getSolid();
+ double x1 = trd.getXHalfLength1();
+ double x2 = trd.getXHalfLength2();
+ double y1 = trd.getYHalfLength1();
+ double z = trd.getZHalfLength();
+
+ double posY = -y1;
+
+ for (ModuleComponentParameters component : moduleParameters)
+ {
+ double thickness = component.getThickness();
+ IMaterial material = component.getMaterial();
+ boolean sensitive = component.isSensitive();
+ int componentNumber = component.getComponentNumber();
+
+ posY += thickness / 2;
+
+ String componentName = "module" + moduleTypeId + "_component" + componentNumber;
+
+ Trd sliceTrd = new Trd(componentName, x1, x2, thickness/2, thickness/2, z);
+
+ ILogicalVolume volume = new LogicalVolume(componentName, sliceTrd, material);
+
+ Transform3D trans = new Transform3D(new Translation3D(0,posY,0));
+
+ PhysicalVolume pv = new PhysicalVolume(trans, componentName, volume, module, componentNumber);
+ pv.setSensitive(sensitive);
+
+ posY += thickness / 2;
+ }
+ }
+
+ public void makeTrapModule(ILogicalVolume module, int moduleTypeId)
+ {
+ Trap trap = (Trap)module.getSolid();
+ double a1 = trap.getTanAlpha1();
+ double a2 = trap.getTanAlpha2();
+ double x1 = trap.getXHalfLength1();
+ double x2 = trap.getXHalfLength2();
+ double x3 = trap.getXHalfLength3();
+ double x4 = trap.getXHalfLength4();
+ double y1 = trap.getYHalfLength1();
+ double y2 = trap.getYHalfLength2();
+ double z = trap.getZHalfLength();
+ double theta = trap.getTheta();
+ double phi = trap.getPhi();
+
+ double posY = -y1;
+ for (ModuleComponentParameters component : moduleParameters)
+ {
+ double thickness = component.getThickness();
+ IMaterial material = component.getMaterial();
+ boolean sensitive = component.isSensitive();
+ int componentNumber = component.getComponentNumber();
+
+ posY += thickness / 2;
+
+ String componentName = "module" + moduleTypeId + "_component" + componentNumber;
+
+ Trap sliceTrap = new Trap(componentName, z, theta, phi, thickness/2, x1, x2, a1, thickness/2, x3, x4, a2);
+
+ ILogicalVolume volume = new LogicalVolume(componentName, sliceTrap, material);
+
+ Transform3D trans = new Transform3D(new Translation3D(0,posY,0));
+
+ PhysicalVolume pv = new PhysicalVolume(trans, componentName, volume, module, componentNumber);
+ pv.setSensitive(sensitive);
+
+ posY += thickness / 2;
+ }
}
public Class getSubdetectorType()
{
return SiTrackerEndcap.class;
}
+
+ private static class ModuleComponentParameters
+ {
+ IMaterial material;
+ double thickness;
+ boolean sensitive;
+ int componentNumber;
+
+ public ModuleComponentParameters(double thickness, IMaterial material, int componentNumber, boolean sensitive)
+ {
+ this.thickness = thickness;
+ this.material = material;
+ this.sensitive = sensitive;
+ this.componentNumber = componentNumber;
+ }
+
+ double getThickness()
+ {
+ return thickness;
+ }
+
+ IMaterial getMaterial()
+ {
+ return material;
+ }
+
+ boolean isSensitive()
+ {
+ return sensitive;
+ }
+
+ int getComponentNumber()
+ {
+ return componentNumber;
+ }
+ }
+
+ private static class ModuleParameters
+ extends ArrayList<ModuleComponentParameters>
+ {
+ double thickness=0.;
+ String name;
+ ModuleParameters(Element element)
+ {
+ name = element.getAttributeValue("name");
+ int cntr=0;
+ for (Object o : element.getChildren("module_component"))
+ {
+ try {
+
+ Element e = (Element)o;
+
+ double cThickness = e.getAttribute("thickness").getDoubleValue();
+
+ IMaterial cMaterial = MaterialStore.getInstance().get(e.getAttributeValue("material"));
+
+ boolean cSensitive = false;
+ if (e.getAttribute("sensitive") != null)
+ cSensitive = e.getAttribute("sensitive").getBooleanValue();
+ add(new ModuleComponentParameters(cThickness, cMaterial, cntr, cSensitive));
+ }
+ 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;
+ }
+ }
}
\ No newline at end of file