LISTSERV mailing list manager LISTSERV 16.5

Help for LCDET-SVN Archives


LCDET-SVN Archives

LCDET-SVN Archives


LCDET-SVN@LISTSERV.SLAC.STANFORD.EDU


View:

Message:

[

First

|

Previous

|

Next

|

Last

]

By Topic:

[

First

|

Previous

|

Next

|

Last

]

By Author:

[

First

|

Previous

|

Next

|

Last

]

Font:

Proportional Font

LISTSERV Archives

LISTSERV Archives

LCDET-SVN Home

LCDET-SVN Home

LCDET-SVN  December 2014

LCDET-SVN December 2014

Subject:

r3437 - in /projects/lcsim/trunk/detector-framework/src: main/java/org/lcsim/detector/converter/compact/ main/java/org/lcsim/geometry/compact/converter/ main/java/org/lcsim/geometry/compact/converter/lcdd/ test/resources/org/lcsim/geometry/subdetector/

From:

[log in to unmask]

Reply-To:

Notification of commits to the lcdet svn repository <[log in to unmask]>

Date:

Tue, 2 Dec 2014 19:22:02 -0000

Content-Type:

text/plain

Parts/Attachments:

Parts/Attachments

text/plain (1530 lines)

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

Top of Message | Previous Page | Permalink

Advanced Options


Options

Log In

Log In

Get Password

Get Password


Search Archives

Search Archives


Subscribe or Unsubscribe

Subscribe or Unsubscribe


Archives

January 2016
December 2015
November 2015
October 2015
September 2015
August 2015
July 2015
June 2015
May 2015
April 2015
March 2015
February 2015
January 2015
December 2014
November 2014
October 2014
September 2014
August 2014
July 2014
June 2014
May 2014
April 2014
March 2014
February 2014
January 2014
December 2013
November 2013

ATOM RSS1 RSS2



LISTSERV.SLAC.STANFORD.EDU

Secured by F-Secure Anti-Virus CataList Email List Search Powered by the LISTSERV Email List Manager

Privacy Notice, Security Notice and Terms of Use