Print

Print


Commit in GeomConverter on MAIN
src/org/lcsim/detector/converter/compact/SiTrackerEndcap2Converter.java+375added 1.1
                                        /DetectorConverter.java+18-161.39 -> 1.40
                                        /SiTrackerEndcapConverter.java+31-591.27 -> 1.28
src/org/lcsim/detector/converter/heprep/DetectorElementToHepRepConverter.java+2-61.14 -> 1.15
src/org/lcsim/geometry/compact/converter/SiTrackerModuleComponentParameters.java+39added 1.1
                                        /SiTrackerModuleParameters.java+86added 1.1
src/org/lcsim/geometry/compact/converter/lcdd/SiTrackerEndcap.java+21.14 -> 1.15
                                             /SiTrackerEndcap2.java+21.4 -> 1.5
                                             /SiTrackerModuleComponentParameters.java-391.1 removed
                                             /SiTrackerModuleParameters.java-861.1 removed
src/org/lcsim/geometry/subdetector/SiTrackerEndcap2.java+26added 1.1
testResources/org/lcsim/geometry/compact/converter/lcdd/SiTrackerEndcap2Test.xml+21-201.1 -> 1.2
+602-226
4 added + 2 removed + 6 modified, total 12 files
JM: added java rep for SiTrackerEndcap2 plus some refactoring

