Print

Print


Author: [log in to unmask]
Date: Tue Dec  2 11:21:55 2014
New Revision: 3437

Log:
Fixing stereo pairing. Adding support for millepede constants for the new detector.

Modified:
    projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/detector/converter/compact/HPSTestRunTracker2014Converter.java
    projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/detector/converter/compact/HPSTracker2014Converter.java
    projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/detector/converter/compact/HPSTracker2014ConverterBase.java
    projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/HPSTestRunTracker2014GeometryDefinition.java
    projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/HPSTracker2014GeometryDefinition.java
    projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/HPSTrackerBuilder.java
    projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/HPSTrackerGeometryDefinition.java
    projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/JavaSurveyVolume.java
    projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/LCDDSurveyVolume.java
    projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/MilleParameter.java
    projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/lcdd/HPSTracker2014Base.java
    projects/lcsim/trunk/detector-framework/src/test/resources/org/lcsim/geometry/subdetector/HPSTracker2014.xml

Modified: projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/detector/converter/compact/HPSTestRunTracker2014Converter.java
 =============================================================================
--- projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/detector/converter/compact/HPSTestRunTracker2014Converter.java	(original)
+++ projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/detector/converter/compact/HPSTestRunTracker2014Converter.java	Tue Dec  2 11:21:55 2014
@@ -4,8 +4,14 @@
 package org.lcsim.detector.converter.compact;
 
 import org.jdom.Element;
+import org.lcsim.detector.IDetectorElement;
+import org.lcsim.detector.identifier.IIdentifier;
+import org.lcsim.detector.tracker.silicon.HpsSiSensor;
+import org.lcsim.detector.tracker.silicon.HpsTestRunSiSensor;
 import org.lcsim.geometry.compact.converter.HPSTestRunTracker2014JavaBuilder;
+import org.lcsim.geometry.compact.converter.HPSTrackerBuilder;
 import org.lcsim.geometry.compact.converter.HPSTrackerJavaBuilder;
+import org.lcsim.geometry.compact.converter.JavaSurveyVolume;
 import org.lcsim.geometry.subdetector.HPSTestRunTracker2014;
 
 /**
@@ -26,8 +32,26 @@
 	     return new HPSTestRunTracker2014JavaBuilder(_debug,node);
 	 }
     
+	/* (non-Javadoc)
+	 * @see org.lcsim.detector.converter.compact.AbstractSubdetectorConverter#getSubdetectorType()
+	 */
 	public Class getSubdetectorType() {
         return HPSTestRunTracker2014.class;
     }
+
+    /* (non-Javadoc)
+     * @see org.lcsim.detector.converter.compact.HPSTracker2014ConverterBase#createSiSensor(int, java.lang.String, org.lcsim.detector.IDetectorElement, java.lang.String, org.lcsim.detector.identifier.IIdentifier)
+     */
+    HpsSiSensor createSiSensor(int sensorid, String name,
+            IDetectorElement parent, String support, IIdentifier id) {
+        return new HpsTestRunSiSensor(sensorid, name, parent, support, id);
+    }
+    
+    /* (non-Javadoc)
+     * @see org.lcsim.detector.converter.compact.HPSTracker2014ConverterBase#getModuleNumber(org.lcsim.geometry.compact.converter.JavaSurveyVolume)
+     */
+    protected int getModuleNumber(JavaSurveyVolume surveyVolume) {
+        return HPSTrackerBuilder.getHalfFromName(surveyVolume.getName()).equals("top") ? 0 : 1;
+    }
 	
 }

Modified: projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/detector/converter/compact/HPSTracker2014Converter.java
 =============================================================================
--- projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/detector/converter/compact/HPSTracker2014Converter.java	(original)
+++ projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/detector/converter/compact/HPSTracker2014Converter.java	Tue Dec  2 11:21:55 2014
@@ -1,8 +1,13 @@
 package org.lcsim.detector.converter.compact;
 
 import org.jdom.Element;
+import org.lcsim.detector.IDetectorElement;
+import org.lcsim.detector.identifier.IIdentifier;
+import org.lcsim.detector.tracker.silicon.HpsSiSensor;
 import org.lcsim.geometry.compact.converter.HPSTracker2014JavaBuilder;
+import org.lcsim.geometry.compact.converter.HPSTrackerBuilder;
 import org.lcsim.geometry.compact.converter.HPSTrackerJavaBuilder;
+import org.lcsim.geometry.compact.converter.JavaSurveyVolume;
 import org.lcsim.geometry.subdetector.HPSTracker2014;
 
 
@@ -17,13 +22,65 @@
         super();
     }
 
+    /* (non-Javadoc)
+     * @see org.lcsim.detector.converter.compact.HPSTracker2014ConverterBase#initializeBuilder(org.jdom.Element)
+     */
     protected HPSTrackerJavaBuilder initializeBuilder(Element node) {
        return new HPSTracker2014JavaBuilder(_debug, node);
     }
 
+    /* (non-Javadoc)
+     * @see org.lcsim.detector.converter.compact.AbstractSubdetectorConverter#getSubdetectorType()
+     */
     public Class getSubdetectorType() {
         return HPSTracker2014.class;
     }
 
+    
+    /* (non-Javadoc)
+     * @see org.lcsim.detector.converter.compact.HPSTracker2014ConverterBase#createSiSensor(int, java.lang.String, org.lcsim.detector.IDetectorElement, java.lang.String, org.lcsim.detector.identifier.IIdentifier)
+     */
+    HpsSiSensor createSiSensor(int sensorid, String name,
+            IDetectorElement parent, String support, IIdentifier id) {
+       return new HpsSiSensor(sensorid, name, parent, support, id);
+    }
+
+    
+    /* (non-Javadoc)
+     * @see org.lcsim.detector.converter.compact.HPSTracker2014ConverterBase#getModuleNumber(org.lcsim.geometry.compact.converter.JavaSurveyVolume)
+     */
+    protected int getModuleNumber(JavaSurveyVolume surveyVolume) {
+        boolean isTopLayer = HPSTrackerBuilder.getHalfFromName(surveyVolume.getName()).equals("top") ? true : false;
+        int layer = HPSTrackerBuilder.getLayerFromVolumeName(surveyVolume.getName());
+        int moduleNumber = -1;
+        if(isTopLayer) {
+            if(layer < 4 ) {
+                moduleNumber = 0;
+            } else {
+                if(HPSTrackerBuilder.isHoleFromName(surveyVolume.getName())) {
+                    moduleNumber = 2;
+                } else {
+                    moduleNumber = 0;
+                }
+            }
+        } else {
+            if(layer < 4 ) {
+                moduleNumber = 1;
+            } else {
+                if(HPSTrackerBuilder.isHoleFromName(surveyVolume.getName())) {
+                    moduleNumber = 1;
+                } else {
+                    moduleNumber = 3;
+                }
+            }
+        }
+
+        if(moduleNumber<0) throw new RuntimeException("Invalid module nr found for " + surveyVolume.getName());
+
+                return moduleNumber;
+    }
+
+
+    
 }
 

Modified: projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/detector/converter/compact/HPSTracker2014ConverterBase.java
 =============================================================================
--- projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/detector/converter/compact/HPSTracker2014ConverterBase.java	(original)
+++ projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/detector/converter/compact/HPSTracker2014ConverterBase.java	Tue Dec  2 11:21:55 2014
@@ -11,6 +11,7 @@
 import org.lcsim.detector.IPhysicalVolume;
 import org.lcsim.detector.PhysicalVolume;
 import org.lcsim.detector.Transform3D;
+import org.lcsim.detector.converter.compact.subdetector.HpsTracker2;
 import org.lcsim.detector.identifier.ExpandedIdentifier;
 import org.lcsim.detector.identifier.IExpandedIdentifier;
 import org.lcsim.detector.identifier.IIdentifier;
@@ -33,13 +34,15 @@
  * @author Per Hansson Adrian <[log in to unmask]>
  *
  */
