Print

Print


Author: phansson
Date: Fri Nov 21 16:45:51 2014
New Revision: 3426

Log:
Adding L4-6 half-modules consisting, for now, of sensor and lamination (visualization help essentially)

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/HPSTestRunTracker2014JavaBuilder.java
    projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/HPSTestRunTracker2014LCDDBuilder.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/HPSTracker2014LCDDBuilder.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/HPSTrackerLCDDBuilder.java

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	Fri Nov 21 16:45:51 2014
@@ -5,7 +5,6 @@
 
 import hep.physics.vec.BasicHep3Vector;
 
-import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.commons.math3.geometry.euclidean.threed.Rotation;
@@ -86,9 +85,6 @@
         SupportPlateTop supportPlateTop = new SupportPlateTop("support_plate_top", base, supportTop, "Aluminum");
         surveyVolumes.add(supportPlateTop);
 
-        // Modules are built using an encapsulating class that keeps tracks of all components
-        modules = new ArrayList<ModuleBundle>();
-
         for(int l=1; l<=5;++l) {
             if(doLayer(l)) {
                 if(doBottom) makeModuleBundle(l,"bottom");
@@ -148,7 +144,7 @@
 
 
         // create the bundle for this module
-        ModuleBundle bundle = new ModuleBundle(module);
+        TestRunModuleBundle bundle = new TestRunModuleBundle(module);
         addModuleBundle(bundle);
 
         if(doAxial) makeHalfModule("axial", module);
@@ -191,7 +187,7 @@
             throw new RuntimeException("wrong layer for " + volName);
         }
     
-        ModuleBundle bundle = getModuleBundle(mother);
+        TestRunModuleBundle bundle = (TestRunModuleBundle) getModuleBundle(mother);
         bundle.coldBlock = coldBlock;
     }
     
@@ -887,8 +883,8 @@
 
 
     public static abstract class BaseModule extends SurveyVolume {
-        private int layer;
-        private String half;
+        protected int layer;
+        protected String half;
 
         public BaseModule(String name, SurveyVolume mother, AlignmentCorrection alignmentCorrection, int layer, String half) {
             super(name, mother, alignmentCorrection);
@@ -1738,15 +1734,15 @@
         }
     }       
 