GeomConverter/src/org/lcsim/detector/converter/compact
SiTrackerEndcap2Converter.java added at 1.1
diff -N SiTrackerEndcap2Converter.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ SiTrackerEndcap2Converter.java	3 Dec 2008 00:53:45 -0000	1.1
@@ -0,0 +1,375 @@
+package org.lcsim.detector.converter.compact;
+
+import hep.physics.matrix.BasicMatrix;
+import hep.physics.vec.BasicHep3Vector;
+import hep.physics.vec.VecOp;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.jdom.Element;
+import org.jdom.JDOMException;
+import org.lcsim.detector.DetectorElement;
+import org.lcsim.detector.DetectorIdentifierHelper;
+import org.lcsim.detector.IDetectorElement;
+import org.lcsim.detector.IPhysicalVolume;
+import org.lcsim.detector.IPhysicalVolumePath;
+import org.lcsim.detector.IRotation3D;
+import org.lcsim.detector.ITranslation3D;
+import org.lcsim.detector.LogicalVolume;
+import org.lcsim.detector.PhysicalVolume;
+import org.lcsim.detector.RotationGeant;
+import org.lcsim.detector.RotationPassiveXYZ;
+import org.lcsim.detector.Transform3D;
+import org.lcsim.detector.Translation3D;
+import org.lcsim.detector.DetectorIdentifierHelper.SystemMap;
+import org.lcsim.detector.identifier.ExpandedIdentifier;
+import org.lcsim.detector.identifier.IExpandedIdentifier;
+import org.lcsim.detector.identifier.IIdentifier;
+import org.lcsim.detector.identifier.IIdentifierDictionary;
+import org.lcsim.detector.identifier.IIdentifierHelper;
+import org.lcsim.detector.identifier.IdentifierUtil;
+import org.lcsim.detector.material.IMaterial;
+import org.lcsim.detector.material.MaterialStore;
+import org.lcsim.detector.solids.Point3D;
+import org.lcsim.detector.solids.Polygon3D;
+import org.lcsim.detector.solids.Trd;
+import org.lcsim.detector.tracker.silicon.ChargeCarrier;
+import org.lcsim.detector.tracker.silicon.SiSensor;
+import org.lcsim.detector.tracker.silicon.SiSensorElectrodes;
+import org.lcsim.detector.tracker.silicon.SiStrips;
+import org.lcsim.detector.tracker.silicon.SiTrackerIdentifierHelper;
+import org.lcsim.detector.tracker.silicon.SiTrackerModule;
+import org.lcsim.geometry.compact.Detector;
+import org.lcsim.geometry.compact.Subdetector;
+import org.lcsim.geometry.compact.converter.SiTrackerModuleComponentParameters;
+import org.lcsim.geometry.compact.converter.SiTrackerModuleParameters;
+import org.lcsim.geometry.subdetector.SiTrackerEndcap2;
+
+/**
+ * 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 SiTrackerEndcap2Converter
+extends AbstractSubdetectorConverter
+implements ISubdetectorConverter
+{
+    Map<String,SiTrackerModuleParameters> moduleParameters = new HashMap<String,SiTrackerModuleParameters>();
+    Map<String,LogicalVolume> modules = new HashMap<String,LogicalVolume>();
+    IMaterial vacuum;
+    
+    public IIdentifierHelper makeIdentifierHelper(Subdetector subdetector, SystemMap systemMap)
+    {
+        return new SiTrackerIdentifierHelper(
+                subdetector.getDetectorElement(),
+                makeIdentifierDictionary(subdetector), 
+                systemMap);
+    }
+
+    public void convert(Subdetector subdet, Detector detector)
+    {
+        try 
+        {
+            Element node = subdet.getNode();
+            int sysId = node.getAttribute("id").getIntValue();
+            String subdetName = node.getAttributeValue("name");
+            vacuum = MaterialStore.getInstance().get("Air");
+            
+            boolean reflect;
+            if (node.getAttribute("reflect") != null)
+                reflect = node.getAttribute("reflect").getBooleanValue();
+            else
+                reflect = true;
+            
+            IDetectorElement subdetDetElem = subdet.getDetectorElement();            
+            DetectorIdentifierHelper helper = (DetectorIdentifierHelper)subdetDetElem.getIdentifierHelper();
+            int nfields = helper.getIdentifierDictionary().getNumberOfFields();
+            IDetectorElement endcapPos = null;
+            IDetectorElement endcapNeg = null;
+            try
+            {
+                // Positive endcap DE
+                IExpandedIdentifier endcapPosId = new ExpandedIdentifier(nfields);
+                endcapPosId.setValue(helper.getFieldIndex("system"), subdet.getSystemID());
+                endcapPosId.setValue(helper.getFieldIndex("barrel"), helper.getEndcapPositiveValue());
+                endcapPos = new DetectorElement(subdet.getName() + "_positive", subdetDetElem);
+                endcapPos.setIdentifier(helper.pack(endcapPosId));
+                
+                // Negative endcap DE.
+                if (reflect)
+                {
+                    IExpandedIdentifier endcapNegId = new ExpandedIdentifier(nfields);
+                    endcapNegId.setValue(helper.getFieldIndex("system"), subdet.getSystemID());
+                    endcapNegId.setValue(helper.getFieldIndex("barrel"), helper.getEndcapNegativeValue());
+                    endcapNeg = new DetectorElement(subdet.getName() + "_negative", subdetDetElem);
+                    endcapNeg.setIdentifier(helper.pack(endcapNegId));
+                }
+                
+            }
+            catch (Exception x)
+            {
+                throw new RuntimeException(x);
+            }                       
+
+            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)));
+            }                     
+
+            for (Iterator i = node.getChildren("layer").iterator(); i.hasNext();)            
+            {
+                Element layerElement = (Element) i.next();
+                
+                int layerId = layerElement.getAttribute("id").getIntValue();
+                
+                // Positive endcap layer.
+                IExpandedIdentifier layerPosId = new ExpandedIdentifier(nfields);
+                layerPosId.setValue(helper.getFieldIndex("system"), subdet.getSystemID());
+                layerPosId.setValue(helper.getFieldIndex("barrel"), helper.getEndcapPositiveValue());
+                layerPosId.setValue(helper.getFieldIndex("layer"), layerId);
+                IDetectorElement layerPos = new DetectorElement(endcapPos.getName() + "_layer" + layerId, endcapPos);
+                layerPos.setIdentifier(helper.pack(layerPosId));
+                
+                // Negative endcap layer.
+                IDetectorElement layerNeg = null;
+                if (reflect)
+                {
+                    IExpandedIdentifier layerNegId = new ExpandedIdentifier(nfields);
+                    layerPosId.setValue(helper.getFieldIndex("system"), subdet.getSystemID());
+                    layerPosId.setValue(helper.getFieldIndex("barrel"), helper.getEndcapNegativeValue());
+                    layerPosId.setValue(helper.getFieldIndex("layer"), layerId);
+                    layerNeg = new DetectorElement(endcapNeg.getName() + "_layer" + layerId, endcapNeg);
+                    layerNeg.setIdentifier(helper.pack(layerNegId));                    
+                }                                                
+                
+                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");
+                    LogicalVolume 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);
+                        
+                        // Positive endcap module.
+                        Translation3D p = new Translation3D(x,y,zstart+dz);
+                        RotationGeant rot = new RotationGeant(-Math.PI/2, -Math.PI/2 - phi, 0);
+                        new PhysicalVolume(new Transform3D(p,rot), moduleBaseName, moduleVolume, detector.getTrackingVolume().getLogicalVolume(), k);
+                        String path = "/" + detector.getTrackingVolume().getName() + "/" + moduleBaseName;
+                        IDetectorElement modulePos = new SiTrackerModule(moduleBaseName, layerPos, path, moduleNumber);
+                                                
+                        // Negative endcap module.
+                        if (reflect)
+                        {
+                            Translation3D pr = new Translation3D(x,y,-zstart-dz);
+                            RotationGeant rotr = new RotationGeant(-Math.PI/2, -Math.PI/2 - phi, Math.PI);
+
+                            String path2 = "/" + detector.getTrackingVolume().getName() + "/" + moduleBaseName+"_reflected";
+                            new PhysicalVolume(new Transform3D(pr, rotr), moduleBaseName+"_reflected", moduleVolume, detector.getTrackingVolume().getLogicalVolume(), k);
+                            new SiTrackerModule(moduleBaseName+"_reflected", layerNeg, path2, moduleNumber);
+                        }
+
+                        dz = -dz;                    
+                        phi += iphi;                        
+                        ++moduleNumber;
+                    }
+                }
+            }    
+        }
+        catch (JDOMException except)
+        {
+            throw new RuntimeException(except);
+        }
+        
+        // Create DetectorElements for the sensors.
+        setupSensorDetectorElements(subdet);
+    }
+
+    private LogicalVolume makeModule(SiTrackerModuleParameters params)
+    {
+        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);
+        Trd envelope = new Trd(params.getName() + "Trd", dx1, dx2, dy1, dy2, dz);
+        LogicalVolume volume = new LogicalVolume(params.getName() + "Volume", envelope, vacuum);
+        makeModuleComponents(volume, params);
+        return volume;
+    }
+
+    private void makeModuleComponents(LogicalVolume moduleVolume, SiTrackerModuleParameters moduleParameters)
+    {
+        Trd trd = (Trd)moduleVolume.getSolid();
+
+        double x1 = trd.getXHalfLength1();
+        double x2 = trd.getXHalfLength2();
+        double y1 = trd.getYHalfLength1();
+        double z = trd.getZHalfLength();
+
+        double posY = -y1;
+
+        String moduleName = moduleVolume.getName();
+
+        int sensor=0;
+        for (SiTrackerModuleComponentParameters component : moduleParameters)
+        {
+            double thickness = component.getThickness();
+
+            IMaterial material = MaterialStore.getInstance().get(component.getMaterialName());
+            if (material == null)
+            {
+                throw new RuntimeException("The material " + component.getMaterialName() + " does not exist in the materials database.");
+            }
+            boolean sensitive = component.isSensitive();
+            int componentNumber = component.getComponentNumber();
+
+            posY += thickness / 2;
+
+            String componentName = moduleName + "_component" + componentNumber;
+
+            Trd sliceTrd = new Trd(componentName + "_trd", x1, x2, thickness/2, thickness/2, z);
+
+            LogicalVolume volume = new LogicalVolume(componentName, sliceTrd, material);
+            
+            double zrot = 0;
+            if (sensitive)
+            {
+                if (sensor > 1)
+                {
+                    throw new RuntimeException("Exceeded maximum of 2 sensors per module.");
+                }
+                // Flip 180 deg for 1st sensor.
+                if (sensor == 0)
+                {
+                    zrot = Math.PI;
+                }
+                ++sensor;
+            }
+            Translation3D position = new Translation3D(0.,posY,0);
+            RotationGeant rotation = new RotationGeant(0,0,zrot);
+            PhysicalVolume pv = new PhysicalVolume(new Transform3D(position,rotation), componentName, volume, moduleVolume, componentNumber);
+            pv.setSensitive(sensitive);
+            
+            posY += thickness / 2;
+        }   
+    }   
+    
+    private void setupSensorDetectorElements(Subdetector subdet)
+    {
+        SiTrackerIdentifierHelper helper = (SiTrackerIdentifierHelper)subdet.getDetectorElement().getIdentifierHelper();
+                               
+        for (IDetectorElement endcap : subdet.getDetectorElement().getChildren())
+        {
+            for (IDetectorElement layer : endcap.getChildren() )
+            {
+                for (IDetectorElement module : layer.getChildren())
+                {
+                    IPhysicalVolume modulePhysVol = module.getGeometry().getPhysicalVolume();
+                    IPhysicalVolumePath modulePath = module.getGeometry().getPath();
+                    int sensorId=0;
+                    for (IPhysicalVolume pv : modulePhysVol.getLogicalVolume().getDaughters())
+                    {
+                        //System.out.println(pv.getName());
+                        if (pv.isSensitive())
+                        {                           
+                            IIdentifierDictionary iddict = subdet.getDetectorElement().getIdentifierHelper().getIdentifierDictionary();
+                              
+                            ExpandedIdentifier expId = new ExpandedIdentifier(iddict.getNumberOfFields());                            
+                            expId.setValue(iddict.getFieldIndex("system"), subdet.getSystemID());
+                                
+                            if (helper.isEndcapPositive(endcap.getIdentifier()))
+                            {
+                                expId.setValue(iddict.getFieldIndex("barrel"), helper.getEndcapPositiveValue());
+                            }
+                            else if (helper.isEndcapNegative(endcap.getIdentifier()))
+                            {
+                                expId.setValue(iddict.getFieldIndex("barrel"), helper.getEndcapNegativeValue());
+                            }
+                            else
+                            {
+                                throw new RuntimeException(endcap.getName() + " is not a positive or negative endcap!");
+                            }
+                            expId.setValue(iddict.getFieldIndex("layer"), layer.getIdentifierHelper().getValue(layer.getIdentifier(), "layer"));
+                            expId.setValue(iddict.getFieldIndex("module"), ((SiTrackerModule)module).getModuleId());
+                            expId.setValue(iddict.getFieldIndex("sensor"), sensorId);
+
+                            IIdentifier id = IdentifierUtil.pack(iddict, expId);
+                            
+                            String sensorPath = modulePath.toString() + "/" + pv.getName();
+                            String sensorName = layer.getName() + module.getName();
+                            
+                            SiSensor sensor = new SiSensor(sensorId,sensorName,module,sensorPath,id);
+                            
+                            // Set up SiStrips for the sensors
+                            Trd sensor_solid = (Trd)sensor.getGeometry().getLogicalVolume().getSolid();
+                            
+                            Polygon3D n_side = sensor_solid.getFacesNormalTo(new BasicHep3Vector(0,-1,0)).get(0);
+                            Polygon3D p_side = sensor_solid.getFacesNormalTo(new BasicHep3Vector(0,1,0)).get(0);
+
+                            System.out.println("Plane of p_side polygon has... ");
+                            System.out.println("                        normal: "+p_side.getNormal());
+                            System.out.println("                        distance: "+p_side.getDistance());
+                            for (Point3D point : p_side.getVertices())
+                            {
+                                System.out.println("      Vertex: "+point);
+                            }
+                            
+                            System.out.println("Plane of n_side polygon has... ");
+                            System.out.println("                        normal: "+n_side.getNormal());
+                            System.out.println("                        distance: "+n_side.getDistance());
+                            
+                            // Bias the sensor
+                            sensor.setBiasSurface(ChargeCarrier.HOLE,p_side);
+                            sensor.setBiasSurface(ChargeCarrier.ELECTRON,n_side);
+                                                         
+                            //double strip_angle = Math.PI/nwedges;
+                            double strip_angle = Math.atan2(sensor_solid.getXHalfLength2() - sensor_solid.getXHalfLength1(), sensor_solid.getZHalfLength() * 2);
+                                                        
+                            ITranslation3D electrodes_position = new Translation3D(VecOp.mult(-p_side.getDistance(),new BasicHep3Vector(0,0,1)));  // translate to outside of polygon
+                            IRotation3D electrodes_rotation = new RotationPassiveXYZ(-Math.PI/2,0,strip_angle);
+                            Transform3D electrodes_transform = new Transform3D(electrodes_position, electrodes_rotation);                                
+                            
+                            // Free calculation of readout electrodes, sense electrodes determined thereon
+                            SiSensorElectrodes readout_electrodes = new SiStrips(ChargeCarrier.HOLE,0.050,sensor,electrodes_transform);
+                            SiSensorElectrodes sense_electrodes = new SiStrips(ChargeCarrier.HOLE,0.025,(readout_electrodes.getNCells()*2-1),sensor,electrodes_transform);                                                                
+                            
+                            sensor.setSenseElectrodes(sense_electrodes);
+                            sensor.setReadoutElectrodes(readout_electrodes);
+                            
+                            double[][] transfer_efficiencies = { {0.986,0.419} };
+                            sensor.setTransferEfficiencies(ChargeCarrier.HOLE,new BasicMatrix(transfer_efficiencies));
+                            
+                            ++sensorId;
+                        }
+                    }
+                }
+            }            
+        }        
+    }
+
+    public Class getSubdetectorType()
+    {
+        return SiTrackerEndcap2.class;
+    }
+}
\ No newline at end of file

GeomConverter/src/org/lcsim/detector/converter/compact
DetectorConverter.java 1.39 -> 1.40
diff -u -r1.39 -r1.40
--- DetectorConverter.java	7 Jul 2008 22:19:04 -0000	1.39
+++ DetectorConverter.java	3 Dec 2008 00:53:45 -0000	1.40
@@ -82,17 +82,18 @@
 
 
     public DetectorConverter()
-    {
-        addSubdetectorConverter( new CylindricalBarrelCalorimeterConverter() );
-        addSubdetectorConverter( new CylindricalEndcapCalorimeterConverter() );
-        addSubdetectorConverter( new MultiLayerTrackerConverter() );
-        addSubdetectorConverter( new DiskTrackerConverter() );
-        addSubdetectorConverter( new SiTrackerBarrelConverter() );
-        addSubdetectorConverter( new PolyconeSupportConverter() );
-        addSubdetectorConverter( new SiTrackerEndcapConverter() );
-        addSubdetectorConverter( new PolyhedraBarrelCalorimeterConverter() );
-        addSubdetectorConverter( new PolyhedraEndcapCalorimeterConverter() );
-        addSubdetectorConverter( new TubeSegmentConverter() );
+    {   
+        addSubdetectorConverter(new CylindricalBarrelCalorimeterConverter());
+        addSubdetectorConverter(new CylindricalEndcapCalorimeterConverter());
+        addSubdetectorConverter(new MultiLayerTrackerConverter());
+        addSubdetectorConverter(new DiskTrackerConverter());
+        addSubdetectorConverter(new SiTrackerBarrelConverter());
+        addSubdetectorConverter(new PolyconeSupportConverter());
+        addSubdetectorConverter(new SiTrackerEndcapConverter());
+        addSubdetectorConverter(new SiTrackerEndcap2Converter());
+        addSubdetectorConverter(new PolyhedraBarrelCalorimeterConverter());
+        addSubdetectorConverter(new PolyhedraEndcapCalorimeterConverter());
+        addSubdetectorConverter(new TubeSegmentConverter());
     }
 
     private void addSubdetectorConverter(ISubdetectorConverter s)
@@ -142,14 +143,14 @@
     {
         // Process all Subdetectors in the Detector.
         for ( Subdetector subdetector : detector.getSubdetectors().values())
-        {		            
+        {	
             // Find a converter for this type.
             ISubdetectorConverter cnv = getSubdetectorConverter(subdetector.getClass());
-
+                        
             if ( cnv != null )
             {
                 DetectorElement subdetectorDE = (DetectorElement)cnv.makeSubdetectorDetectorElement(detector, subdetector);
-                
+                                           
                 // Make the IdentifierHelper for this Subdetector.
                 IIdentifierHelper helper = cnv.makeIdentifierHelper(subdetector, sysMap);
                
@@ -174,7 +175,7 @@
                 // Check if a DetectorElement was created.  Some compact "detector" objects
                 // are not really detectors but dead material so this check is necessary
                 // to avoid errors.
-                if ( subdetDE != null)
+                if (subdetDE != null)
                 {
                     // Make the Parameters from the compact detector element
                     // and assign to the Subdetector's DetectorElement.
@@ -228,7 +229,8 @@
 
         if ( constants.get("world_x") == null ||
                 constants.get("world_y") == null ||
-                constants.get("world_z") == null ) {
+                constants.get("world_z") == null ) 
+        {
             throw new RuntimeException("Missing world_x, world_y, or world_z!");
         }
 

GeomConverter/src/org/lcsim/detector/converter/compact
SiTrackerEndcapConverter.java 1.27 -> 1.28
diff -u -r1.27 -r1.28
--- SiTrackerEndcapConverter.java	2 Jul 2008 21:38:32 -0000	1.27
+++ SiTrackerEndcapConverter.java	3 Dec 2008 00:53:45 -0000	1.28
@@ -12,7 +12,6 @@
 import org.jdom.Attribute;
 import org.jdom.DataConversionException;
 import org.jdom.Element;
-import org.jdom.JDOMException;
 import org.lcsim.detector.DetectorElement;
 import org.lcsim.detector.DetectorIdentifierHelper;
 import org.lcsim.detector.IDetectorElement;
@@ -52,13 +51,15 @@
 import org.lcsim.detector.tracker.silicon.SiTrackerModule;
 import org.lcsim.geometry.compact.Detector;
 import org.lcsim.geometry.compact.Subdetector;
+import org.lcsim.geometry.compact.converter.SiTrackerModuleComponentParameters;
+import org.lcsim.geometry.compact.converter.SiTrackerModuleParameters;
 import org.lcsim.geometry.subdetector.SiTrackerEndcap;
 
 /**
  * Converter for SiTrackerEndcap.
  *
  * @author Jeremy McCormick, Tim Nelson
- * @version $Id: SiTrackerEndcapConverter.java,v 1.27 2008/07/02 21:38:32 jeremy Exp $
+ * @version $Id: SiTrackerEndcapConverter.java,v 1.28 2008/12/03 00:53:45 jeremy Exp $
  */
 
 public class SiTrackerEndcapConverter