-public abstract class HPSTracker2014ConverterBase extends
-        AbstractSubdetectorConverter {
+public abstract class HPSTracker2014ConverterBase extends AbstractSubdetectorConverter {
 
     protected boolean _debug = false;
     protected IMaterial trackingMaterial = null;
     protected static HPSTrackerJavaBuilder builder;
 
+    /**
+     * Default constructor.
+     */
     public HPSTracker2014ConverterBase() {
         super();
     }
@@ -51,6 +54,22 @@
      */
     abstract protected HPSTrackerJavaBuilder initializeBuilder(Element node);
     
+    
+    /**
+     * Abstract method to create the correct type of {@link HpsSiSensor}.
+     * @param sensorid
+     * @param name
+     * @param parent
+     * @param support
+     * @param id
+     * @return the created sensor.
+     */
+    abstract HpsSiSensor createSiSensor(int sensorid, String name, IDetectorElement parent, String support, IIdentifier id);
+    
+    
+    /* (non-Javadoc)
+     * @see org.lcsim.detector.converter.compact.AbstractSubdetectorConverter#makeIdentifierHelper(org.lcsim.geometry.compact.Subdetector, org.lcsim.detector.DetectorIdentifierHelper.SystemMap)
+     */
     public IIdentifierHelper makeIdentifierHelper(Subdetector subdetector, SystemMap systemMap) {
     	return new SiTrackerIdentifierHelper(subdetector.getDetectorElement(), makeIdentifierDictionary(subdetector), systemMap);
     }
@@ -101,33 +120,28 @@
 
         if(_debug) System.out.printf("%s: DONE setup and build the JAVA geometry\n", getClass().getSimpleName());
 
+        if(_debug) System.out.printf("%s: setup physical volumes\n", getClass().getSimpleName());
+        
         setupPhysicalVolumes();
-
+        
+        if(_debug) System.out.printf("%s: DONE setup physical volumes\n", getClass().getSimpleName());
+        
+        if(_debug) System.out.printf("%s: create stereo layers\n", getClass().getSimpleName());
+        
+        ((HpsTracker2) subdet.getDetectorElement()).createStereoLayers();
+       
+        if(_debug) System.out.printf("%s: DONE create stereo layers\n", getClass().getSimpleName());
+       
         if(_debug) {
-            System.out.printf("%s: Print all %d detector elements in store\n", getClass().getSimpleName(),DetectorElementStore.getInstance().size());
-            for(IDetectorElement e : DetectorElementStore.getInstance()) {
-                System.out.printf("%s: Name: %s \n", getClass().getSimpleName(),e.getName());
-                if(e.hasGeometryInfo()) {
-                    System.out.printf("%s: Position: %s \n", getClass().getSimpleName(),e.getGeometry().getPosition());
-                    System.out.printf("%s: LocalToGlobal: \n%s \n", getClass().getSimpleName(),((Transform3D)e.getGeometry().getLocalToGlobal()).toString());
-                    //System.out.printf("%s: GlobalToLocal: \n%s \n", getClass().getSimpleName(),((Transform3D)e.getGeometry().getGlobalToLocal()).toString());
-                    IGeometryInfo info = e.getGeometry();
-                    if(info!=null) {
-                        while((info=info.parentGeometry())!=null) {
-                            System.out.printf("%s: Parent geometry DE: %s \n", getClass().getSimpleName(),info.getDetectorElement().getName());
-                            System.out.printf("%s: Parent Position: %s \n", getClass().getSimpleName(),info.getPosition());
-                            System.out.printf("%s: Parent LocalToGlobal: \n%s \n", getClass().getSimpleName(),((Transform3D)info.getLocalToGlobal()).toString());
-
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-
-    /**
-     * Setup physical volumes based on the top level @JavaSurveyVolume
+            printDEs();
+        }
+    }
+
+
+   
+
+    /**
+     * Setup physical volumes based on the top level {@link JavaSurveyVolume}.
      */
     private void setupPhysicalVolumes() {
 
@@ -135,25 +149,18 @@
 
         setupPhysicalVolumes(builder.getBaseTrackerGeometry());
 
-
         if(_debug) System.out.printf("%s: DONE setup the detector elements\n", getClass().getSimpleName());
 
-
-    }
-
-
-
-
-
+    }
 
 
     /**
      * Setup the physical volumes recursively
-     * @param geometryObject - volume to process.
-     */
-    private void setupPhysicalVolumes(JavaSurveyVolume geometryObject) {
-
-        if(_debug) System.out.printf("%s: setupDetectorElement for %s\n", getClass().getSimpleName(),geometryObject.getName());
+     * @param surveyVolume - volume to process.
+     */
+    private void setupPhysicalVolumes(JavaSurveyVolume surveyVolume) {
+
+        if(_debug) System.out.printf("%s: setupDetectorElement for %s\n", getClass().getSimpleName(),surveyVolume.getName());
 
         // Only certain objects are setup as detector elements
         // Ghost volumes are never setup
@@ -165,257 +172,349 @@
         // are added so I keep track of all the elements in the builder in order 
         // to build a hierarchy.
 
-        if( geometryObject instanceof JavaGhostSurveyVolume) {
-
-            if(_debug) System.out.printf("%s: %s  is a ghost volume, dont create elements or physvol\n", getClass().getSimpleName(),geometryObject.getName());
-
-        } else if(geometryObject.getName().contains("tracking")) {
-            if(_debug) System.out.printf("%s: %s  is the tracking volume, dont create elements or physvol\n", getClass().getSimpleName(),geometryObject.getName());
+        if( surveyVolume instanceof JavaGhostSurveyVolume) {
+
+            if(_debug) System.out.printf("%s: %s  is a ghost volume, dont create elements or physvol\n", getClass().getSimpleName(),surveyVolume.getName());
+
+        } else if(surveyVolume.getName().contains("tracking")) {
+            if(_debug) System.out.printf("%s: %s  is the tracking volume, dont create elements or physvol\n", getClass().getSimpleName(),surveyVolume.getName());
         } else {
 
             // build the physical volume
-            geometryObject.buildPhysVolume();
-            PhysicalVolume physVol = (PhysicalVolume) geometryObject.getPhysVolume();
-
+            surveyVolume.buildPhysVolume();
+            
             // create detector element
             // create detector element
-            if(HPSTrackerBuilder.isBase(geometryObject.getName())) {
+            if(HPSTrackerBuilder.isBase(surveyVolume.getName())) {
 
                 if(_debug) System.out.printf("%s: create the base detector element\n", getClass().getSimpleName());
 
-
-                int nfields = builder.getDetectorIdentifierHelper().getIdentifierDictionary().getNumberOfFields();
-                IExpandedIdentifier layerPosId = new ExpandedIdentifier(nfields);
-                layerPosId.setValue(builder.getDetectorIdentifierHelper().getFieldIndex("system"), builder.getSubdetector().getSystemID());
-                layerPosId.setValue(builder.getDetectorIdentifierHelper().getFieldIndex("barrel"), builder.getDetectorIdentifierHelper().getBarrelValue());
-                int layer = 12; // dummy value
-                layerPosId.setValue(builder.getDetectorIdentifierHelper().getFieldIndex("layer"), layer);
-                IDetectorElement baseDe = builder.getBaseDetectorElement();
-                if(baseDe!=null) {
-                    throw new RuntimeException("Base exists. Shouldn't happen!");
-                } 
-                ILogicalVolume trackingVolume = geometryObject.getPhysMother().getVolume();
-                if(!trackingVolume.getName().contains("tracking")) {
-                    throw new RuntimeException("base phys mother " + geometryObject.getPhysMother().getName() + " is not tracking volume!?");
+                createBaseDetectorElement(surveyVolume);
+                
+                if(_debug) System.out.printf("%s: DONE create the base detector element\n", getClass().getSimpleName());
+
+
+            } else if(HPSTrackerBuilder.isHalfModule(surveyVolume.getName())) {
+
+                if(_debug) System.out.printf("%s: create the layer detector element\n", getClass().getSimpleName());
+
+                IDetectorElement layerDe = createLayerDetectorElement(surveyVolume);
+                
+                if(_debug) System.out.printf("%s: DONE create the layer detector element\n", getClass().getSimpleName());
+
+                if(_debug) System.out.printf("%s: create the module detector element\n", getClass().getSimpleName());
+                
+                createTrackerModuleDetectorElement(surveyVolume, layerDe);
+                
+                if(_debug) System.out.printf("%s: DONE create the module detector element\n", getClass().getSimpleName());
+
+
+            } else if(HPSTrackerBuilder.isSensor(surveyVolume.getName())) {
+
+                if(_debug) System.out.printf("%s: set sensitive volume for sensor %s\n", getClass().getSimpleName(),surveyVolume.getName());
+
+                createSensorDetectorElement(surveyVolume);
+
+                if(_debug) System.out.printf("%s: DONE set sensitive volume for sensor %s\n", getClass().getSimpleName(),surveyVolume.getName());
+
+
+            } else if(HPSTrackerBuilder.isActiveSensor(surveyVolume.getName())) {
+                
+                if(_debug) System.out.printf("%s: create the active sensor detector element\n", getClass().getSimpleName());
+
+                createActiveSensorDetectorElement(surveyVolume);
+                
+                if(_debug) System.out.printf("%s: DONE create the active sensor detector element\n", getClass().getSimpleName());
+
+            } else {
+                throw new RuntimeException("I don't think I should reach this? Should " + surveyVolume.getName() + " be a ghost?" );
+            }
+
+        }
+
+        // add daughters
+        if(_debug) System.out.printf("%s: add %d daughters to %s\n", this.getClass().getSimpleName(),surveyVolume.getDaughters().size(), surveyVolume.getName());
+        for(JavaSurveyVolume daughter : surveyVolume.getDaughters()) {
+            setupPhysicalVolumes(daughter);
+        }
+
+        if(_debug) System.out.printf("%s: DONE setup the detector element for %s\n", this.getClass().getSimpleName(),surveyVolume.getName());
+
+    }
+
+    
+       
+    
+    /**
+     * Find the module {@link DetectorElement} in a layer {@link DetectorElement} using the module number id.
+     * @param layerDe
+     * @param moduleNumber
+     * @return the found {@link DetectorElement} or {@code null} if not found.
+     */
+    private IDetectorElement getModuleDetectorElement(IDetectorElement layerDe, int moduleNumber) {
+      //Find the module by looping over the modules and checking module number
+        IDetectorElement moduleDe = null;
+        for(IDetectorElement e : layerDe.getChildren()) {
+            if(e instanceof SiTrackerModule) {
+                SiTrackerModule m = (SiTrackerModule)e;
+                if(m.getModuleId()==moduleNumber) {
+                    moduleDe = m;
                 }
-                String physVolPath = trackingVolume.getName() + "/" + geometryObject.getPhysVolume().getName();
-                baseDe = new DetectorElement(builder.getSubdetector().getName() + "_base", builder.getSubdetector().getDetectorElement(), physVolPath, builder.getIdentifierDictionary().pack(layerPosId));
-                builder.addBaseDetectorElement(baseDe);
-
-                if(_debug) System.out.printf("%s: baseDE name %s  \n", getClass().getSimpleName(),baseDe.getName());
-
-
-
-            } else if(HPSTrackerBuilder.isHalfModule(geometryObject.getName())) {
-
-                if(_debug) System.out.printf("%s: create the layer detector element\n", getClass().getSimpleName());
-
-                // The old geometry was built using a layer definition from a barrel tracker
-                // It also only has the concept of half-modules which it calls modules
-                // Thus the nomenclature here is a little strange
-                // Anyway, find those ID's
-
-                int nfields = builder.getDetectorIdentifierHelper().getIdentifierDictionary().getNumberOfFields();
-                IExpandedIdentifier layerPosId = new ExpandedIdentifier(nfields);
-                layerPosId.setValue(builder.getDetectorIdentifierHelper().getFieldIndex("system"), builder.getSubdetector().getSystemID());
-                layerPosId.setValue(builder.getDetectorIdentifierHelper().getFieldIndex("barrel"), builder.getDetectorIdentifierHelper().getBarrelValue());
-                //use the old definition of layer number to be consistent
-                //int layer = HPSTestRunTracker2014Builder.getLayerFromVolumeName(geometryObject.getName());
-                int layer = HPSTrackerBuilder.getOldGeomDefLayerFromVolumeName(geometryObject.getName());
-                layerPosId.setValue(builder.getDetectorIdentifierHelper().getFieldIndex("layer"), layer);
-                if(_debug) System.out.printf("%s: layerPosId layer = %d (compare with new layer %d)\n", getClass().getSimpleName(),layer, HPSTrackerBuilder.getLayerFromVolumeName(geometryObject.getName()));
-
-                // find the base DE as mother
-                IDetectorElement baseDe = builder.getBaseDetectorElement();
-                if(baseDe==null) {
-                    throw new RuntimeException("Base DE couldn't be found. Shouldn't happen!");
-                } 
-
-
-                // create the layer detector element and keep track of it
-                //IDetectorElement layerDe = builder.getLayerDetectorElement(layerPosId);
-                IDetectorElement layerDe = builder.getLayerDetectorElement(layerPosId);
-
-                if(layerDe==null) {
-                    //layerDe =  new DetectorElement(builder.getSubdetector().getName() + "_layer" + layer, builder.getSubdetector().getDetectorElement(), builder.getDetectorIdentifierHelper().pack(layerPosId));
-                    layerDe =  new DetectorElement(builder.getSubdetector().getName() + "_layer" + layer, baseDe, builder.getDetectorIdentifierHelper().pack(layerPosId));
-                    builder.addLayerDetectorElement(layerDe);
-                } else {
-                    if(_debug) System.out.printf("%s: layerDE exists\n", getClass().getSimpleName());
-                }
-
-                if(_debug) System.out.printf("%s: layerDE name %s  \n", getClass().getSimpleName(),layerDe.getName());
-
-
-
-                if(_debug) System.out.printf("%s: create the module detector element\n", getClass().getSimpleName());
-
-                // create the "module" detector element 
-                // it's under the base element
-                String half = HPSTrackerBuilder.getHalfFromName(geometryObject.getName());
-                if(half.equals("")) throw new RuntimeException("No half found for " + geometryObject.getName());
-                int moduleNumber = half.equals("top") ? 0 : 1;
-                //String modulePlacementName = builder.getSubdetector().getName() + "_" + moduleName + "_layer" + layer + "_module" + moduleNumber;
-                String modulePlacementName = geometryObject.getName();// builder.getSubdetector().getName() + "_" + moduleName + "_layer" + layer + "_module" + moduleNumber;
-
-
-                /*
-            ILogicalVolume trackingVolume = null;
-            if(builder.getBaseTrackerGeometry().getName().contains("tracking")) {
-                trackingVolume = builder.getBaseTrackerGeometry().getVolume();
-            } else {
-                trackingVolume = builder.getBaseTrackerGeometry().getMother().getVolume();
             }
-            if( trackingVolume == null ) {
-                throw new RuntimeException("failed to get tracking geometry from mother to " + builder.getBaseTrackerGeometry().getName()); 
-            }   
-            String modulePath = String.format("/%s/%s", trackingVolume.getName(), modulePlacementName);                                                        
-                 */
-                // use base as mother for physical volume
-                String modulePath = baseDe.getGeometry().getPathString() + "/" + modulePlacementName;
-
-                if(_debug) {
-                    System.out.printf("%s: create SiTrackerModule with: placementname %s, modulePath %s, moduleNumber %d  \n", getClass().getSimpleName(),modulePlacementName, modulePath, moduleNumber);
-                    //System.out.printf("%s: print all %d physical volumes from the Store\n", getClass().getSimpleName(),PhysicalVolumeStore.getInstance().size());
-                    //for(IPhysicalVolume v :  PhysicalVolumeStore.getInstance()) {
-                    //  System.out.printf("%s: %s %s %s\n", getClass().getSimpleName(), v.getName(), v.getLogicalVolume().getName(), v.getMotherLogicalVolume()!=null?v.getMotherLogicalVolume().getName():"(no mother)");
-                    //}
-                }
-
-                SiTrackerModule moduleDe = new SiTrackerModule(modulePlacementName, layerDe, modulePath, moduleNumber);
-
-                if(_debug) System.out.printf("%s: add module DE to existing ones  \n", getClass().getSimpleName(),modulePlacementName, modulePath, moduleNumber);
-
-
-                //keep track of the module detector element
-                builder.addModuleDetectorElement(moduleDe);
-
-
-
-
-            } else if(HPSTrackerBuilder.isSensor(geometryObject.getName())) {
-
-                if(_debug) System.out.printf("%s: this is where I would create a detector element for the sensor %s if needed\n", getClass().getSimpleName(),geometryObject.getName());
-
-                // set the physical volume to be sensitive
-                // TODO this should go into the geometry definition?!
-                physVol.setSensitive(true);
-
-            } else if(HPSTrackerBuilder.isActiveSensor(geometryObject.getName())) {
-
-                // Setup the active sensor element
-                // to be consistent with old converter I also add the sensor 
-                // in the path to the element even though it's not associated with 
-                // with a element. I'm not sure why this is done.
-
-                if(_debug) System.out.printf("%s: create the active sensor detector element\n", getClass().getSimpleName());
-
-                if(_debug) System.out.printf("%s: find the active sensor phys vol\n", this.getClass().getSimpleName());             
-
-                // Find active Sensor physical volume.
-                // Keep name consistent with old converter
-                PhysicalVolume sensorPhysVol = physVol;
-
-                if(sensorPhysVol==null) throw new RuntimeException("cannot find physVol for " + geometryObject.getName());
-
-                if(_debug) System.out.printf("%s: found %s phys vol\n", this.getClass().getSimpleName(),sensorPhysVol.getName());               
-
-                if(_debug) System.out.printf("%s: find the sensor phys vol\n", this.getClass().getSimpleName());                
-
-                // find the module detector element
-
-                // Helpers
-                IIdentifierDictionary iddict = builder.getDetectorIdentifierHelper().getIdentifierDictionary();
-
-                // Find the mother: the module detector element
-                IExpandedIdentifier layerExpId = new ExpandedIdentifier(iddict.getNumberOfFields());
-                layerExpId.setValue(iddict.getFieldIndex("system"), builder.getSubdetector().getSystemID());
-                layerExpId.setValue(iddict.getFieldIndex("barrel"), builder.getDetectorIdentifierHelper().getBarrelValue());                            
-                //use the old definition of layer number to be consistent
-                //int layer = HPSTestRunTracker2014Builder.getLayerFromVolumeName(geometryObject.getName());
-                int layer = HPSTrackerBuilder.getOldGeomDefLayerFromVolumeName(geometryObject.getName());
-                layerExpId.setValue(iddict.getFieldIndex("layer"), layer);
-                String half = HPSTrackerBuilder.getHalfFromName(geometryObject.getName());
-                if(half.equals("")) throw new RuntimeException("No half found for " + geometryObject.getName());
-                int moduleNumber = half.equals("top") ? 0 : 1;
-
-                // The expId is the same for the layerDE and moduleDE because the tracker module object stores the 
-                // module ID in a member variable. So when searching I need to add this info
-                // TODO Can we change this and add the module ID to the identifier?
-                //IDetectorElement moduleDe = builder.getModuleDetectorElement(layerExpId);
-                //IDetectorElement moduleDe = builder.getSiTrackerModuleDetectorElement(layerExpId, moduleNumber);
-
-                //Find the layer
-                IDetectorElement layerDe = builder.getLayerDetectorElement(layerExpId);
-
-                if(layerDe==null) throw new RuntimeException("Cannot find layer DE");
-
-                //Find the module
-                IDetectorElement moduleDe = null;
-                for(IDetectorElement e : layerDe.getChildren()) {
-                    if(e instanceof SiTrackerModule) {
-                        SiTrackerModule m = (SiTrackerModule)e;
-                        if(m.getModuleId()==moduleNumber) {
-                            moduleDe = m;
-                        }
+        }
+        return moduleDe;
+    }
+
+    /**
+     * Abstract method to find the module number.
+     * @param surveyVolume
+     * @return module number
+     */
+    abstract protected int getModuleNumber(JavaSurveyVolume surveyVolume);
+
+    /**
+     * Find the layer {@link DetectorElement}.
+     * @param surveyVolume
+     * @return the {@link DetectorElement}.
+     */
+    private IDetectorElement getLayerDetectorElement(JavaSurveyVolume surveyVolume) {
+        // Helper
+        IIdentifierDictionary iddict = builder.getDetectorIdentifierHelper().getIdentifierDictionary();
+
+        // Find the mother: the module detector element
+        IExpandedIdentifier layerExpId = new ExpandedIdentifier(iddict.getNumberOfFields());
+        layerExpId.setValue(iddict.getFieldIndex("system"), builder.getSubdetector().getSystemID());
+        layerExpId.setValue(iddict.getFieldIndex("barrel"), builder.getDetectorIdentifierHelper().getBarrelValue());                            
+        //use the old definition of layer number to be consistent
+        //int layer = HPSTestRunTracker2014Builder.getLayerFromVolumeName(geometryObject.getName());
+        int layer = builder._builder.getOldGeomDefLayerFromVolumeName(surveyVolume.getName());
+        layerExpId.setValue(iddict.getFieldIndex("layer"), layer);
+        //Find the layer from the ID
+        return builder.getLayerDetectorElement(layerExpId);
+    }
+
+    
+    
+    /**
+     * Create the {@link HpsSiSensor} detector element.
+     * @param surveyVolume
+     */
+    private void createActiveSensorDetectorElement(JavaSurveyVolume surveyVolume) {
+     // Setup the active sensor element
+        // to be consistent with old converter I also add the sensor 
+        // in the path to the element even though it's not associated with 
+        // with a element. I'm not sure why this is done.
+
+        
+        if(_debug) System.out.printf("%s: find the active sensor phys vol\n", this.getClass().getSimpleName());             
+
+        // Find active Sensor physical volume.
+        // Keep name consistent with old converter
+        PhysicalVolume sensorPhysVol = (PhysicalVolume) surveyVolume.getPhysVolume();
+
+        if(sensorPhysVol==null) throw new RuntimeException("cannot find physVol for " + surveyVolume.getName());
+
+        if(_debug) System.out.printf("%s: found %s phys vol\n", this.getClass().getSimpleName(),sensorPhysVol.getName());               
+
+        // find the layer and module detector element
+        
+        IDetectorElement layerDe = getLayerDetectorElement(surveyVolume);
+        
+        if(layerDe==null) throw new RuntimeException("Cannot find layer DE");
+
+        //Find the module number
+        int moduleNumber = getModuleNumber(surveyVolume);
+        
+        //Find the module detector element
+        IDetectorElement moduleDe = getModuleDetectorElement(layerDe, moduleNumber);
+        
+        if(moduleDe==null) throw new RuntimeException("Cannot find module DE for " + surveyVolume.getName());
+
+        // Setup SiSensor's identifier.
+        IIdentifierDictionary iddict = builder.getIdentifierDictionary();
+        IExpandedIdentifier expId = new ExpandedIdentifier(iddict.getNumberOfFields());
+        expId.setValue(iddict.getFieldIndex("system"), builder.getSubdetector().getSystemID());
+        expId.setValue(iddict.getFieldIndex("barrel"), 0);                            
+        expId.setValue(iddict.getFieldIndex("layer"), builder.getDetectorIdentifierHelper().getValue(layerDe.getIdentifier(), "layer"));
+        expId.setValue(iddict.getFieldIndex("module"), ((SiTrackerModule) moduleDe).getModuleId());
+        // The sensorNumber is always 0 in the old geometry. Keep it that way.
+        int sensorNumber = 0;
+        expId.setValue(iddict.getFieldIndex("sensor"), sensorNumber);
+
+        // Packed identifier.
+        IIdentifier sensorId = iddict.pack(expId);
+
+        // Sensor paths.
+        String modulePath = moduleDe.getGeometry().getPathString();
+        IPhysicalVolume componentPhysVol = surveyVolume.getPhysMother().getPhysVolume();
+        String sensorPath = modulePath.toString() + "/" + componentPhysVol.getName() + "/" + sensorPhysVol.getName();
+        String sensorName = moduleDe.getName() + "_sensor" + sensorNumber;
+
+        if(_debug) System.out.printf("%s: create HpsSiSensor with sensorNumber %d name %s moduleDe %s sensorPath %s sensor Id %d \n", getClass().getSimpleName(), 
+                sensorNumber, sensorName, moduleDe.getName(), sensorPath, sensorNumber);
+
+
+        // Create the sensor.
+        HpsSiSensor sensor = createSiSensor(sensorNumber, sensorName, moduleDe, sensorPath, sensorId);
+        
+        if(_debug) System.out.printf("%s: created sensor %s \n", getClass().getSimpleName(), sensor.getName());
+
+        
+    }
+    
+    
+    
+    /**
+     * Set the sensor {@link PhysicalVolume} to be sensitive.
+     * @param surveyVolume
+     */
+    private void createSensorDetectorElement(JavaSurveyVolume surveyVolume) {
+
+        // set the physical volume to be sensitive
+        // TODO this should go into the geometry definition?!
+        ((PhysicalVolume)surveyVolume.getPhysVolume()).setSensitive(true);
+        
+    }
+
+    /**
+     * Create the {@link SiTrackerModule}.
+     * @param surveyVolume
+     * @param layerDe - mother {@link DetectorElement}
+     */
+    protected void createTrackerModuleDetectorElement(JavaSurveyVolume surveyVolume, IDetectorElement layerDe) {
+        // create the "module" detector element 
+        // it's under the base element
+        
+        int moduleNumber = getModuleNumber(surveyVolume);
+        
+        String modulePlacementName = surveyVolume.getName();// builder.getSubdetector().getName() + "_" + moduleName + "_layer" + layer + "_module" + moduleNumber;
+       
+        // find the base DE as mother
+        IDetectorElement baseDe = builder.getBaseDetectorElement();
+        if(baseDe==null) {
+            throw new RuntimeException("Base DE couldn't be found. Shouldn't happen!");
+        } 
+        
+        // use base as mother for physical volume
+        String modulePath = baseDe.getGeometry().getPathString() + "/" + modulePlacementName;
+
+        if(_debug) {
+            System.out.printf("%s: create SiTrackerModule with: placementname %s, modulePath %s, moduleNumber %d  \n", getClass().getSimpleName(),modulePlacementName, modulePath, moduleNumber);
+        }
+        
+        SiTrackerModule moduleDe = new SiTrackerModule(modulePlacementName, layerDe, modulePath, moduleNumber);
+
+        if(_debug) System.out.printf("%s: add module DE to existing ones  \n", getClass().getSimpleName(),modulePlacementName, modulePath, moduleNumber);
+
+
+        //keep track of the module detector element
+        builder.addModuleDetectorElement(moduleDe);
+        
+    }
+
+    
+    
+    
+    /**
+     * Create the layer {@link DetectorElement}
+     * @param surveyVolume
+     * @return the detector element.
+     */
+    protected IDetectorElement createLayerDetectorElement(JavaSurveyVolume surveyVolume) {
+        int nfields = builder.getDetectorIdentifierHelper().getIdentifierDictionary().getNumberOfFields();
+        IExpandedIdentifier layerPosId = new ExpandedIdentifier(nfields);
+        layerPosId.setValue(builder.getDetectorIdentifierHelper().getFieldIndex("system"), builder.getSubdetector().getSystemID());
+        layerPosId.setValue(builder.getDetectorIdentifierHelper().getFieldIndex("barrel"), builder.getDetectorIdentifierHelper().getBarrelValue());
+        //use the old definition of layer number to be consistent
+        //int layer = HPSTestRunTracker2014Builder.getLayerFromVolumeName(geometryObject.getName());
+        int layer = builder._builder.getOldGeomDefLayerFromVolumeName(surveyVolume.getName());
+        layerPosId.setValue(builder.getDetectorIdentifierHelper().getFieldIndex("layer"), layer);
+        if(_debug) System.out.printf("%s: layerPosId layer = %d (compare with new layer %d)\n", getClass().getSimpleName(),layer, HPSTrackerBuilder.getLayerFromVolumeName(surveyVolume.getName()));
+
+        // find the base DE as mother
+        IDetectorElement baseDe = builder.getBaseDetectorElement();
+        if(baseDe==null) {
+            throw new RuntimeException("Base DE couldn't be found. Shouldn't happen!");
+        } 
+
+
+        // create the layer detector element and keep track of it
+        //IDetectorElement layerDe = builder.getLayerDetectorElement(layerPosId);
+        IDetectorElement layerDe = builder.getLayerDetectorElement(layerPosId);
+
+        if(layerDe==null) {
+            //layerDe =  new DetectorElement(builder.getSubdetector().getName() + "_layer" + layer, builder.getSubdetector().getDetectorElement(), builder.getDetectorIdentifierHelper().pack(layerPosId));
+            layerDe =  new DetectorElement(builder.getSubdetector().getName() + "_layer" + layer, baseDe, builder.getDetectorIdentifierHelper().pack(layerPosId));
+            builder.addLayerDetectorElement(layerDe);
+        } else {
+            if(_debug) System.out.printf("%s: layerDE exists\n", getClass().getSimpleName());
+        }
+
+        if(_debug) System.out.printf("%s: created layerDE  %s  \n", getClass().getSimpleName(),layerDe.getName());
+        
+        return layerDe;
+    }
+    
+    
+    
+    /**
+     * Create the tracker base {@link DetectorElement}
+     * @param surveyVolume
+     */
+    void createBaseDetectorElement(JavaSurveyVolume surveyVolume) {
+
+        int nfields = builder.getDetectorIdentifierHelper().getIdentifierDictionary().getNumberOfFields();
+        IExpandedIdentifier layerPosId = new ExpandedIdentifier(nfields);
+        layerPosId.setValue(builder.getDetectorIdentifierHelper().getFieldIndex("system"), builder.getSubdetector().getSystemID());
+        layerPosId.setValue(builder.getDetectorIdentifierHelper().getFieldIndex("barrel"), builder.getDetectorIdentifierHelper().getBarrelValue());
+        int layer = 12; // dummy value
+        layerPosId.setValue(builder.getDetectorIdentifierHelper().getFieldIndex("layer"), layer);
+        IDetectorElement baseDe = builder.getBaseDetectorElement();
+        if(baseDe!=null) {
+            throw new RuntimeException("Base exists. Shouldn't happen!");
+        } 
+        ILogicalVolume trackingVolume = surveyVolume.getPhysMother().getVolume();
+        if(!trackingVolume.getName().contains("tracking")) {
+            throw new RuntimeException("base phys mother " + surveyVolume.getPhysMother().getName() + " is not tracking volume!?");
+        }
+        String physVolPath = trackingVolume.getName() + "/" + surveyVolume.getPhysVolume().getName();
+        baseDe = new DetectorElement(builder.getSubdetector().getName() + "_base", builder.getSubdetector().getDetectorElement(), physVolPath, builder.getIdentifierDictionary().pack(layerPosId));
+        builder.addBaseDetectorElement(baseDe);
+        
+        if(_debug) System.out.printf("%s: baseDE name %s  \n", getClass().getSimpleName(),baseDe.getName());
+    }
+
+    
+    public IDetectorElement makeSubdetectorDetectorElement(Detector detector, Subdetector subdetector) {
+        
+        if(_debug) System.out.printf("%s: makeSubdetectorDetectorElement for subdetector %s\n", getClass().getSimpleName(),subdetector.getName());
+        
+        IDetectorElement subdetectorDE =
+                new HpsTracker2(subdetector.getName(), detector.getDetectorElement());
+        subdetector.setDetectorElement(subdetectorDE);
+        return subdetectorDE;
+    }
+    
+    private void printDEs() {
+        System.out.printf("%s: Print all %d detector elements in store\n", getClass().getSimpleName(),DetectorElementStore.getInstance().size());
+        for(IDetectorElement e : DetectorElementStore.getInstance()) {
+            System.out.printf("%s: Name: %s \n", getClass().getSimpleName(),e.getName());
+            if(e.hasGeometryInfo()) {
+                System.out.printf("%s: Position: %s \n", getClass().getSimpleName(),e.getGeometry().getPosition());
+                System.out.printf("%s: LocalToGlobal: \n%s \n", getClass().getSimpleName(),((Transform3D)e.getGeometry().getLocalToGlobal()).toString());
+                //System.out.printf("%s: GlobalToLocal: \n%s \n", getClass().getSimpleName(),((Transform3D)e.getGeometry().getGlobalToLocal()).toString());
+                IGeometryInfo info = e.getGeometry();
+                if(info!=null) {
+                    while((info=info.parentGeometry())!=null) {
+                        System.out.printf("%s: Parent geometry DE: %s \n", getClass().getSimpleName(),info.getDetectorElement().getName());
+                        System.out.printf("%s: Parent Position: %s \n", getClass().getSimpleName(),info.getPosition());
+                        System.out.printf("%s: Parent LocalToGlobal: \n%s \n", getClass().getSimpleName(),((Transform3D)info.getLocalToGlobal()).toString());
+
                     }
                 }
-
-
-                if(moduleDe==null) throw new RuntimeException("Cannot find module DE for " + geometryObject.getName());
-
-                // Setup SiSensor's identifier.
-                IExpandedIdentifier expId = new ExpandedIdentifier(iddict.getNumberOfFields());
-                expId.setValue(iddict.getFieldIndex("system"), builder.getSubdetector().getSystemID());
-                expId.setValue(iddict.getFieldIndex("barrel"), 0);                            
-                expId.setValue(iddict.getFieldIndex("layer"), builder.getDetectorIdentifierHelper().getValue(layerDe.getIdentifier(), "layer"));
-                expId.setValue(iddict.getFieldIndex("module"), ((SiTrackerModule) moduleDe).getModuleId());
-                // The sensorNumber is always 0 in the old geometry. Keep it that way.
-                int sensorNumber = 0;
-                expId.setValue(iddict.getFieldIndex("sensor"), sensorNumber);
-
-                // Packed identifier.
-                IIdentifier sensorId = iddict.pack(expId);
-
-                // Sensor paths.
-                String modulePath = moduleDe.getGeometry().getPathString();
-                IPhysicalVolume componentPhysVol = geometryObject.getPhysMother().getPhysVolume();
-                String sensorPath = modulePath.toString() + "/" + componentPhysVol.getName() + "/" + sensorPhysVol.getName();
-                String sensorName = moduleDe.getName() + "_sensor" + sensorNumber;
-
-                if(_debug) System.out.printf("%s: create HpsSiSensor with sensorNumber %d name %s moduleDe %s sensorPath %s sensor Id %d \n", getClass().getSimpleName(), 
-                        sensorNumber, sensorName, moduleDe.getName(), sensorPath, sensorNumber);
-
-
-                // Create the sensor.
-                HpsSiSensor sensor = new HpsSiSensor(sensorNumber, sensorName, moduleDe, sensorPath, sensorId);
-
-                if(_debug) System.out.printf("%s: created sensor %s \n", getClass().getSimpleName(), sensor.getName());
-
-                // Increment sensor numbering.
-                // TODO this is just random. Not sure what to do here!
-                // ++sensorNumber;
-
-            } else {
-                throw new RuntimeException("I don't think I should reach this? Should " + geometryObject.getName() + " be a ghost?" );
             }
-
-
-        }
-
-        // add daughters
-        if(_debug) System.out.printf("%s: add %d daughters to %s\n", this.getClass().getSimpleName(),geometryObject.getDaughters().size(), geometryObject.getName());
-        for(JavaSurveyVolume daughter : geometryObject.getDaughters()) {
-            setupPhysicalVolumes(daughter);
-        }
-
-
-
-        if(_debug) System.out.printf("%s: DONE setup the detector element for %s\n", this.getClass().getSimpleName(),geometryObject.getName());
-
-
-    }
-
-
+        }
+    }
+    
 
 }

Modified: projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/HPSTestRunTracker2014GeometryDefinition.java
 =============================================================================
--- projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/HPSTestRunTracker2014GeometryDefinition.java	(original)
+++ projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/HPSTestRunTracker2014GeometryDefinition.java	Tue Dec  2 11:21:55 2014
@@ -1787,6 +1787,54 @@
     }
 
 
+    /* (non-Javadoc)
+     * @see org.lcsim.geometry.compact.converter.HPSTrackerBuilder#getOldGeomDefLayerFromVolumeName(java.lang.String)
+     */
+    public int getOldGeomDefLayerFromVolumeName(String name) {
+        
+        String half = getHalfFromName(name);
+        int l = getLayerFromVolumeName(name);
+        boolean isTopLayer = false;
+        if(half=="top") isTopLayer=true;
+        else if(half=="bottom") isTopLayer = false;
+        else throw new RuntimeException("no half found from " + name);
+        boolean isAxial = isAxialFromName(name);
+        return getOldLayerDefinition(isTopLayer, l, isAxial);
+    }
+
+    /* (non-Javadoc)
+     * @see org.lcsim.geometry.compact.converter.HPSTrackerBuilder#getOldLayerDefinition(boolean, int, boolean)
+     */
+    public int getOldLayerDefinition(boolean isTopLayer, int l, boolean isAxial) {
+        int layer=-1;
+        if(isAxial) {
+            if(isTopLayer) {
+                layer = 2*l-1;
+            }
+            else {
+                layer = 2*l;
+            }
+        } else {
+            if(isTopLayer) {
+                layer = 2*l;
+            } else {
+                layer = 2*l-1;
+            }
+        }
+        return layer;
+    }
+
+
+    
+    /* (non-Javadoc)
+     * @see org.lcsim.geometry.compact.converter.HPSTrackerBuilder#getMillepedeLayer(java.lang.String)
+     */
+    public int getMillepedeLayer(String name) {
+       return getOldGeomDefLayerFromVolumeName(name);
+    }
+    
+
+
 
 
 }

Modified: projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/HPSTracker2014GeometryDefinition.java
 =============================================================================
--- projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/HPSTracker2014GeometryDefinition.java	(original)
+++ projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/HPSTracker2014GeometryDefinition.java	Tue Dec  2 11:21:55 2014
@@ -1749,11 +1749,11 @@
         // hole or slot
         boolean isHole = isHoleFromName(volName);
         
-        // find layer according to old definition
-        int oldLayer = getOldLayerDefinition(isTopLayer, layer, isAxial);
-    
+        // find layer according to Millepede layer definition
+        int millepedeLayer = getMillepedeLayer(isTopLayer, layer, isAxial, isHole);
+        
         // find alignment correction to this volume
-        AlignmentCorrection alignmentCorrection =  getHalfModuleAlignmentCorrection(isTopLayer, oldLayer);
+        AlignmentCorrection alignmentCorrection =  getHalfModuleAlignmentCorrection(isTopLayer, millepedeLayer);
         
         
         // find the module bundle that it will be added to
@@ -1898,7 +1898,101 @@
         return hm;
     }
 
-    
+
+    
+    
+    /* (non-Javadoc)
+     * @see org.lcsim.geometry.compact.converter.HPSTrackerBuilder#getMillepedeLayer(java.lang.String)
+     */
+    public int getMillepedeLayer(String name) {
+        
+        boolean isTopLayer = getHalfFromName(name).equals("top") ? true : false;
+    
+        // find layer
+        int layer = getLayerFromVolumeName(name);
+
+        // axial or stereo
+        boolean isAxial = isAxialFromName(name);
+
+        // use default layer numbering for L1-3    
+        if(layer<4) {
+            int l = getOldLayerDefinition(isTopLayer, layer, isAxial);
+            System.out.printf("%s: %s %d %s -> MP layer %d\n",getClass().getSimpleName(),isTopLayer?"top":"bottom", layer, isAxial?"axial":"stereo", l);
+            return l;
+        } 
+     
+        // hole or slot
+        boolean isHole = isHoleFromName(name);
+
+        return  getMillepedeLayer(isTopLayer, layer, isAxial, isHole);
+
+    }
+    
+    
+
+    /**
+     * Definition relating the sensors and layer number used in millepede for this detector.
+     * @param isTopLayer
+     * @param layer
+     * @param isAxial
+     * @param isHole
+     * @return
+     */
+    public int getMillepedeLayer(boolean isTopLayer, int layer, boolean isAxial, boolean isHole) {
+        int l = -1;
+        // use default layer numbering for L1-3
+        if(layer<4) {
+            l = getOldLayerDefinition(isTopLayer, layer, isAxial);
+        } else {
+            // Scheme: 
+            // For top modules axial layer is odd and stereo is even.
+            // Hole vs slot given by example below:
+            // e.g. top layer 4:
+            // axial -  hole: 7
+            // axial -  slot: 9
+            // stereo - hole: 8
+            // axial -  slot: 10
+            
+            l = 7 + (layer-4)*4;
+            int s = -1;
+            if(isTopLayer) {
+                s = 0;
+                if(isAxial) {
+                    s += 0;
+                } else {
+                    s += 1;
+                }
+                if(isHole) {
+                    s += 0;
+                } else {
+                    s += 2;
+                }
+            } else {
+                s = 0;
+                if(!isAxial) {
+                    s += 0;
+                } else {
+                    s += 1;
+                }
+                if(isHole) {
+                    s += 0;
+                } else {
+                    s += 2;
+                }
+            }
+            l = l + s;
+        }
+        
+        if(l<0) throw new RuntimeException("Error getting the millepede layer.");
+        
+        System.out.printf("%s: %s %d %s %s -> MP layer %d\n",getClass().getSimpleName(),isTopLayer?"top":"bottom", layer, isAxial?"axial":"stereo", isHole?"hole":"slot", l);
+
+        
+        return l;
+    }
+
+
+   
 
 }
 

Modified: projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/HPSTrackerBuilder.java
 =============================================================================
--- projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/HPSTrackerBuilder.java	(original)
+++ projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/HPSTrackerBuilder.java	Tue Dec  2 11:21:55 2014
@@ -93,6 +93,8 @@
 	 * @return the alignment correction for this half-module
 	 */
 	protected AlignmentCorrection getHalfModuleAlignmentCorrection(boolean isTopLayer, int layer) {
+        int rFound = 0;
+        int tFound = 0;
         double r[] = {0,0,0};
         double t[] = {0,0,0};
         for(MilleParameter p_loop: milleparameters) {
@@ -101,10 +103,15 @@
             if(paramIsTop==isTopLayer && paramLayer==layer) {
                 if(p_loop.getType()==1) {
                     t[p_loop.getDim()-1] = p_loop.getValue();
+                    tFound++;
                 } else if(p_loop.getType()==2) {
                     r[p_loop.getDim()-1] = p_loop.getValue();
+                    rFound++;
                 } 
             }
+        }
+        if(tFound!=3 || rFound!=3) {
+            throw new RuntimeException("Problem finding translation alignment parameters (found t " + tFound + " r " + rFound + ") for " + (isTopLayer?"top":"bottom") + " layer " + layer);
         }
         AlignmentCorrection c = new AlignmentCorrection();
         c.setTranslation(new BasicHep3Vector(t));
@@ -423,35 +430,42 @@
 	 * @return transformed vector.
 	 */
 	public static Hep3Vector transformToTracking(Hep3Vector vec, SurveyVolume geometry) {
-		int debug =0;
-		if(debug>0) System.out.printf("\ntransformToTracking: vec %s in local coordiantes of %s with mother %s\n", vec.toString(), geometry.getName(), geometry.getMother().getName().toString());
-		Hep3Vector vec_mother_coord = geometry.getCoord().getTransformation().transformed(vec);
-		if(debug>0) System.out.printf("vec_mother_coord %s\n",vec_mother_coord.toString());
-		if(geometry.getMother().getName().equals("trackingVolume")) {
-			if(debug>0) System.out.printf("reached tracking volume. Return \n");
-			return vec_mother_coord;
-		} else {
-			if(debug>0) System.out.printf("continue searching.\n");
-		}
-		return transformToTracking(vec_mother_coord, geometry.getMother());
-	}
-
-	/**
-	 * Get the layer number consistent with the old geometry definition. 
-	 * @param module name that contains layer and half information.
-	 * @return the layer.
-	 */
-	public static int getOldGeomDefLayerFromVolumeName(String name) {
-	    
-		String half = getHalfFromName(name);
-		int l = getLayerFromVolumeName(name);
-		boolean isTopLayer = false;
-		if(half=="top") isTopLayer=true;
-		else if(half=="bottom") isTopLayer = false;
-		else throw new RuntimeException("no half found from " + name);
-		boolean isAxial = isAxialFromName(name);
-		return getOldLayerDefinition(isTopLayer, l, isAxial);
-	}
+		return transformToParent(vec, geometry, "trackingVolume");
+	}
+
+	/**
+     * Find the vector in a mother volume coordinate system.
+     * @param vec - vector to transform
+     * @param geometry - geometry where vector is defined.
+     * @return transformed vector.
+     */
+    public static Hep3Vector transformToParent(Hep3Vector vec, SurveyVolume geometry, String targetName) {
+        int debug =0;
+        if(debug>0) System.out.printf("\ntransformToParent: vec %s in local coordiantes of %s\n", vec.toString(), geometry.getName());
+        if(geometry.getMother()==null) {
+            if(debug>0) System.out.printf("\ntransformToParent: no mother, return null\n", vec.toString(), geometry.getName());
+            return null;    
+        }
+        if(debug>0) System.out.printf("\ntransformToParent: vec %s in local coordiantes of %s with mother %s\n", vec.toString(), geometry.getName(), geometry.getMother().getName().toString());
+        SurveyCoordinateSystem coord = geometry.getCoord();
+        if(coord==null) {
+            throw new RuntimeException("transformToParent: no coordinate system found for %s, return null " + geometry.getName());
+        }
+        Hep3Vector vec_mother_coord = coord.getTransformation().transformed(vec);
+        if(debug>0) System.out.printf("vec_mother_coord %s\n",vec_mother_coord.toString());
+        if(geometry.getMother().getName().equals(targetName)) {
+            if(debug>0) System.out.printf("reached target \"%s\"tracking volume. Return \n", targetName);
+            return vec_mother_coord;
+        } else {
+            if(debug>0) System.out.printf("continue searching.\n");
+        }
+        return transformToParent(vec_mother_coord, geometry.getMother(), targetName);
+    }
+
+    
+	
+	
+	
 	
 	/**
      * Get axial or stereo key name from string
@@ -487,7 +501,25 @@
 	 * @param isAxial - axial or stereo sensor
 	 * @return
 	 */
-	public static int getOldLayerDefinition(boolean isTopLayer, int l, boolean isAxial) {
+     public int getOldGeomDefLayerFromVolumeName(String name) {
+        
+        String half = getHalfFromName(name);
+        int l = getLayerFromVolumeName(name);
+        boolean isTopLayer = false;
+        if(half=="top") isTopLayer=true;
+        else if(half=="bottom") isTopLayer = false;
+        else throw new RuntimeException("no half found from " + name);
+        boolean isAxial = isAxialFromName(name);
+        return getOldLayerDefinition(isTopLayer, l, isAxial);
+    }
+     
+     
+     /**
+      * Get the layer number consistent with the old geometry definition. 
+      * @param module name that contains layer and half information.
+      * @return the layer.
+      */
+    public int getOldLayerDefinition(boolean isTopLayer, int l, boolean isAxial) {
         int layer=-1;
         if(isAxial) {
             if(isTopLayer) {
@@ -505,7 +537,16 @@
         }
         return layer;
     }
-	
+
+    /**
+     * Definition of the millepede layer number.
+     * @param name of half-module or sensor
+     * @return millepede layer number.
+     */
+    abstract public int getMillepedeLayer(String name);
+    
+    
+
 	
 
 

Modified: projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/HPSTrackerGeometryDefinition.java
 =============================================================================
--- projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/HPSTrackerGeometryDefinition.java	(original)
+++ projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/HPSTrackerGeometryDefinition.java	Tue Dec  2 11:21:55 2014
@@ -99,12 +99,13 @@
         boolean isAxial = isAxialFromName(volName);
     
         // find layer according to old definition
-        int oldLayer = getOldLayerDefinition(isTopLayer, layer, isAxial);
+        int millepedeLayer = getMillepedeLayer(volName);
+        
         //if(isDebug()) System.out.printf("%s: half? %s layer %d oldlayer %d axial? %s\n", 
         //        this.getClass().getSimpleName(), isTopLayer?"top":"bottom", layer,oldLayer,isAxial?"yes":"no");
     
         // find alignment correction to this volume
-        AlignmentCorrection alignmentCorrection =  getHalfModuleAlignmentCorrection(isTopLayer, oldLayer);
+        AlignmentCorrection alignmentCorrection =  getHalfModuleAlignmentCorrection(isTopLayer, millepedeLayer);
         
         
         // find the module bundle that it will be added to
@@ -248,6 +249,8 @@
     }
     
     
+    
+
     /**
      * Tracking volume geometry definition. 
      */

Modified: projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/JavaSurveyVolume.java
 =============================================================================
--- projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/JavaSurveyVolume.java	(original)
+++ projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/JavaSurveyVolume.java	Tue Dec  2 11:21:55 2014
@@ -180,18 +180,24 @@
 		
 		//if(isDebug()) {
 			
-			System.out.printf("%s: box_center_base_local       %s\n", this.getClass().getSimpleName(), box_center_base_local.toString());
+		    System.out.printf("%s: SurveyVolume information for %s:\n", this.getClass().getSimpleName(), base.getName());
+            System.out.printf("%s: box_center_base_local       %s\n", this.getClass().getSimpleName(), box_center_base_local.toString());
 			System.out.printf("%s: box_center_base             %s\n", this.getClass().getSimpleName(), box_center_base.toString());
 			System.out.printf("%s: mother center               %s\n", this.getClass().getSimpleName(), base.getMother()==null?" <no mother> ":mother_center.toString());
 			System.out.printf("%s: box_center                  %s\n", this.getClass().getSimpleName(), box_center.toString());
 			System.out.printf("%s: pos                         %s\n", this.getClass().getSimpleName(), getPos().toString());
-			System.out.printf("%s: euler                       %s\n", this.getClass().getSimpleName(), lcdd_rot_angles.toString());
+			Hep3Vector box_center_tracking_xcheck = HPSTrackerBuilder.transformToTracking(box_center_base_local, base);
+            System.out.printf("%s: box_center_tracking_xcheck  %s (for %s)\n", this.getClass().getSimpleName(), box_center_tracking_xcheck==null ? " <null> " : box_center_tracking_xcheck.toString(),base.getName());
+            Hep3Vector box_center_envelope_xcheck2 = HPSTrackerBuilder.transformToParent(box_center_base_local, base, "base");
+            System.out.printf("%s: box_center_base_xcheck2     %s (for %s)\n", this.getClass().getSimpleName(), box_center_envelope_xcheck2==null ? " <null> " : box_center_envelope_xcheck2.toString(),base.getName());
+            if(box_center_envelope_xcheck2!=null) {
+                Hep3Vector box_center_envelope_xcheck2_inch = VecOp.mult(0.0393701, box_center_envelope_xcheck2);
+                System.out.printf("%s: box_center_base_xcheck2_in  %s (for %s)\n", this.getClass().getSimpleName(), box_center_envelope_xcheck2_inch==null ? " <null> " : box_center_envelope_xcheck2_inch.toString(),base.getName());
+            }
+            System.out.printf("%s: euler                       %s\n", this.getClass().getSimpleName(), lcdd_rot_angles.toString());
 			System.out.printf("%s: rot                         %s\n", this.getClass().getSimpleName(), getRot().toString());
 
-			//calculate the position in tracking volume separately as a xcheck
-			Hep3Vector box_center_tracking_xcheck = HPSTrackerBuilder.transformToTracking(box_center_base_local, base);
-			System.out.printf("%s: box_center_tracking_xcheck  %s for %s\n", this.getClass().getSimpleName(), box_center_tracking_xcheck.toString(),base.getName());
-		//}
+			//}
 		
 	}
 

Modified: projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/LCDDSurveyVolume.java
 =============================================================================
--- projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/LCDDSurveyVolume.java	(original)
+++ projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/LCDDSurveyVolume.java	Tue Dec  2 11:21:55 2014
@@ -169,12 +169,13 @@
         Hep3Vector lcdd_rot_angles = TransformationUtils.getCardanAngles(base_u, base_v, base_w, unit_u, unit_v, unit_w);
         
 		
-		// Create the LCDD position
+		// Create the LCDD position and rotation
 		setPos(new Position(getName() + "_position",box_center.x(), box_center.y(), box_center.z()));
-		
 		setRot(new Rotation(getName() + "_rotation",lcdd_rot_angles.x(), lcdd_rot_angles.y(), lcdd_rot_angles.z()));
+		
 		if(isDebug()) {
-			System.out.printf("%s: box_center_base_local  %s\n", this.getClass().getSimpleName(), box_center_base_local.toString());
+		    System.out.printf("%s: SurveyVolume information for %s:\n", this.getClass().getSimpleName(), base.getName());
+            System.out.printf("%s: box_center_base_local  %s\n", this.getClass().getSimpleName(), box_center_base_local.toString());
 			System.out.printf("%s: box_center_base        %s\n", this.getClass().getSimpleName(), box_center_base.toString());
 			System.out.printf("%s: mother center          %s\n", this.getClass().getSimpleName(), mother_center.toString());
 			System.out.printf("%s: box_center             %s\n", this.getClass().getSimpleName(), box_center.toString());
@@ -184,7 +185,7 @@
 			
 			//calculate the position in tracking volume separately as a xcheck
 			Hep3Vector box_center_tracking_xcheck = HPSTrackerBuilder.transformToTracking(box_center_base_local, base);
-			System.out.printf("%s: box_center_tracking_xcheck  %s\n", this.getClass().getSimpleName(), box_center_tracking_xcheck.toString());
+			System.out.printf("%s: box_center_tracking_xcheck  %s (for %s)\n", this.getClass().getSimpleName(), box_center_tracking_xcheck.toString(), base.getName());
 		}
 		
 	}

Modified: projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/MilleParameter.java
 =============================================================================
--- projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/MilleParameter.java	(original)
+++ projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/MilleParameter.java	Tue Dec  2 11:21:55 2014
@@ -107,4 +107,6 @@
 	public String toString() {
 	    return String.format("Milleparameter id=%d half=%d type=%d dim=%d sensor=%d value=%f", this.getId(), this.getHalf(), this.getType(), this.getDim(), this.getSensor(), this.getValue());
 	}
+
+
 }

Modified: projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/lcdd/HPSTracker2014Base.java
 =============================================================================
--- projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/lcdd/HPSTracker2014Base.java	(original)
+++ projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/lcdd/HPSTracker2014Base.java	Tue Dec  2 11:21:55 2014
@@ -237,7 +237,7 @@
 
             //use the old definition of layer number to be consistent
             //int layer = HPSTestRunTracker2014Builder.getLayerFromVolumeName(geometryObject.getName());
-            int layer = HPSTrackerBuilder.getOldGeomDefLayerFromVolumeName(geometryObject.getName());
+            int layer = builder._builder.getOldGeomDefLayerFromVolumeName(geometryObject.getName());
             if(_debug) System.out.printf("%s: physVolId layer = %d (compare with new layer %d)\n", getClass().getSimpleName(),layer, HPSTrackerBuilder.getLayerFromVolumeName(geometryObject.getName()));
 
             

Modified: projects/lcsim/trunk/detector-framework/src/test/resources/org/lcsim/geometry/subdetector/HPSTracker2014.xml
 =============================================================================
--- projects/lcsim/trunk/detector-framework/src/test/resources/org/lcsim/geometry/subdetector/HPSTracker2014.xml	(original)
+++ projects/lcsim/trunk/detector-framework/src/test/resources/org/lcsim/geometry/subdetector/HPSTracker2014.xml	Tue Dec  2 11:21:55 2014
@@ -114,6 +114,14 @@
             <millepede_constant name="11108" value="0.0"/>
             <millepede_constant name="11109" value="0.0"/>
             <millepede_constant name="11110" value="0.0"/>
+            <millepede_constant name="11111" value="0.0"/>
+            <millepede_constant name="11112" value="0.0"/>
+            <millepede_constant name="11113" value="0.0"/>
+            <millepede_constant name="11114" value="0.0"/>
+            <millepede_constant name="11115" value="0.0"/>
+            <millepede_constant name="11116" value="0.0"/>
+            <millepede_constant name="11117" value="0.0"/>
+            <millepede_constant name="11118" value="0.0"/>
 
             <millepede_constant name="11201" value="0.0"/>
             <millepede_constant name="11202" value="0.0"/>
@@ -125,6 +133,14 @@
             <millepede_constant name="11208" value="0.0"/>
             <millepede_constant name="11209" value="0.0"/>
             <millepede_constant name="11210" value="0.0"/>
+            <millepede_constant name="11211" value="0.0"/>
+            <millepede_constant name="11212" value="0.0"/>
+            <millepede_constant name="11213" value="0.0"/>
+            <millepede_constant name="11214" value="0.0"/>
+            <millepede_constant name="11215" value="0.0"/>
+            <millepede_constant name="11216" value="0.0"/>
+            <millepede_constant name="11217" value="0.0"/>
+            <millepede_constant name="11218" value="0.0"/>
 
             <millepede_constant name="11301" value="0.0"/>
             <millepede_constant name="11302" value="0.0"/>
@@ -136,6 +152,15 @@
             <millepede_constant name="11308" value="0.0"/>
             <millepede_constant name="11309" value="0.0"/>
             <millepede_constant name="11310" value="0.0"/>
+            <millepede_constant name="11311" value="0.0"/>
+            <millepede_constant name="11312" value="0.0"/>
+            <millepede_constant name="11313" value="0.0"/>
+            <millepede_constant name="11314" value="0.0"/>
+            <millepede_constant name="11315" value="0.0"/>
+            <millepede_constant name="11316" value="0.0"/>
+            <millepede_constant name="11317" value="0.0"/>
+            <millepede_constant name="11318" value="0.0"/>
+            
             
             <!-- top half-module rotations -->
             
@@ -149,6 +174,14 @@
             <millepede_constant name="12108" value="0.0"/>
             <millepede_constant name="12109" value="0.0"/>
             <millepede_constant name="12110" value="0.0"/>
+            <millepede_constant name="12111" value="0.0"/>
+            <millepede_constant name="12112" value="0.0"/>
+            <millepede_constant name="12113" value="0.0"/>
+            <millepede_constant name="12114" value="0.0"/>
+            <millepede_constant name="12115" value="0.0"/>
+            <millepede_constant name="12116" value="0.0"/>
+            <millepede_constant name="12117" value="0.0"/>
+            <millepede_constant name="12118" value="0.0"/>
 
             <millepede_constant name="12201" value="0.0"/>
             <millepede_constant name="12202" value="0.0"/>
@@ -160,6 +193,14 @@
             <millepede_constant name="12208" value="0.0"/>
             <millepede_constant name="12209" value="0.0"/>
             <millepede_constant name="12210" value="0.0"/>
+            <millepede_constant name="12211" value="0.0"/>
+            <millepede_constant name="12212" value="0.0"/>
+            <millepede_constant name="12213" value="0.0"/>
+            <millepede_constant name="12214" value="0.0"/>
+            <millepede_constant name="12215" value="0.0"/>
+            <millepede_constant name="12216" value="0.0"/>
+            <millepede_constant name="12217" value="0.0"/>
+            <millepede_constant name="12218" value="0.0"/>
 
             <millepede_constant name="12301" value="0.0"/>
             <millepede_constant name="12302" value="0.0"/>
@@ -171,6 +212,14 @@
             <millepede_constant name="12308" value="0.0"/>
             <millepede_constant name="12309" value="0.0"/>
             <millepede_constant name="12310" value="0.0"/>
+            <millepede_constant name="12311" value="0.0"/>
+            <millepede_constant name="12312" value="0.0"/>
+            <millepede_constant name="12313" value="0.0"/>
+            <millepede_constant name="12314" value="0.0"/>
+            <millepede_constant name="12315" value="0.0"/>
+            <millepede_constant name="12316" value="0.0"/>
+            <millepede_constant name="12317" value="0.0"/>
+            <millepede_constant name="12318" value="0.0"/>
             
             <!-- bottom half-module translations -->
             
@@ -184,7 +233,15 @@
             <millepede_constant name="21108" value="0.0"/>
             <millepede_constant name="21109" value="0.0"/>
             <millepede_constant name="21110" value="0.0"/>
-
+            <millepede_constant name="21111" value="0.0"/>
+            <millepede_constant name="21112" value="0.0"/>
+            <millepede_constant name="21113" value="0.0"/>
+            <millepede_constant name="21114" value="0.0"/>
+            <millepede_constant name="21115" value="0.0"/>
+            <millepede_constant name="21116" value="0.0"/>
+            <millepede_constant name="21117" value="0.0"/>
+            <millepede_constant name="21118" value="0.0"/>
+            
             <millepede_constant name="21201" value="0.0"/>
             <millepede_constant name="21202" value="0.0"/>
             <millepede_constant name="21203" value="0.0"/>
@@ -195,6 +252,14 @@
             <millepede_constant name="21208" value="0.0"/>
             <millepede_constant name="21209" value="0.0"/>
             <millepede_constant name="21210" value="0.0"/>
+            <millepede_constant name="21211" value="0.0"/>
+            <millepede_constant name="21212" value="0.0"/>
+            <millepede_constant name="21213" value="0.0"/>
+            <millepede_constant name="21214" value="0.0"/>
+            <millepede_constant name="21215" value="0.0"/>
+            <millepede_constant name="21216" value="0.0"/>
+            <millepede_constant name="21217" value="0.0"/>
+            <millepede_constant name="21218" value="0.0"/>
 
             <millepede_constant name="21301" value="0.0"/>
             <millepede_constant name="21302" value="0.0"/>
@@ -206,6 +271,14 @@
             <millepede_constant name="21308" value="0.0"/>
             <millepede_constant name="21309" value="0.0"/>
             <millepede_constant name="21310" value="0.0"/>
+            <millepede_constant name="21311" value="0.0"/>
+            <millepede_constant name="21312" value="0.0"/>
+            <millepede_constant name="21313" value="0.0"/>
+            <millepede_constant name="21314" value="0.0"/>
+            <millepede_constant name="21315" value="0.0"/>
+            <millepede_constant name="21316" value="0.0"/>
+            <millepede_constant name="21317" value="0.0"/>
+            <millepede_constant name="21318" value="0.0"/>
             
             <!-- bottom half-module rotations -->
             
@@ -219,6 +292,14 @@
             <millepede_constant name="22108" value="0.0"/>
             <millepede_constant name="22109" value="0.0"/>
             <millepede_constant name="22110" value="0.0"/>
+            <millepede_constant name="22111" value="0.0"/>
+            <millepede_constant name="22112" value="0.0"/>
+            <millepede_constant name="22113" value="0.0"/>
+            <millepede_constant name="22114" value="0.0"/>
+            <millepede_constant name="22115" value="0.0"/>
+            <millepede_constant name="22116" value="0.0"/>
+            <millepede_constant name="22117" value="0.0"/>
+            <millepede_constant name="22118" value="0.0"/>
 
             <millepede_constant name="22201" value="0.0"/>
             <millepede_constant name="22202" value="0.0"/>
@@ -230,6 +311,14 @@
             <millepede_constant name="22208" value="0.0"/>
             <millepede_constant name="22209" value="0.0"/>
             <millepede_constant name="22210" value="0.0"/>
+            <millepede_constant name="22211" value="0.0"/>
+            <millepede_constant name="22212" value="0.0"/>
+            <millepede_constant name="22213" value="0.0"/>
+            <millepede_constant name="22214" value="0.0"/>
+            <millepede_constant name="22215" value="0.0"/>
+            <millepede_constant name="22216" value="0.0"/>
+            <millepede_constant name="22217" value="0.0"/>
+            <millepede_constant name="22218" value="0.0"/>
 
             <millepede_constant name="22301" value="0.0"/>
             <millepede_constant name="22302" value="0.0"/>
@@ -241,6 +330,14 @@
             <millepede_constant name="22308" value="0.0"/>
             <millepede_constant name="22309" value="0.0"/>
             <millepede_constant name="22310" value="0.0"/>
+            <millepede_constant name="22311" value="0.0"/>
+            <millepede_constant name="22312" value="0.0"/>
+            <millepede_constant name="22313" value="0.0"/>
+            <millepede_constant name="22314" value="0.0"/>
+            <millepede_constant name="22315" value="0.0"/>
+            <millepede_constant name="22316" value="0.0"/>
+            <millepede_constant name="22317" value="0.0"/>
+            <millepede_constant name="22318" value="0.0"/>
             
             
             <!-- top support tilt angles -->

########################################################################
Use REPLY-ALL to reply to list

To unsubscribe from the LCDET-SVN list, click the following link:
https://listserv.slac.stanford.edu/cgi-bin/wa?SUBED1=LCDET-SVN&A=1