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  November 2014

LCDET-SVN November 2014

Subject:

r3426 - /projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/

From:

[log in to unmask]

Reply-To:

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

Date:

Sat, 22 Nov 2014 00:45:55 -0000

Content-Type:

text/plain

Parts/Attachments:

Parts/Attachments

text/plain (1553 lines)

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<BaseModuleBundle> modules = new ArrayList<BaseModuleBundle>();
 	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<BaseModuleBundle> 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

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