@@ -78,7 +79,7 @@
 	    
     public void convert(Subdetector subdet, Detector detector)
     {    	    
-    	Map<String, ModuleParameters> moduleParameters = new HashMap<String, ModuleParameters>();
+    	Map<String, SiTrackerModuleParameters> moduleParameters = new HashMap<String, SiTrackerModuleParameters>();
     	
         IPhysicalVolume trackingPV = detector.getTrackingVolume();
         ILogicalVolume trackingLV = trackingPV.getLogicalVolume();
@@ -118,7 +119,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));
         }        
         
         for (Object o : node.getChildren("layer"))
@@ -179,7 +180,12 @@
                 // Negative endcap.
                 String wedgePathReflect = layerPathReflect + "/" + wedge.getName();
                 String wedgeNameReflect = layerNameReflect + "_wedge" + wedge.getCopyNumber();
-                IDetectorElement wedgeDEReflect = new DetectorElement(wedgeNameReflect,layerDEReflect,detector.getNavigator().getPath(wedgePathReflect));
+                IDetectorElement wedgeDEReflect = 
+                    new DetectorElement(
+                            wedgeNameReflect,
+                            layerDEReflect,
+                            detector.getNavigator().getPath(wedgePathReflect)
+                            );
                 
                 // Module DEs.
                 for (IPhysicalVolume module : wedge.getLogicalVolume().getDaughters())
