Commit in GeomConverter/src/org/lcsim/detector/converter/compact on MAIN
DiskTrackerConverter.java+228-2141.13 -> 1.14
JM: Add various guards against null IDDecoder when DiskTracker is used for support materials.

GeomConverter/src/org/lcsim/detector/converter/compact
DiskTrackerConverter.java 1.13 -> 1.14
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);            
+		}
+	}    
 }
CVSspam 0.2.8