Print

Print


Author: phansson
Date: Fri Oct 31 12:37:29 2014
New Revision: 3406

Log:
Large refactoring: renaming, pulling out static sub-classes and setting up for extracting common features for the SurveyVolumes into a super class.

Added:
    projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/JavaGhostSurveyVolume.java
    projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/JavaSurveyVolume.java
    projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/LCDDGhostSurveyVolume.java
    projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/LCDDSurveyVolume.java
    projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/SurveyVolumeImpl.java
    projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/SurveyVolumeVisualization.java
Modified:
    projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/detector/converter/compact/HPSTestRunTracker2014Converter.java
    projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/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/HPSTrackerJavaBuilder.java
    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/lcdd/HPSTestRunTracker2014.java

Modified: projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/detector/converter/compact/HPSTestRunTracker2014Converter.java
 =============================================================================
--- projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/detector/converter/compact/HPSTestRunTracker2014Converter.java	(original)
+++ projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/detector/converter/compact/HPSTestRunTracker2014Converter.java	Fri Oct 31 12:37:29 2014
@@ -26,11 +26,11 @@
 import org.lcsim.detector.tracker.silicon.SiTrackerModule;
 import org.lcsim.geometry.compact.Detector;
 import org.lcsim.geometry.compact.Subdetector;
+import org.lcsim.geometry.compact.converter.JavaGhostSurveyVolume;
 import org.lcsim.geometry.compact.converter.HPSTestRunTracker2014JavaBuilder;
 import org.lcsim.geometry.compact.converter.HPSTrackerBuilder;
 import org.lcsim.geometry.compact.converter.HPSTrackerJavaBuilder;
-import org.lcsim.geometry.compact.converter.HPSTrackerJavaBuilder.GhostJavaBaseGeom;
-import org.lcsim.geometry.compact.converter.HPSTrackerJavaBuilder.JavaBaseGeometry;
+import org.lcsim.geometry.compact.converter.JavaSurveyVolume;
 import org.lcsim.geometry.subdetector.HPSTestRunTracker2014;
 
 /**
@@ -147,7 +147,7 @@
 	 * Setup the detector element for a geometry object.
 	 * @param geometryObject - volume to process.
 	 */