@@ -187,8 +193,8 @@
                     // Positive endcap module.
                     String modulePath = wedgePath + "/" + module.getName();
                     String moduleName = wedgeName + "_module" + module.getCopyNumber();
-                    //IDetectorElement moduleDE = new DetectorElement(moduleName,wedgeDE,detector.getNavigator().getPath(modulePath));
-                    IDetectorElement moduleDE = new SiTrackerModule(
+                    IDetectorElement moduleDE = 
+                        new SiTrackerModule(
                             moduleName,
                             wedgeDE,
                             detector.getNavigator().getPath(modulePath).toString(),
@@ -197,37 +203,13 @@
                     // Negative endcap module.
                     String modulePathReflect = wedgePathReflect + "/" + module.getName();
                     String moduleNameReflect = wedgeNameReflect + "_module" + module.getCopyNumber();
-                    //IDetectorElement moduleDEReflect = new DetectorElement(moduleNameReflect,wedgeDEReflect,detector.getNavigator().getPath(modulePathReflect));
-                    IDetectorElement moduleDEReflect = new SiTrackerModule(
+                    IDetectorElement moduleDEReflect = 
+                        new SiTrackerModule(
                             moduleNameReflect,
                             wedgeDEReflect,
                             detector.getNavigator().getPath(modulePathReflect).toString(),
                             module.getCopyNumber()
-                            );
-                    
-                    // I believe this is correctly done now in setupSensorDetectorElements()
-//                    // Sensor DEs.
-//                    for (IPhysicalVolume component : module.getLogicalVolume().getDaughters())
-//                    {
-//                        if (component.isSensitive())
-//                        {
-//                            int sensorNum = component.getCopyNumber();
-//                            
-//                            // Positive endcap component.
-//                            new SiSensor(
-//                                    sensorNum,
-//                                    moduleName + "_component" + sensorNum,
-//                                    moduleDE,
-//                                    detector.getNavigator().getPath(modulePath + "/" + component.getName()).toString());
-//                            
-//                            // Negative endcap component. (should have same physical layout as positive)
-//                            new SiSensor(
-//                                    sensorNum,
-//                                    moduleNameReflect + "_component" + sensorNum,
-//                                    moduleDEReflect,
-//                                    detector.getNavigator().getPath(modulePathReflect + "/" + component.getName()).toString());
-//                        }
-//                    }
+                            );                    
                 }
             }
         }
