GeomConverter/src/org/lcsim/detector/converter/compact
diff -u -r1.13 -r1.14
--- DiskTrackerConverter.java 28 Aug 2007 22:26:34 -0000 1.13
+++ DiskTrackerConverter.java 11 Sep 2007 20:18:13 -0000 1.14
@@ -35,218 +35,232 @@
public class DiskTrackerConverter
implements ISubdetectorConverter
{
- public void convert( Subdetector subdet, Detector detector)
- {
- ILogicalVolume trackingVolume = detector.getTrackingVolume().getLogicalVolume();
-
- DiskTracker tracker = (DiskTracker)subdet;
- IDDecoder decoder = tracker.getIDDecoder();
-
- int systemNumber = tracker.getIDDecoder().getSystemNumber();
-
- subdet.setDetectorElement( new DeSubdetector( detector, subdet ) );
-
- Layering layering = tracker.getLayering();
- String name = tracker.getName();
-
- DetectorElement endcapPos = new DiskTrackerDE(name + "_positive");
- endcapPos.setParent(tracker.getDetectorElement());
-
- DetectorElement endcapNeg=null;
- if ( tracker.getReflect() )
- {
- endcapNeg = new DiskTrackerDE(name + "_negative");
- endcapNeg.setParent(tracker.getDetectorElement());
- }
-
- IRotation3D reflect = new RotationPassiveXYZ(0, Math.PI, 0);
-
- int sensorNum=0;
-
- for (int i=0; i<layering.getNumberOfLayers(); i++)
- {
- Layer layer = layering.getLayer(i);
-
- double layerInnerRadius = tracker.getInnerR()[i];
- double layerOuterRadius = tracker.getOuterR()[i];
- double layerInnerZ = tracker.getInnerZ()[i];
-
- //System.out.println("thick="+layer.getThickness());
-
- Tube layerTube = new Tube(
- name + "_layer" + i,
- layerInnerRadius,
- layerOuterRadius,
- layer.getThickness()/2);
-
- LogicalVolume layerLV = new LogicalVolume(
- name + "_layer" + i,
- layerTube,
- detector.getDetectorElement().getGeometry().getLogicalVolume().getMaterial()
- );
-
- // Layer in positive z.
- new PhysicalVolume(
- new Transform3D(
- new Translation3D(
- 0,
- 0,
- layerInnerZ + layer.getThickness()/2 )),
- name + "_positive_layer" + i,
- layerLV,
- trackingVolume,
- i);
-
- // Reflected layer in negative z.
- if ( tracker.getReflect() )
- {
- new PhysicalVolume(
- new Transform3D(
- new Translation3D(
- 0.,
- 0.,
- -layerInnerZ - layer.getThickness()/2
- ),
- reflect
- ),
- name + "_negative_layer" + i,
- layerLV,
- trackingVolume,
- i);
- }
-
- double sliceZ = -layer.getThickness()/2;
- for (int j=0; j<layer.getNumberOfSlices(); j++)
- {
- //System.out.println("sliceZ="+sliceZ);
- LayerSlice slice = layer.getSlice(j);
- double sliceThickness = slice.getThickness();
- IMaterial sliceMaterial =
- MaterialStore.getInstance().get(slice.getMaterial().getName());
-
- Tube sliceTube =
- new Tube(name + "_layer" + i + "_slice"+j,
- layerInnerRadius,
- layerOuterRadius,
- sliceThickness/2);
-
- LogicalVolume sliceLV =
- new LogicalVolume(
- name + "_layer" + i + "_slice"+j,
- sliceTube,
- sliceMaterial);
-
- sliceZ += sliceThickness/2;
-
- new PhysicalVolume(
- new Transform3D(
- new Translation3D(
- 0,
- 0,
- sliceZ )),
- "slice" + j,
- sliceLV,
- layerLV,
- j);
-
- sliceZ += sliceThickness/2;
-
- if ( slice.isSensitive() )
- {
- String path = "/tracking_region/" + name + "_positive_layer" +i + "/slice" + j;
-
- ExpandedIdentifier expid = makeExpandedIdentifier(decoder, systemNumber, 1, i);
-
- IIdentifierDictionary iddict = IdentifierDictionaryManager.getInstance().getIdentifierDictionary( subdet.getReadout().getName() );
- IIdentifier id = null;
- try {
- id = IdentifierUtil.pack(iddict, expid);
- }
- catch (InvalidIndexException x)
- {
- throw new RuntimeException(x);
- }
- DiskTrackerSensorLayer northEndcapLayer =
- new DiskTrackerSensorLayer(
- name + "_positive_sensor" + sensorNum,
- endcapPos,
- path,
- id);
-
- if ( tracker.getReflect() )
- {
- path = "/tracking_region/" + name + "_negative_layer" +i + "/slice" + j;
-
- expid = makeExpandedIdentifier(decoder, systemNumber, 2, i);
- try {
- id = IdentifierUtil.pack(iddict, expid);
- }
- catch (InvalidIndexException x)
- {
- throw new RuntimeException(x);
- }
- DiskTrackerSensorLayer southEndcapLayer =
- new DiskTrackerSensorLayer(
- name + "_negative_sensor" + sensorNum,
- endcapNeg,
- path,
- id);
- }
-
- ++sensorNum;
- }
- }
- }
- }
-
- static ExpandedIdentifier makeExpandedIdentifier(IDDecoder decoder, int systemNumber, int barrel, int layer)
- {
- ExpandedIdentifier id = new ExpandedIdentifier();
- for (int i=0; i<decoder.getFieldCount(); i++)
- {
- String fieldName = decoder.getFieldName(i);
- if (fieldName.equals("system"))
- {
- id.addValue(systemNumber);
- }
- else if (fieldName.equals("layer"))
- {
- id.addValue(layer);
- }
- else if (fieldName.equals("barrel"))
- {
- id.addValue(barrel);
- }
- else
- {
- id.addValue(0);
- }
- }
- return id;
- }
-
- public Class getSubdetectorType()
- {
- return DiskTracker.class;
- }
-
- class DiskTrackerSensorLayer
- extends DetectorElement
- {
- DiskTrackerSensorLayer
- (String name, IDetectorElement parent, String path, IIdentifier id)
- {
- super(name,parent,path,id);
- }
- }
-
- class DiskTrackerDE
- extends DetectorElement
- {
- DiskTrackerDE
- (String name)
- {
- super(name);
- }
- }
+ public void convert( Subdetector subdet, Detector detector)
+ {
+ ILogicalVolume trackingVolume = detector.getTrackingVolume().getLogicalVolume();
+
+ DiskTracker tracker = (DiskTracker)subdet;
+
+ // Some DiskTracker subdetectors are used for support material
+ // so need to make sure IDDecoder is not null before using it.
+ int systemNumber = -1;
+ IDDecoder decoder = null;
+ try {
+ decoder = tracker.getIDDecoder();
+ if (decoder != null)
+ systemNumber = tracker.getIDDecoder().getSystemNumber();
+ }
+ catch (NullPointerException x)
+ {}
+
+ if (decoder != null)
+ subdet.setDetectorElement( new DeSubdetector( detector, subdet ) );
+
+ Layering layering = tracker.getLayering();
+ String name = tracker.getName();
+
+ DetectorElement endcapPos = null;
+ DetectorElement endcapNeg = null;
+ if (decoder != null)
+ {
+ endcapPos = new DiskTrackerDE(name + "_positive");
+ endcapPos.setParent(tracker.getDetectorElement());
+
+ if ( tracker.getReflect() )
+ {
+ endcapNeg = new DiskTrackerDE(name + "_negative");
+ endcapNeg.setParent(tracker.getDetectorElement());
+ }
+ }
+
+ IRotation3D reflect = new RotationPassiveXYZ(0, Math.PI, 0);
+
+ int sensorNum=0;
+
+ for (int i=0; i<layering.getNumberOfLayers(); i++)
+ {
+ Layer layer = layering.getLayer(i);
+
+ double layerInnerRadius = tracker.getInnerR()[i];
+ double layerOuterRadius = tracker.getOuterR()[i];
+ double layerInnerZ = tracker.getInnerZ()[i];
+
+ //System.out.println("thick="+layer.getThickness());
+
+ Tube layerTube = new Tube(
+ name + "_layer" + i,
+ layerInnerRadius,
+ layerOuterRadius,
+ layer.getThickness()/2);
+
+ LogicalVolume layerLV = new LogicalVolume(
+ name + "_layer" + i,
+ layerTube,
+ detector.getDetectorElement().getGeometry().getLogicalVolume().getMaterial()
+ );
+
+ // Layer in positive z.
+ new PhysicalVolume(
+ new Transform3D(
+ new Translation3D(
+ 0,
+ 0,
+ layerInnerZ + layer.getThickness()/2 )),
+ name + "_positive_layer" + i,
+ layerLV,
+ trackingVolume,
+ i);
+
+ // Reflected layer in negative z.
+ if ( tracker.getReflect() )
+ {
+ new PhysicalVolume(
+ new Transform3D(
+ new Translation3D(
+ 0.,
+ 0.,
+ -layerInnerZ - layer.getThickness()/2
+ ),
+ reflect
+ ),
+ name + "_negative_layer" + i,
+ layerLV,
+ trackingVolume,
+ i);
+ }
+
+ double sliceZ = -layer.getThickness()/2;
+ for (int j=0; j<layer.getNumberOfSlices(); j++)
+ {
+ //System.out.println("sliceZ="+sliceZ);
+ LayerSlice slice = layer.getSlice(j);
+ double sliceThickness = slice.getThickness();
+ IMaterial sliceMaterial =
+ MaterialStore.getInstance().get(slice.getMaterial().getName());
+
+ Tube sliceTube =
+ new Tube(name + "_layer" + i + "_slice"+j,
+ layerInnerRadius,
+ layerOuterRadius,
+ sliceThickness/2);
+
+ LogicalVolume sliceLV =
+ new LogicalVolume(
+ name + "_layer" + i + "_slice"+j,
+ sliceTube,
+ sliceMaterial);
+
+ sliceZ += sliceThickness/2;
+
+ new PhysicalVolume(
+ new Transform3D(
+ new Translation3D(
+ 0,
+ 0,
+ sliceZ )),
+ "slice" + j,
+ sliceLV,
+ layerLV,
+ j);
+
+ sliceZ += sliceThickness/2;
+
+ if ( slice.isSensitive() && decoder != null)
+ {
+ String path = "/tracking_region/" + name + "_positive_layer" +i + "/slice" + j;
+
+ ExpandedIdentifier expid = makeExpandedIdentifier(decoder, systemNumber, 1, i);
+
+ IIdentifierDictionary iddict = IdentifierDictionaryManager.getInstance().getIdentifierDictionary( subdet.getReadout().getName() );
+ IIdentifier id = null;
+ try {
+ id = IdentifierUtil.pack(iddict, expid);
+ }
+ catch (InvalidIndexException x)
+ {
+ throw new RuntimeException(x);
+ }
+ DiskTrackerSensorLayer northEndcapLayer =
+ new DiskTrackerSensorLayer(
+ name + "_positive_sensor" + sensorNum,
+ endcapPos,
+ path,
+ id);
+
+ if ( tracker.getReflect() )
+ {
+ path = "/tracking_region/" + name + "_negative_layer" +i + "/slice" + j;
+
+ expid = makeExpandedIdentifier(decoder, systemNumber, 2, i);
+ try {
+ id = IdentifierUtil.pack(iddict, expid);
+ }
+ catch (InvalidIndexException x)
+ {
+ throw new RuntimeException(x);
+ }
+ DiskTrackerSensorLayer southEndcapLayer =
+ new DiskTrackerSensorLayer(
+ name + "_negative_sensor" + sensorNum,
+ endcapNeg,
+ path,
+ id);
+ }
+
+ ++sensorNum;
+ }
+ }
+ }
+ }
+
+ static ExpandedIdentifier makeExpandedIdentifier(IDDecoder decoder, int systemNumber, int barrel, int layer)
+ {
+ ExpandedIdentifier id = new ExpandedIdentifier();
+ for (int i=0; i<decoder.getFieldCount(); i++)
+ {
+ String fieldName = decoder.getFieldName(i);
+ if (fieldName.equals("system"))
+ {
+ id.addValue(systemNumber);
+ }
+ else if (fieldName.equals("layer"))
+ {
+ id.addValue(layer);
+ }
+ else if (fieldName.equals("barrel"))
+ {
+ id.addValue(barrel);
+ }
+ else
+ {
+ id.addValue(0);
+ }
+ }
+ return id;
+ }
+
+ public Class getSubdetectorType()
+ {
+ return DiskTracker.class;
+ }
+
+ class DiskTrackerSensorLayer
+ extends DetectorElement
+ {
+ DiskTrackerSensorLayer
+ (String name, IDetectorElement parent, String path, IIdentifier id)
+ {
+ super(name,parent,path,id);
+ }
+ }
+
+ class DiskTrackerDE
+ extends DetectorElement
+ {
+ DiskTrackerDE
+ (String name)
+ {
+ super(name);
+ }
+ }
}