-	private void setupPhysicalVolumes(JavaBaseGeometry geometryObject) {
+	private void setupPhysicalVolumes(JavaSurveyVolume geometryObject) {
 
 		if(_debug) System.out.printf("%s: setupDetectorElement for %s\n", getClass().getSimpleName(),geometryObject.getName());
 
@@ -161,7 +161,7 @@
 		// are added so I keep track of all the elements in the builder in order 
 		// to build a hierarchy.
 		
-		if( geometryObject instanceof GhostJavaBaseGeom) {
+		if( geometryObject instanceof JavaGhostSurveyVolume) {
 			
 			if(_debug) System.out.printf("%s: %s  is a ghost volume, dont create elements or physvol\n", getClass().getSimpleName(),geometryObject.getName());
 		
@@ -401,7 +401,7 @@
 
 		// add daughters
 		if(_debug) System.out.printf("%s: add %d daughters to %s\n", this.getClass().getSimpleName(),geometryObject.getDaughters().size(), geometryObject.getName());
-		for(JavaBaseGeometry daughter : geometryObject.getDaughters()) {
+		for(JavaSurveyVolume daughter : geometryObject.getDaughters()) {
 			setupPhysicalVolumes(daughter);
 		}
 

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 Oct 31 12:37:29 2014
@@ -62,26 +62,26 @@
 		if(isDebug()) System.out.printf("%s: build the JAVA geometry objects\n", getClass().getSimpleName());
 		
 		// initialize the list to store a reference to each object
-		java_objects = new ArrayList<JavaBaseGeometry>();
+		javaSurveyVolumes = new ArrayList<JavaSurveyVolume>();
 
 		// Go through the list of volumes to build that is created in the generic builder class
-		JavaBaseGeometry trackingGeometry = new JavaBaseGeometry(_builder.getBaseGeometry(TrackingVolume.class), trackingVolume);
+		JavaSurveyVolume trackingGeometry = new JavaSurveyVolume(_builder.getBaseGeometry(TrackingVolume.class), trackingVolume);
 		add(trackingGeometry);
 		//setBaseTrackerGeometry(new GhostJavaBaseGeom(_builder.getBaseGeometry(Base.class), trackingGeometry));
-        setBaseTrackerGeometry(new JavaBaseGeometry(_builder.getBaseGeometry(TrackerEnvelope.class), trackingGeometry,1));
+        setBaseTrackerGeometry(new JavaSurveyVolume(_builder.getBaseGeometry(TrackerEnvelope.class), trackingGeometry,1));
         add(getBaseTrackerGeometry());
-		JavaBaseGeometry basePlateGeometry = new GhostJavaBaseGeom(_builder.getBaseGeometry(BasePlate.class), getBaseTrackerGeometry());
+		JavaSurveyVolume basePlateGeometry = new JavaGhostSurveyVolume(_builder.getBaseGeometry(BasePlate.class), getBaseTrackerGeometry());
 		add(basePlateGeometry);
 		// skip the c-support, this is purely a reference volume in the builder so should have no use here!?
 		//JavaBaseGeometry cSupportGeometry = new GhostJavaBaseGeom(_builder.getBaseGeometry(CSupport.class), baseTrackerGeometry);
 		//add(cSupportGeometry);
-		JavaBaseGeometry supportBottomGeometry = new GhostJavaBaseGeom(_builder.getBaseGeometry(SupportBottom.class), getBaseTrackerGeometry());
+		JavaSurveyVolume supportBottomGeometry = new JavaGhostSurveyVolume(_builder.getBaseGeometry(SupportBottom.class), getBaseTrackerGeometry());
 		add(supportBottomGeometry);
-		JavaBaseGeometry supportPlateBottomGeometry = new GhostJavaBaseGeom(_builder.getBaseGeometry(SupportPlateBottom.class), getBaseTrackerGeometry());
+		JavaSurveyVolume supportPlateBottomGeometry = new JavaGhostSurveyVolume(_builder.getBaseGeometry(SupportPlateBottom.class), getBaseTrackerGeometry());
 		add(supportPlateBottomGeometry);
-		JavaBaseGeometry supportTopGeometry = new GhostJavaBaseGeom(_builder.getBaseGeometry(SupportTop.class), getBaseTrackerGeometry());
+		JavaSurveyVolume supportTopGeometry = new JavaGhostSurveyVolume(_builder.getBaseGeometry(SupportTop.class), getBaseTrackerGeometry());
 		add(supportTopGeometry);
-		JavaBaseGeometry supportPlateTopGeometry = new GhostJavaBaseGeom(_builder.getBaseGeometry(SupportPlateTop.class), getBaseTrackerGeometry());
+		JavaSurveyVolume supportPlateTopGeometry = new JavaGhostSurveyVolume(_builder.getBaseGeometry(SupportPlateTop.class), getBaseTrackerGeometry());
 		add(supportPlateTopGeometry);
 
 		// build modules	
@@ -98,8 +98,8 @@
 
 			// Find the mother among the objects using its name, should probably have a better way...
 			String name_mother = m.getMother().getName();
-			JavaBaseGeometry mother = null;
-			for(JavaBaseGeometry g : java_objects) {
+			JavaSurveyVolume mother = null;
+			for(JavaSurveyVolume g : javaSurveyVolumes) {
 				if(g.getName().equals(name_mother)) {
 					mother = g;
 					break;
@@ -125,7 +125,7 @@
 		if(isDebug()) {
 		    System.out.printf("%s: DONE building the JAVA geometry objects\n", getClass().getSimpleName());
 		    System.out.printf("%s: List of all the JAVA geometry objects built\n", this.getClass().getSimpleName());
-		    for(JavaBaseGeometry bg : java_objects) {
+		    for(JavaSurveyVolume bg : javaSurveyVolumes) {
 		        System.out.printf("-------\n%s\n", bg.toString());
 		    }
 		}
@@ -142,7 +142,7 @@
 	 * @param bundle - module to be added
 	 * @param mother - mother JAVA geometry object
 	 */
-	private void addModule(TestRunModuleBundle bundle, JavaBaseGeometry mother) {
+	private void addModule(TestRunModuleBundle bundle, JavaSurveyVolume mother) {
 		
 		if(isDebug()) {
 			System.out.printf("%s: addModule %s containing:\n",this.getClass().getSimpleName(), bundle.module.getName());
@@ -150,7 +150,7 @@
 		}
 		
 		// Create the module
-		JavaBaseGeometry lcddM = new GhostJavaBaseGeom(bundle.module, mother);
+		JavaSurveyVolume lcddM = new JavaGhostSurveyVolume(bundle.module, mother);
 		add(lcddM);
 		
 		// add half modules
@@ -170,13 +170,13 @@
 	 * @param bundle - module to be added
 	 * @param mother - mother JAVA geometry object
 	 */
-	private void addHalfModule(TestRunHalfModuleBundle bundle, JavaBaseGeometry mother) {
+	private void addHalfModule(TestRunHalfModuleBundle bundle, JavaSurveyVolume mother) {
 		// Create the half-module
 		// This is not a ghost element but reflects the module 
 		// concept in the old compact description
 		// TODO fix the layer IDs
 		int oldCompactModuleId = 0;
-		JavaBaseGeometry lcddHM = new JavaBaseGeometry(bundle.halfModule, mother,oldCompactModuleId);
+		JavaSurveyVolume lcddHM = new JavaSurveyVolume(bundle.halfModule, mother,oldCompactModuleId);
 		add(lcddHM);
 		
 		// ComponentNumber is taken from old geometry where it is simply a counter when adding the xml daughters to the TestRunModule.
@@ -184,11 +184,11 @@
 		int componentNumber = ((Sensor)bundle.sensor).getId();
 
 		// create the sensor
-		JavaBaseGeometry lcddS = new JavaBaseGeometry(bundle.sensor, lcddHM, componentNumber);
+		JavaSurveyVolume lcddS = new JavaSurveyVolume(bundle.sensor, lcddHM, componentNumber);
 		add(lcddS);
 
 		// create the active sensor
-		JavaBaseGeometry lcddAS = new JavaBaseGeometry(bundle.activeSensor, lcddS, componentNumber);
+		JavaSurveyVolume lcddAS = new JavaSurveyVolume(bundle.activeSensor, lcddS, componentNumber);
 		add(lcddAS);
 		
 //		if(isDebug()) {

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 Oct 31 12:37:29 2014
@@ -49,22 +49,22 @@
 		
 		// Go through the list of volumes to build that is created in the generic builder class
 		// TODO this is manual now since I don't have a way of knowing in the generic builder class what is a ghost volume at this point.
-		LCDDBaseGeometry trackingGeometry = new LCDDBaseGeometry(_builder.getBaseGeometry(TrackingVolume.class), worldVolume);
+		LCDDSurveyVolume trackingGeometry = new LCDDSurveyVolume(_builder.getBaseGeometry(TrackingVolume.class), worldVolume);
 		add(trackingGeometry);
-		baseTrackerGeometry = new LCDDBaseGeometry(_builder.getBaseGeometry(TrackerEnvelope.class), lcdd, trackingGeometry);
-		add(baseTrackerGeometry);
-		LCDDBaseGeometry basePlateGeometry = new LCDDBaseGeometry(_builder.getBaseGeometry(BasePlate.class), lcdd, baseTrackerGeometry);
+		baseSurveyVolume = new LCDDSurveyVolume(_builder.getBaseGeometry(TrackerEnvelope.class), lcdd, trackingGeometry);
+		add(baseSurveyVolume);
+		LCDDSurveyVolume basePlateGeometry = new LCDDSurveyVolume(_builder.getBaseGeometry(BasePlate.class), lcdd, baseSurveyVolume);
 		add(basePlateGeometry);
 		// TODO I don't think this c-support has any use at all since the coordinates of it has been already used in the builder. Should remove?
-		LCDDBaseGeometry cSupportGeometry = new GhostLCDDBaseGeometry(_builder.getBaseGeometry(CSupport.class), baseTrackerGeometry);
+		LCDDSurveyVolume cSupportGeometry = new LCDDGhostSurveyVolume(_builder.getBaseGeometry(CSupport.class), baseSurveyVolume);
 		add(cSupportGeometry);
-		LCDDBaseGeometry supportBottomGeometry = new GhostLCDDBaseGeometry(_builder.getBaseGeometry(SupportBottom.class), baseTrackerGeometry);
+		LCDDSurveyVolume supportBottomGeometry = new LCDDGhostSurveyVolume(_builder.getBaseGeometry(SupportBottom.class), baseSurveyVolume);
 		add(supportBottomGeometry);
-		LCDDBaseGeometry supportPlateBottomGeometry = new LCDDBaseGeometry(_builder.getBaseGeometry(SupportPlateBottom.class), lcdd, baseTrackerGeometry);
+		LCDDSurveyVolume supportPlateBottomGeometry = new LCDDSurveyVolume(_builder.getBaseGeometry(SupportPlateBottom.class), lcdd, baseSurveyVolume);
 		add(supportPlateBottomGeometry);
-		LCDDBaseGeometry supportTopGeometry = new GhostLCDDBaseGeometry(_builder.getBaseGeometry(SupportTop.class), baseTrackerGeometry);
+		LCDDSurveyVolume supportTopGeometry = new LCDDGhostSurveyVolume(_builder.getBaseGeometry(SupportTop.class), baseSurveyVolume);
 		add(supportTopGeometry);
-		LCDDBaseGeometry supportPlateTopGeometry = new LCDDBaseGeometry(_builder.getBaseGeometry(SupportPlateTop.class), lcdd, baseTrackerGeometry);
+		LCDDSurveyVolume supportPlateTopGeometry = new LCDDSurveyVolume(_builder.getBaseGeometry(SupportPlateTop.class), lcdd, baseSurveyVolume);
 		add(supportPlateTopGeometry);
 
 		// build modules	
@@ -82,8 +82,8 @@
 
 			// Find the mother among the LCDD objects using its name, should probably have a better way...
 			String name_mother = m.getMother().getName();
-			LCDDBaseGeometry mother = null;
-			for(LCDDBaseGeometry g : lcddGeometries) {
+			LCDDSurveyVolume mother = null;
+			for(LCDDSurveyVolume g : lcddSurveyVolumes) {
 				if(g.getName().equals(name_mother)) {
 					mother = g;
 					break;
@@ -103,8 +103,8 @@
 
 		//if(isDebug()) {
 		System.out.printf("%s: DONE building the LCDD geometry objects\n", getClass().getSimpleName());
-		System.out.printf("%s: List of all %d LCDD geometry objects built\n", this.getClass().getSimpleName(), lcddGeometries.size());
-		for(LCDDBaseGeometry bg : lcddGeometries) {
+		System.out.printf("%s: List of all %d LCDD geometry objects built\n", this.getClass().getSimpleName(), lcddSurveyVolumes.size());
+		for(SurveyVolumeImpl bg : lcddSurveyVolumes) {
 			System.out.printf("-------\n%s\n", bg.toString());
 		}
 		//}
@@ -123,13 +123,13 @@
 	 * @param bundle - module to be added
 	 * @param mother - mother LCDD geometry object
 	 */
-	private void addModule(ModuleBundle bundle, LCDDBaseGeometry mother) {
+	private void addModule(ModuleBundle bundle, LCDDSurveyVolume mother) {
 		// This could perhaps be fixed if there is a relation with daughters in geometry definition?
 		// create the module
-		LCDDBaseGeometry lcddM = new LCDDBaseGeometry(bundle.module, lcdd, mother);
+		LCDDSurveyVolume lcddM = new LCDDSurveyVolume(bundle.module, lcdd, mother);
 		add(lcddM);
 		if(bundle.halfModuleAxial!=null)  addHalfModule((TestRunHalfModuleBundle)bundle.halfModuleAxial,lcddM);
-		if(bundle.coldBlock!=null)        add(new LCDDBaseGeometry(bundle.coldBlock, lcdd, lcddM));		
+		if(bundle.coldBlock!=null)        add(new LCDDSurveyVolume(bundle.coldBlock, lcdd, lcddM));		
 		if(bundle.halfModuleStereo!=null) addHalfModule((TestRunHalfModuleBundle)bundle.halfModuleStereo,lcddM);
 	}
 
@@ -138,25 +138,25 @@
 	 * @param bundle - module to be added
 	 * @param mother - mother LCDD geometry object
 	 */
-	private void addHalfModule(TestRunHalfModuleBundle bundle, LCDDBaseGeometry mother) {
+	private void addHalfModule(TestRunHalfModuleBundle bundle, LCDDSurveyVolume mother) {
 		// This could perhaps be fixed if there is a relation with daughters in geometry definition?
 		// create the half-module
-		LCDDBaseGeometry lcddHM = new LCDDBaseGeometry(bundle.halfModule, lcdd, mother);
+		LCDDSurveyVolume lcddHM = new LCDDSurveyVolume(bundle.halfModule, lcdd, mother);
 		add(lcddHM);
 		// create the sensor
-		LCDDBaseGeometry lcddS = new LCDDBaseGeometry(bundle.sensor, lcdd, lcddHM);
+		LCDDSurveyVolume lcddS = new LCDDSurveyVolume(bundle.sensor, lcdd, lcddHM);
 		add(lcddS);
 		// create the active sensor
-		LCDDBaseGeometry lcddAS = new LCDDBaseGeometry(bundle.activeSensor, lcdd, lcddS);
+		LCDDSurveyVolume lcddAS = new LCDDSurveyVolume(bundle.activeSensor, lcdd, lcddS);
 		add(lcddAS);
 		// create the lamination
-		LCDDBaseGeometry lcddL = new LCDDBaseGeometry(bundle.lamination, lcdd, lcddHM);
+		LCDDSurveyVolume lcddL = new LCDDSurveyVolume(bundle.lamination, lcdd, lcddHM);
 		add(lcddL);
 		// create the carbon fiber frame
-		LCDDBaseGeometry lcddCF = new LCDDBaseGeometry(bundle.carbonFiber, lcdd, lcddHM);
+		LCDDSurveyVolume lcddCF = new LCDDSurveyVolume(bundle.carbonFiber, lcdd, lcddHM);
 		add(lcddCF);
 		// create the hybrid frame
-		LCDDBaseGeometry lcddH = new LCDDBaseGeometry(bundle.hybrid, lcdd, lcddHM);
+		LCDDSurveyVolume lcddH = new LCDDSurveyVolume(bundle.hybrid, lcdd, lcddHM);
 		add(lcddH);
 
 	}	
@@ -164,8 +164,8 @@
 
 	public void setVisualization() {
 
-		if(isDebug()) System.out.printf("%s: Set LCDD visualization for %d LCDD geometry objects \n", getClass().getSimpleName(), lcddGeometries.size());
-		for(LCDDBaseGeometry g : lcddGeometries) {
+		if(isDebug()) System.out.printf("%s: Set LCDD visualization for %d LCDD geometry objects \n", getClass().getSimpleName(), lcddSurveyVolumes.size());
+		for(SurveyVolumeImpl g : lcddSurveyVolumes) {
 			if(isDebug()) System.out.printf("%s: Set LCDD vis for %s \n", getClass().getSimpleName(), g.getName());			
 			if(g.getName().endsWith("baseplate")) g.setVisName("BasePlateVis");
 			//else if(g.getName().contains("base")) g.setVisName("BaseVis");

Modified: projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/HPSTrackerJavaBuilder.java
 =============================================================================
--- projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/HPSTrackerJavaBuilder.java	(original)
+++ projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/HPSTrackerJavaBuilder.java	Fri Oct 31 12:37:29 2014
@@ -1,8 +1,4 @@
 package org.lcsim.geometry.compact.converter;
-
-import hep.physics.vec.BasicHep3Vector;
-import hep.physics.vec.Hep3Vector;
-import hep.physics.vec.VecOp;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -11,29 +7,17 @@
 import org.lcsim.detector.DetectorIdentifierHelper;
 import org.lcsim.detector.IDetectorElement;
 import org.lcsim.detector.ILogicalVolume;
-import org.lcsim.detector.IPhysicalVolume;
-import org.lcsim.detector.IRotation3D;
-import org.lcsim.detector.ITranslation3D;
-import org.lcsim.detector.LogicalVolume;
-import org.lcsim.detector.PhysicalVolume;
-import org.lcsim.detector.RotationGeant;
-import org.lcsim.detector.Transform3D;
-import org.lcsim.detector.Translation3D;
 import org.lcsim.detector.identifier.ExpandedIdentifier;
 import org.lcsim.detector.identifier.IExpandedIdentifier;
 import org.lcsim.detector.identifier.IIdentifierDictionary;
-import org.lcsim.detector.material.IMaterial;
-import org.lcsim.detector.material.MaterialStore;
-import org.lcsim.detector.solids.Box;
 import org.lcsim.detector.tracker.silicon.SiTrackerModule;
 import org.lcsim.geometry.compact.Subdetector;
-import org.lcsim.geometry.util.TransformationUtils;
 
 public abstract class HPSTrackerJavaBuilder implements IHPSTrackerJavaBuilder {
 
 	protected boolean _debug = true;
-	private JavaBaseGeometry baseTrackerGeometry;
-	protected List<JavaBaseGeometry> java_objects = new ArrayList<JavaBaseGeometry>();
+	private JavaSurveyVolume baseSurveyVolume;
+	protected List<JavaSurveyVolume> javaSurveyVolumes = new ArrayList<JavaSurveyVolume>();
 	protected DetectorIdentifierHelper detectorIdentifierHelper;
 	protected IIdentifierDictionary identifierDictionary;
 	protected Subdetector subdet;
@@ -55,8 +39,8 @@
 	 * Add to list of objects.
 	 * @param geom - object to add.
 	 */
-	public void add(JavaBaseGeometry geom) {
-		java_objects.add(geom);
+	public void add(JavaSurveyVolume geom) {
+		javaSurveyVolumes.add(geom);
 	}
 	
 	public void setBuilder(HPSTrackerBuilder b) {
@@ -172,309 +156,15 @@
 	/**
 	 * @return the baseTrackerGeometry
 	 */
-	public JavaBaseGeometry getBaseTrackerGeometry() {
-		return baseTrackerGeometry;
+	public JavaSurveyVolume getBaseTrackerGeometry() {
+		return baseSurveyVolume;
 	}
 
 	/**
 	 * @param baseTrackerGeometry the baseTrackerGeometry to set
 	 */
-	public void setBaseTrackerGeometry(JavaBaseGeometry baseTrackerGeometry) {
-		this.baseTrackerGeometry = baseTrackerGeometry;
-	}
-
-
-	/**
-	 * 
-	 *  Interface to the JAVA converter geometry for the geometry definition.   
-	 *  In this case no volume is built but can be used as reference in building the geometry.
-	 * @author Per Hansson Adrian <[log in to unmask]>
-	 */
-	public static class GhostJavaBaseGeom extends JavaBaseGeometry {
-		
-		/**
-		 * Initialize with base and mother. This is typically for a reference geometry object 
-		 * that is used for referencing coordinate systems but that doesn't have a volume itself.
-		 * @param base - object used to get geometry definitions
-		 * @param mother - mother object
-		 */
-		public GhostJavaBaseGeom(SurveyVolume base, JavaBaseGeometry mother) {
-			super();
-			if(isDebug()) System.out.printf("%s: constructing JAVA ghost object %s with mother %s\n", this.getClass().getSimpleName(),base.getName(),mother==null?"null":mother.getName());
-			setName(base.getName());
-			setMother(mother);
-			mother.addDaughter(this);
-			setPositionAndRotation(base);
-			if(isDebug()) System.out.printf("%s: DONE constructing JAVA object %s\n", this.getClass().getSimpleName(),base.getName());
-		}
-		
-
-
-	}
-
-	/**
-	 *  Interface to the JAVA converter geometry for the geometry definition.  
-	 * @author Per Hansson Adrian <[log in to unmask]>
-	 */
-	public static class JavaBaseGeometry {
-		private boolean debug = false;
-		private String name;
-		private Box box= null;
-		private ILogicalVolume volume = null;
-		private ITranslation3D pos = null;
-		private IRotation3D rot = null;
-		private IPhysicalVolume physVolume = null;
-		private JavaBaseGeometry mother = null;
-		public List<JavaBaseGeometry> daughters = new ArrayList<JavaBaseGeometry>();
-		private int componentId = -1;
-		
-		/**
-		 *  Default constructor
-		 */
-		public JavaBaseGeometry() {
-		}
-
-		/**
-		 * Construct a JAVA geometry object from its geometry definition and an already built logical volume. 
-		 * This is typically used by the tracking volume.
-		 * @param geomObject - input geometry definition
-		 * @param vol - logical volume
-		 */
-		public JavaBaseGeometry(SurveyVolume geomObject, ILogicalVolume vol) {
-			if(isDebug()) System.out.printf("%s: JavaBaseGeometry %s (given logical volume %s)\n", this.getClass().getSimpleName(),geomObject.getName(),vol.getName());
-			// this must be tracking volume. May change in the future and is probably weird to make this requirement here. 
-			if(!geomObject.getName().contains("tracking")) throw new RuntimeException("this constructor is only used with the tracking volume!?");
-			setName(geomObject.getName());
-			setVolume(vol);
-			// since it's tracking volume, set the pos and rotation trivially
-			Hep3Vector lcdd_rot_angles = TransformationUtils.getCardanAngles(geomObject.getCoord().v(), geomObject.getCoord().w(), new BasicHep3Vector(0,1,0),new BasicHep3Vector(0,0,1));
-			setPos(new Translation3D(0,0,0));
-			setRot(new RotationGeant(lcdd_rot_angles.x(), lcdd_rot_angles.y(), lcdd_rot_angles.z()));
-			if(isDebug()) System.out.printf("%s: DONE JavaBaseGeometry %s\n", this.getClass().getSimpleName(),geomObject.getName());
-		}
-		
-		/**
-		 * Construct a JAVA geometry object from its geometry definition. 
-		 * @param geomObject - input geometry definition
-		 * @param mother - reference to mother JAVA definition
-		 * @param volumeId - component id number 
-		 */
-		public JavaBaseGeometry(SurveyVolume geomObject, JavaBaseGeometry mother, int volumeId) {
-			if(isDebug()) System.out.printf("%s: JavaBaseGeometry %s (volumeID %d, mother %s)\n", this.getClass().getSimpleName(),geomObject.getName(),volumeId,mother==null?"null":mother.getName());
-			setName(geomObject.getName());
-			setComponentId(volumeId);
-			setMother(mother);
-			mother.addDaughter(this);
-			buildBox(geomObject);
-			buildVolume(geomObject);
-			setPositionAndRotation(geomObject);
-			if(isDebug()) System.out.printf("%s: DONE JavaBaseGeometry %s\n", this.getClass().getSimpleName(),geomObject.getName());
-		}
-
-		protected boolean hasCoordinateSystemInfo() {
-			return pos!=null && rot!=null;
-		}
-		
-		
-		public void buildPhysVolume() {
-			if(isDebug()) System.out.printf("%s: build phys volume for %s with mother %s and physical mother %s\n", this.getClass().getSimpleName(),getName(),getMother().getName(),getPhysMother().getName());
-			JavaBaseGeometry physMother =  getPhysMother();
-			setPhysVolume(new PhysicalVolume(new Transform3D(getPos(), getRot()), name, volume, physMother.getVolume(),getComponentId()));
-		}
-		protected void buildBox(SurveyVolume base) {
-			Hep3Vector b = base.getBoxDim();
-			b = VecOp.mult(0.5, b);
-			if(isDebug()) System.out.printf("%s: build box for %s with dimensions %s \n", this.getClass().getSimpleName(),getName(), b);
-			setBox(new Box(getName() + "Box", b.x(), b.y(), b.z())); 
-		}
-		protected void buildVolume(SurveyVolume base) {
-			if(isDebug()) System.out.printf("%s: build volume for %s with material %s\n", this.getClass().getSimpleName(),getName(),base.getMaterial());
-				IMaterial material = MaterialStore.getInstance().get(base.getMaterial());
-				setVolume(new LogicalVolume(getName() + "_volume", box, material));
-			
-		}
-		protected void setPositionAndRotation(SurveyVolume base) {
-			if(isDebug()) System.out.printf("%s: set position and rotation for volume %s\n", this.getClass().getSimpleName(),getName());
-			
-			// no mother, this must be the world/tracking volume!?
-			if(base.getMother()==null) throw new RuntimeException("trying to set coordinates w/o mother defined for "+base.getName());
-			
-			// Vector from origin to center of box locally 
-			Hep3Vector box_center_base_local = base.getCenter();
-			
-			// find the physical mother i.e. not a ghost volume and compound transformations to it
-			JavaBaseGeometry physMother =  getPhysMother();
-			if(isDebug()) System.out.printf("%s: physical mother to transform to is %s; find the transform to it\n", this.getClass().getSimpleName(),physMother.getName());
-			Transform3D trf = HPSTrackerBuilder.getTransform(base.getCoord().getTransformation(),base.getMother(),physMother.getName()); 
-			if(isDebug()) System.out.printf("%s: found transform to physical mother \n%s\n\n", this.getClass().getSimpleName(),trf.toString());
-			
-			// find the position of the center in the physical mother coord
-			Hep3Vector box_center_base = trf.transformed(box_center_base_local);
-			
-			// find the position of the center of the box in the mother coordinate system, make sure to use the physical mother coordinates
-			if(isDebug()) System.out.printf("%s: find center of box in physical mother coord %s \n", this.getClass().getSimpleName(),physMother.getName());
-			// hack since my getTransform function needs a mother TODO Fix this!
-			SurveyVolume gm = base;
-			if(isDebug()) System.out.printf("%s: look for physical mother %s starting from mother %s \n", this.getClass().getSimpleName(),physMother.getName(),gm.getMother()!=null?gm.getMother().getName():"-- no mother --");
-			while((gm=gm.getMother()).getName()!=physMother.getName()) {
-				if(isDebug()) System.out.printf("%s: gm is %s \n", this.getClass().getSimpleName(),gm.getName());
-				//gm = gm.getMother();
-			}
-			if(isDebug()) System.out.printf("%s: found physical mother %s with center at %s \n", this.getClass().getSimpleName(),gm.getName(), gm.getCenter());
-			
-			Hep3Vector mother_center = gm.getCenter();
-
-			// now calculate the position of this box center in the mother LCDD coordinates
-			Hep3Vector box_center = VecOp.sub(box_center_base, mother_center);
-
-			//Find LCDD Euler rotation angles from coordinate system unit vectors
-			//Note that this has to be rotation wrt to physical mother and not just mother as normally is the case
-			//Use apache lib to get angles, but in principle I should already have it from the trf above
-			//Hep3Vector lcdd_rot_angles = HPSTestRunTracker2014.getEulerAngles(base.getCoord().v(), base.getCoord().w(), new BasicHep3Vector(0,1,0),new BasicHep3Vector(0,0,1));
-			if(isDebug()) System.out.printf("%s: find LCDD Cardan rotation angles - need to find mother to physical mother transform \n", this.getClass().getSimpleName(),physMother.getName());
-			Hep3Vector base_u = base.getCoord().u();
-            Hep3Vector base_v = base.getCoord().v();
-            Hep3Vector base_w = base.getCoord().w();
-            if(isDebug()) System.out.printf("%s: unit vectors in mother coord: %s, %s, %s\n", this.getClass().getSimpleName(),base_u.toString(),base_v.toString(),base_w.toString());
-            Hep3Vector unit_u = new BasicHep3Vector(1,0,0);
-            Hep3Vector unit_v = new BasicHep3Vector(0,1,0);
-            Hep3Vector unit_w = new BasicHep3Vector(0,0,1);
-            if(!base.getMother().getName().equals(physMother.getName())) {
-                if(isDebug()) System.out.printf("%s: Need to get unit vectors in physical mother %s coord system\n", this.getClass().getSimpleName(),physMother.getName());
-                Transform3D trf_mother = HPSTrackerBuilder.getTransform(base.getMother().getCoord().getTransformation(),base.getMother().getMother(),physMother.getName()); 
-                if(isDebug()) System.out.printf("%s: found transform from mother to physical mother \n%s\n", this.getClass().getSimpleName(),trf_mother.toString());
-                //unit_u = VecOp.unit(trf_mother.rotated(unit_u));
-                //unit_v = VecOp.unit(trf_mother.rotated(unit_v));
-                //unit_w = VecOp.unit(trf_mother.rotated(unit_w));
-                base_u = VecOp.unit(trf_mother.rotated(base_u));
-                base_v = VecOp.unit(trf_mother.rotated(base_v));
-                base_w = VecOp.unit(trf_mother.rotated(base_w));
-                
-            } else {
-                if(isDebug()) System.out.printf("%s: mother and physical mother is the same so unit vectors didn't change\n",getClass().getSimpleName());
-            }
-            
-            if(isDebug()) {
-                if(isDebug()) System.out.printf("%s: final unit vectors to get Cardan angles from : \n%s, %s, %s -> %s, %s, %s \n", 
-                                                this.getClass().getSimpleName(),
-                                                base_u.toString(),base_v.toString(),base_w.toString(),              
-                                                unit_u.toString(),unit_v.toString(),unit_w.toString());
-                //System.out.printf("%s: unit vectors u %s v %s w %s\n", this.getClass().getSimpleName(),base.getCoord().u().toString(),base.getCoord().v().toString(),base.getCoord().w().toString());
-            }
-            
-			Hep3Vector lcdd_rot_angles = TransformationUtils.getCardanAngles(base_u, base_v, base_w, unit_u, unit_v, unit_w);
-
-
-			// Create the LCDD position
-			setPos(new Translation3D(box_center.x(), box_center.y(), box_center.z()));
-			setRot(new RotationGeant(lcdd_rot_angles.x(), lcdd_rot_angles.y(), lcdd_rot_angles.z()));
-			
-			if(isDebug()) {
-				
-				System.out.printf("%s: box_center_base_local       %s\n", this.getClass().getSimpleName(), box_center_base_local.toString());
-				System.out.printf("%s: box_center_base             %s\n", this.getClass().getSimpleName(), box_center_base.toString());
-				System.out.printf("%s: mother center               %s\n", this.getClass().getSimpleName(), base.getMother()==null?" <no mother> ":mother_center.toString());
-				System.out.printf("%s: box_center                  %s\n", this.getClass().getSimpleName(), box_center.toString());
-				System.out.printf("%s: pos                         %s\n", this.getClass().getSimpleName(), getPos().toString());
-				System.out.printf("%s: euler                       %s\n", this.getClass().getSimpleName(), lcdd_rot_angles.toString());
-				System.out.printf("%s: rot                         %s\n", this.getClass().getSimpleName(), getRot().toString());
-
-				//calculate the position in tracking volume separately as a xcheck
-				Hep3Vector box_center_tracking_xcheck = HPSTrackerBuilder.transformToTracking(box_center_base_local, base);
-				System.out.printf("%s: box_center_tracking_xcheck  %s for %s\n", this.getClass().getSimpleName(), box_center_tracking_xcheck.toString(),base.getName());
-			}
-			
-		}
-
-		/**
-		 * Find the first non-ghost volume among parents.  
-		 * @return mother object
-		 */
-		public JavaBaseGeometry getPhysMother() {
-			//if(isDebug()) System.out.printf("%s: finding physical mother to %s\n", this.getClass().getSimpleName(), getName());
-			if(mother==null) throw new RuntimeException("Trying to get phys mother but there is no mother!");
-			if(mother instanceof GhostJavaBaseGeom) {
-				return mother.getPhysMother();
-			} else {
-				//if(isDebug()) System.out.printf("%s: found a non-ghost volume: %s\n", this.getClass().getSimpleName(), mother.getName());
-				return mother;
-			}
-		}
-		
-		
-		public ILogicalVolume getVolume() {
-			return volume;
-		}
-		protected void setVolume(ILogicalVolume volume) {
-			this.volume = volume;
-		}
-		protected Box getBox() {
-			return box;
-		}
-		protected void setBox(Box b) {
-			box = b;
-		}	
-		public String getName() {
-			return name;
-		}
-		protected void setName(String name) {
-			this.name = name;
-		}
-		protected ITranslation3D getPos() {
-			return pos;
-		}
-		protected void setPos(ITranslation3D iTranslation3D) {
-			this.pos = iTranslation3D;
-		}
-		protected IRotation3D getRot() {
-			return rot;
-		}
-		protected void setRot(IRotation3D iRotation3D) {
-			this.rot = iRotation3D;
-		}
-		public JavaBaseGeometry getMother() {
-			return mother;
-		}
-		protected void setMother(JavaBaseGeometry mother) {
-			this.mother = mother;
-		}
-		public IPhysicalVolume getPhysVolume() {
-			return physVolume;
-		}
-		protected void setPhysVolume(PhysicalVolume physVolume) {
-			this.physVolume = physVolume;
-		}
-		public boolean isDebug() {
-			return debug;
-		}
-
-		public List<JavaBaseGeometry> getDaughters() {
-			return daughters;
-		}
-
-		protected void addDaughter(JavaBaseGeometry o) {
-			getDaughters().add(o);
-		}
-
-		public int getComponentId() {
-			return componentId;
-		}
-
-		public void setComponentId(int componentId) {
-			this.componentId = componentId;
-		}
-		
-		public String toString() {
-			String s = "JavaBaseGeometry " + getName() + "\n";
-			if(getPos()!=null && getRot()!=null) {
-				s += "Position: "  + getPos().toString() + "\n";
-				s += "Rotation: " + getRot().toString() + "\n";
-			} else {
-				s+= " - no position/rotation info -\n";
-			}
-			return s;
-		}
-
+	public void setBaseTrackerGeometry(JavaSurveyVolume baseTrackerGeometry) {
+		this.baseSurveyVolume = baseTrackerGeometry;
 	}
 
 

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 Oct 31 12:37:29 2014
@@ -1,32 +1,19 @@
 package org.lcsim.geometry.compact.converter;
-
-import hep.physics.vec.BasicHep3Vector;
-import hep.physics.vec.Hep3Vector;
-import hep.physics.vec.VecOp;
 
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Map;
 
 import org.jdom.Element;
-import org.jdom.JDOMException;
-import org.lcsim.detector.Transform3D;
-import org.lcsim.geometry.compact.converter.lcdd.util.Box;
 import org.lcsim.geometry.compact.converter.lcdd.util.LCDD;
-import org.lcsim.geometry.compact.converter.lcdd.util.Material;
-import org.lcsim.geometry.compact.converter.lcdd.util.PhysVol;
-import org.lcsim.geometry.compact.converter.lcdd.util.Position;
-import org.lcsim.geometry.compact.converter.lcdd.util.Rotation;
 import org.lcsim.geometry.compact.converter.lcdd.util.SensitiveDetector;
 import org.lcsim.geometry.compact.converter.lcdd.util.Volume;
-import org.lcsim.geometry.util.TransformationUtils;
 
 public abstract class HPSTrackerLCDDBuilder  implements IHPSTrackerLCDDBuilder {
 
 	public boolean _debug = false;
 	protected LCDD lcdd = null;
-	protected LCDDBaseGeometry baseTrackerGeometry;
-	protected List<LCDDBaseGeometry> lcddGeometries = new ArrayList<LCDDBaseGeometry>();
+	protected LCDDSurveyVolume baseSurveyVolume;
+	protected List<LCDDSurveyVolume> lcddSurveyVolumes = new ArrayList<LCDDSurveyVolume>();
 	private SensitiveDetector sensitiveDetector;
 	public HPSTrackerBuilder _builder = null;
     protected Element node;
@@ -69,266 +56,11 @@
 	}
 	
 	/**
-	 * Interface to the LCDD converter geometry for the geometry definition. 
-	 *   
-	 * @author Per Hansson Adrian <[log in to unmask]>
-	 */
-	public static class LCDDBaseGeometry extends LCDDBaseGeometryVisualization {
-		private boolean debug = true;
-		private String name;
-		private Box box= null;
-		private Volume volume = null;
-		private Position pos = null;
-		private Rotation rot = null;
-		private PhysVol physVolume = null;
-		private LCDD lcdd = null;
-		private LCDDBaseGeometry mother = null;
-		protected Map<String,Integer> physVolId = null;
-		public List<LCDDBaseGeometry> daughters = new ArrayList<LCDDBaseGeometry>();
-		/**
-		 *  Default constructor
-		 */
-		public LCDDBaseGeometry() {
-		}
-		
-		/**
-		 * Initialize this object with a known volume and no mother. Typically the world volume would use this.
-		 * @param base - object used to get geometry definitions
-		 * @param vol - given volume
-		 */
-		public LCDDBaseGeometry(SurveyVolume base, Volume volume) {
-			super();
-			if(isDebug()) System.out.printf("%s: constructing LCDD object %s with given volume name %s\n", this.getClass().getSimpleName(),base.getName(),volume.getName());
-			setName(base.getName());
-			setVolume(volume);
-			if(isDebug()) System.out.printf("%s: DONE constructing LCDD object %s\n", this.getClass().getSimpleName(),base.getName());
-			Hep3Vector lcdd_rot_angles = TransformationUtils.getCardanAngles(base.getCoord().v(), base.getCoord().w(), new BasicHep3Vector(0,1,0),new BasicHep3Vector(0,0,1));
-			setPos(new Position(getName() + "_position", 0, 0, 0));
-			setRot(new Rotation(getName() + "_rotation",lcdd_rot_angles.x(), lcdd_rot_angles.y(), lcdd_rot_angles.z()));
-			if(isDebug()) System.out.printf("%s: DONE  %s\n", this.getClass().getSimpleName(),base.getName());
-		}
-		
-		/**
-		 * Interface to the LCDD converter geometry for the geometry definition. 
-		 * @param base - input geometry definition
-		 * @param lcdd - lcdd file 
-		 * @param mother - reference to mother LCDD definition
-		 */
-		public LCDDBaseGeometry(SurveyVolume base, LCDD lcdd, LCDDBaseGeometry mother) {
-			if(isDebug()) System.out.printf("%s: constructing LCDD object %s with mother %s\n", this.getClass().getSimpleName(),base.getName(),mother==null?"null":mother.getName());
-			this.lcdd = lcdd;
-			setName(base.getName());
-			setMother(mother);
-			mother.addDaughter(this);
-			buildBox(base);
-			buildVolume(base);
-			setPositionAndRotation(base);
-			//buildPhysVolume(mother);
-			if(isDebug()) System.out.printf("%s: DONE constructing LCDD object %s\n", this.getClass().getSimpleName(),base.getName());
-		}
-	
-		
-		public void buildPhysVolume() {
-			if(isDebug()) System.out.printf("%s: build phys volume for %s\n", this.getClass().getSimpleName(),getName());
-			setPhysVolume(new PhysVol(volume, getMother().getVolume(), getPos(), getRot()));
-		}
-		public void buildBox(SurveyVolume base) {
-			if(isDebug()) System.out.printf("%s: build box for %s\n", this.getClass().getSimpleName(),getName());
-			setBox(new Box(getName() + "Box", base.getBoxDim().x(), base.getBoxDim().y(), base.getBoxDim().z())); 
-		}
-		public void buildVolume(SurveyVolume base) {
-			if(isDebug()) System.out.printf("%s: build volume for %s with material %s\n", this.getClass().getSimpleName(),getName(),base.getMaterial());
-			try {
-				Material mat = lcdd.getMaterial(base.getMaterial());
-				setVolume(new Volume(getName() + "_volume", box, mat));
-			} catch (JDOMException e) {
-				e.printStackTrace();
-			}
-		}
-		
-		
-		public void setPositionAndRotation(SurveyVolume base) {
-			if(isDebug()) System.out.printf("%s: set position and rotation for volume %s\n", this.getClass().getSimpleName(),getName());
-			
-			// NOTE:
-			// This sets position and reference w.r.t. mother coordinate system. 
-			// If I'm not building that volume this will be wrong. 
-			// TODO Similar to in the JAVA converter this should be something like the physical mother.
-			
-			if(base.getMother()==null) throw new RuntimeException("trying to set coordinates w/o mother defined for "+base.getName());
-			
-			// Vector from origin to center of box locally 
-			Hep3Vector box_center_base_local = base.getCenter();
-			
-			//translate to the mother coordinate system
-			LCDDBaseGeometry physMother = getPhysMother();
-			if(isDebug()) System.out.printf("%s: physical mother to transform to is %s; find the transform to it\n", this.getClass().getSimpleName(),physMother.getName());
-			Transform3D trf = HPSTrackerBuilder.getTransform(base.getCoord().getTransformation(),base.getMother(),physMother.getName()); 
-			if(isDebug()) System.out.printf("%s: found transform to physical mother \n%s\n\n", this.getClass().getSimpleName(),trf.toString());
-			
-			// find the position of the center in the physical mother coord
-			Hep3Vector box_center_base = trf.transformed(box_center_base_local);
-			
-			// find the position of the center of the box in the mother coordinate system, make sure to use the physical mother coordinates
-			if(isDebug()) System.out.printf("%s: find center of box in physical mother coord %s \n", this.getClass().getSimpleName(),physMother.getName());
-			// hack since my getTransform function needs a mother TODO Fix this!
-			SurveyVolume gm = base;
-			if(isDebug()) System.out.printf("%s: look for physical mother %s starting from mother %s \n", this.getClass().getSimpleName(),physMother.getName(),gm.getMother()!=null?gm.getMother().getName():"-- no mother --");
-			while((gm=gm.getMother()).getName()!=physMother.getName()) {
-				if(isDebug()) System.out.printf("%s: gm is %s \n", this.getClass().getSimpleName(),gm.getName());
-				//gm = gm.getMother();
-			}
-			if(isDebug()) System.out.printf("%s: found physical mother %s with center at %s \n", this.getClass().getSimpleName(),gm.getName(), gm.getCenter());
-
-			Hep3Vector mother_center = gm.getCenter();
-			
-			// find the position of the center in the mother coord
-			Hep3Vector box_center = VecOp.sub(box_center_base, mother_center);
-			
-			//Find LCDD Euler rotation angles from coordinate system unit vectors
-			//Note that this has to be rotation wrt to physical mother and not just mother as normally is the case
-			if(isDebug()) System.out.printf("%s: find LCDD Cardan rotation angles - need to find mother to physical mother transform \n", this.getClass().getSimpleName(),physMother.getName());
-			Hep3Vector base_u = base.getCoord().u();
-			Hep3Vector base_v = base.getCoord().v();
-			Hep3Vector base_w = base.getCoord().w();
-            if(isDebug()) System.out.printf("%s: unit vectors in mother coord: %s, %s, %s\n", this.getClass().getSimpleName(),base_u.toString(),base_v.toString(),base_w.toString());
-			Hep3Vector unit_u = new BasicHep3Vector(1,0,0);
-			Hep3Vector unit_v = new BasicHep3Vector(0,1,0);
-			Hep3Vector unit_w = new BasicHep3Vector(0,0,1);
-			if(!base.getMother().getName().equals(physMother.getName())) {
-			    if(isDebug()) System.out.printf("%s: Need to get unit vectors in physical mother %s coord system\n", this.getClass().getSimpleName(),physMother.getName());
-                Transform3D trf_mother = HPSTrackerBuilder.getTransform(base.getMother().getCoord().getTransformation(),base.getMother().getMother(),physMother.getName()); 
-                if(isDebug()) System.out.printf("%s: found transform from mother to physical mother \n%s\n", this.getClass().getSimpleName(),trf_mother.toString());
-				//unit_u = VecOp.unit(trf_mother.rotated(unit_u));
-				//unit_v = VecOp.unit(trf_mother.rotated(unit_v));
-				//unit_w = VecOp.unit(trf_mother.rotated(unit_w));
-				base_u = VecOp.unit(trf_mother.rotated(base_u));
-                base_v = VecOp.unit(trf_mother.rotated(base_v));
-                base_w = VecOp.unit(trf_mother.rotated(base_w));
-                
-			} else {
-				if(isDebug()) System.out.printf("%s: mother and physical mother is the same so unit vectors didn't change\n",getClass().getSimpleName());
-			}
-			
-			if(isDebug()) {
-			    if(isDebug()) System.out.printf("%s: final unit vectors to get Cardan angles from : \n%s, %s, %s -> %s, %s, %s \n", 
-			                                    this.getClass().getSimpleName(),
-			                                    base_u.toString(),base_v.toString(),base_w.toString(),	            
-			                                    unit_u.toString(),unit_v.toString(),unit_w.toString());
-				//System.out.printf("%s: unit vectors u %s v %s w %s\n", this.getClass().getSimpleName(),base.getCoord().u().toString(),base.getCoord().v().toString(),base.getCoord().w().toString());
-			}
-            Hep3Vector lcdd_rot_angles = TransformationUtils.getCardanAngles(base_u, base_v, base_w, unit_u, unit_v, unit_w);
-            
-			
-			// Create the LCDD position
-			setPos(new Position(getName() + "_position",box_center.x(), box_center.y(), box_center.z()));
-			
-			setRot(new Rotation(getName() + "_rotation",lcdd_rot_angles.x(), lcdd_rot_angles.y(), lcdd_rot_angles.z()));
-			if(isDebug()) {
-				System.out.printf("%s: box_center_base_local  %s\n", this.getClass().getSimpleName(), box_center_base_local.toString());
-				System.out.printf("%s: box_center_base        %s\n", this.getClass().getSimpleName(), box_center_base.toString());
-				System.out.printf("%s: mother center          %s\n", this.getClass().getSimpleName(), mother_center.toString());
-				System.out.printf("%s: box_center             %s\n", this.getClass().getSimpleName(), box_center.toString());
-				System.out.printf("%s: pos                    %s\n", this.getClass().getSimpleName(), getPos().toString());
-				System.out.printf("%s: euler                  %s\n", this.getClass().getSimpleName(), lcdd_rot_angles.toString());
-                System.out.printf("%s: rot                    %s\n", this.getClass().getSimpleName(), getRot().toString());
-				
-				//calculate the position in tracking volume separately as a xcheck
-				Hep3Vector box_center_tracking_xcheck = HPSTrackerBuilder.transformToTracking(box_center_base_local, base);
-				System.out.printf("%s: box_center_tracking_xcheck  %s\n", this.getClass().getSimpleName(), box_center_tracking_xcheck.toString());
-			}
-			
-		}
-		/**
-		 * Find the first non-ghost volume among parents.  
-		 * @return mother object
-		 */
-		public LCDDBaseGeometry getPhysMother() {
-			//if(isDebug()) System.out.printf("%s: finding physical mother to %s\n", this.getClass().getSimpleName(), getName());
-			if(mother==null) throw new RuntimeException("Trying to get phys mother but there is no mother!");
-			if(mother instanceof GhostLCDDBaseGeometry) {
-				return mother.getPhysMother();
-			} else {
-				//if(isDebug()) System.out.printf("%s: found a non-ghost volume: %s\n", this.getClass().getSimpleName(), mother.getName());
-				return mother;
-			}
-		}
-		
-		public Volume getVolume() {
-			return volume;
-		}
-		public void setVolume(Volume volume) {
-			this.volume = volume;
-		}
-		public Box getBox() {
-			return box;
-		}
-		public void setBox(Box b) {
-			box = b;
-		}	
-		public String getName() {
-			return name;
-		}
-		public void setName(String name) {
-			this.name = name;
-		}
-		public Position getPos() {
-			return pos;
-		}
-		public void setPos(Position pos) {
-			this.pos = pos;
-		}
-		public Rotation getRot() {
-			return rot;
-		}
-		public void setRot(Rotation rot) {
-			this.rot = rot;
-		}
-		public LCDDBaseGeometry getMother() {
-			return mother;
-		}
-		public void setMother(LCDDBaseGeometry mother) {
-			this.mother = mother;
-		}
-		public PhysVol getPhysVolume() {
-			return physVolume;
-		}
-		public void setPhysVolume(PhysVol physVolume) {
-			this.physVolume = physVolume;
-		}
-		public boolean isDebug() {
-			return debug;
-		}
-		public List<LCDDBaseGeometry> getDaughters() {
-			return daughters;
-		}
-		public void addDaughter(LCDDBaseGeometry o) {
-			getDaughters().add(o);
-		}
-		public String toString() {
-			String s = "LCDDBaseGeometry " + getName() + "\n";
-			if(getPos()!=null && getRot()!=null) 	{
-				double x = Double.valueOf(getPos().getAttributeValue("x"));
-				double y = Double.valueOf(getPos().getAttributeValue("y"));
-				double z = Double.valueOf(getPos().getAttributeValue("z"));
-				s += "Position: " + String.format("(%.4f %.4f %.4f)\n", x,y,z);
-				x = Double.valueOf(getRot().getAttributeValue("x"));
-				y = Double.valueOf(getRot().getAttributeValue("y"));
-				z = Double.valueOf(getRot().getAttributeValue("z"));
-				s += "Rotation: " + String.format("(%.4f %.4f %.4f)\n", x,y,z);
-			} else {
-				s += " - no position/rotation info -\n";
-			}
-			return s;
-		}
-	}
-
-	/**
 	 * Add to list of objects.
 	 * @param geom - object to add.
 	 */
-	public void add(LCDDBaseGeometry geom) {
-		lcddGeometries.add(geom);
+	public void add(LCDDSurveyVolume geom) {
+		lcddSurveyVolumes.add(geom);
 	}
 
 	/**
@@ -347,63 +79,14 @@
 		return lcdd;
 	}
 
-	public LCDDBaseGeometry getBaseLCDD() {
-		return baseTrackerGeometry;
+	public LCDDSurveyVolume getBaseLCDD() {
+		return baseSurveyVolume;
 	}
 
-	/**
-	 * 
-	 * Interface to the LCDD converter geometry for the geometry definition. 
-	 * No volume is built but it can be used as reference in building the geometry.
-	 * 
-	 * @author Per Hansson Adrian <[log in to unmask]>
-	 *
-	 */
-	public static class GhostLCDDBaseGeometry extends LCDDBaseGeometry {
-	
-		
-		
-		/**
-		 * Initialize with base and mother. This is typically for a reference geometry object 
-		 * that is used for referencing coordinate systems but that doesn't have a volume itself.
-		 * @param base - object used to get geometry definitions
-		 * @param mother - mother LCDD object
-		 */
-		public GhostLCDDBaseGeometry(SurveyVolume base, LCDDBaseGeometry mother) {
-			super();
-			if(isDebug()) System.out.printf("%s: constructing LCDD ghost object %s with mother %s\n", this.getClass().getSimpleName(),base.getName(),mother==null?"null":mother.getName());
-			setName(base.getName());
-			setMother(mother);
-			if(isDebug()) System.out.printf("%s: DONE constructing LCDD object %s\n", this.getClass().getSimpleName(),base.getName());
-		}
-		
-	}
-
-	/**
-	 * 
-	 * LCDD geometry visualization information
-	 * 
-	 * @author Per Hansson Adrian <[log in to unmask]>
-	 */
-	public static class LCDDBaseGeometryVisualization {
-		protected String visName = "";
-		public LCDDBaseGeometryVisualization() {}
-		public String getVisName() {
-			return visName;
-		}
-		protected void setVisName(String visName) {
-			this.visName = visName;
-		}
-		
-		
-	}
-
-
-	
 	public void setVisualization() {
 	
-		if(isDebug()) System.out.printf("%s: Set LCDD visualization for %d LCDD geometry objects \n", getClass().getSimpleName(), lcddGeometries.size());
-		for(LCDDBaseGeometry g : lcddGeometries) {
+		if(isDebug()) System.out.printf("%s: Set LCDD visualization for %d LCDD geometry objects \n", getClass().getSimpleName(), lcddSurveyVolumes.size());
+		for(SurveyVolumeImpl g : lcddSurveyVolumes) {
 			if(isDebug()) System.out.printf("%s: Set LCDD vis for %s \n", getClass().getSimpleName(), g.getName());			
 			if(g.getName().endsWith("baseplate")) g.setVisName("BasePlateVis");
 			//else if(g.getName().contains("base")) g.setVisName("BaseVis");

Added: projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/JavaGhostSurveyVolume.java
 =============================================================================
--- projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/JavaGhostSurveyVolume.java	(added)
+++ projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/JavaGhostSurveyVolume.java	Fri Oct 31 12:37:29 2014
@@ -0,0 +1,29 @@
+package org.lcsim.geometry.compact.converter;
+
+/**
+ * 
+ *  Interface to the JAVA converter geometry for the geometry definition.   
+ *  In this case no volume is built but can be used as reference in building the geometry.
+ * @author Per Hansson Adrian <[log in to unmask]>
+ */
+public class JavaGhostSurveyVolume extends JavaSurveyVolume {
+	
+	/**
+	 * Initialize with base and mother. This is typically for a reference geometry object 
+	 * that is used for referencing coordinate systems but that doesn't have a volume itself.
+	 * @param base - object used to get geometry definitions
+	 * @param mother - mother object
+	 */
+	public JavaGhostSurveyVolume(SurveyVolume base, JavaSurveyVolume mother) {
+		super();
+		if(isDebug()) System.out.printf("%s: constructing JAVA ghost object %s with mother %s\n", this.getClass().getSimpleName(),base.getName(),mother==null?"null":mother.getName());
+		setName(base.getName());
+		setMother(mother);
+		mother.addDaughter(this);
+		setPositionAndRotation(base);
+		if(isDebug()) System.out.printf("%s: DONE constructing JAVA object %s\n", this.getClass().getSimpleName(),base.getName());
+	}
+	
+
+
+}

Added: projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/JavaSurveyVolume.java
 =============================================================================
--- projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/JavaSurveyVolume.java	(added)
+++ projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/JavaSurveyVolume.java	Fri Oct 31 12:37:29 2014
@@ -0,0 +1,287 @@
+package org.lcsim.geometry.compact.converter;
+
+import hep.physics.vec.BasicHep3Vector;
+import hep.physics.vec.Hep3Vector;
+import hep.physics.vec.VecOp;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.lcsim.detector.ILogicalVolume;
+import org.lcsim.detector.IPhysicalVolume;
+import org.lcsim.detector.IRotation3D;
+import org.lcsim.detector.ITranslation3D;
+import org.lcsim.detector.LogicalVolume;
+import org.lcsim.detector.PhysicalVolume;
+import org.lcsim.detector.RotationGeant;
+import org.lcsim.detector.Transform3D;
+import org.lcsim.detector.Translation3D;
+import org.lcsim.detector.material.IMaterial;
+import org.lcsim.detector.material.MaterialStore;
+import org.lcsim.detector.solids.Box;
+import org.lcsim.geometry.util.TransformationUtils;
+
+/**
+ *  Interface to the JAVA converter geometry for the geometry definition.  
+ * @author Per Hansson Adrian <[log in to unmask]>
+ */
+public class JavaSurveyVolume {
+	private boolean debug = false;
+	private String name;
+	private Box box= null;
+	private ILogicalVolume volume = null;
+	private ITranslation3D pos = null;
+	private IRotation3D rot = null;
+	private IPhysicalVolume physVolume = null;
+	private JavaSurveyVolume mother = null;
+	public List<JavaSurveyVolume> daughters = new ArrayList<JavaSurveyVolume>();
+	private int componentId = -1;
+	
+	/**
+	 *  Default constructor
+	 */
+	public JavaSurveyVolume() {
+	}
+
+	/**
+	 * Construct a JAVA geometry object from its geometry definition and an already built logical volume. 
+	 * This is typically used by the tracking volume.
+	 * @param geomObject - input geometry definition
+	 * @param vol - logical volume
+	 */
+	public JavaSurveyVolume(SurveyVolume geomObject, ILogicalVolume vol) {
+		if(isDebug()) System.out.printf("%s: JavaBaseGeometry %s (given logical volume %s)\n", this.getClass().getSimpleName(),geomObject.getName(),vol.getName());
+		// this must be tracking volume. May change in the future and is probably weird to make this requirement here. 
+		if(!geomObject.getName().contains("tracking")) throw new RuntimeException("this constructor is only used with the tracking volume!?");
+		setName(geomObject.getName());
+		setVolume(vol);
+		// since it's tracking volume, set the pos and rotation trivially
+		Hep3Vector lcdd_rot_angles = TransformationUtils.getCardanAngles(geomObject.getCoord().v(), geomObject.getCoord().w(), new BasicHep3Vector(0,1,0),new BasicHep3Vector(0,0,1));
+		setPos(new Translation3D(0,0,0));
+		setRot(new RotationGeant(lcdd_rot_angles.x(), lcdd_rot_angles.y(), lcdd_rot_angles.z()));
+		if(isDebug()) System.out.printf("%s: DONE JavaBaseGeometry %s\n", this.getClass().getSimpleName(),geomObject.getName());
+	}
+	
+	/**
+	 * Construct a JAVA geometry object from its geometry definition. 
+	 * @param geomObject - input geometry definition
+	 * @param mother - reference to mother JAVA definition
+	 * @param volumeId - component id number 
+	 */
+	public JavaSurveyVolume(SurveyVolume geomObject, JavaSurveyVolume mother, int volumeId) {
+		if(isDebug()) System.out.printf("%s: JavaBaseGeometry %s (volumeID %d, mother %s)\n", this.getClass().getSimpleName(),geomObject.getName(),volumeId,mother==null?"null":mother.getName());
+		setName(geomObject.getName());
+		setComponentId(volumeId);
+		setMother(mother);
+		mother.addDaughter(this);
+		buildBox(geomObject);
+		buildVolume(geomObject);
+		setPositionAndRotation(geomObject);
+		if(isDebug()) System.out.printf("%s: DONE JavaBaseGeometry %s\n", this.getClass().getSimpleName(),geomObject.getName());
+	}
+
+	protected boolean hasCoordinateSystemInfo() {
+		return pos!=null && rot!=null;
+	}
+	
+	
+	public void buildPhysVolume() {
+		if(isDebug()) System.out.printf("%s: build phys volume for %s with mother %s and physical mother %s\n", this.getClass().getSimpleName(),getName(),getMother().getName(),getPhysMother().getName());
+		JavaSurveyVolume physMother =  getPhysMother();
+		setPhysVolume(new PhysicalVolume(new Transform3D(getPos(), getRot()), name, volume, physMother.getVolume(),getComponentId()));
+	}
+	protected void buildBox(SurveyVolume base) {
+		Hep3Vector b = base.getBoxDim();
+		b = VecOp.mult(0.5, b);
+		if(isDebug()) System.out.printf("%s: build box for %s with dimensions %s \n", this.getClass().getSimpleName(),getName(), b);
+		setBox(new Box(getName() + "Box", b.x(), b.y(), b.z())); 
+	}
+	protected void buildVolume(SurveyVolume base) {
+		if(isDebug()) System.out.printf("%s: build volume for %s with material %s\n", this.getClass().getSimpleName(),getName(),base.getMaterial());
+			IMaterial material = MaterialStore.getInstance().get(base.getMaterial());
+			setVolume(new LogicalVolume(getName() + "_volume", box, material));
+		
+	}
+	protected void setPositionAndRotation(SurveyVolume base) {
+		if(isDebug()) System.out.printf("%s: set position and rotation for volume %s\n", this.getClass().getSimpleName(),getName());
+		
+		// no mother, this must be the world/tracking volume!?
+		if(base.getMother()==null) throw new RuntimeException("trying to set coordinates w/o mother defined for "+base.getName());
+		
+		// Vector from origin to center of box locally 
+		Hep3Vector box_center_base_local = base.getCenter();
+		
+		// find the physical mother i.e. not a ghost volume and compound transformations to it
+		JavaSurveyVolume physMother =  getPhysMother();
+		if(isDebug()) System.out.printf("%s: physical mother to transform to is %s; find the transform to it\n", this.getClass().getSimpleName(),physMother.getName());
+		Transform3D trf = HPSTrackerBuilder.getTransform(base.getCoord().getTransformation(),base.getMother(),physMother.getName()); 
+		if(isDebug()) System.out.printf("%s: found transform to physical mother \n%s\n\n", this.getClass().getSimpleName(),trf.toString());
+		
+		// find the position of the center in the physical mother coord
+		Hep3Vector box_center_base = trf.transformed(box_center_base_local);
+		
+		// find the position of the center of the box in the mother coordinate system, make sure to use the physical mother coordinates
+		if(isDebug()) System.out.printf("%s: find center of box in physical mother coord %s \n", this.getClass().getSimpleName(),physMother.getName());
+		// hack since my getTransform function needs a mother TODO Fix this!
+		SurveyVolume gm = base;
+		if(isDebug()) System.out.printf("%s: look for physical mother %s starting from mother %s \n", this.getClass().getSimpleName(),physMother.getName(),gm.getMother()!=null?gm.getMother().getName():"-- no mother --");
+		while((gm=gm.getMother()).getName()!=physMother.getName()) {
+			if(isDebug()) System.out.printf("%s: gm is %s \n", this.getClass().getSimpleName(),gm.getName());
+			//gm = gm.getMother();
+		}
+		if(isDebug()) System.out.printf("%s: found physical mother %s with center at %s \n", this.getClass().getSimpleName(),gm.getName(), gm.getCenter());
+		
+		Hep3Vector mother_center = gm.getCenter();
+
+		// now calculate the position of this box center in the mother LCDD coordinates
+		Hep3Vector box_center = VecOp.sub(box_center_base, mother_center);
+
+		//Find LCDD Euler rotation angles from coordinate system unit vectors
+		//Note that this has to be rotation wrt to physical mother and not just mother as normally is the case
+		//Use apache lib to get angles, but in principle I should already have it from the trf above
+		//Hep3Vector lcdd_rot_angles = HPSTestRunTracker2014.getEulerAngles(base.getCoord().v(), base.getCoord().w(), new BasicHep3Vector(0,1,0),new BasicHep3Vector(0,0,1));
+		if(isDebug()) System.out.printf("%s: find LCDD Cardan rotation angles - need to find mother to physical mother transform \n", this.getClass().getSimpleName(),physMother.getName());
+		Hep3Vector base_u = base.getCoord().u();
+        Hep3Vector base_v = base.getCoord().v();
+        Hep3Vector base_w = base.getCoord().w();
+        if(isDebug()) System.out.printf("%s: unit vectors in mother coord: %s, %s, %s\n", this.getClass().getSimpleName(),base_u.toString(),base_v.toString(),base_w.toString());
+        Hep3Vector unit_u = new BasicHep3Vector(1,0,0);
+        Hep3Vector unit_v = new BasicHep3Vector(0,1,0);
+        Hep3Vector unit_w = new BasicHep3Vector(0,0,1);
+        if(!base.getMother().getName().equals(physMother.getName())) {
+            if(isDebug()) System.out.printf("%s: Need to get unit vectors in physical mother %s coord system\n", this.getClass().getSimpleName(),physMother.getName());
+            Transform3D trf_mother = HPSTrackerBuilder.getTransform(base.getMother().getCoord().getTransformation(),base.getMother().getMother(),physMother.getName()); 
+            if(isDebug()) System.out.printf("%s: found transform from mother to physical mother \n%s\n", this.getClass().getSimpleName(),trf_mother.toString());
+            //unit_u = VecOp.unit(trf_mother.rotated(unit_u));
+            //unit_v = VecOp.unit(trf_mother.rotated(unit_v));
+            //unit_w = VecOp.unit(trf_mother.rotated(unit_w));
+            base_u = VecOp.unit(trf_mother.rotated(base_u));
+            base_v = VecOp.unit(trf_mother.rotated(base_v));
+            base_w = VecOp.unit(trf_mother.rotated(base_w));
+            
+        } else {
+            if(isDebug()) System.out.printf("%s: mother and physical mother is the same so unit vectors didn't change\n",getClass().getSimpleName());
+        }
+        
+        if(isDebug()) {
+            if(isDebug()) System.out.printf("%s: final unit vectors to get Cardan angles from : \n%s, %s, %s -> %s, %s, %s \n", 
+                                            this.getClass().getSimpleName(),
+                                            base_u.toString(),base_v.toString(),base_w.toString(),              
+                                            unit_u.toString(),unit_v.toString(),unit_w.toString());
+            //System.out.printf("%s: unit vectors u %s v %s w %s\n", this.getClass().getSimpleName(),base.getCoord().u().toString(),base.getCoord().v().toString(),base.getCoord().w().toString());
+        }
+        
+		Hep3Vector lcdd_rot_angles = TransformationUtils.getCardanAngles(base_u, base_v, base_w, unit_u, unit_v, unit_w);
+
+
+		// Create the LCDD position
+		setPos(new Translation3D(box_center.x(), box_center.y(), box_center.z()));
+		setRot(new RotationGeant(lcdd_rot_angles.x(), lcdd_rot_angles.y(), lcdd_rot_angles.z()));
+		
+		if(isDebug()) {
+			
+			System.out.printf("%s: box_center_base_local       %s\n", this.getClass().getSimpleName(), box_center_base_local.toString());
+			System.out.printf("%s: box_center_base             %s\n", this.getClass().getSimpleName(), box_center_base.toString());
+			System.out.printf("%s: mother center               %s\n", this.getClass().getSimpleName(), base.getMother()==null?" <no mother> ":mother_center.toString());
+			System.out.printf("%s: box_center                  %s\n", this.getClass().getSimpleName(), box_center.toString());
+			System.out.printf("%s: pos                         %s\n", this.getClass().getSimpleName(), getPos().toString());
+			System.out.printf("%s: euler                       %s\n", this.getClass().getSimpleName(), lcdd_rot_angles.toString());
+			System.out.printf("%s: rot                         %s\n", this.getClass().getSimpleName(), getRot().toString());
+
+			//calculate the position in tracking volume separately as a xcheck
+			Hep3Vector box_center_tracking_xcheck = HPSTrackerBuilder.transformToTracking(box_center_base_local, base);
+			System.out.printf("%s: box_center_tracking_xcheck  %s for %s\n", this.getClass().getSimpleName(), box_center_tracking_xcheck.toString(),base.getName());
+		}
+		
+	}
+
+	/**
+	 * Find the first non-ghost volume among parents.  
+	 * @return mother object
+	 */
+	public JavaSurveyVolume getPhysMother() {
+		//if(isDebug()) System.out.printf("%s: finding physical mother to %s\n", this.getClass().getSimpleName(), getName());
+		if(mother==null) throw new RuntimeException("Trying to get phys mother but there is no mother!");
+		if(mother instanceof JavaGhostSurveyVolume) {
+			return mother.getPhysMother();
+		} else {
+			//if(isDebug()) System.out.printf("%s: found a non-ghost volume: %s\n", this.getClass().getSimpleName(), mother.getName());
+			return mother;
+		}
+	}
+	
+	
+	public ILogicalVolume getVolume() {
+		return volume;
+	}
+	protected void setVolume(ILogicalVolume volume) {
+		this.volume = volume;
+	}
+	protected Box getBox() {
+		return box;
+	}
+	protected void setBox(Box b) {
+		box = b;
+	}	
+	public String getName() {
+		return name;
+	}
+	protected void setName(String name) {
+		this.name = name;
+	}
+	protected ITranslation3D getPos() {
+		return pos;
+	}
+	protected void setPos(ITranslation3D iTranslation3D) {
+		this.pos = iTranslation3D;
+	}
+	protected IRotation3D getRot() {
+		return rot;
+	}
+	protected void setRot(IRotation3D iRotation3D) {
+		this.rot = iRotation3D;
+	}
+	public JavaSurveyVolume getMother() {
+		return mother;
+	}
+	protected void setMother(JavaSurveyVolume mother) {
+		this.mother = mother;
+	}
+	public IPhysicalVolume getPhysVolume() {
+		return physVolume;
+	}
+	protected void setPhysVolume(PhysicalVolume physVolume) {
+		this.physVolume = physVolume;
+	}
+	public boolean isDebug() {
+		return debug;
+	}
+
+	public List<JavaSurveyVolume> getDaughters() {
+		return daughters;
+	}
+
+	protected void addDaughter(JavaSurveyVolume o) {
+		getDaughters().add(o);
+	}
+
+	public int getComponentId() {
+		return componentId;
+	}
+
+	public void setComponentId(int componentId) {
+		this.componentId = componentId;
+	}
+	
+	public String toString() {
+		String s = "JavaBaseGeometry " + getName() + "\n";
+		if(getPos()!=null && getRot()!=null) {
+			s += "Position: "  + getPos().toString() + "\n";
+			s += "Rotation: " + getRot().toString() + "\n";
+		} else {
+			s+= " - no position/rotation info -\n";
+		}
+		return s;
+	}
+
+}

Added: projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/LCDDGhostSurveyVolume.java
 =============================================================================
--- projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/LCDDGhostSurveyVolume.java	(added)
+++ projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/LCDDGhostSurveyVolume.java	Fri Oct 31 12:37:29 2014
@@ -0,0 +1,29 @@
+package org.lcsim.geometry.compact.converter;
+
+/**
+ * 
+ * Interface to the LCDD converter geometry for the geometry definition. 
+ * No volume is built but it can be used as reference in building the geometry.
+ * 
+ * @author Per Hansson Adrian <[log in to unmask]>
+ *
+ */
+public class LCDDGhostSurveyVolume extends LCDDSurveyVolume {
+
+	
+	
+	/**
+	 * Initialize with base and mother. This is typically for a reference geometry object 
+	 * that is used for referencing coordinate systems but that doesn't have a volume itself.
+	 * @param base - object used to get geometry definitions
+	 * @param mother - mother LCDD object
+	 */
+	public LCDDGhostSurveyVolume(SurveyVolume base, LCDDSurveyVolume mother) {
+		super();
+		if(isDebug()) System.out.printf("%s: constructing LCDD ghost object %s with mother %s\n", this.getClass().getSimpleName(),base.getName(),mother==null?"null":mother.getName());
+		setName(base.getName());
+		setMother(mother);
+		if(isDebug()) System.out.printf("%s: DONE constructing LCDD object %s\n", this.getClass().getSimpleName(),base.getName());
+	}
+	
+}

Added: projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/LCDDSurveyVolume.java
 =============================================================================
--- projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/LCDDSurveyVolume.java	(added)
+++ projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/LCDDSurveyVolume.java	Fri Oct 31 12:37:29 2014
@@ -0,0 +1,264 @@
+package org.lcsim.geometry.compact.converter;
+
+import hep.physics.vec.BasicHep3Vector;
+import hep.physics.vec.Hep3Vector;
+import hep.physics.vec.VecOp;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import org.jdom.JDOMException;
+import org.lcsim.detector.Transform3D;
+import org.lcsim.geometry.compact.converter.lcdd.util.Box;
+import org.lcsim.geometry.compact.converter.lcdd.util.LCDD;
+import org.lcsim.geometry.compact.converter.lcdd.util.Material;
+import org.lcsim.geometry.compact.converter.lcdd.util.PhysVol;
+import org.lcsim.geometry.compact.converter.lcdd.util.Position;
+import org.lcsim.geometry.compact.converter.lcdd.util.Rotation;
+import org.lcsim.geometry.compact.converter.lcdd.util.Volume;
+import org.lcsim.geometry.util.TransformationUtils;
+
+/**
+ * Interface to the LCDD converter geometry for the geometry definition. 
+ *   
+ * @author Per Hansson Adrian <[log in to unmask]>
+ */
+public class LCDDSurveyVolume extends SurveyVolumeImpl  {
+	Box box= null;
+	Volume volume = null;
+	private Position pos = null;
+	private Rotation rot = null;
+	private PhysVol physVolume = null;
+	LCDD lcdd = null;
+	private LCDDSurveyVolume mother = null;
+	protected Map<String,Integer> physVolId = null;
+	public List<LCDDSurveyVolume> daughters = new ArrayList<LCDDSurveyVolume>();
+	/**
+	 *  Default constructor
+	 */
+	public LCDDSurveyVolume() {
+	}
+	
+	/**
+	 * Initialize this object with a known volume and no mother. Typically the world volume would use this.
+	 * @param base - object used to get geometry definitions
+	 * @param vol - given volume
+	 */
+	public LCDDSurveyVolume(SurveyVolume base, Volume volume) {
+		super();
+		if(isDebug()) System.out.printf("%s: constructing LCDD object %s with given volume name %s\n", this.getClass().getSimpleName(),base.getName(),volume.getName());
+		setName(base.getName());
+		setVolume(volume);
+		if(isDebug()) System.out.printf("%s: DONE constructing LCDD object %s\n", this.getClass().getSimpleName(),base.getName());
+		Hep3Vector lcdd_rot_angles = TransformationUtils.getCardanAngles(base.getCoord().v(), base.getCoord().w(), new BasicHep3Vector(0,1,0),new BasicHep3Vector(0,0,1));
+		setPos(new Position(getName() + "_position", 0, 0, 0));
+		setRot(new Rotation(getName() + "_rotation",lcdd_rot_angles.x(), lcdd_rot_angles.y(), lcdd_rot_angles.z()));
+		if(isDebug()) System.out.printf("%s: DONE  %s\n", this.getClass().getSimpleName(),base.getName());
+	}
+	
+	/**
+	 * Interface to the LCDD converter geometry for the geometry definition. 
+	 * @param base - input geometry definition
+	 * @param lcdd - lcdd file 
+	 * @param mother - reference to mother LCDD definition
+	 */
+	public LCDDSurveyVolume(SurveyVolume base, LCDD lcdd, LCDDSurveyVolume mother) {
+		if(isDebug()) System.out.printf("%s: constructing LCDD object %s with mother %s\n", this.getClass().getSimpleName(),base.getName(),mother==null?"null":mother.getName());
+		this.lcdd = lcdd;
+		setName(base.getName());
+		setMother(mother);
+		mother.addDaughter(this);
+		buildBox(base);
+		buildVolume(base);
+		setPositionAndRotation(base);
+		//buildPhysVolume(mother);
+		if(isDebug()) System.out.printf("%s: DONE constructing LCDD object %s\n", this.getClass().getSimpleName(),base.getName());
+	}
+
+	
+	public void buildPhysVolume() {
+		if(isDebug()) System.out.printf("%s: build phys volume for %s\n", this.getClass().getSimpleName(),getName());
+		setPhysVolume(new PhysVol(volume, getMother().getVolume(), getPos(), getRot()));
+	}
+	public void buildBox(SurveyVolume base) {
+		if(isDebug()) System.out.printf("%s: build box for %s\n", this.getClass().getSimpleName(),getName());
+		setBox(new Box(getName() + "Box", base.getBoxDim().x(), base.getBoxDim().y(), base.getBoxDim().z())); 
+	}
+	public void buildVolume(SurveyVolume base) {
+		if(isDebug()) System.out.printf("%s: build volume for %s with material %s\n", this.getClass().getSimpleName(),getName(),base.getMaterial());
+		try {
+			Material mat = lcdd.getMaterial(base.getMaterial());
+			setVolume(new Volume(getName() + "_volume", box, mat));
+		} catch (JDOMException e) {
+			e.printStackTrace();
+		}
+	}
+	
+	
+	public void setPositionAndRotation(SurveyVolume base) {
+		if(isDebug()) System.out.printf("%s: set position and rotation for volume %s\n", this.getClass().getSimpleName(),getName());
+		
+		// NOTE:
+		// This sets position and reference w.r.t. mother coordinate system. 
+		// If I'm not building that volume this will be wrong. 
+		// TODO Similar to in the JAVA converter this should be something like the physical mother.
+		
+		if(base.getMother()==null) throw new RuntimeException("trying to set coordinates w/o mother defined for "+base.getName());
+		
+		// Vector from origin to center of box locally 
+		Hep3Vector box_center_base_local = base.getCenter();
+		
+		//translate to the mother coordinate system
+		LCDDSurveyVolume physMother = getPhysMother();
+		if(isDebug()) System.out.printf("%s: physical mother to transform to is %s; find the transform to it\n", this.getClass().getSimpleName(),physMother.getName());
+		Transform3D trf = HPSTrackerBuilder.getTransform(base.getCoord().getTransformation(),base.getMother(),physMother.getName()); 
+		if(isDebug()) System.out.printf("%s: found transform to physical mother \n%s\n\n", this.getClass().getSimpleName(),trf.toString());
+		
+		// find the position of the center in the physical mother coord
+		Hep3Vector box_center_base = trf.transformed(box_center_base_local);
+		
+		// find the position of the center of the box in the mother coordinate system, make sure to use the physical mother coordinates
+		if(isDebug()) System.out.printf("%s: find center of box in physical mother coord %s \n", this.getClass().getSimpleName(),physMother.getName());
+		// hack since my getTransform function needs a mother TODO Fix this!
+		SurveyVolume gm = base;
+		if(isDebug()) System.out.printf("%s: look for physical mother %s starting from mother %s \n", this.getClass().getSimpleName(),physMother.getName(),gm.getMother()!=null?gm.getMother().getName():"-- no mother --");
+		while((gm=gm.getMother()).getName()!=physMother.getName()) {
+			if(isDebug()) System.out.printf("%s: gm is %s \n", this.getClass().getSimpleName(),gm.getName());
+			//gm = gm.getMother();
+		}
+		if(isDebug()) System.out.printf("%s: found physical mother %s with center at %s \n", this.getClass().getSimpleName(),gm.getName(), gm.getCenter());
+
+		Hep3Vector mother_center = gm.getCenter();
+		
+		// find the position of the center in the mother coord
+		Hep3Vector box_center = VecOp.sub(box_center_base, mother_center);
+		
+		//Find LCDD Euler rotation angles from coordinate system unit vectors
+		//Note that this has to be rotation wrt to physical mother and not just mother as normally is the case
+		if(isDebug()) System.out.printf("%s: find LCDD Cardan rotation angles - need to find mother to physical mother transform \n", this.getClass().getSimpleName(),physMother.getName());
+		Hep3Vector base_u = base.getCoord().u();
+		Hep3Vector base_v = base.getCoord().v();
+		Hep3Vector base_w = base.getCoord().w();
+        if(isDebug()) System.out.printf("%s: unit vectors in mother coord: %s, %s, %s\n", this.getClass().getSimpleName(),base_u.toString(),base_v.toString(),base_w.toString());
+		Hep3Vector unit_u = new BasicHep3Vector(1,0,0);
+		Hep3Vector unit_v = new BasicHep3Vector(0,1,0);
+		Hep3Vector unit_w = new BasicHep3Vector(0,0,1);
+		if(!base.getMother().getName().equals(physMother.getName())) {
+		    if(isDebug()) System.out.printf("%s: Need to get unit vectors in physical mother %s coord system\n", this.getClass().getSimpleName(),physMother.getName());
+            Transform3D trf_mother = HPSTrackerBuilder.getTransform(base.getMother().getCoord().getTransformation(),base.getMother().getMother(),physMother.getName()); 
+            if(isDebug()) System.out.printf("%s: found transform from mother to physical mother \n%s\n", this.getClass().getSimpleName(),trf_mother.toString());
+			//unit_u = VecOp.unit(trf_mother.rotated(unit_u));
+			//unit_v = VecOp.unit(trf_mother.rotated(unit_v));
+			//unit_w = VecOp.unit(trf_mother.rotated(unit_w));
+			base_u = VecOp.unit(trf_mother.rotated(base_u));
+            base_v = VecOp.unit(trf_mother.rotated(base_v));
+            base_w = VecOp.unit(trf_mother.rotated(base_w));
+            
+		} else {
+			if(isDebug()) System.out.printf("%s: mother and physical mother is the same so unit vectors didn't change\n",getClass().getSimpleName());
+		}
+		
+		if(isDebug()) {
+		    if(isDebug()) System.out.printf("%s: final unit vectors to get Cardan angles from : \n%s, %s, %s -> %s, %s, %s \n", 
+		                                    this.getClass().getSimpleName(),
+		                                    base_u.toString(),base_v.toString(),base_w.toString(),	            
+		                                    unit_u.toString(),unit_v.toString(),unit_w.toString());
+			//System.out.printf("%s: unit vectors u %s v %s w %s\n", this.getClass().getSimpleName(),base.getCoord().u().toString(),base.getCoord().v().toString(),base.getCoord().w().toString());
+		}
+        Hep3Vector lcdd_rot_angles = TransformationUtils.getCardanAngles(base_u, base_v, base_w, unit_u, unit_v, unit_w);
+        
+		
+		// Create the LCDD position
+		setPos(new Position(getName() + "_position",box_center.x(), box_center.y(), box_center.z()));
+		
+		setRot(new Rotation(getName() + "_rotation",lcdd_rot_angles.x(), lcdd_rot_angles.y(), lcdd_rot_angles.z()));
+		if(isDebug()) {
+			System.out.printf("%s: box_center_base_local  %s\n", this.getClass().getSimpleName(), box_center_base_local.toString());
+			System.out.printf("%s: box_center_base        %s\n", this.getClass().getSimpleName(), box_center_base.toString());
+			System.out.printf("%s: mother center          %s\n", this.getClass().getSimpleName(), mother_center.toString());
+			System.out.printf("%s: box_center             %s\n", this.getClass().getSimpleName(), box_center.toString());
+			System.out.printf("%s: pos                    %s\n", this.getClass().getSimpleName(), getPos().toString());
+			System.out.printf("%s: euler                  %s\n", this.getClass().getSimpleName(), lcdd_rot_angles.toString());
+            System.out.printf("%s: rot                    %s\n", this.getClass().getSimpleName(), getRot().toString());
+			
+			//calculate the position in tracking volume separately as a xcheck
+			Hep3Vector box_center_tracking_xcheck = HPSTrackerBuilder.transformToTracking(box_center_base_local, base);
+			System.out.printf("%s: box_center_tracking_xcheck  %s\n", this.getClass().getSimpleName(), box_center_tracking_xcheck.toString());
+		}
+		
+	}
+	/**
+	 * Find the first non-ghost volume among parents.  
+	 * @return mother object
+	 */
+	public LCDDSurveyVolume getPhysMother() {
+		//if(isDebug()) System.out.printf("%s: finding physical mother to %s\n", this.getClass().getSimpleName(), getName());
+		if(mother==null) throw new RuntimeException("Trying to get phys mother but there is no mother!");
+		if(mother instanceof LCDDGhostSurveyVolume) {
+			return mother.getPhysMother();
+		} else {
+			//if(isDebug()) System.out.printf("%s: found a non-ghost volume: %s\n", this.getClass().getSimpleName(), mother.getName());
+			return mother;
+		}
+	}
+	
+	public Volume getVolume() {
+		return volume;
+	}
+	public void setVolume(Volume volume) {
+		this.volume = volume;
+	}
+	public Box getBox() {
+		return box;
+	}
+	public void setBox(Box b) {
+		box = b;
+	}	
+	public Position getPos() {
+		return pos;
+	}
+	public void setPos(Position pos) {
+		this.pos = pos;
+	}
+	public Rotation getRot() {
+		return rot;
+	}
+	public void setRot(Rotation rot) {
+		this.rot = rot;
+	}
+	public LCDDSurveyVolume getMother() {
+		return mother;
+	}
+	public void setMother(LCDDSurveyVolume mother) {
+		this.mother = mother;
+	}
+	public PhysVol getPhysVolume() {
+		return physVolume;
+	}
+	public void setPhysVolume(PhysVol physVolume) {
+		this.physVolume = physVolume;
+	}
+	public List<LCDDSurveyVolume> getDaughters() {
+		return daughters;
+	}
+	public void addDaughter(LCDDSurveyVolume o) {
+		getDaughters().add(o);
+	}
+	 public String toString() {
+        String s = getClass().getSimpleName() +": " + getName() + "\n";
+        if(getPos()!=null && getRot()!=null)    {
+            double x = Double.valueOf(getPos().getAttributeValue("x"));
+            double y = Double.valueOf(getPos().getAttributeValue("y"));
+            double z = Double.valueOf(getPos().getAttributeValue("z"));
+            s += "Position: " + String.format("(%.4f %.4f %.4f)\n", x,y,z);
+            x = Double.valueOf(getRot().getAttributeValue("x"));
+            y = Double.valueOf(getRot().getAttributeValue("y"));
+            z = Double.valueOf(getRot().getAttributeValue("z"));
+            s += "Rotation: " + String.format("(%.4f %.4f %.4f)\n", x,y,z);
+        } else {
+            s += " - no position/rotation info -\n";
+        }
+        return s;
+    }
+}

Added: projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/SurveyVolumeImpl.java
 =============================================================================
--- projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/SurveyVolumeImpl.java	(added)
+++ projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/SurveyVolumeImpl.java	Fri Oct 31 12:37:29 2014
@@ -0,0 +1,34 @@
+package org.lcsim.geometry.compact.converter;
+
+public abstract class SurveyVolumeImpl extends SurveyVolumeVisualization {
+
+    private boolean debug = true;
+    private String name;
+
+    public SurveyVolumeImpl() {
+        super();
+    }
+
+    public abstract void buildPhysVolume();
+
+    public abstract void buildBox(SurveyVolume base);
+
+    public abstract void buildVolume(SurveyVolume base);
+
+    public abstract void setPositionAndRotation(SurveyVolume base);
+
+    public String getName() {
+    	return name;
+    }
+
+    public void setName(String name) {
+    	this.name = name;
+    }
+
+    public boolean isDebug() {
+    	return debug;
+    }
+
+    public abstract String toString();
+
+}

Added: projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/SurveyVolumeVisualization.java
 =============================================================================
--- projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/SurveyVolumeVisualization.java	(added)
+++ projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/SurveyVolumeVisualization.java	Fri Oct 31 12:37:29 2014
@@ -0,0 +1,20 @@
+package org.lcsim.geometry.compact.converter;
+
+/**
+ * 
+ * LCDD geometry visualization information
+ * 
+ * @author Per Hansson Adrian <[log in to unmask]>
+ */
+public class SurveyVolumeVisualization {
+	protected String visName = "";
+	public SurveyVolumeVisualization() {}
+	public String getVisName() {
+		return visName;
+	}
+	protected void setVisName(String visName) {
+		this.visName = visName;
+	}
+	
+	
+}

Modified: projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/lcdd/HPSTestRunTracker2014.java
 =============================================================================
--- projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/lcdd/HPSTestRunTracker2014.java	(original)
+++ projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/lcdd/HPSTestRunTracker2014.java	Fri Oct 31 12:37:29 2014
@@ -14,8 +14,8 @@
 import org.lcsim.geometry.compact.converter.HPSTestRunTracker2014LCDDBuilder;
 import org.lcsim.geometry.compact.converter.HPSTrackerBuilder;
 import org.lcsim.geometry.compact.converter.HPSTrackerLCDDBuilder;
-import org.lcsim.geometry.compact.converter.HPSTrackerLCDDBuilder.GhostLCDDBaseGeometry;
-import org.lcsim.geometry.compact.converter.HPSTrackerLCDDBuilder.LCDDBaseGeometry;
+import org.lcsim.geometry.compact.converter.LCDDGhostSurveyVolume;
+import org.lcsim.geometry.compact.converter.LCDDSurveyVolume;
 import org.lcsim.geometry.compact.converter.SurveyCoordinateSystem;
 import org.lcsim.geometry.compact.converter.lcdd.util.Box;
 import org.lcsim.geometry.compact.converter.lcdd.util.LCDD;
@@ -154,7 +154,7 @@
 
 		// Reference to the top level object in the builder class
 		// In this case it is the base volume holding the entire tracker
-		LCDDBaseGeometry lcddObj = builder.getBaseLCDD();
+		LCDDSurveyVolume lcddObj  = (LCDDSurveyVolume) builder.getBaseLCDD();
 		
 		// Add the base volume and all its daughters to the LCDD
 		addToLCDD(lcddObj,lcdd,sd);
@@ -170,7 +170,7 @@
 	 * @param lcddObj to add
 	 * @param lcdd file
 	 */
-	private void addToLCDD(LCDDBaseGeometry lcddObj, LCDD lcdd, SensitiveDetector sd) {
+	private void addToLCDD(LCDDSurveyVolume lcddObj, LCDD lcdd, SensitiveDetector sd) {
 		
 		if(_debug) System.out.printf("%s: adding %s to LCDD\n", getClass().getSimpleName(),lcddObj.getName());
 
@@ -180,7 +180,7 @@
 		if(doAdd) {
 
 			// only world/tracking volume can be ghost here?!
-			if(lcddObj instanceof GhostLCDDBaseGeometry ) {
+			if(lcddObj instanceof LCDDGhostSurveyVolume ) {
 				System.out.printf("%s: trying to add a ghost volume: %s ??\n", getClass().getSimpleName(),lcddObj.getName());
 				throw new RuntimeException("adding a ghost volume (" + lcddObj.getName() + ") to LCDD is not allowed.");
 			}
@@ -206,7 +206,7 @@
 		
 		// add daughters
 		if(_debug) System.out.printf("%s: add %d daughters to %s\n", getClass().getSimpleName(),lcddObj.getDaughters().size(),lcddObj.getName());
-		for(LCDDBaseGeometry daughter : lcddObj.getDaughters()) {
+		for(LCDDSurveyVolume daughter : lcddObj.getDaughters()) {
 			addToLCDD(daughter,lcdd, sd);
 		}
 		
@@ -226,7 +226,7 @@
 	 * Set properties of the physical volume.
 	 * @param geometryObject
 	 */
-	private void setPhysicalVolumeProperties(LCDDBaseGeometry geometryObject, SensitiveDetector sd) throws DataConversionException {
+	private void setPhysicalVolumeProperties(LCDDSurveyVolume geometryObject, SensitiveDetector sd) throws DataConversionException {
 		
 		if(_debug) System.out.printf("%s: setPhysVolumeProperties for name %s\n", getClass().getSimpleName(),geometryObject.getName());
 		

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