@@ -278,7 +260,7 @@
             double thickness,
             int nwedges,
             Element layerElement,
-            Map<String, ModuleParameters> moduleParameters
+            Map<String, SiTrackerModuleParameters> moduleParameters
             )
     {
         int layern;
@@ -313,14 +295,13 @@
         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());
         
         // Make the modules in the wedge.
         makeModules(subdet, wedgeLV, layerElement.getChild("module_parameters"), module, layern);
         
         // Place the wedges in the layer.
         double r = (innerR + outerR) / 2;
-        //String wedgeName = wedgeLV.getName();
         
         for (int i=0; i<nwedges; i++)
         {
@@ -329,7 +310,6 @@
             double y = r * Math.sin(phi);
             
             Translation3D p = new Translation3D(x,y,0);
-            //Rotation3D rot = new RotationPassiveXYZ(-Math.PI/2,0.,-Math.PI/2 - phi);
             IRotation3D rot = new RotationGeant(-Math.PI/2,-Math.PI/2 - phi,0.);
             Transform3D transform = new Transform3D(p,rot);
             new PhysicalVolume(
@@ -344,7 +324,7 @@
     }
     
     
-    private void makeModules(Subdetector subdet, ILogicalVolume wedgeLV, Element moduleElement, ModuleParameters module, int layern)
+    private void makeModules(Subdetector subdet, ILogicalVolume wedgeLV, Element moduleElement, SiTrackerModuleParameters module, int layern)
     {
         double r_size;
         try
@@ -521,14 +501,14 @@
         }
     }
     
-    public void makeBoxModule(ILogicalVolume module, ModuleParameters moduleParameters, int moduleTypeId)
+    public void makeBoxModule(ILogicalVolume module, SiTrackerModuleParameters moduleParameters, int moduleTypeId)
     {
         Box moduleBox = (Box)module.getSolid();
         double posY = -moduleBox.getYHalfLength();
         double moduleX = moduleBox.getXHalfLength();
         double moduleZ = moduleBox.getZHalfLength();
         
-        for (ModuleComponentParameters component : moduleParameters)
+        for (SiTrackerModuleComponentParameters component : moduleParameters)
         {
             double thickness = component.getThickness();
             IMaterial material = MaterialStore.getInstance().get(component.getMaterialName());
@@ -552,7 +532,7 @@
         }
     }
     
-    public void makeTrdModule(ILogicalVolume module, ModuleParameters moduleParameters, int moduleTypeId)
+    public void makeTrdModule(ILogicalVolume module, SiTrackerModuleParameters moduleParameters, int moduleTypeId)
     {
         Trd trd = (Trd)module.getSolid();
         double x1 = trd.getXHalfLength1();
@@ -562,7 +542,7 @@
         
         double posY = -y1;
         
-        for (ModuleComponentParameters component : moduleParameters)
+        for (SiTrackerModuleComponentParameters component : moduleParameters)
         {
             double thickness = component.getThickness();
             IMaterial material = MaterialStore.getInstance().get(component.getMaterialName());
@@ -586,7 +566,7 @@
         }
     }
     