+    
+    
+   
 
     public static class TestRunHalfModuleBundle extends HalfModuleBundle {
-        public SurveyVolume sensor = null;
-        public SurveyVolume activeSensor = null;
-        protected SurveyVolume lamination = null;
         protected SurveyVolume carbonFiber = null;
         protected SurveyVolume hybrid = null;
-        TestRunHalfModuleBundle(TestRunHalfModule hm) {         
-            halfModule = hm;
+        TestRunHalfModuleBundle(SurveyVolume hm) {         
+            super(hm);
         }
         public void print() {
             System.out.printf("%s: %s\n", this.getClass().getSimpleName(),halfModule.getName());
@@ -1769,6 +1765,34 @@
     }
 
 
+    /* (non-Javadoc)
+     * @see org.lcsim.geometry.compact.converter.HPSTrackerGeometryDefinition#getHalfModuleBundle(org.lcsim.geometry.compact.converter.HPSTestRunTracker2014GeometryDefinition.BaseModule, java.lang.String)
+     */
+    protected HalfModuleBundle getHalfModuleBundle(BaseModule module, String halfModuleName) {
+        BaseModuleBundle m = getModuleBundle(module.getLayer(), module.getHalf());
+        HalfModuleBundle hm = null;
+        // TODO this needs to change when I build quarter-modules for the long half-modules.
+        if(m!=null) {
+            if( m instanceof TestRunModuleBundle) {   
+                TestRunModuleBundle mtr = (TestRunModuleBundle) m;
+                if(halfModuleName.contains("axial")) {
+                    hm = mtr.halfModuleAxial;
+                }
+                else if(halfModuleName.contains("stereo")) {
+                    hm = mtr.halfModuleStereo;
+                }
+                else {
+                    throw new RuntimeException("No axial or stereo string found in half module bundle name " + halfModuleName);
+                }
+            }
+            else {
+                throw new RuntimeException("The type of this module bundle is incorrect. Should be a TestRunModuleBundle.");
+            }
+        } else {
+            throw new RuntimeException("No module found for " + module.getLayer() + " and half " + module.getHalf());
+        }
+        return hm;
+    }
 
 
 

Modified: projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/HPSTestRunTracker2014JavaBuilder.java
 =============================================================================
--- projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/HPSTestRunTracker2014JavaBuilder.java	(original)
+++ projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/HPSTestRunTracker2014JavaBuilder.java	Fri Nov 21 16:45:51 2014
@@ -15,7 +15,8 @@
 import org.lcsim.geometry.compact.converter.HPSTestRunTracker2014GeometryDefinition.SupportTop;
 import org.lcsim.geometry.compact.converter.HPSTestRunTracker2014GeometryDefinition.TestRunHalfModuleBundle;
 import org.lcsim.geometry.compact.converter.HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope;
-import org.lcsim.geometry.compact.converter.HPSTrackerBuilder.ModuleBundle;
+import org.lcsim.geometry.compact.converter.HPSTrackerBuilder.BaseModuleBundle;
+import org.lcsim.geometry.compact.converter.HPSTrackerGeometryDefinition.TestRunModuleBundle;
 
 
 /**
@@ -86,8 +87,9 @@
 		if(isDebug()) System.out.printf("%s: build JAVA modules\n", getClass().getSimpleName());
 
 		// Loop over all modules created
-		for(ModuleBundle m : _builder.modules) {
-			if(isDebug()) { 
+		for(BaseModuleBundle mod : _builder.modules) {
+			TestRunModuleBundle m = (TestRunModuleBundle) mod;
+		    if(isDebug()) { 
 				System.out.printf("%s: build module %s (layer %d half %s)\n", getClass().getSimpleName(),m.module.getName(),m.getLayer(),m.getHalf());
 				m.print();
 			}
@@ -138,7 +140,7 @@
 	 * @param bundle - module to be added
 	 * @param mother - mother JAVA geometry object
 	 */
-	private void addModule(ModuleBundle bundle, JavaSurveyVolume mother) {
+	private void addModule(TestRunModuleBundle bundle, JavaSurveyVolume mother) {
 		
 		if(isDebug()) {
 			System.out.printf("%s: addModule %s containing:\n",this.getClass().getSimpleName(), bundle.module.getName());

Modified: projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/HPSTestRunTracker2014LCDDBuilder.java
 =============================================================================
--- projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/HPSTestRunTracker2014LCDDBuilder.java	(original)
+++ projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/HPSTestRunTracker2014LCDDBuilder.java	Fri Nov 21 16:45:51 2014
@@ -9,8 +9,9 @@
 import org.lcsim.geometry.compact.converter.HPSTestRunTracker2014GeometryDefinition.SupportTop;
 import org.lcsim.geometry.compact.converter.HPSTestRunTracker2014GeometryDefinition.TestRunHalfModuleBundle;
 import org.lcsim.geometry.compact.converter.HPSTestRunTracker2014GeometryDefinition.TrackerEnvelope;
+import org.lcsim.geometry.compact.converter.HPSTrackerBuilder.BaseModuleBundle;
 import org.lcsim.geometry.compact.converter.HPSTrackerBuilder.HalfModuleBundle;
-import org.lcsim.geometry.compact.converter.HPSTrackerBuilder.ModuleBundle;
+import org.lcsim.geometry.compact.converter.HPSTrackerGeometryDefinition.TestRunModuleBundle;
 import org.lcsim.geometry.compact.converter.lcdd.util.LCDD;
 import org.lcsim.geometry.compact.converter.lcdd.util.SensitiveDetector;
 import org.lcsim.geometry.compact.converter.lcdd.util.Volume;
@@ -76,8 +77,8 @@
 		if(isDebug()) System.out.printf("%s: build modules\n", getClass().getSimpleName());
 
 		// Loop over all modules created
-		for(ModuleBundle m : _builder.modules) {
-		    
+		for(BaseModuleBundle mod : _builder.modules) {
+		    TestRunModuleBundle m = (TestRunModuleBundle) mod;
 			if(isDebug()) { 
 				System.out.printf("%s: module layer %d half %s\n", getClass().getSimpleName(),m.getLayer(),m.getHalf());
 				m.print();
@@ -98,7 +99,7 @@
 			if(isDebug()) System.out.printf("%s: found mother %s for module layer %d half %s\n", getClass().getSimpleName(),mother.getName(),m.getLayer(),m.getHalf());
 
 			// add the module to the list of objects that will be added to LCDD
-			addModule(m, mother);
+			addTestRunModule(m, mother);
 
 		}
 
@@ -126,14 +127,14 @@
 	 * @param bundle - module to be added
 	 * @param mother - mother LCDD geometry object
 	 */
-	protected void addModule(ModuleBundle bundle, LCDDSurveyVolume mother) {
+	protected void addTestRunModule(TestRunModuleBundle bundle, LCDDSurveyVolume mother) {
 		// This could perhaps be fixed if there is a relation with daughters in geometry definition?
 		// create the module
 		LCDDSurveyVolume lcddM = new LCDDSurveyVolume(bundle.module, lcdd, mother);
 		add(lcddM);
-		if(bundle.halfModuleAxial!=null)  addHalfModule(bundle.halfModuleAxial,lcddM);
+		if(bundle.halfModuleAxial!=null)  addTestRunHalfModule(bundle.halfModuleAxial,lcddM);
 		if(bundle.coldBlock!=null)        add(new LCDDSurveyVolume(bundle.coldBlock, lcdd, lcddM));		
-		if(bundle.halfModuleStereo!=null) addHalfModule((TestRunHalfModuleBundle)bundle.halfModuleStereo,lcddM);
+		if(bundle.halfModuleStereo!=null) addTestRunHalfModule((TestRunHalfModuleBundle)bundle.halfModuleStereo,lcddM);
 //        if(bundle.halfModuleAxial!=null)  addHalfModule((TestRunHalfModuleBundle)bundle.halfModuleAxial,lcddM);
 //        if(bundle.coldBlock!=null)        add(new LCDDSurveyVolume(bundle.coldBlock, lcdd, lcddM));     
 //        if(bundle.halfModuleStereo!=null) addHalfModule((TestRunHalfModuleBundle)bundle.halfModuleStereo,lcddM);
@@ -145,7 +146,7 @@
 	 * @param bundle - module to be added
 	 * @param mother - mother LCDD geometry object
 	 */
-	private void addHalfModule(HalfModuleBundle bundle2, LCDDSurveyVolume mother) {
+	private void addTestRunHalfModule(HalfModuleBundle bundle2, LCDDSurveyVolume mother) {
 		// This could perhaps be fixed if there is a relation with daughters in geometry definition?
 	    TestRunHalfModuleBundle bundle = (TestRunHalfModuleBundle) bundle2;
 	    

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	Fri Nov 21 16:45:51 2014
@@ -7,6 +7,7 @@
 import hep.physics.vec.Hep3Vector;
 import hep.physics.vec.VecOp;
 
+import org.apache.commons.lang3.NotImplementedException;
 import org.apache.commons.math3.geometry.euclidean.threed.Rotation;
 import org.apache.commons.math3.geometry.euclidean.threed.Vector3D;
 import org.jdom.Element;
@@ -15,6 +16,7 @@
 import org.lcsim.geometry.compact.converter.HPSTestRunTracker2014GeometryDefinition.HalfModuleLamination;
 import org.lcsim.geometry.compact.converter.HPSTestRunTracker2014GeometryDefinition.Sensor;
 import org.lcsim.geometry.compact.converter.HPSTestRunTracker2014GeometryDefinition.TestRunHalfModule;
+import org.lcsim.geometry.compact.converter.HPSTrackerBuilder.HalfModuleBundle;
 
 
 /**
@@ -35,7 +37,7 @@
         doColdBlock = false;
         doBottom = true;
         doTop = false;
-        layerBitMask = 0x7;
+        layerBitMask = 0x3F;
     }
 
 
@@ -73,7 +75,7 @@
         UChannelL13BottomPlate uChannelL13BottomPlate = new UChannelL13BottomPlate("support_plate_bottom_L13", uChannelL13Bottom, null); 
         surveyVolumes.add(uChannelL13BottomPlate);
         
-        UChannelL46Bottom uChannelL46Bottom = new UChannelL46Bottom("support_bottom_L46", svtBox, null, svtBoxBasePlate);
+        UChannelL46Bottom uChannelL46Bottom = new UChannelL46Bottom("support_bottom_L46", svtBox, null);
         surveyVolumes.add(uChannelL46Bottom);
         
         UChannelL46BottomPlate uChannelL46BottomPlate = new UChannelL46BottomPlate("support_plate_bottom_L46", uChannelL46Bottom, null);
@@ -104,7 +106,7 @@
      * @SurveyVolume volume defining the pair spectrometer (PS) vacuum chamber
      * Reference: tracking volume coordinate system
      * Origin: same as reference
-     * Orientation:  same as reference
+     * Orientation:  u - points in x direction (towards positron side), v - points upstream
      * 
      * @author Per Hansson Adrian <[log in to unmask]>
      *
@@ -140,7 +142,7 @@
      * @SurveyVolume volume defining the SVT box envelope 
      * Reference: PS vacuum chamber coordinate system.
      * Origin: intersection of midplanes vertically and horizontally
-     * Orientation: u - width towards positron side, v - length towards upstream
+     * Orientation: same as reference
      * 
      * @author Per Hansson Adrian <[log in to unmask]>
      *
@@ -392,7 +394,7 @@
         public final static double pocket_depth_L1 = 0.025;
         public final static double pocket_depth_L2 = pocket_depth_L1 + 0.059;
         public final static double pocket_depth_L3 = pocket_depth_L2 + 0.059;
-        public final static double hole_to_hole_x =3.937*inch;
+        public final static double module_mounting_hole_to_hole_x =3.937*inch;
         
         public UChannelL13Plate(String name, SurveyVolume m,
                 AlignmentCorrection alignmentCorrection) {
@@ -461,7 +463,7 @@
     
     /**
      * @SurveyVolume volume defining the coordinate system of the u-channel 
-     *  Reference: SVTBox base plate coordinate system
+     *  Reference: SVTBox coordinate system
      *  Origin: midpoint between upstream survey cones
      *  Orientation: u - width pointing towards electron side, v - pointing along the U-channel in the beam direction
      *  
@@ -477,14 +479,19 @@
         public final static double cone_to_edge_of_plate_y = 2.75*inch; 
         public final static double side_plate_cone_y = 2.0*inch;
         public final static double cone_to_L1_hole_y = cone_to_edge_of_plate_y - kin_mount_to_edge_of_plate_y; 
+        // position of positron side upstream cone surface/intercept with normal from center of cone
+        private final static double cone_x =  -6.977*inch;
+        private final static double cone_y = SvtBox.length/2.0 - 31.668*inch;
+        private final static double cone_z = -0.3316*inch;
+        
+        
         
         
         
         
         public UChannelL46Bottom(String name, SurveyVolume m,
-                AlignmentCorrection alignmentCorrection,
-                SurveyVolume ref) {
-            super(name, m, alignmentCorrection, ref);
+                AlignmentCorrection alignmentCorrection) {
+            super(name, m, alignmentCorrection);
             init();
         }
         protected void setCenter() {
@@ -497,14 +504,10 @@
             setBoxDim(width,length,height);
         }
         protected void setPos() {
-            //locate cone from pin hole
-//            final double ball_pos_x = 4*inch;
-//            final double ball_pos_y = (4.175 + 2*3.937) * inch; 
-//            final double ball_pos_z = side_plate_cone_y; // TODO need to find distance to surface from kin mount
-            final double ball_pos_x = 0.0;
-            final double ball_pos_y = 0.0;
-            final double ball_pos_z = 0.0;
-            
+            //locate coordinate system from cone in mother coordinate system
+            final double ball_pos_x = cone_x + width/2.0;
+            final double ball_pos_y = cone_y;
+            final double ball_pos_z = cone_z;
             ballPos = new BasicHep3Vector(ball_pos_x, ball_pos_y, ball_pos_z);
             veePos = new BasicHep3Vector(ballPos.x()-1, ballPos.y(), ballPos.z());
             flatPos = new BasicHep3Vector(ballPos.x(), ballPos.y()-1, ballPos.z());
@@ -518,7 +521,7 @@
         public final static double pocket_depth_L4 = 0.1;
         public final static double pocket_depth_L5 = pocket_depth_L4 + 0.118;
         public final static double pocket_depth_L6 = pocket_depth_L5 + 0.118;
-        public final static double hole_to_hole_x =7.874*inch;
+        public final static double module_mounting_hole_to_hole_x =7.874*inch;
         
         public UChannelL46Plate(String name, SurveyVolume m,
                 AlignmentCorrection alignmentCorrection) {
@@ -585,8 +588,8 @@
     /**
      * @SurveyVolume volume defining the coordinate system of module L1-3
      * Reference:  @UChannelL13Bottom coordinate system
-     * Origin:  hole position on mounting surface (sensor side)
-     * Orientation: u - is normal to the surface pointing vertically down, v - points along module away from hybrid side.
+     * Origin:  hole position on mounting surface (on electron side)
+     * Orientation: u - is normal to the surface pointing vertically down, v - points along module away from hybrid side (i.e. positron direction).
      * 
      * @author Per Hansson Adrian <[log in to unmask]>
      *
@@ -656,7 +659,7 @@
         protected Hep3Vector getHole() {
             //hole position (sensor side)
             double x = hole_to_center_of_plate_width_dir;
-            double y = UChannelL13BottomPlate.hole_to_hole_x;
+            double y = UChannelL13BottomPlate.module_mounting_hole_to_hole_x;
             double z = -UChannelL13Bottom.side_plate_cone_y - UChannelL13Plate.pocket_depth_L2;
             return new BasicHep3Vector(x, y, z);
         }
@@ -673,7 +676,7 @@
         protected Hep3Vector getHole() {
             //hole position (sensor side)
             double x = hole_to_center_of_plate_width_dir;
-            double y = 2*UChannelL13BottomPlate.hole_to_hole_x;
+            double y = 2*UChannelL13BottomPlate.module_mounting_hole_to_hole_x;
             double z = -UChannelL13Bottom.side_plate_cone_y - UChannelL13Plate.pocket_depth_L3;
             return new BasicHep3Vector(x, y, z);
         }
@@ -681,6 +684,275 @@
     }
         
     
+    
+    
+    
+   
+    
+    /**
+     * @SurveyVolume volume defining the coordinate system of module L4-6
+     * Reference:  @UChannelL46Bottom coordinate system
+     * Origin:  hole position on mounting surface (electron side)
+     * Orientation: u - is normal to the surface pointing vertically down, v - points along module towards positron side.
+     * 
+     * @author Per Hansson Adrian <[log in to unmask]>
+     *
+     */
+    public abstract static class ModuleL46 extends BaseModule {
+        protected final static double hole_to_center_of_plate_width_dir = 5.875*inch;
+        protected final static double hole_to_module_edge_height_dir = 0.875*inch;
+        protected static final double hole_to_module_edge_length_dir = 0.25*inch;
+        protected final static double box_extra_length = 10.0;// random at this point
+        protected final static double box_extra_height = 15.0;// random at this point
+        protected final static double box_extra_width = 0.5*inch;// random at this point
+        
+        private static final double tension_lever_y = 2.5*inch;
+        // TODO the dimension of the L4-6 module is completely made up
+        public static final double length = 12.25*inch;
+        public static final double height = 1.0*inch;
+        public static final double width = tension_lever_y + 0.04*inch + box_extra_width;
+        
+        public ModuleL46(String name, SurveyVolume mother, AlignmentCorrection alignmentCorrection, SurveyVolume ref) {
+            super(name, mother, alignmentCorrection, ref, getLayerFromVolumeName(name), getHalfFromName(name));
+            
+        }
+        protected void setCenter() {
+            final double x = -width/2.0;
+            final double y = -hole_to_module_edge_length_dir + length/2.0;
+            final double z = -hole_to_module_edge_height_dir + height/2.0;
+            setCenter(x,y,z);
+        }
+        protected void setBoxDim() {
+            setBoxDim(width, length, height);
+        }
+        protected void setPos() {
+            ballPos = getHole();
+            veePos = new BasicHep3Vector(ballPos.x(), ballPos.y(), ballPos.z()-1.0);
+            flatPos = new BasicHep3Vector(ballPos.x()-1.0, ballPos.y(), ballPos.z());
+        }
+        protected abstract Hep3Vector getHole();
+    }
+    
+    
+    
+    
+    public static class ModuleL4 extends ModuleL46 {
+
+        public ModuleL4(String name, SurveyVolume mother,
+                AlignmentCorrection alignmentCorrection, SurveyVolume ref) {
+            super(name, mother, alignmentCorrection, ref);
+            init();
+        }
+
+        protected Hep3Vector getHole() {
+            double x = hole_to_center_of_plate_width_dir;   
+            double y = 0.0; // TODO assume that cone and module mount pin hole is at same y. Check if true.
+            double z = -UChannelL46Bottom.side_plate_cone_y - UChannelL46Plate.pocket_depth_L4;
+            return new BasicHep3Vector(x, y, z);
+        }
+        
+    }
+    
+
+    public static class ModuleL5 extends ModuleL46 {
+
+        public ModuleL5(String name, SurveyVolume mother,
+                AlignmentCorrection alignmentCorrection, SurveyVolume ref) {
+            super(name, mother, alignmentCorrection, ref);
+            init();
+        }
+
+        protected Hep3Vector getHole() {
+            double x = hole_to_center_of_plate_width_dir;   
+            double y = UChannelL46BottomPlate.module_mounting_hole_to_hole_x; 
+            double z = -UChannelL46Bottom.side_plate_cone_y - UChannelL46Plate.pocket_depth_L5;
+            return new BasicHep3Vector(x, y, z);
+        }
+
+    }
+
+    public static class ModuleL6 extends ModuleL46 {
+
+        public ModuleL6(String name, SurveyVolume mother,
+                AlignmentCorrection alignmentCorrection, SurveyVolume ref) {
+            super(name, mother, alignmentCorrection, ref);
+            init();
+        }
+
+        protected Hep3Vector getHole() {
+            double x = hole_to_center_of_plate_width_dir;   
+            double y = 2.0*UChannelL46BottomPlate.module_mounting_hole_to_hole_x; 
+            double z = -UChannelL46Bottom.side_plate_cone_y - UChannelL46Plate.pocket_depth_L6;
+            return new BasicHep3Vector(x, y, z);
+        }
+
+    }
+
+
+
+
+
+    public abstract static class LongHalfModule extends BaseModule {
+
+        private static final double randomoffset = 5.0; //TODO this will be replaced when I fix the size of the half-module
+        public static final double width = Sensor.getSensorWidth() + randomoffset;
+        public static final double length = Sensor.getSensorLength() + randomoffset/10.0;
+        public static final double height = Sensor.getSensorThickness() + randomoffset/10.0;
+
+
+        public LongHalfModule(String name, SurveyVolume mother,
+                AlignmentCorrection alignmentCorrection, int layer,
+                String half) {
+            super(name, mother, alignmentCorrection, layer, half);
+        }
+
+        protected abstract Hep3Vector getSensorPosition();
+        
+        protected void setBoxDim() {
+            setBoxDim(width, length, height);
+        }
+
+        protected void setCenter() {
+            setCenter(0.0,0.0,0.0); 
+        }
+
+        protected void setPos() {
+            ballPos = getSensorPosition(); //TODO make this get each coordinate instead.
+            veePos  = new BasicHep3Vector(ballPos.x()+1, ballPos.y(), ballPos.z());
+            flatPos  = new BasicHep3Vector(ballPos.x(), ballPos.y()+1, ballPos.z());
+        }
+        
+    }
+
+
+
+    
+    public static class LongAxialHoleHalfModule extends LongHalfModule {
+
+        private final static double sensor_x = 1.382*inch;
+        private final static double sensor_y = 3.817*inch;
+        private final static double sensor_z = 0.32*inch;
+
+
+        public LongAxialHoleHalfModule(String name, SurveyVolume mother,
+                AlignmentCorrection alignmentCorrection, int layer,
+                String half) {
+            super(name, mother, alignmentCorrection, layer, half);
+            init();
+        }
+
+        protected Hep3Vector getSensorPosition() {
+            return new BasicHep3Vector(-sensor_x, sensor_y, -sensor_z);
+        }
+        
+
+    }
+
+
+
+
+    public static class LongAxialSlotHalfModule extends LongHalfModule {
+
+        private final static double sensor_x = 1.382*inch;
+        private final static double sensor_y = 7.863*inch;
+        private final static double sensor_z = 0.32*inch;
+
+
+        public LongAxialSlotHalfModule(String name, SurveyVolume mother,
+                AlignmentCorrection alignmentCorrection, int layer,
+                String half) {
+            super(name, mother, alignmentCorrection, layer, half);
+            init();
+        }
+       
+        protected Hep3Vector getSensorPosition() {
+            return new BasicHep3Vector(-sensor_x, sensor_y, -sensor_z);
+        }
+       
+
+
+    }
+
+
+    public abstract static class LongStereoHalfModule extends LongHalfModule {
+
+        protected final static double stereo_angle = 0.05;
+        
+        public LongStereoHalfModule(String name, SurveyVolume mother,
+                AlignmentCorrection alignmentCorrection, int layer, String half) {
+            super(name, mother, alignmentCorrection, layer, half);
+        }
+        
+        
+        protected void applyGenericCoordinateSystemCorrections() {
+
+            // Rotate these into the right place for the stereo
+            // My rotations here are active rotations in the mother coordinate system frame
+
+            // flip around v ~ along the strips
+            Rotation r1 = new Rotation(new Vector3D(0,1,0),Math.PI);
+            // apply stereo angle around w ~ normal to the sensor plane
+            Rotation r2 = new Rotation(new Vector3D(0,0,1),stereo_angle);
+            // Build full rotation
+            Rotation r = r2.applyTo(r1);
+            //Rotation r = r1;
+            if(debug) System.out.printf("%s: Coord before corrections\n%s\n", getClass().getSimpleName(),getCoord().toString());
+            if(debug) System.out.printf("%s: box center before corrections\n%s\n", getClass().getSimpleName(),getBoxDim().toString());
+            getCoord().rotateApache(r);
+            if(debug) System.out.printf("%s: Coord after corrections\n%s\n", getClass().getSimpleName(),getCoord().toString());
+            if(debug) System.out.printf("%s: box center after corrections\n%s\n", getClass().getSimpleName(),getBoxDim().toString());
+
+
+        }
+        
+        
+
+
+    }
+
+    
+    public static class LongStereoHoleHalfModule extends LongStereoHalfModule {
+
+        private final static double sensor_x = 1.282*inch;
+        private final static double sensor_y = 3.889*inch;
+        private final static double sensor_z = 0.52*inch;
+
+        public LongStereoHoleHalfModule(String name, SurveyVolume mother,
+                AlignmentCorrection alignmentCorrection, int layer,
+                String half) {
+            super(name, mother, alignmentCorrection, layer, half);
+            init();
+        }
+
+        protected Hep3Vector getSensorPosition() {
+           return new BasicHep3Vector(-sensor_x, sensor_y, -sensor_z);
+        }
+
+    }
+
+
+    
+    public static class LongStereoSlotHalfModule extends LongStereoHalfModule {
+
+        private final static double sensor_x = 1.481*inch;
+        private final static double sensor_y = 7.861*inch;
+        private final static double sensor_z = 0.52*inch;
+
+
+        public LongStereoSlotHalfModule(String name, SurveyVolume mother,
+                AlignmentCorrection alignmentCorrection, int layer,
+                String half) {
+            super(name, mother, alignmentCorrection, layer, half);
+            init();
+        }
+
+        protected Hep3Vector getSensorPosition() {
+            return new BasicHep3Vector(-sensor_x, sensor_y, -sensor_z);
+        }
+
+    }
+
+
     /**
      * @SurveyVolume volume defining the coordinate system of the axial half-module in module L1-3
      * Reference:  @ModuleL13 coordinate system
@@ -718,20 +990,7 @@
             setCenter(x, y, z); 
         }
         
-        
-//        double box_center_local_x =  TestRunHalfModule.getLength()/2.0 - ( (170.00 + 10.00) - Sensor.getSensorLength()/2.0); 
-//        double box_center_local_y = - Sensor.getSensorThickness()/2.0 - HalfModuleLamination.kapton_thickness - CarbonFiber.cf_thickness + half_module_thickness/2.0; 
-//        double box_center_local_z = TestRunHalfModule.getWidth()/2.0 - ( 12.66 - (8.83 -3.00) + Sensor.getSensorWidth()/2.0 ); 
-//        
-//        
-//        if(useSiStripsConvention) {
-//            //setCenter(box_center_local_z, box_center_local_x, box_center_local_y); 
-//            setCenter(-1.0*box_center_local_z, box_center_local_x, box_center_local_y); 
-//        } else {
-//            setCenter(box_center_local_x, box_center_local_y, box_center_local_z); 
-//        }
-//        
-        
+
 
         
     }
@@ -801,6 +1060,46 @@
     }
     
     
+    public static class HalfLongModuleLamination extends HPSTestRunTracker2014GeometryDefinition.HalfModuleComponent {
+        protected static final double width = Sensor.getSensorWidth();
+        protected static final double length = Sensor.getSensorLength();
+        protected static final double height = Sensor.getSensorThickness();
+        
+        public HalfLongModuleLamination(String name, SurveyVolume mother, int id) {
+            super(name, mother, null, id);
+           init();
+        }
+
+        protected double getThickness() {
+            return height;
+        }
+        protected double getHeigth() {
+            return height;
+        }
+        protected double getWidth() {
+            return width;
+        }
+        protected double getLength() {
+            return length;
+        }
+        protected void setPos() {
+            ballPos = new BasicHep3Vector(0, 0, -(Sensor.getSensorThickness()/2.0 + height/2.0));
+            veePos = new BasicHep3Vector(ballPos.x()+1, ballPos.y(), ballPos.z());
+            flatPos = new BasicHep3Vector(ballPos.x(), ballPos.y()+1, ballPos.z());
+        }
+        protected void setCenter() {
+            setCenter(0, 0, 0);            
+        }
+        protected void setBoxDim() {
+            setBoxDim(width, length, height);
+        }
+
+       
+        
+        
+    }
+    
+    
     
     
     /**
@@ -827,7 +1126,7 @@
             if(layer < 4) {
                 ref = getSurveyVolume(UChannelL13Bottom.class);
             } else {
-                throw new UnsupportedOperationException("L4-6 not implemented yet");
+                ref = getSurveyVolume(UChannelL46Bottom.class);
             }
         } else {
             throw new UnsupportedOperationException("top not implemented yet");
@@ -841,28 +1140,209 @@
             module = new ModuleL2(volName, mother, alignmentCorrection, ref); 
         } else if(layer==3) {
             module = new ModuleL3(volName, mother, alignmentCorrection, ref); 
+        } else if(layer==4) {
+            module = new ModuleL4(volName, mother, alignmentCorrection, ref); 
+        } else if(layer==5) {
+            module = new ModuleL5(volName, mother, alignmentCorrection, ref); 
+        } else if(layer==6) {
+            module = new ModuleL6(volName, mother, alignmentCorrection, ref); 
         } else {
             throw new UnsupportedOperationException("Layer " + layer + " not implemented yet");
         }
 
 
         // create the bundle for this module
-        ModuleBundle bundle = new ModuleBundle(module);
-        addModuleBundle(bundle);
-
-        if(doAxial) makeHalfModule("axial", module);
-//        if(doColdBlock) makeColdBlock(module);
-        if(doStereo) makeHalfModule("stereo", module);
-
-
-        if(isDebug()) {
-            System.out.printf("%s: created module bundle:\n", this.getClass().getSimpleName());
-            bundle.print();
-        }
-
-    }
-
-
+        // need to create it and add to list before half-module is created
+        // as it uses the list to find the bundle. Ugly. TODO fix this.
+        BaseModuleBundle bundle;
+        
+        if(layer<=3) {
+            bundle = new TestRunModuleBundle(module);
+            addModuleBundle(bundle);
+            if(doAxial) makeHalfModule("axial", module);
+            //        if(doColdBlock) makeColdBlock(module);
+            if(doStereo) makeHalfModule("stereo", module);
+        } else {
+            bundle = new LongModuleBundle(module);
+            addModuleBundle(bundle);
+            if(doAxial) {
+                makeLongHalfModule("axial","hole", module);
+                makeLongHalfModule("axial","slot", module);
+            }
+            //        if(doColdBlock) makeColdBlock(module);
+            if(doStereo) {
+                makeLongHalfModule("stereo","hole", module);
+                makeLongHalfModule("stereo","slot", module);
+            }
+        }
+
+
+        
+        //if(isDebug()) {
+        System.out.printf("%s: created module bundle:\n", this.getClass().getSimpleName());
+        bundle.print();
+        System.out.printf("%s: Now there are %d  modules\n", this.getClass().getSimpleName(),modules.size());
+        //}
+        
+        
+
+    }
+
+
+
+
+
+    /**
+     * @author Per Hansson Adrian <[log in to unmask]>
+     *
+     */
+    public static class LongModuleBundle extends BaseModuleBundle {
+        public HalfModuleBundle halfModuleAxialHole = null;
+        public HalfModuleBundle halfModuleStereoHole = null;
+        public HalfModuleBundle halfModuleAxialSlot = null;
+        public HalfModuleBundle halfModuleStereoSlot = null;
+        protected SurveyVolume coldBlock = null;
+        public LongModuleBundle(BaseModule m) {
+            super(m);
+        }
+        public void print() {
+            if(module!=null) System.out.printf("%s: %s\n", this.getClass().getSimpleName(),module.getName());
+            if(halfModuleAxialHole!=null) halfModuleAxialHole.print();
+            if(halfModuleAxialSlot!=null) halfModuleAxialSlot.print();
+            if(coldBlock!=null)System.out.printf("%s: %s\n", this.getClass().getSimpleName(),coldBlock.getName());
+            if(halfModuleStereoHole!=null) halfModuleStereoHole.print();
+            if(halfModuleStereoSlot!=null) halfModuleStereoSlot.print();
+            }
+        }
+
+
+    /**
+     * @author Per Hansson Adrian <[log in to unmask]>
+     *
+     */
+    public static class LongHalfModuleBundle extends HalfModuleBundle {
+        public LongHalfModuleBundle() {
+            super();
+        }
+        public LongHalfModuleBundle(SurveyVolume hm) {
+            super(hm);
+        }
+        public void print() {
+            System.out.printf("%s: %s\n", this.getClass().getSimpleName(),halfModule.getName());
+        }
+    }
+    
+    
+    
+    /**
+     * Create the half-module.
+     * @param side - stereo or axial
+     * @param type - hole or slot
+     * @param mother to the half-module
+     */
+    protected void makeLongHalfModule(String side, String type , BaseModule mother) {
+        
+        String moduleName = mother.getName();
+    
+        if(isDebug()) System.out.printf("%s: makeHalfModule for %s %s %s \n", this.getClass().getSimpleName(), moduleName, side, type);
+        
+        String volName = moduleName + "_halfmodule_" + side + "_" + type;
+    
+        // top or bottom?
+        String half = mother.getHalf();
+        boolean isTopLayer = !mother.isBottom();
+    
+        // find layer
+        int layer = mother.getLayer();
+    
+        // axial or stereo
+        boolean isAxial = isAxialFromName(volName);
+    
+        // hole or slot
+        boolean isHole = isHoleFromName(volName);
+        
+        // find layer according to old definition
+        int oldLayer = getOldLayerDefinition(isTopLayer, layer, isAxial);
+    
+        // find alignment correction to this volume
+        AlignmentCorrection alignmentCorrection =  getHalfModuleAlignmentCorrection(isTopLayer, oldLayer);
+        
+        
+        // find the module bundle that it will be added to
+        //TestRunModuleBundle bundle  = (TestRunModuleBundle)getModuleBundle(mother);
+        //TestRunHalfModuleBundle halfModuleBundle;
+        LongModuleBundle bundle  = (LongModuleBundle)getModuleBundle(mother);
+        
+       
+        
+        
+        // Build the half-module bundle and half-module
+        //TODO clean this up to a separate method
+        LongHalfModule halfModule;
+        HalfModuleBundle halfModuleBundle;
+        if(isAxial) {
+            halfModuleBundle = new LongHalfModuleBundle();
+            if(isHole) {
+                halfModule = new LongAxialHoleHalfModule(volName, mother, alignmentCorrection, layer, half);
+                bundle.halfModuleAxialHole = halfModuleBundle;
+            } else {
+                halfModule = new LongAxialSlotHalfModule(volName, mother, alignmentCorrection, layer, half);
+                bundle.halfModuleAxialSlot = halfModuleBundle;
+            }
+        } else {
+            halfModuleBundle = new LongHalfModuleBundle();
+            if(isHole) {
+                halfModule = new LongStereoHoleHalfModule(volName, mother, alignmentCorrection, layer, half);
+                bundle.halfModuleStereoHole = halfModuleBundle;
+            } else {
+                halfModule = new LongStereoSlotHalfModule(volName, mother, alignmentCorrection, layer, half);
+                bundle.halfModuleStereoSlot = halfModuleBundle;
+            }
+        } 
+        halfModuleBundle.halfModule = halfModule;
+        
+        
+    
+    
+        // create the half module components 
+    
+        makeHalfModuleComponentSensor(halfModule);
+    
+        makeLongHalfModuleComponentKapton(halfModule);
+    
+        //makeHalfModuleComponentCF(halfModule);
+    
+        //makeHalfModuleComponentHybrid(halfModule);
+    
+    
+    
+    
+    }
+
+
+    protected void makeLongHalfModuleComponentKapton(BaseModule mother) {
+        
+        if(isDebug()) System.out.printf("%s: makeHalfModuleComponentKapton for %s \n", this.getClass().getSimpleName(), mother.getName());
+    
+        String volName = mother.getName() + "_lamination";
+    
+        // Build the half-module
+    
+        //  id is hard coded
+        int component_number = 2;
+    
+        HalfLongModuleLamination lamination = new HalfLongModuleLamination(volName,mother,component_number);
+        lamination.setMaterial("Kapton");
+    
+    
+        HalfModuleBundle hm = getHalfModuleBundle((BaseModule) mother.getMother(), mother.getName());
+        hm.lamination = lamination;
+    
+    }
+
+    
+    
+    
     
     protected HPSTestRunTracker2014GeometryDefinition.TestRunHalfModule createTestRunHalfModuleAxial(String volName,
             BaseModule mother, AlignmentCorrection alignmentCorrection,
@@ -880,6 +1360,58 @@
     
     
     
+    /* (non-Javadoc)
+     * @see org.lcsim.geometry.compact.converter.HPSTrackerGeometryDefinition#getHalfModuleBundle(org.lcsim.geometry.compact.converter.HPSTestRunTracker2014GeometryDefinition.BaseModule, java.lang.String)
+     */
+    protected HalfModuleBundle getHalfModuleBundle(BaseModule module, String halfModuleName) {
+        BaseModuleBundle moduleBundle = getModuleBundle(module);
+        HalfModuleBundle hm = null;
+        // TODO this should to change when I build quarter-modules for the long half-modules. I think. I should probably not rely on names but types btu not sure how to fix that one now.
+        if(moduleBundle!=null) {
+            if( moduleBundle instanceof TestRunModuleBundle) {   
+                TestRunModuleBundle mtr = (TestRunModuleBundle) moduleBundle;
+                if(halfModuleName.contains("axial")) {
+                    hm = mtr.halfModuleAxial;
+                }
+                else if(halfModuleName.contains("stereo")) {
+                    hm = mtr.halfModuleStereo;
+                }
+                else {
+                    throw new RuntimeException("NO axial or stereo string found in half module bundle name " + halfModuleName);
+                }
+            } 
+            else if(moduleBundle instanceof LongModuleBundle) {
+                LongModuleBundle longModuleBundle = (LongModuleBundle) moduleBundle;
+                if(halfModuleName.contains("axial")) {
+                    if(halfModuleName.contains("hole")) {
+                        hm = longModuleBundle.halfModuleAxialHole;
+                    } else if(halfModuleName.contains("slot")) {
+                        hm = longModuleBundle.halfModuleAxialSlot;
+                    } else {
+                        throw new RuntimeException("This half-module name \"" + halfModuleName +  " \" is invalid. Need to contain hole or slot for this type.");
+                    }
+                } else if(halfModuleName.contains("stereo")) {
+                    if(halfModuleName.contains("hole")) {
+                        hm = longModuleBundle.halfModuleStereoHole;
+                    } else if(halfModuleName.contains("slot")) {
+                        hm = longModuleBundle.halfModuleStereoSlot;
+                    } else {
+                        throw new RuntimeException("This half-module name \"" + halfModuleName +  " \" is invalid. Need to contain hole or slot for this type.");
+                    }
+                } else {
+                    throw new RuntimeException("This half-module name \"" + halfModuleName +  " \" is invalid. Need to contain axial or stereo.");
+                }
+            }
+            else {
+                throw new NotImplementedException("This type of module bundle is not implemented!?");
+            }
+        } else {
+            throw new RuntimeException("Couldn't find module " + module.getName() + " and layer "  + module.getLayer() + " and half " + module.getHalf());
+        }
+        return hm;
+    }
+
+    
 
 }
 

Modified: projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/HPSTracker2014LCDDBuilder.java
 =============================================================================
--- projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/HPSTracker2014LCDDBuilder.java	(original)
+++ projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/HPSTracker2014LCDDBuilder.java	Fri Nov 21 16:45:51 2014
@@ -1,16 +1,18 @@
 package org.lcsim.geometry.compact.converter;
 
 import org.jdom.Element;
+import org.lcsim.geometry.compact.converter.HPSTracker2014GeometryDefinition.LongHalfModuleBundle;
+import org.lcsim.geometry.compact.converter.HPSTracker2014GeometryDefinition.LongModuleBundle;
 import org.lcsim.geometry.compact.converter.HPSTracker2014GeometryDefinition.PSVacuumChamber;
-import org.lcsim.geometry.compact.converter.HPSTracker2014GeometryDefinition.SupportRing;
-import org.lcsim.geometry.compact.converter.HPSTracker2014GeometryDefinition.SupportRingL13BottomKinMount;
+import org.lcsim.geometry.compact.converter.HPSTracker2014GeometryDefinition.SvtBox;
 import org.lcsim.geometry.compact.converter.HPSTracker2014GeometryDefinition.SvtBoxBasePlate;
-import org.lcsim.geometry.compact.converter.HPSTracker2014GeometryDefinition.SvtBox;
 import org.lcsim.geometry.compact.converter.HPSTracker2014GeometryDefinition.UChannelL13Bottom;
 import org.lcsim.geometry.compact.converter.HPSTracker2014GeometryDefinition.UChannelL13BottomPlate;
 import org.lcsim.geometry.compact.converter.HPSTracker2014GeometryDefinition.UChannelL46Bottom;
 import org.lcsim.geometry.compact.converter.HPSTracker2014GeometryDefinition.UChannelL46BottomPlate;
-import org.lcsim.geometry.compact.converter.HPSTrackerBuilder.ModuleBundle;
+import org.lcsim.geometry.compact.converter.HPSTrackerBuilder.BaseModuleBundle;
+import org.lcsim.geometry.compact.converter.HPSTrackerBuilder.HalfModuleBundle;
+import org.lcsim.geometry.compact.converter.HPSTrackerGeometryDefinition.TestRunModuleBundle;
 import org.lcsim.geometry.compact.converter.HPSTrackerGeometryDefinition.TrackingVolume;
 import org.lcsim.geometry.compact.converter.lcdd.util.LCDD;
 import org.lcsim.geometry.compact.converter.lcdd.util.SensitiveDetector;
@@ -93,9 +95,9 @@
         if(isDebug()) System.out.printf("%s: build modules\n", getClass().getSimpleName());
 
         // Loop over all modules created
-        for(ModuleBundle mod : _builder.modules) {
+        for(BaseModuleBundle mod : _builder.modules) {
             //SVTModuleBundle m = (SVTModuleBundle) mod;
-            ModuleBundle m = mod;
+            BaseModuleBundle m = mod;
             if(isDebug()) { 
                 System.out.printf("%s: module layer %d half %s\n", getClass().getSimpleName(),m.getLayer(),m.getHalf());
                 m.print();
@@ -139,7 +141,67 @@
 
     }    
     
+    /**
+     * Rules for adding the LCDD module geometry.
+     * @param bundle - module to be added
+     * @param mother - mother LCDD geometry object
+     */
+    private void addModule(BaseModuleBundle bundle, LCDDSurveyVolume mother) {
+       if(bundle instanceof TestRunModuleBundle) {
+           addTestRunModule((TestRunModuleBundle) bundle, mother);
+       } else if(bundle instanceof LongModuleBundle) {
+           addLongModule((LongModuleBundle) bundle, mother);
+       } else {
+           throw new RuntimeException("The bundle is of unknown class type!");
+       }
+    }
   
-
+    /**
+     * Rules for adding the LCDD module geometry.
+     * @param bundle - module to be added
+     * @param mother - mother LCDD geometry object
+     */
+    protected void addLongModule(LongModuleBundle bundle, LCDDSurveyVolume mother) {
+        // This could perhaps be fixed if there is a relation with daughters in geometry definition?
+        // create the module
+        LCDDSurveyVolume lcddM = new LCDDSurveyVolume(bundle.module, lcdd, mother);
+        add(lcddM);
+        if(bundle.halfModuleAxialHole!=null)  addLongHalfModule(bundle.halfModuleAxialHole,lcddM);
+        if(bundle.halfModuleAxialSlot!=null)  addLongHalfModule(bundle.halfModuleAxialSlot,lcddM);
+        if(bundle.coldBlock!=null)        add(new LCDDSurveyVolume(bundle.coldBlock, lcdd, lcddM));     
+        if(bundle.halfModuleStereoHole!=null)  addLongHalfModule(bundle.halfModuleStereoHole,lcddM);
+        if(bundle.halfModuleStereoSlot!=null)  addLongHalfModule(bundle.halfModuleStereoSlot,lcddM);
+    }
+    
+    
+    /**
+     * Rules for adding the LCDD half module geometry.
+     * @param bundle - module to be added
+     * @param mother - mother LCDD geometry object
+     */
+    private void addLongHalfModule(HalfModuleBundle bundle2, LCDDSurveyVolume mother) {
+        LongHalfModuleBundle bundle = (LongHalfModuleBundle) bundle2;
+        
+        // create the half-module
+        LCDDSurveyVolume lcddHM = new LCDDSurveyVolume(bundle.halfModule, lcdd, mother);
+        add(lcddHM);
+        // create the sensor
+        LCDDSurveyVolume lcddS = new LCDDSurveyVolume(bundle.sensor, lcdd, lcddHM);
+        add(lcddS);
+        // create the active sensor
+        LCDDSurveyVolume lcddAS = new LCDDSurveyVolume(bundle.activeSensor, lcdd, lcddS);
+        add(lcddAS);
+        // create the lamination
+        LCDDSurveyVolume lcddL = new LCDDSurveyVolume(bundle.lamination, lcdd, lcddHM);
+        add(lcddL);
+        /*
+        // create the carbon fiber frame
+        LCDDSurveyVolume lcddCF = new LCDDSurveyVolume(bundle.carbonFiber, lcdd, lcddHM);
+        add(lcddCF);
+        // create the hybrid frame
+        LCDDSurveyVolume lcddH = new LCDDSurveyVolume(bundle.hybrid, lcdd, lcddHM);
+        add(lcddH);
+*/
+    }   
 
 }

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	Fri Nov 21 16:45:51 2014
@@ -11,11 +11,12 @@
 import org.jdom.Element;
 import org.lcsim.detector.Transform3D;
 import org.lcsim.geometry.compact.converter.HPSTestRunTracker2014GeometryDefinition.BaseModule;
+import org.lcsim.geometry.compact.converter.HPSTestRunTracker2014GeometryDefinition.TestRunHalfModule;
 
 public abstract class HPSTrackerBuilder {
 
 	private boolean debug = true;
-	public List<ModuleBundle> modules = new ArrayList<ModuleBundle>();
+	public List<BassModuleBundle> modules = new ArrayList<BassModuleBundle>();
 	protected List<SurveyVolume> surveyVolumes = new ArrayList<SurveyVolume>();
     protected Element node;
     protected List<MilleParameter> milleparameters = new ArrayList<MilleParameter>();
@@ -144,18 +145,18 @@
 	public abstract void build();
 	
 	
-	/**
+	
+    
+    
+    /**
      * Bundle volumes into a module. 
      * 
      * @author Per Hansson Adrian <[log in to unmask]>
      *
      */
-    public static class ModuleBundle {
+    public abstract static class BaseModuleBundle {
         public SurveyVolume module = null;
-        public HalfModuleBundle halfModuleAxial = null;
-        public HalfModuleBundle halfModuleStereo = null;
-        protected SurveyVolume coldBlock = null;
-        public ModuleBundle(BaseModule m) {
+        public BaseModuleBundle(BaseModule m) {
             module = m;
         }
         public int getLayer() {
@@ -170,13 +171,8 @@
             if(module==null) throw new RuntimeException("Need to add module to bundle first!");
             return module.getMother();
         }
-        public void print() {
-            if(module!=null) System.out.printf("%s: %s\n", this.getClass().getSimpleName(),module.getName());
-            if(halfModuleAxial!=null) halfModuleAxial.print();
-            if(coldBlock!=null)System.out.printf("%s: %s\n", this.getClass().getSimpleName(),coldBlock.getName());
-            if(halfModuleStereo!=null) halfModuleStereo.print();
-        }
-     }
+        public abstract void print();
+    }
     
     /**
      * Bundle volumes into a half-module. 
@@ -187,6 +183,12 @@
      */
     public static abstract class HalfModuleBundle {
         public SurveyVolume halfModule = null;
+        public SurveyVolume lamination = null;
+        public SurveyVolume sensor = null;
+        public SurveyVolume activeSensor = null;
+        public HalfModuleBundle(SurveyVolume hm) {
+            halfModule = hm;
+        }
         public HalfModuleBundle() {
         }
         abstract public void print();
@@ -234,7 +236,7 @@
 
 	public static int getLayerFromVolumeName(String name) {
 		int layer = -1;
-		for(int i=1; i<= 5; ++i) {
+		for(int i=1; i<= 6; ++i) {
 			if(name.contains(String.format("module_L%d", i))) {
 				layer = i;
 			}
@@ -301,7 +303,7 @@
 		throw new RuntimeException("Coulnd't find instance of " + c.getSimpleName() + " among the " + surveyVolumes.size() + " tracker items!");
 	}
 
-	protected List<ModuleBundle> getModules() {
+	protected List<BassModuleBundle> getModules() {
 		return modules;
 	}
 
@@ -311,8 +313,8 @@
 	 * @param half - top or bottom half
 	 * @return module or null if not found
 	 */
-	protected ModuleBundle getModuleBundle(int layer, String half) {
-		for(ModuleBundle m : modules) {
+	protected BaseModuleBundle getModuleBundle(int layer, String half) {
+		for(BaseModuleBundle m : modules) {
 			if(m.getLayer()==layer && m.getHalf().equals(half)) {
 				return m;
 			}
@@ -325,34 +327,17 @@
 	 * @param module - to find
 	 * @return bundle
 	 */
-	protected ModuleBundle getModuleBundle(BaseModule module) {
+	protected BaseModuleBundle getModuleBundle(BaseModule module) {
 		return getModuleBundle(module.getLayer(), module.getHalf());
 	}
 
-	/**
-	 * Find half module among the existing bundles.
-	 * @param module - to find
-	 * @return bundle
-	 */
-	protected HalfModuleBundle getHalfModuleBundle(BaseModule module, String halfModuleName) {
-		ModuleBundle m = getModuleBundle(module.getLayer(), module.getHalf());
-		HalfModuleBundle hm = null;
-		if(m!=null) {
-			if(halfModuleName.contains("axial")) hm = m.halfModuleAxial;
-			else if(halfModuleName.contains("stereo")) hm = m.halfModuleStereo;
-			else throw new RuntimeException("NO axial or stereo string found in half module bundle name " + halfModuleName);
-		} else {
-			throw new RuntimeException("No module found for " + module.getLayer() + " and half " + module.getHalf());
-		}
-		return hm;
-	}
-
+	
 	/**
 	 * Add module to list.
 	 * @param bundle - module to add.
 	 */
-	protected void addModuleBundle(ModuleBundle bundle) {
-		ModuleBundle b = getModuleBundle(bundle.getLayer(), bundle.getHalf());
+	protected void addModuleBundle(BaseModuleBundle bundle) {
+		BaseModuleBundle b = getModuleBundle(bundle.getLayer(), bundle.getHalf());
 		if(b==null) {
 			modules.add(bundle);
 		} else {
@@ -460,26 +445,45 @@
 		else if(half=="bottom") isTopLayer = false;
 		else throw new RuntimeException("no half found from " + name);
 		boolean isAxial = isAxialFromName(name);
-		return getOldGeomDefLayerFromVolumeName(isTopLayer, l, isAxial);
-	}
-	
-	/**
-     * Get axial or stereo key name from name
-     * @param name that contains layer and half information.
-     * @return the layer.
+		return getOldLayerDefinition(isTopLayer, l, isAxial);
+	}
+	
+	/**
+     * Get axial or stereo key name from string
+     * @param name
+     * @return axial or not boolean
      */
     public static boolean isAxialFromName(String name) {
-        boolean isAxial = false;
+        boolean isAxial;
         if(name.contains("axial")) isAxial=true;
         else if(name.contains("stereo")) isAxial=false;
         else throw new RuntimeException("no axial or stereo name found from " + name);
         return isAxial;
     }
 	
-	
-	public static int getOldGeomDefLayerFromVolumeName(boolean isTopLayer, int l, boolean isAxial) {
+    /**
+     * Get hole or slot key name from string
+     * @param name.
+     * @return hole or not boolean
+     */
+    public static boolean isHoleFromName(String name) {
+        boolean isHole;
+        if(name.contains("hole")) isHole=true;
+        else if(name.contains("slot")) isHole=false;
+        else throw new RuntimeException("no hole or slot keys found in name " + name);
+        return isHole;
+    }
+    
+	
+	/**
+	 * Extract old definition of Test Run sensor number.
+	 * @param isTopLayer - top or bottom layer
+	 * @param l - layer 
+	 * @param isAxial - axial or stereo sensor
+	 * @return
+	 */
+	public static int getOldLayerDefinition(boolean isTopLayer, int l, boolean isAxial) {
         int layer=-1;
-        // convert to old definition
         if(isAxial) {
             if(isTopLayer) {
                 layer = 2*l-1;
@@ -496,8 +500,8 @@
         }
         return layer;
     }
-    
-
+	
+	
 
 
 }

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	Fri Nov 21 16:45:51 2014
@@ -13,10 +13,7 @@
 import org.lcsim.geometry.compact.converter.HPSTestRunTracker2014GeometryDefinition.Hybrid;
 import org.lcsim.geometry.compact.converter.HPSTestRunTracker2014GeometryDefinition.Sensor;
 import org.lcsim.geometry.compact.converter.HPSTestRunTracker2014GeometryDefinition.TestRunHalfModule;
-import org.lcsim.geometry.compact.converter.HPSTestRunTracker2014GeometryDefinition.TestRunHalfModuleAxial;
 import org.lcsim.geometry.compact.converter.HPSTestRunTracker2014GeometryDefinition.TestRunHalfModuleBundle;
-import org.lcsim.geometry.compact.converter.HPSTestRunTracker2014GeometryDefinition.TestRunHalfModuleStereo;
-import org.lcsim.geometry.compact.converter.HPSTestRunTracker2014GeometryDefinition.TestRunModule;
 
 /**
  * 
@@ -62,9 +59,13 @@
     }
 
     
+    protected abstract HalfModuleBundle getHalfModuleBundle(BaseModule module, String halfModuleName);
     protected abstract void makeModuleBundle(int layer, String half);
     protected abstract TestRunHalfModule createTestRunHalfModuleAxial(String volName, BaseModule mother, AlignmentCorrection alignmentCorrection, int layer, String half);
     protected abstract TestRunHalfModule createTestRunHalfModuleStereo(String volName, BaseModule mother, AlignmentCorrection alignmentCorrection, int layer, String half);
+
+    
+    
     
     protected boolean doLayer(int layer) {
         int a = (1<<(layer-1)) & layerBitMask;
@@ -98,7 +99,7 @@
         boolean isAxial = isAxialFromName(volName);
     
         // find layer according to old definition
-        int oldLayer = getOldGeomDefLayerFromVolumeName(isTopLayer, layer, isAxial);
+        int oldLayer = getOldLayerDefinition(isTopLayer, layer, isAxial);
         //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");
     
@@ -106,18 +107,22 @@
         AlignmentCorrection alignmentCorrection =  getHalfModuleAlignmentCorrection(isTopLayer, oldLayer);
         
         
-        // find the bundle that it will be added to
+        // find the module bundle that it will be added to
         //TestRunModuleBundle bundle  = (TestRunModuleBundle)getModuleBundle(mother);
         //TestRunHalfModuleBundle halfModuleBundle;
-        ModuleBundle bundle  = getModuleBundle(mother);
+        TestRunModuleBundle bundle  = (TestRunModuleBundle) getModuleBundle(mother);
+        if(bundle==null) {
+            throw new RuntimeException("Couldn't find bundle for " + volName + " from mother " + mother.getName());
+        }
+        
+        // Build the half-module bundle and add the half-module to it
         HalfModuleBundle halfModuleBundle;
-        
-        
-        // Build the half-module
         TestRunHalfModule halfModule;
         if(isAxial) {
             halfModule = createTestRunHalfModuleAxial(volName, mother, alignmentCorrection, layer, half);
             halfModuleBundle = new TestRunHalfModuleBundle(halfModule);
+            System.out.printf("halfModuleBundle is null? %s\n", halfModuleBundle==null?"true":"false");
+            System.out.printf("bundle.halfModuleAxial is null? %s\n", bundle.halfModuleAxial==null?"true":"false");
             bundle.halfModuleAxial = halfModuleBundle;
         } else {
             halfModule = createTestRunHalfModuleStereo(volName, mother, alignmentCorrection, layer, half);
@@ -186,7 +191,7 @@
     
     }
 
-    void makeHalfModuleComponentKapton(TestRunHalfModule mother) {
+    void makeHalfModuleComponentKapton(BaseModule mother) {
     
         if(isDebug()) System.out.printf("%s: makeHalfModuleComponentKapton for %s \n", this.getClass().getSimpleName(), mother.getName());
     
@@ -201,12 +206,34 @@
         lamination.setMaterial("Kapton");
     
     
+        HalfModuleBundle hm = getHalfModuleBundle((BaseModule) mother.getMother(), mother.getName());
+        hm.lamination = lamination;
+    
+    }
+
+    /*
+    void makeHalfModuleComponentKapton(TestRunHalfModule mother) {
+        
+        if(isDebug()) System.out.printf("%s: makeHalfModuleComponentKapton for %s \n", this.getClass().getSimpleName(), mother.getName());
+    
+        String volName = mother.getName() + "_lamination";
+    
+        // Build the half-module
+    
+        //  id is hard coded
+        int component_number = 2;
+    
+        HalfModuleLamination lamination = new HalfModuleLamination(volName,mother,component_number);
+        lamination.setMaterial("Kapton");
+    
+    
         TestRunHalfModuleBundle hm = (TestRunHalfModuleBundle) getHalfModuleBundle((BaseModule) mother.getMother(), mother.getName());
         hm.lamination = lamination;
     
     }
-
-    void makeHalfModuleComponentSensor(TestRunHalfModule mother) {
+*/
+    
+    protected void makeHalfModuleComponentSensor(BaseModule mother) {
     
         if(isDebug()) System.out.printf("%s: makeHalfModuleComponentSensor for %s \n", this.getClass().getSimpleName(), mother.getName());
     
@@ -219,6 +246,43 @@
         Sensor sensor = new Sensor(volName, mother, null, component_number);
         sensor.setMaterial("Silicon");
     
+        HalfModuleBundle hm = getHalfModuleBundle((BaseModule)mother.getMother(), mother.getName());
+        hm.sensor = sensor;
+    
+    
+        makeHalfModuleComponentActiveSensor(sensor);
+    
+    
+    }
+    
+    private void makeHalfModuleComponentActiveSensor(Sensor mother) {
+        
+        if(isDebug()) System.out.printf("%s: makeHalfModuleComponentActiveSensor for %s \n", this.getClass().getSimpleName(), mother.getName());
+    
+        String volName = mother.getName() + "_active";
+    
+        ActiveSensor active_sensor = new ActiveSensor(volName, mother);
+        active_sensor.setMaterial("Silicon");
+    
+        HalfModuleBundle hm = getHalfModuleBundle((BaseModule) mother.getMother().getMother(), mother.getMother().getName());
+        hm.activeSensor = active_sensor;
+    
+    }
+    
+    /*
+    void makeHalfModuleComponentSensor(TestRunHalfModule mother) {
+        
+        if(isDebug()) System.out.printf("%s: makeHalfModuleComponentSensor for %s \n", this.getClass().getSimpleName(), mother.getName());
+    
+        String volName = mother.getName() + "_sensor";
+    
+        // sensor id is hard coded in old geometry to be zero by counting over the components of the module
+        int component_number = 0;
+    
+        //  
+        Sensor sensor = new Sensor(volName, mother, null, component_number);
+        sensor.setMaterial("Silicon");
+    
         TestRunHalfModuleBundle hm = (TestRunHalfModuleBundle) getHalfModuleBundle((BaseModule)mother.getMother(), mother.getName());
         hm.sensor = sensor;
     
@@ -241,6 +305,7 @@
         hm.activeSensor = active_sensor;
     
     }
+    */
 
 
     /**
@@ -266,10 +331,29 @@
         }
     }
 
+    /**
+     * TODO This class is shared among geometry definitions but should really be in the test run class. Fix this. 
+     * @author Per Hansson Adrian <[log in to unmask]>
+     *
+     */
+    public static class TestRunModuleBundle extends BaseModuleBundle {
+        public HalfModuleBundle halfModuleAxial = null;
+        public HalfModuleBundle halfModuleStereo = null;
+        protected SurveyVolume coldBlock = null;
+        public TestRunModuleBundle(BaseModule m) {
+           super(m);
+        }
+        public void print() {
+            if(module!=null) System.out.printf("%s: %s\n", this.getClass().getSimpleName(),module.getName());
+            if(halfModuleAxial!=null) halfModuleAxial.print();
+            if(coldBlock!=null)System.out.printf("%s: %s\n", this.getClass().getSimpleName(),coldBlock.getName());
+            if(halfModuleStereo!=null) halfModuleStereo.print();
+        }
+     }
+    
+
    
 
-   
-
 
 
 

Modified: projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/HPSTrackerLCDDBuilder.java
 =============================================================================
--- projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/HPSTrackerLCDDBuilder.java	(original)
+++ projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/HPSTrackerLCDDBuilder.java	Fri Nov 21 16:45:51 2014
@@ -10,7 +10,7 @@
 
 public abstract class HPSTrackerLCDDBuilder  implements IHPSTrackerLCDDBuilder {
 
-	public boolean _debug = false;
+	public boolean _debug = true;
 	protected LCDD lcdd = null;
 	protected LCDDSurveyVolume baseSurveyVolume;
 	protected List<LCDDSurveyVolume> lcddSurveyVolumes = new ArrayList<LCDDSurveyVolume>();

########################################################################
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