GeomConverter/src/org/lcsim/detector/converter/compact
diff -N MultiLayerTrackerConverter.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ MultiLayerTrackerConverter.java 20 Mar 2007 23:57:45 -0000 1.1
@@ -0,0 +1,117 @@
+package org.lcsim.detector.converter.compact;
+
+import org.lcsim.detector.DetectorElement;
+import org.lcsim.detector.IDetectorElement;
+import org.lcsim.detector.ILogicalVolume;
+import org.lcsim.detector.LogicalVolume;
+import org.lcsim.detector.PhysicalVolume;
+import org.lcsim.detector.material.IMaterial;
+import org.lcsim.detector.material.MaterialStore;
+import org.lcsim.detector.solids.Tube;
+import org.lcsim.geometry.Detector;
+import org.lcsim.geometry.Subdetector;
+import org.lcsim.geometry.layer.Layer;
+import org.lcsim.geometry.layer.LayerSlice;
+import org.lcsim.geometry.layer.Layering;
+import org.lcsim.geometry.subdetector.MultiLayerTracker;
+
+/**
+ * Convert a MultiLayerTracker into the org.lcsim.detector geometry representation.
+ *
+ * @author Jeremy McCormick <[log in to unmask]>
+ */
+public class MultiLayerTrackerConverter implements ISubdetectorConverter
+{
+ public void convert( Subdetector subdet, Detector detector)
+ {
+ MultiLayerTracker tracker = (MultiLayerTracker)subdet;
+
+ IDetectorElement deTrackingRegion = detector.getChildren().get("tracking_region");
+
+ ILogicalVolume trackingVolume =
+ deTrackingRegion.getGeometry().getLogicalVolume();
+
+ tracker.setParent(detector);
+
+ Layering layering = tracker.getLayering();
+
+ String name = tracker.getName();
+
+ int sensorNum=0;
+ for (int i=0; i<tracker.getLayering().getNumberOfLayers(); i++)
+ {
+ Layer layer = layering.getLayer(i);
+ double layerInnerR = tracker.getInnerR()[i];
+ double layerOuterZ = tracker.getOuterZ()[i];
+ double layerThickness = layer.getThickness();
+
+ Tube layerTube = new Tube(
+ name + "_layer" + i + "_tube",
+ layerInnerR,
+ layerInnerR + layerThickness,
+ layerOuterZ
+ );
+
+ IMaterial layerMaterial = detector.getGeometry().getLogicalVolume().getMaterial();
+
+ LogicalVolume layerLV = new LogicalVolume(
+ name + "_layer" + i,
+ layerTube,
+ layerMaterial
+ );
+
+ new PhysicalVolume(
+ null,
+ name + "_layer" +i,
+ layerLV,
+ trackingVolume,
+ i);
+
+ double sliceInnerR=layerInnerR;
+ for (int j=0; j<layer.getNumberOfSlices(); j++)
+ {
+ LayerSlice slice = layer.getSlice(j);
+
+ double sliceThickness = slice.getThickness();
+
+ Tube sliceTube =
+ new Tube(name + "layer" + i + "_slice" + j + "_tube",
+ sliceInnerR,
+ slice.getThickness(),
+ layerOuterZ
+ );
+
+ IMaterial sliceMaterial =
+ MaterialStore.getInstance().get(slice.getMaterial().getName());
+
+ LogicalVolume sliceLV =
+ new LogicalVolume(
+ name + "layer" + i + "_slice" + j,
+ sliceTube,
+ sliceMaterial
+ );
+
+ new PhysicalVolume(
+ null,
+ "slice" + j,
+ sliceLV,
+ layerLV,
+ j);
+
+ if ( slice.isSensitive() )
+ {
+ String path = "/tracking_region/" + name + "_layer" +i + "/slice" + j;
+ new DetectorElement(name + "sensor" + sensorNum, tracker, path);
+ ++sensorNum;
+ }
+
+ sliceInnerR += sliceThickness;
+ }
+ }
+ }
+
+ public Class getSubdetectorType()
+ {
+ return MultiLayerTracker.class;
+ }
+}
\ No newline at end of file