-    public void makeTrapModule(ILogicalVolume module, ModuleParameters moduleParameters, int moduleTypeId)
+    public void makeTrapModule(ILogicalVolume module, SiTrackerModuleParameters moduleParameters, int moduleTypeId)
     {
         Trap trap = (Trap)module.getSolid();
         double a1 = trap.getAlpha1();
@@ -601,7 +581,7 @@
         double phi = trap.getPhi();        
         double posY = -y1;
         
-        for (ModuleComponentParameters component : moduleParameters)
+        for (SiTrackerModuleComponentParameters component : moduleParameters)
         {
             double thickness = component.getThickness();
             IMaterial material = MaterialStore.getInstance().get(component.getMaterialName());
@@ -713,7 +693,6 @@
                                 //System.out.println();
                                 
                                 SiSensor sensor = new SiSensor(sensorId,sensorName,module,sensorPath,id);
-                                //sensor.setIdentifier(id);
                                 
                                 // Set up SiStrips for the sensors
                                 IPolyhedron sensor_solid = (IPolyhedron)sensor.getGeometry().getLogicalVolume().getSolid();
@@ -762,20 +741,12 @@
                                 //System.out.println("                        side = : "+side);
                                 
                                 ITranslation3D electrodes_position = new Translation3D(VecOp.mult(-p_side.getDistance(),new BasicHep3Vector(0,0,1)));  // translate to outside of polygon
-//                                ITranslation3D electrodes_position = new Translation3D(VecOp.mult(-p_side.getDistance(),p_side.getNormal()));  // translate to p_side
                                 IRotation3D electrodes_rotation = new RotationPassiveXYZ(side*(Math.PI/2),0,strip_angle);          //
-                                Transform3D electrodes_transform = new Transform3D(electrodes_position, electrodes_rotation);
-                                
-                                //System.out.println(" electrodes_transform translation: \n"+electrodes_transform.getTranslation().getTranslationVector());
-                                //System.out.println(" electrodes_transform rotation: \n"+electrodes_transform.getRotation().getRotationMatrix());
+                                Transform3D electrodes_transform = new Transform3D(electrodes_position, electrodes_rotation);                                
                                 
                                 // Free calculation of readout electrodes, sense electrodes determined thereon
                                 SiSensorElectrodes readout_electrodes = new SiStrips(ChargeCarrier.HOLE,0.050,sensor,electrodes_transform);
-                                SiSensorElectrodes sense_electrodes = new SiStrips(ChargeCarrier.HOLE,0.025,(readout_electrodes.getNCells()*2-1),sensor,electrodes_transform);
-                                                                
-//                                // Free calculation of sense electrodes, readout electrodes determined thereon
-//                                SiSensorElectrodes sense_electrodes = new SiStrips(ChargeCarrier.HOLE,0.025,sensor,electrodes_transform);
-//                                SiSensorElectrodes readout_electrodes = new SiStrips(ChargeCarrier.HOLE,0.050,(sense_electrodes.getNCells()+1)/2,sensor,electrodes_transform);
+                                SiSensorElectrodes sense_electrodes = new SiStrips(ChargeCarrier.HOLE,0.025,(readout_electrodes.getNCells()*2-1),sensor,electrodes_transform);                                                                
                                 
                                 sensor.setSenseElectrodes(sense_electrodes);
                                 sensor.setReadoutElectrodes(readout_electrodes);
@@ -783,11 +754,10 @@
                                 double[][] transfer_efficiencies = { {0.986,0.419} };
                                 sensor.setTransferEfficiencies(ChargeCarrier.HOLE,new BasicMatrix(transfer_efficiencies));
                                 
-                                // Incremenet sensorID for double-sided.
+                                // Increment sensorID for double-sided.
                                 ++sensorId;
                             }
-                        }
-                        
+                        }                        
                         ++moduleId;
                     }
                 }
@@ -795,6 +765,7 @@
         }
     }
     
+    /*
     public static class ModuleComponentParameters
     {
         String materialName;
@@ -879,4 +850,5 @@
             return thickness;
         }
     }
+    */
 }

GeomConverter/src/org/lcsim/detector/converter/heprep
DetectorElementToHepRepConverter.java 1.14 -> 1.15
diff -u -r1.14 -r1.15
--- DetectorElementToHepRepConverter.java	7 Jul 2008 22:18:21 -0000	1.14
+++ DetectorElementToHepRepConverter.java	3 Dec 2008 00:53:45 -0000	1.15
@@ -27,12 +27,9 @@
 {   
     public static void convert(IDetectorElement detelem, HepRepFactory factory, HepRep heprep, int currentDepth, int maxDepth)
     {
-        //System.out.println("convert");
         if (maxDepth != -1 && currentDepth > maxDepth)
             return;
-        
-        //System.out.println("converting " + detelem.getName());
-        
+                
         HepRepInstanceTree instanceTree = heprep.getInstanceTreeTop("Detector","1.0");
         HepRepTypeTree typeTree = heprep.getTypeTree("DetectorType","1.0");
         
@@ -60,8 +57,7 @@
                     Hep3Vector p = geo.transformLocalToGlobal(points.get(point_ordering[i]));
                     factory.createHepRepPoint(instance,p.x(),p.y(),p.z());
                 }
-            }
- 
+            } 
             else if ( solid instanceof Tube )
             {
                 Tube tube = (Tube)geo.getLogicalVolume().getSolid();

GeomConverter/src/org/lcsim/geometry/compact/converter
SiTrackerModuleComponentParameters.java added at 1.1
diff -N SiTrackerModuleComponentParameters.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ SiTrackerModuleComponentParameters.java	3 Dec 2008 00:53:45 -0000	1.1
@@ -0,0 +1,39 @@
+package org.lcsim.geometry.compact.converter;
+
+//FIXME: Duplicates class in org.lcsim.detector.converter.compact.SiTrackerEndcapConverter to avoid dependency.
+
+public class SiTrackerModuleComponentParameters
+{
+    String materialName;
+    double thickness;
+    boolean sensitive;
+    int componentNumber;
+
+    public SiTrackerModuleComponentParameters(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;
+    }
+}

GeomConverter/src/org/lcsim/geometry/compact/converter
SiTrackerModuleParameters.java added at 1.1
diff -N SiTrackerModuleParameters.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ SiTrackerModuleParameters.java	3 Dec 2008 00:53:45 -0000	1.1
@@ -0,0 +1,86 @@
+package org.lcsim.geometry.compact.converter;
+
+import java.util.ArrayList;
+
+import org.jdom.DataConversionException;
+import org.jdom.Element;
+import org.jdom.JDOMException;
+
+// FIXME: Duplicates class in org.lcsim.detector.converter.compact.SiTrackerEndcapConverter to avoid dependency.       
+public class SiTrackerModuleParameters
+extends ArrayList<SiTrackerModuleComponentParameters>
+{
+    double thickness=0.;
+    String name;
+    double dimensions[] = new double[3];
+    public SiTrackerModuleParameters(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 SiTrackerModuleComponentParameters(thickness, materialName, cntr, sensitive));
+            }
+            catch (JDOMException x)
+            {
+                throw new RuntimeException(x);
+            }
+            ++cntr;
+        }
+        
+        // Optional dimension parameters (not always present).
+        if (element.getChild("trd") != null)
+        {
+            Element trd = element.getChild("trd");
+            try 
+            {
+                dimensions[0] = trd.getAttribute("x1").getDoubleValue();
+                dimensions[1] = trd.getAttribute("x2").getDoubleValue();
+                dimensions[2] = trd.getAttribute("z").getDoubleValue();
+            }
+            catch (DataConversionException x)
+            {
+                throw new RuntimeException(x);
+            }
+        }
+        
+        calculateThickness();
+    }
+
+    public void calculateThickness()
+    {
+        thickness = 0.; // reset thickness
+        for (SiTrackerModuleComponentParameters p : this)
+        {
+            thickness += p.getThickness();
+        }
+    }
+
+    public double getThickness()
+    {
+        return thickness;
+    }
+    
+    public String getName()
+    {
+        return name;
+    }
+    
+    public double getDimension(int i)
+    {
+        if (i > (dimensions.length - 1) || i < 0)
+            throw new RuntimeException("Invalid dimensions index: " + i);
+        return dimensions[i];
+    }
+}
\ No newline at end of file

GeomConverter/src/org/lcsim/geometry/compact/converter/lcdd
SiTrackerEndcap.java 1.14 -> 1.15
diff -u -r1.14 -r1.15
--- SiTrackerEndcap.java	22 Nov 2008 01:00:39 -0000	1.14
+++ SiTrackerEndcap.java	3 Dec 2008 00:53:45 -0000	1.15
@@ -9,6 +9,8 @@
 import org.jdom.DataConversionException;
 import org.jdom.Element;
 import org.jdom.JDOMException;
+import org.lcsim.geometry.compact.converter.SiTrackerModuleComponentParameters;
+import org.lcsim.geometry.compact.converter.SiTrackerModuleParameters;
 import org.lcsim.geometry.compact.converter.lcdd.util.Box;
 import org.lcsim.geometry.compact.converter.lcdd.util.LCDD;
 import org.lcsim.geometry.compact.converter.lcdd.util.Material;

GeomConverter/src/org/lcsim/geometry/compact/converter/lcdd
SiTrackerEndcap2.java 1.4 -> 1.5
diff -u -r1.4 -r1.5
--- SiTrackerEndcap2.java	25 Nov 2008 22:52:12 -0000	1.4
+++ SiTrackerEndcap2.java	3 Dec 2008 00:53:45 -0000	1.5
@@ -6,6 +6,8 @@
 
 import org.jdom.Element;
 import org.jdom.JDOMException;
+import org.lcsim.geometry.compact.converter.SiTrackerModuleComponentParameters;
+import org.lcsim.geometry.compact.converter.SiTrackerModuleParameters;
 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;

GeomConverter/src/org/lcsim/geometry/compact/converter/lcdd
SiTrackerModuleComponentParameters.java removed after 1.1
diff -N SiTrackerModuleComponentParameters.java
--- SiTrackerModuleComponentParameters.java	22 Nov 2008 01:00:39 -0000	1.1
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,39 +0,0 @@
-package org.lcsim.geometry.compact.converter.lcdd;
-
-//FIXME: Duplicates class in org.lcsim.detector.converter.compact.SiTrackerEndcapConverter to avoid dependency.
-
-public class SiTrackerModuleComponentParameters
-{
-    String materialName;
-    double thickness;
-    boolean sensitive;
-    int componentNumber;
-
-    public SiTrackerModuleComponentParameters(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;
-    }
-}

GeomConverter/src/org/lcsim/geometry/compact/converter/lcdd
SiTrackerModuleParameters.java removed after 1.1
diff -N SiTrackerModuleParameters.java
--- SiTrackerModuleParameters.java	22 Nov 2008 01:00:39 -0000	1.1
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,86 +0,0 @@
-package org.lcsim.geometry.compact.converter.lcdd;
-
-import java.util.ArrayList;
-
-import org.jdom.DataConversionException;
-import org.jdom.Element;
-import org.jdom.JDOMException;
-
-// FIXME: Duplicates class in org.lcsim.detector.converter.compact.SiTrackerEndcapConverter to avoid dependency.       
-public class SiTrackerModuleParameters
-extends ArrayList<SiTrackerModuleComponentParameters>
-{
-    double thickness=0.;
-    String name;
-    double dimensions[] = new double[3];
-    public SiTrackerModuleParameters(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 SiTrackerModuleComponentParameters(thickness, materialName, cntr, sensitive));
-            }
-            catch (JDOMException x)
-            {
-                throw new RuntimeException(x);
-            }
-            ++cntr;
-        }
-        
-        // Optional dimension parameters (not always present).
-        if (element.getChild("trd") != null)
-        {
-            Element trd = element.getChild("trd");
-            try 
-            {
-                dimensions[0] = trd.getAttribute("x1").getDoubleValue();
-                dimensions[1] = trd.getAttribute("x2").getDoubleValue();
-                dimensions[2] = trd.getAttribute("z").getDoubleValue();
-            }
-            catch (DataConversionException x)
-            {
-                throw new RuntimeException(x);
-            }
-        }
-        
-        calculateThickness();
-    }
-
-    public void calculateThickness()
-    {
-        thickness = 0.; // reset thickness
-        for (SiTrackerModuleComponentParameters p : this)
-        {
-            thickness += p.getThickness();
-        }
-    }
-
-    public double getThickness()
-    {
-        return thickness;
-    }
-    
-    public String getName()
-    {
-        return name;
-    }
-    
-    public double getDimension(int i)
-    {
-        if (i > (dimensions.length - 1) || i < 0)
-            throw new RuntimeException("Invalid dimensions index " + i);
-        return dimensions[i];
-    }
-}
\ No newline at end of file

GeomConverter/src/org/lcsim/geometry/subdetector
SiTrackerEndcap2.java added at 1.1
diff -N SiTrackerEndcap2.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ SiTrackerEndcap2.java	3 Dec 2008 00:53:45 -0000	1.1
@@ -0,0 +1,26 @@
+package org.lcsim.geometry.subdetector;
+
+import hep.graphics.heprep.HepRep;
+import hep.graphics.heprep.HepRepFactory;
+
+import org.jdom.Element;
+import org.jdom.JDOMException;
+import org.lcsim.detector.converter.heprep.DetectorElementToHepRepConverter;
+
+public class SiTrackerEndcap2 extends AbstractTracker
+{
+    SiTrackerEndcap2(Element node) throws JDOMException
+    {
+        super(node);
+    }
+
+    public void appendHepRep(HepRepFactory factory, HepRep heprep)
+    {
+        DetectorElementToHepRepConverter.convert(getDetectorElement(), factory, heprep, 0, -1);
+    }
+    
+    public boolean isEndcap()
+    {
+        return true;
+    }
+}
\ No newline at end of file

GeomConverter/testResources/org/lcsim/geometry/compact/converter/lcdd
SiTrackerEndcap2Test.xml 1.1 -> 1.2
diff -u -r1.1 -r1.2
--- SiTrackerEndcap2Test.xml	22 Nov 2008 01:13:56 -0000	1.1
+++ SiTrackerEndcap2Test.xml	3 Dec 2008 00:53:45 -0000	1.2
@@ -5,13 +5,13 @@
     <comment></comment>
   </info>
   <define>
-    <constant name="cm" value="10"/>
-    <constant name="world_side" value="30000"/>
-    <constant name="world_x" value="world_side"/>
-    <constant name="world_y" value="world_side"/>
-    <constant name="world_z" value="world_side"/>
-    <constant name="tracking_region_radius" value="180.0 * cm"/>
-    <constant name="tracking_region_zmax" value="300.0 * cm"/>
+      <constant name="cm" value="10"/>
+      <constant name="world_side" value="30000"/>
+      <constant name="world_x" value="world_side"/>
+      <constant name="world_y" value="world_side"/>
+      <constant name="world_z" value="world_side"/>
+      <constant name="tracking_region_radius" value="180.0 * cm"/>
+      <constant name="tracking_region_zmax" value="300.0 * cm"/>
   </define>
   <materials>
   </materials>
@@ -21,33 +21,34 @@
   </display>
 -->
   <detectors>
-
-    <detector id="1" name="SiTrackerEndcap2" type="SiTrackerEndcap2" readout="SiTrackerEndcap_RO">
+    <detector id="1" name="SiTrackerEndcap2" type="SiTrackerEndcap2" readout="TestReadout">
         <module name="Module1">
             <trd x1="65.2422" x2="88.47" z="110.48" />
             <module_component thickness="1.0" material="Silicon"/>
         </module>
         <module name="Module2">
             <trd x1="88.63" x2="118.5" z="92.6" />
-            <module_component thickness="1.0" material="Silicon"/>
+            <module_component thickness="5.0" material="Silicon" sensitive="true"/>
+            <module_component thickness="2.0" material="Silicon"/>
+            <module_component thickness="5.0" material="Silicon" sensitive="true"/>
         </module>
         <layer id="1">
-            <ring r="1210.0" phi0="0.0" zstart="855.0" dz="1.25" nmodules="84" module="Module2"/>
+            <ring r="1210.0" phi0="0.0" zstart="855.0" dz="1.25" nmodules="24" module="Module2"/>
 <!--            <ring r="200.0" phi0="0.0" zstart="1100.0" dz="1.1" nmodules="30" module="Module1"/>-->
         </layer>
     </detector>
   </detectors>
   <readouts>
-    <readout name="SiTrackerEndcap_RO">
-      <id>system:6,barrel:3,layer:4,wedge:6,module:6,sensor:1,side:32:-2,strip:12</id>
-    </readout>
+      <readout name="TestReadout">
+          <id>system:6,barrel:3,layer:4,module:6,sensor:1,side:32:-2,strip:12</id>
+      </readout>
   </readouts>
   <fields>
-    <field type="Solenoid" 
-           name="GlobalSolenoid"
-           inner_field="5.0"
-           outer_field="-0.6"
-           zmax="1000"
-           outer_radius="(250.0+ 5.0 + 17.5 + 40./2.)*cm" />
+      <field type="Solenoid" 
+             name="GlobalSolenoid"
+             inner_field="5.0"
+             outer_field="-0.6"
+             zmax="1000"
+             outer_radius="(250.0+ 5.0 + 17.5 + 40./2.)*cm" />
   </fields>
 </lccdd>
CVSspam 0.2.8