Print

Print


Commit in projects/lcsim/trunk/detector-framework/src on MAIN
main/java/org/lcsim/geometry/compact/converter/lcdd/HPSTestRunTracker2014.java+1496added 3101
test/resources/org/lcsim/geometry/subdetector/HPSTestRunTracker2014.xml+108added 3101
+1604
2 added files
work in progress testrun det from survey

projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/lcdd
HPSTestRunTracker2014.java added at 3101
--- projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/lcdd/HPSTestRunTracker2014.java	                        (rev 0)
+++ projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/lcdd/HPSTestRunTracker2014.java	2014-04-22 05:14:21 UTC (rev 3101)
@@ -0,0 +1,1496 @@
+package org.lcsim.geometry.compact.converter.lcdd;
+
+import hep.physics.vec.BasicHep3Matrix;
+import hep.physics.vec.BasicHep3Vector;
+import hep.physics.vec.Hep3Matrix;
+import hep.physics.vec.Hep3Vector;
+import hep.physics.vec.VecOp;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.jdom.Element;
+import org.jdom.JDOMException;
+import org.lcsim.detector.ITransform3D;
+import org.lcsim.detector.Rotation3D;
+import org.lcsim.detector.RotationGeant;
+import org.lcsim.detector.Transform3D;
+import org.lcsim.detector.Translation3D;
+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;
+
+/**
+ * 
+ * Convert an SiTrackerBarrel subdetector to the LCDD format.
+ * 
+ * @author Jeremy McCormick <[log in to unmask]>
+ * @author Tim Nelson <[log in to unmask]>
+ *
+ */
+public class HPSTestRunTracker2014 extends LCDDSubdetector
+{
+	private boolean _debug = true; 
+	public static final double inch = 25.4;
+	
+	private final double sensor_length= 98.33;
+	private final double sensor_width = 38.3399;
+	private final double sensor_thickness = 0.32;
+	private final double hybrid_length = 170.0 - sensor_length; // sensor b-to-b with hybrid
+	private final double hybrid_width  = sensor_width;
+	private final double hybrid_width_L46  = 45.34;
+	private final double hybrid_thickness = 4.0/64.0*inch;
+	//TODO Check these numbers
+	private final double cf_length = 200.;
+	private final double cf_width = 45.;
+	private final double cf_thickness = 0.250;
+	private final double kapton_length = 184.0;
+	private final double kapton_width = 40.0;
+	private final double kapton_thickness = 0.050;
+	
+	private final double support_plate_bottom_height = 12.7; //1/2"
+	private final double support_plate_bottom_length = 736.1;
+	private final double support_plate_bottom_width = 120.0;
+
+	
+	private final double module_L13_width = 71.3 - 13.0; // height from cold block to encapsulate the whole module
+	private final double module_L45_width = 65.3-12.0; 
+	final double module_box_L13_length = 205.2; // includes lexan spacer and cold block
+	final double module_box_L13_height = 12.5; // includes screws height
+	final double module_box_L13_width = module_L13_width;
+	
+	private final double half_module_thickness = this.hybrid_thickness + this.cf_thickness + this.kapton_thickness;
+	private final double half_module_length = this.cf_length;
+	private final double half_module_width = 6.83 + this.sensor_width;
+	
+	private final double coldblock_length = 82.00;
+	private final double coldblock_width = 52.50;
+	private final double coldblock_thickness = 6.00;
+	
+	private final Hep3Vector ball_pos_module1_support_plate_local = new BasicHep3Vector(25.0, 661.0, 0.0);
+	private final Hep3Vector vee_pos_module1_support_plate_local = new BasicHep3Vector(95.0, 661.0, 0.0);
+	private final Hep3Vector flat_pos_module1_support_plate_local = new BasicHep3Vector(60.0, 667.10, 0.0);
+
+	private final Hep3Vector ball_pos_module2_support_plate_local = new BasicHep3Vector(25.0, 561.0, 0.0);
+	private final Hep3Vector vee_pos_module2_support_plate_local = new BasicHep3Vector(95.0, 561.0, 0.0);
+	private final Hep3Vector flat_pos_module2_support_plate_local = new BasicHep3Vector(60.0, 567.10, 0.0);
+
+	private final Hep3Vector ball_pos_module3_support_plate_local = new BasicHep3Vector(25.0, 461.0, 0.0);
+	private final Hep3Vector vee_pos_module3_support_plate_local = new BasicHep3Vector(95.0, 461.0, 0.0);
+	private final Hep3Vector flat_pos_module3_support_plate_local = new BasicHep3Vector(60.0, 467.10, 0.0);
+
+	private final Hep3Vector ball_pos_module4_support_plate_local = new BasicHep3Vector(25.0, 261.0, 0.0);
+	private final Hep3Vector vee_pos_module4_support_plate_local = new BasicHep3Vector(95.0, 261.0, 0.0);
+	private final Hep3Vector flat_pos_module4_support_plate_local = new BasicHep3Vector(60.0, 267.10, 0.0);
+
+	private final Hep3Vector ball_pos_module5_support_plate_local = new BasicHep3Vector(25.0, 61.0, 0.0);
+	private final Hep3Vector vee_pos_module5_support_plate_local = new BasicHep3Vector(95.0, 61.0, 0.0);
+	private final Hep3Vector flat_pos_module5_support_plate_local = new BasicHep3Vector(60.0, 67.10, 0.0);
+
+
+	
+
+	
+	
+	
+	public HPSTestRunTracker2014(Element node) throws JDOMException
+	{
+		super(node);
+	}
+
+	
+	public boolean isTracker() {
+		return true;
+	}
+	
+	/**
+	 * Build the LCDD for the subdetector.
+	 * @param lcdd The LCDD file being created.
+	 * @param sens The SD for this subdetector.
+	 */
+	public void addToLCDD(LCDD lcdd, SensitiveDetector sens) throws JDOMException
+	{
+		
+		/** General comments
+		// Roll: rotation around x
+		// pitch: rotation around y
+		// yaw: rotation around z
+		
+		// kinematic mounts:
+		// ball (constraints x,y,z)
+		// vee  (constraints pitch & yaw)
+		// flat (constraints roll)
+		**/
+		
+		
+		
+		
+		// ID of the detector.
+		int id = this.node.getAttribute("id").getIntValue();
+
+		// Name of the detector.
+		String detector_name = this.node.getAttributeValue("name");
+
+		if(_debug) {
+			print(String.format("detector id %d name %s", id,detector_name));
+		}
+		
+		// Pick the mother volume (tracking volume).
+		Volume trackingVolume = lcdd.pickMotherVolume(this);
+		
+		VolWrapper trackingWrap = new VolWrapper();
+		trackingWrap.name = "trackingVolume";
+		trackingWrap.vol = trackingVolume;
+	
+		// create the box around the support plate: "support box"
+		makeSupport(trackingWrap, lcdd, sens );
+		
+		
+	
+		
+		
+		
+		
+	}
+	
+	
+	
+	private void makeSupport(VolWrapper trackingWrap, LCDD lcdd, SensitiveDetector sens) throws JDOMException {
+		
+		
+		
+		
+		final double support_length = this.support_plate_bottom_length;
+		final double support_width = (25.0-5.0) + this.module_box_L13_length;  
+		// height to encapsulate all the modules; a little arbitrary here, TODO fix this 
+		final double support_height = this.support_plate_bottom_height + module_L45_width;
+		
+		
+		String volName = "support";
+		Box box = new Box(volName + "Box", support_width, support_height , support_length);
+		lcdd.add(box);
+		Volume supportVolume = new Volume(volName + "_volume", box, lcdd.getMaterial("Vacuum"));
+
+		Position pos = new Position( volName + "_position", 0,0,0); 
+		Rotation rot = new Rotation( volName + "_rotation",0,0,0);
+		lcdd.add(pos);
+		lcdd.add(rot);
+		
+		PhysVol supportPV = new PhysVol(supportVolume, trackingWrap.vol, pos, rot);
+		
+		VolWrapper supportWrap = new VolWrapper();
+		supportWrap.vol = supportVolume;
+		supportWrap.name = volName;
+		supportWrap.pos_vol = pos;
+		supportWrap.rot_vol = rot;
+		
+		
+
+		
+		
+		// create the support plate inside the support box at the "bottom"
+		// survey points are: 
+		// ball: corner of the hinge end at the surface on the positron side
+		// vee: corner of the hinge end at the surface on the electron side
+		// flat: middle of plate at upstream end at the surface
+		
+		Hep3Vector ball_pos_support_plate = new BasicHep3Vector(-1.0 * support_width/2.0, -1.0 * support_height/2.0 + support_plate_bottom_height , support_length/2.0);
+		Hep3Vector vee_pos_support_plate = new BasicHep3Vector(ball_pos_support_plate.x() + support_plate_bottom_width, ball_pos_support_plate.y(),ball_pos_support_plate.z());
+		Hep3Vector flat_pos_support_plate = new BasicHep3Vector(ball_pos_support_plate.x(), ball_pos_support_plate.y(),ball_pos_support_plate.z() - support_plate_bottom_length);
+		
+		makeSupportPlate(supportWrap, ball_pos_support_plate, vee_pos_support_plate, flat_pos_support_plate, lcdd, sens );
+		
+		// create the module from positions of module ball, vee and flat w.r.t. support plate survey points
+
+		// create the coordinate system of the support plate
+		CoordSysDef support_plate_coord = new CoordSysDef(ball_pos_support_plate, vee_pos_support_plate, flat_pos_support_plate);		
+		Transform3D trans_support_plate_to_support = getTransformation(support_plate_coord);
+
+		if(_debug) {
+			print("Make modules on support plate");
+		}
+		
+		for(int ilayer = 1; ilayer <=5; ++ilayer) {
+
+			String layerName = String.format("L%db", ilayer);
+			
+			print(layerName);
+
+			// position of survey positions on the support plate in the support plate coordinates system	
+			Hep3Vector ball_pos_mod_local = null;
+			Hep3Vector vee_pos_mod_local = null;
+			Hep3Vector flat_pos_mod_local = null;
+			if(ilayer == 1) {
+				 ball_pos_mod_local = ball_pos_module1_support_plate_local;
+				 vee_pos_mod_local = vee_pos_module1_support_plate_local;
+				 flat_pos_mod_local = flat_pos_module1_support_plate_local;
+			}
+			else if (ilayer == 2) {
+				 ball_pos_mod_local = ball_pos_module2_support_plate_local;
+				 vee_pos_mod_local = vee_pos_module2_support_plate_local;
+				 flat_pos_mod_local = flat_pos_module2_support_plate_local;
+			} 
+			else if (ilayer == 3) {
+				ball_pos_mod_local = ball_pos_module3_support_plate_local;
+				vee_pos_mod_local = vee_pos_module3_support_plate_local;
+				flat_pos_mod_local = flat_pos_module3_support_plate_local;
+			} 
+			else if (ilayer == 4) {
+				ball_pos_mod_local = ball_pos_module4_support_plate_local;
+				vee_pos_mod_local = vee_pos_module4_support_plate_local;
+				flat_pos_mod_local = flat_pos_module4_support_plate_local;
+			} else if (ilayer == 5) {
+				ball_pos_mod_local = ball_pos_module5_support_plate_local;
+				vee_pos_mod_local = vee_pos_module5_support_plate_local;
+				flat_pos_mod_local = flat_pos_module5_support_plate_local;
+			} else {
+				print("Not more than 5 layers!");
+				System.exit(1);
+			}
+			
+			if(_debug) {
+				print(String.format("ball_pos_mod_local %s", ball_pos_mod_local.toString()));
+				print(String.format("vee_pos_mod_local  %s", vee_pos_mod_local.toString()));
+				print(String.format("flat_pos_mod_local %s", flat_pos_mod_local.toString()));
+			}
+
+			// transform to support frame
+			Hep3Vector ball_pos_mod = trans_support_plate_to_support.transformed(ball_pos_mod_local);
+			Hep3Vector ball_pos_mod_rot = trans_support_plate_to_support.rotated(ball_pos_mod_local);
+			Hep3Vector ball_pos_mod_tr = trans_support_plate_to_support.translated(ball_pos_mod_local);
+			Hep3Vector vee_pos_mod = trans_support_plate_to_support.transformed(vee_pos_mod_local);
+			Hep3Vector flat_pos_mod = trans_support_plate_to_support.transformed(flat_pos_mod_local);
+			
+			if(_debug) {
+				print(String.format("ball_pos_mod_rot %s", ball_pos_mod_rot.toString()));
+				print(String.format("ball_pos_mod_tr %s", ball_pos_mod_tr.toString()));
+				print(String.format("ball_pos_mod %s", ball_pos_mod.toString()));
+				print(String.format("vee_pos_mod  %s", vee_pos_mod.toString()));
+				print(String.format("flat_pos_mod %s", flat_pos_mod.toString()));
+			}
+			
+			// make the module
+			makeModule(layerName,supportWrap, ball_pos_mod, vee_pos_mod, flat_pos_mod,lcdd, sens);
+		
+		} // ilayer
+		
+		
+		
+		// add support volume to lcdd
+		lcdd.add(supportVolume);
+		
+
+
+		
+	/*
+				
+		// Get corrections to survey ball positions from compact file to support plate positions (from e.g. survey)
+		Map<String, Hep3Vector> corr_balls = new HashMap<String,Hep3Vector>(); // save for debugging
+		for(Iterator i = node.getChildren("support_plate").iterator(); i.hasNext();) {
+			Element e = (Element)i.next();
+			if(e.getAttributeValue("name").equals("SupportPlateL1-3bot")) {
+				for(Iterator ii = e.getChildren("position").iterator(); ii.hasNext();) {
+					Element element = (Element) ii.next();
+					String name = element.getAttribute("name").getValue();
+					// get vector correction
+					Hep3Vector corr = new BasicHep3Vector(element.getAttribute("x").getDoubleValue(), element.getAttribute("y").getDoubleValue(), element.getAttribute("z").getDoubleValue());
+					if( name.equals("ball")) {
+						VecOp.add(ball_pos, corr);
+						corr_balls.put("ball", corr);
+					}
+					else if( name.equals("vee")) {
+						VecOp.add(vee_pos, corr);
+						corr_balls.put("vee", corr);
+					}
+					else if( name.equals("flat")) {
+						VecOp.add(flat_pos, corr);
+						corr_balls.put("flat", corr);
+					} 
+					else {
+						print(String.format("wrong alignment name for support plate: \"%s\"", name));
+						System.exit(1);
+					}
+				} //ii
+			}
+		} //i
+	
+		
+		// Find the local alignment corrections to the support plate
+		Hep3Vector local_translation = new BasicHep3Vector(0,0,0);
+		Hep3Vector local_rotation = new BasicHep3Vector(0,0,0);
+		for(Iterator i = node.getChildren("support_plate").iterator(); i.hasNext();) {
+			Element e = (Element)i.next();
+			if(e.getAttributeValue("name").equals("SupportPlateL1-3bot")) {
+				for(Iterator ii = e.getChildren("alignment").iterator(); ii.hasNext();) {
+					Element element = (Element) ii.next();
+					local_translation = new BasicHep3Vector(element.getAttribute("x").getDoubleValue(), element.getAttribute("y").getDoubleValue(), element.getAttribute("z").getDoubleValue());
+					local_rotation = new BasicHep3Vector(element.getAttribute("rx").getDoubleValue(), element.getAttribute("ry").getDoubleValue(), element.getAttribute("rz").getDoubleValue());
+
+				} //ii
+			}
+		} //i
+				
+	
+				
+		*/
+	}
+
+
+	private void makeSupportPlate(VolWrapper supportWrap,
+			Hep3Vector ball_pos_support_plate,
+			Hep3Vector vee_pos_support_plate,
+			Hep3Vector flat_pos_support_plate, LCDD lcdd, SensitiveDetector sens) throws JDOMException {
+
+		
+
+
+		String volName = "supportplate";
+		Box box = new Box(volName + "Box", support_plate_bottom_width, support_plate_bottom_height , support_plate_bottom_length);
+		lcdd.add(box);
+		Volume supportPlateVolume = new Volume(volName + "_volume", box, lcdd.getMaterial("Aluminum"));
+		
+		
+		// create the coordinate system
+		CoordSysDef support_plate_coord = new CoordSysDef(ball_pos_support_plate, vee_pos_support_plate, flat_pos_support_plate);
+		
+		print(String.format("support_plate ball %s", ball_pos_support_plate.toString()));
+		print(String.format("support_plate vee  %s", vee_pos_support_plate.toString()));
+		print(String.format("support_plate flat %s", flat_pos_support_plate.toString()));
+		print(String.format("support_plate:\n%s", support_plate_coord.toString()));
+
+		// Find distance to center in the local coordinate system 
+		Transform3D trans_support_plate_to_support = getTransformation(support_plate_coord);
+		Hep3Vector box_center_support_plate_local = new BasicHep3Vector(support_plate_bottom_width/2.0, support_plate_bottom_length/2.0, -1.0 * support_plate_bottom_height/2.0);
+		Hep3Vector box_center_support_plate = trans_support_plate_to_support.transformed(box_center_support_plate_local);
+		
+		print(String.format("box_center_support_plate_local  %s", box_center_support_plate_local.toString()));
+		print(String.format("box_center_support_plate        %s", box_center_support_plate.toString()));
+		
+		
+		Position pos = new Position(volName + "_position",box_center_support_plate.x(), box_center_support_plate.y(), box_center_support_plate.z());
+		//Find LCDD rotation angles from coordinate system unit vectors
+		Hep3Vector lcdd_rot_angles = new BasicHep3Vector(0,0,0); //getLCDDRotation(support_plate_coord);
+		Rotation rot = new Rotation(volName + "_rotation",lcdd_rot_angles.x(), lcdd_rot_angles.y(), lcdd_rot_angles.z());
+		lcdd.add(pos);
+		lcdd.add(rot);
+		PhysVol supportPlatePV = new PhysVol(supportPlateVolume, supportWrap.vol, pos, rot);
+		// add volume to lcdd
+		
+		supportPlateVolume.setVisAttributes(lcdd.getVisAttributes("SupportPlateVis"));
+		
+		lcdd.add(supportPlateVolume);
+		
+		VolWrapper supportPlateWrap = new VolWrapper();
+		supportPlateWrap.mother = supportWrap;
+		supportPlateWrap.vol = supportPlateVolume;
+		supportPlateWrap.name = volName;
+		supportPlateWrap.pos_vol = pos;
+		supportPlateWrap.rot_vol = rot;		
+		supportWrap.daughters.add(supportPlateWrap);
+		
+		
+		
+	}
+
+
+	private void makeModule(String name, VolWrapper supportWrap, Hep3Vector ball_pos_mod, Hep3Vector vee_pos_mod, Hep3Vector flat_pos_mod, LCDD lcdd, SensitiveDetector sens) throws JDOMException 
+    {
+
+		print(String.format("----- makeModule() ------"));
+
+		// create the coordinate system of the module in the support frame
+		CoordSysDef module_coord = new CoordSysDef(ball_pos_mod, vee_pos_mod, flat_pos_mod);
+		Transform3D trans = getTransformation(module_coord); 
+		
+		if(_debug) {
+			print(String.format("module_coord:\n%s", module_coord.toString()));
+			print(String.format("module_coord trans:\n%s", trans.toString()));
+		}
+		
+		
+		
+		String moduleName = "module_" + name;
+		// Find the bounding box for the module
+		//TODO find dimensions of this module box from Shawn
+		// Right now the box starts from the ball position and approximately encapsulates the two half-modules on the drawing
+		
+		Hep3Vector box_dim_local = new BasicHep3Vector(module_box_L13_length,module_box_L13_height,module_box_L13_width);
+		Hep3Vector box_dim = trans.rotated(box_dim_local);
+		if(_debug) {
+			print(String.format("box_dim_local: %s", box_dim_local.toString()));
+			print(String.format("box_dim      : %s", box_dim.toString()));
+		}
+		
+		Box box = new Box(moduleName + "_box", box_dim.x(), box_dim.y(), box_dim.z());
+		lcdd.add(box);
+		Volume moduleVolume = new Volume(moduleName + "_volume", box, lcdd.getMaterial("Vacuum"));
+		
+		
+		
+		VolWrapper moduleWrap = new VolWrapper();
+		moduleWrap.name = moduleName;
+		moduleWrap.vol = moduleVolume;
+		moduleWrap.mother = supportWrap;
+		moduleWrap.coord = module_coord;
+		
+		// distance to the center of the box in the local coordinates
+		Hep3Vector box_center_local = new BasicHep3Vector(box_dim_local.x()/2.0-5.0, 0.0, box_dim_local.z()/2.0); 
+		//Hep3Vector box_center_local = new BasicHep3Vector(0.0, 0.0,0.0);
+		moduleWrap.center = box_center_local;
+				
+		// Find the LCDD position and rotation of this module
+		// vector to the center of module box from ball position/origin
+		Hep3Vector box_center = trans.transformed(box_center_local);
+		//Position pos = new Position(volName + "_position",box_center.x(), box_center.y(), box_center.z());
+		Position pos = new Position(moduleName + "_position",box_center.x(), box_center.y(), box_center.z());
+		//Find LCDD rotation angles from coordinate system unit vectors
+		//Hep3Vector lcdd_rot_angles = new BasicHep3Vector(	Math.PI/2.0,0,0); //getLCDDRotation(survey_coord);
+		Hep3Vector lcdd_rot_angles = new BasicHep3Vector(0,0,0); //getLCDDRotation(survey_coord);
+		Rotation rot = new Rotation(moduleName + "_rotation",lcdd_rot_angles.x(), lcdd_rot_angles.y(), lcdd_rot_angles.z());
+		lcdd.add(pos);
+		lcdd.add(rot);
+		
+		PhysVol physVolume = new PhysVol(moduleVolume, supportWrap.vol, pos, rot);
+		supportWrap.daughters.add(moduleWrap);
+		moduleWrap.pv = physVolume;
+		moduleWrap.pos_vol = pos;
+		moduleWrap.rot_vol = rot;
+
+		if(_debug) {
+			print(String.format("module box center local %s",box_center_local.toString()));
+			print(String.format("module box center %s",box_center.toString()));
+		}
+		
+
+		// Find the coordinate system of the half-modules w.r.t. to the module survey points
+		// We are going to know the sensor center position w.r.t. module frame so the half-module 
+		// is really just a dummy volume to contain the daughters. Therefore place it at the same place 
+		// as where the sensor coordinate system will be to make things simpler.
+		
+		final double ball_pos_halfmod_axial_local_x =  (180.0 - 30.0 + (33.73 - 5.0)) - sensor_length/2.0; 
+		final double ball_pos_halfmod_axial_local_y =  -1.0* (this.coldblock_thickness/2.0 + this.cf_thickness + this.kapton_thickness + this.sensor_thickness/2.0);
+		final double ball_pos_halfmod_axial_local_z =  12.66 + sensor_width/2.0;
+		final double vee_pos_halfmod_axial_local_x =  ball_pos_halfmod_axial_local_x + sensor_length/2.0;
+		final double vee_pos_halfmod_axial_local_y =  ball_pos_halfmod_axial_local_y;
+		final double vee_pos_halfmod_axial_local_z =  ball_pos_halfmod_axial_local_z;
+		final double flat_pos_halfmod_axial_local_x =  ball_pos_halfmod_axial_local_x;
+		final double flat_pos_halfmod_axial_local_y =  ball_pos_halfmod_axial_local_y + sensor_thickness/2.0;
+		final double flat_pos_halfmod_axial_local_z =  ball_pos_halfmod_axial_local_z;		
+		Hep3Vector ball_pos_halfmod_axial_local = new BasicHep3Vector(ball_pos_halfmod_axial_local_x, ball_pos_halfmod_axial_local_y, ball_pos_halfmod_axial_local_z);
+		Hep3Vector vee_pos_halfmod_axial_local = new BasicHep3Vector(vee_pos_halfmod_axial_local_x, vee_pos_halfmod_axial_local_y,vee_pos_halfmod_axial_local_z);
+		Hep3Vector flat_pos_halfmod_axial_local = new BasicHep3Vector(flat_pos_halfmod_axial_local_x, flat_pos_halfmod_axial_local_y,flat_pos_halfmod_axial_local_z);
+
+		
+		if(_debug) {
+			print(String.format("ball_pos_halfmod_axial_local %s", ball_pos_halfmod_axial_local.toString()));
+			print(String.format("vee_pos_halfmod_axial_local %s", vee_pos_halfmod_axial_local.toString()));
+			print(String.format("flat_pos_halfmod_axial_local %s", flat_pos_halfmod_axial_local.toString()));
+		}
+		
+		makeHalfModule("axial",moduleWrap, ball_pos_halfmod_axial_local, vee_pos_halfmod_axial_local, flat_pos_halfmod_axial_local,lcdd,sens);
+
+		
+		
+		// cold block
+		
+		
+		
+		final double ball_pos_coldblock_local_x =  -5.00; 
+		final double ball_pos_coldblock_local_y =  0.00;
+		final double ball_pos_coldblock_local_z =  0.00;
+		final double vee_pos_coldblock_local_x =  ball_pos_coldblock_local_x + 1.0; //arbitrary distance 
+		final double vee_pos_coldblock_local_y =  ball_pos_coldblock_local_y;  
+		final double vee_pos_coldblock_local_z =  ball_pos_coldblock_local_z;  
+		final double flat_pos_coldblock_local_x =  ball_pos_coldblock_local_x;  
+		final double flat_pos_coldblock_local_y =  ball_pos_coldblock_local_y + 1.0;  //arbitrary distance 
+		final double flat_pos_coldblock_local_z =  ball_pos_coldblock_local_z;  
+		
+		
+		Hep3Vector ball_pos_coldblock_local = new BasicHep3Vector(ball_pos_coldblock_local_x, ball_pos_coldblock_local_y, ball_pos_coldblock_local_z);
+		Hep3Vector vee_pos_coldblock_local = new BasicHep3Vector(vee_pos_coldblock_local_x, vee_pos_coldblock_local_y,vee_pos_coldblock_local_z);
+		Hep3Vector flat_pos_coldblock_local = new BasicHep3Vector(flat_pos_coldblock_local_x, flat_pos_coldblock_local_y,flat_pos_coldblock_local_z);
+
+		
+		if(_debug) {
+			print(String.format("ball_pos_coldblock_local %s", ball_pos_coldblock_local.toString()));
+			print(String.format("vee_pos_coldblock_local %s", vee_pos_coldblock_local.toString()));
+			print(String.format("flat_pos_coldblock_local %s", flat_pos_coldblock_local.toString()));
+		}
+		
+		makeColdBlock(moduleWrap, ball_pos_coldblock_local, vee_pos_coldblock_local, flat_pos_coldblock_local,lcdd,sens);
+
+		
+		
+		final double ball_pos_halfmod_stereo_local_x =  ball_pos_halfmod_axial_local_x; 
+		final double ball_pos_halfmod_stereo_local_y =  -1.0 * ball_pos_halfmod_axial_local_y; // note minus sign
+		final double ball_pos_halfmod_stereo_local_z =  ball_pos_halfmod_axial_local_z;
+		final double vee_pos_halfmod_stereo_local_x =  ball_pos_halfmod_stereo_local_x + sensor_length/2.0;
+		final double vee_pos_halfmod_stereo_local_y =  ball_pos_halfmod_stereo_local_y;
+		final double vee_pos_halfmod_stereo_local_z =  ball_pos_halfmod_stereo_local_z;
+		final double flat_pos_halfmod_stereo_local_x =  ball_pos_halfmod_stereo_local_x;
+		final double flat_pos_halfmod_stereo_local_y =  ball_pos_halfmod_stereo_local_y + sensor_thickness/2.0;
+		final double flat_pos_halfmod_stereo_local_z =  ball_pos_halfmod_stereo_local_z;		
+		Hep3Vector ball_pos_halfmod_stereo_local = new BasicHep3Vector(ball_pos_halfmod_stereo_local_x, ball_pos_halfmod_stereo_local_y, ball_pos_halfmod_stereo_local_z);
+		Hep3Vector vee_pos_halfmod_stereo_local = new BasicHep3Vector(vee_pos_halfmod_stereo_local_x, vee_pos_halfmod_stereo_local_y,vee_pos_halfmod_stereo_local_z);
+		Hep3Vector flat_pos_halfmod_stereo_local = new BasicHep3Vector(flat_pos_halfmod_stereo_local_x, flat_pos_halfmod_stereo_local_y,flat_pos_halfmod_stereo_local_z);
+
+		
+		if(_debug) {
+			print(String.format("ball_pos_halfmod_stereo_local %s", ball_pos_halfmod_stereo_local.toString()));
+			print(String.format("vee_pos_halfmod_stereo_local %s", vee_pos_halfmod_stereo_local.toString()));
+			print(String.format("flat_pos_halfmod_stereo_local %s", flat_pos_halfmod_stereo_local.toString()));
+		}
+		
+		makeHalfModule("stereo",moduleWrap, ball_pos_halfmod_stereo_local, vee_pos_halfmod_stereo_local, flat_pos_halfmod_stereo_local,lcdd,sens);
+
+		
+		moduleVolume.setVisAttributes(lcdd.getVisAttributes("ModuleVis"));
+		
+		lcdd.add(moduleVolume);	
+
+
+    }
+	
+	
+	private void makeHalfModule(String side, VolWrapper moduleWrap, Hep3Vector ball_pos_halfmod, Hep3Vector vee_pos_halfmod, Hep3Vector flat_pos_halfmod, LCDD lcdd, SensitiveDetector sens) throws JDOMException {
+	
+		if(_debug) {
+			print("--- makeHalfModule " + side);
+		}
+		
+		CoordSysDef half_module_coord = new CoordSysDef(ball_pos_halfmod, vee_pos_halfmod, flat_pos_halfmod);		
+		Transform3D transToModuleCoord = getTransformation(half_module_coord); 
+		Transform3D transModuleToSupportCoord = getTransformation(moduleWrap.coord); 
+		
+		if(_debug) {
+			print(String.format("half_module_coord:\n%s", half_module_coord.toString()));
+			print(String.format("transToModuleCoord:\n%s", transToModuleCoord.toString()));
+			print(String.format("transModuleToSupportCoord:\n%s", transModuleToSupportCoord.toString()));
+		}
+
+		
+		// the half-module box is built based on the location of the center of the sensor box
+		String halfModuleName = moduleWrap.name + "_halfmodule_" + side;
+		//find the bounding box for the half module
+		final double x_local = this.half_module_length; 
+		final double y_local = this.half_module_thickness; 
+		final double z_local = this.half_module_width;	
+		Hep3Vector box_dim_local = new BasicHep3Vector( x_local, y_local, z_local); 
+		// rotate to module coordinate system
+		Hep3Vector box_dim_module = transToModuleCoord.rotated(box_dim_local);
+		// apply the same rotation as to mother 
+		Hep3Vector box_dim = transModuleToSupportCoord.rotated(box_dim_module);
+		
+		if(_debug) {
+			print(String.format("box_dim_local:\n%s", box_dim_local.toString()));
+			print(String.format("box_dim_module:\n%s", box_dim_module.toString()));
+			print(String.format("box_dim:\n%s", box_dim.toString()));
+		}		
+		
+		Box box = new Box(halfModuleName + "Box", box_dim.x(), box_dim.y(), box_dim.z());
+		lcdd.add(box);
+		Volume halfModuleVolume = new Volume(halfModuleName + "_volume", box, lcdd.getMaterial("Vacuum"));
+
+		
+		// vector to the center of the half module box from the half module ball position
+		double box_center_local_x =  this.half_module_length/2.0 - ( (170.00 + 10.00) - this.sensor_length/2.0); 
+		double box_center_local_y = (this.half_module_thickness/2.0 - (cf_thickness + kapton_thickness + sensor_thickness/2.0));
+		double box_center_local_z = this.half_module_width/2.0 - ( 12.66 - (8.83 -3.00) + this.sensor_width/2.0 ); 
+		Hep3Vector box_center_local = new BasicHep3Vector( box_center_local_x, box_center_local_y, box_center_local_z); 
+		//Hep3Vector box_center_local = new BasicHep3Vector( 0.,0.,0.);
+		
+		
+		VolWrapper halfModuleWrap = new VolWrapper();
+		halfModuleWrap.name = halfModuleName;
+		halfModuleWrap.vol = halfModuleVolume;
+		halfModuleWrap.coord = half_module_coord;
+		halfModuleWrap.center = box_center_local;
+
+		
+		Hep3Vector box_center_module_coord = transToModuleCoord.transformed(box_center_local);
+		Hep3Vector lcdd_rot_angles;
+		if(side.equals("stereo")) {
+			if(halfModuleName.contains("L1") || halfModuleName.contains("L2") ||halfModuleName.contains("L3")) {
+				lcdd_rot_angles = new BasicHep3Vector(0.0,0.1,0.0); 
+			} else {
+				lcdd_rot_angles = new BasicHep3Vector(0.0,0.05,0.0); 
+			}
+		} 
+		else {
+			lcdd_rot_angles = new BasicHep3Vector(Math.PI,0,0); 		
+		}
+
+		// find the displacement from the rotation around an arbitrary point in local coordinates
+		Hep3Vector box_center_module_coord_rot = getRotationDisplacement(ball_pos_halfmod, box_center_module_coord, lcdd_rot_angles);
+		
+		// find the position of the center in the module box
+		Hep3Vector box_center_sub = VecOp.sub(box_center_module_coord_rot, moduleWrap.center);
+		Hep3Vector box_center = transModuleToSupportCoord.rotated(box_center_sub);
+
+		// fix the rotation
+		Hep3Vector lcdd_rot_angles_support = transModuleToSupportCoord.rotated(lcdd_rot_angles);
+
+		
+		// create the lcdd tags
+		Position pos = new Position(halfModuleName + "_position",box_center.x(), box_center.y(), box_center.z());
+		Rotation rot = new Rotation(halfModuleName + "_rotation",lcdd_rot_angles_support.x(), lcdd_rot_angles_support.y(), lcdd_rot_angles_support.z());
+		lcdd.add(pos);
+		lcdd.add(rot);
+		
+		PhysVol physVolume = new PhysVol(halfModuleVolume, moduleWrap.vol, pos, rot);
+		halfModuleWrap.pv = physVolume;
+		halfModuleWrap.pos_vol = pos;
+		halfModuleWrap.rot_vol = rot;
+		halfModuleWrap.mother = moduleWrap;
+		moduleWrap.daughters.add(halfModuleWrap);
+		
+		if(_debug) {
+			print(String.format("box_center_local %s", box_center_local.toString()));
+			print(String.format("box_center_module_coord  %s", box_center_module_coord.toString()));
+			print(String.format("box_center_module_coord_rot %s", box_center_module_coord_rot.toString()));
+			print(String.format("moduleWrap.center %s", moduleWrap.center.toString()));
+			print(String.format("box_center_sub %s", box_center_sub.toString()));
+			print(String.format("box_center %s", box_center.toString()));
+			print(String.format("lcdd_rot_angles %s", lcdd_rot_angles.toString()));
+			print(String.format("lcdd_rot_angles_support %s", lcdd_rot_angles_support.toString()));
+			
+			
+		}
+		
+		// create the half module components 
+		
+		Hep3Vector ball_pos_sensor_local = new BasicHep3Vector(0,0,0);
+		Hep3Vector vee_pos_sensor_local = new BasicHep3Vector(ball_pos_sensor_local.x() + sensor_length/2.0, ball_pos_sensor_local.y(), ball_pos_sensor_local.z());
+		Hep3Vector flat_pos_sensor_local = new BasicHep3Vector(ball_pos_sensor_local.x(),ball_pos_sensor_local.y() + sensor_thickness/2.0, ball_pos_sensor_local.z());
+		
+		makeHalfModuleComponentSensor(halfModuleWrap,ball_pos_sensor_local,vee_pos_sensor_local,flat_pos_sensor_local, lcdd, sens);
+
+		
+		final double ball_pos_kapton_local_x =  -1 * (180.0 - this.sensor_length/2.0) + 8.5;
+		final double ball_pos_kapton_local_y =  -1 * (this.sensor_thickness/2.0 + this.kapton_thickness/2.0);
+		final double ball_pos_kapton_local_z = -1 * (this.sensor_width/2.0 + 12.66) + 8.83 - 3.00 + 6.00 ;
+		final double vee_pos_kapton_local_x =  ball_pos_kapton_local_x + 1.0; // arbitrary distance
+		final double vee_pos_kapton_local_y =  ball_pos_kapton_local_y;
+		final double vee_pos_kapton_local_z =  ball_pos_kapton_local_z;
+		final double flat_pos_kapton_local_x =  ball_pos_kapton_local_x;
+		final double flat_pos_kapton_local_y =  ball_pos_kapton_local_y + this.kapton_thickness/2.0; // arbitrary distance
+		final double flat_pos_kapton_local_z =  ball_pos_kapton_local_z;
+		
+		Hep3Vector ball_pos_kapton_local = new BasicHep3Vector(ball_pos_kapton_local_x,ball_pos_kapton_local_y,ball_pos_kapton_local_z);
+		Hep3Vector vee_pos_kapton_local = new BasicHep3Vector(vee_pos_kapton_local_x,vee_pos_kapton_local_y,vee_pos_kapton_local_z);
+		Hep3Vector flat_pos_kapton_local = new BasicHep3Vector(flat_pos_kapton_local_x,flat_pos_kapton_local_y,flat_pos_kapton_local_z);
+		
+		makeHalfModuleComponentKapton(halfModuleWrap,ball_pos_kapton_local,vee_pos_kapton_local,flat_pos_kapton_local, lcdd, sens);
+
+		
+		
+		final double ball_pos_cf_local_x =  -1 * (180.0 - this.sensor_length/2.0);
+		final double ball_pos_cf_local_y =  -1 * (this.sensor_thickness/2.0 + this.kapton_thickness + this.cf_thickness/2.0);
+		final double ball_pos_cf_local_z = -1 * (this.sensor_width/2.0 + 12.66) + 8.83 - 3.00;
+		final double vee_pos_cf_local_x =  ball_pos_cf_local_x + 1.0; // arbitrary distance
+		final double vee_pos_cf_local_y =  ball_pos_cf_local_y;
+		final double vee_pos_cf_local_z =  ball_pos_cf_local_z;
+		final double flat_pos_cf_local_x =  ball_pos_cf_local_x;
+		final double flat_pos_cf_local_y =  ball_pos_cf_local_y + this.cf_thickness/2.0; // arbitrary distance
+		final double flat_pos_cf_local_z =  ball_pos_cf_local_z;
+		
+		Hep3Vector ball_pos_cf_local = new BasicHep3Vector(ball_pos_cf_local_x,ball_pos_cf_local_y,ball_pos_cf_local_z);
+		Hep3Vector vee_pos_cf_local = new BasicHep3Vector(vee_pos_cf_local_x,vee_pos_cf_local_y,vee_pos_cf_local_z);
+		Hep3Vector flat_pos_cf_local = new BasicHep3Vector(flat_pos_cf_local_x,flat_pos_cf_local_y,flat_pos_cf_local_z);
+		
+		makeHalfModuleComponentCF(halfModuleWrap,ball_pos_cf_local,vee_pos_cf_local,flat_pos_cf_local, lcdd, sens);
+
+		
+		
+
+		final double ball_pos_hybrid_local_x =  -1 * (170.0 - this.sensor_length/2.0);
+		final double ball_pos_hybrid_local_y =  -1 * (this.sensor_thickness/2.0 - this.hybrid_thickness/2.0);
+		final double ball_pos_hybrid_local_z = -1 * (this.sensor_width/2.0);
+		final double vee_pos_hybrid_local_x =  ball_pos_hybrid_local_x + 1.0; // arbitrary distance
+		final double vee_pos_hybrid_local_y =  ball_pos_hybrid_local_y;
+		final double vee_pos_hybrid_local_z =  ball_pos_hybrid_local_z;
+		final double flat_pos_hybrid_local_x =  ball_pos_hybrid_local_x;
+		final double flat_pos_hybrid_local_y =  ball_pos_hybrid_local_y + this.hybrid_thickness/2.0; // arbitrary distance
+		final double flat_pos_hybrid_local_z =  ball_pos_hybrid_local_z;
+		
+		Hep3Vector ball_pos_hybrid_local = new BasicHep3Vector(ball_pos_hybrid_local_x,ball_pos_hybrid_local_y,ball_pos_hybrid_local_z);
+		Hep3Vector vee_pos_hybrid_local = new BasicHep3Vector(vee_pos_hybrid_local_x,vee_pos_hybrid_local_y,vee_pos_hybrid_local_z);
+		Hep3Vector flat_pos_hybrid_local = new BasicHep3Vector(flat_pos_hybrid_local_x,flat_pos_hybrid_local_y,flat_pos_hybrid_local_z);
+		
+		makeHalfModuleComponentHybrid(halfModuleWrap,ball_pos_hybrid_local,vee_pos_hybrid_local,flat_pos_hybrid_local, lcdd, sens);
+
+		
+		
+			
+		//set vis stuff
+		halfModuleVolume.setVisAttributes(lcdd.getVisAttributes("HalfModuleVis"));
+
+		lcdd.add(halfModuleVolume);
+		
+		
+	}
+	
+	
+	
+	private void makeColdBlock(VolWrapper moduleWrap, Hep3Vector ball_pos_coldblock, Hep3Vector vee_pos_coldblock, Hep3Vector flat_pos_coldblock, LCDD lcdd, SensitiveDetector sens) throws JDOMException {
+		
+		if(_debug) {
+			print("--- makeColdBlock ");
+		}
+		
+		CoordSysDef coldblock_coord = new CoordSysDef(ball_pos_coldblock, vee_pos_coldblock, flat_pos_coldblock);		
+		Transform3D transToModuleCoord = getTransformation(coldblock_coord); 
+		Transform3D transModuleToSupportCoord = getTransformation(moduleWrap.coord); 
+		
+		if(_debug) {
+			print(String.format("coldblock_coord:\n%s", coldblock_coord.toString()));
+			print(String.format("transToModuleCoord:\n%s", transToModuleCoord.toString()));
+			print(String.format("transModuleToSupportCoord:\n%s", transModuleToSupportCoord.toString()));
+		}
+
+		
+		String coldBlockName = moduleWrap.name + "_coldBlock";
+		//find the bounding box
+		final double x_local = this.coldblock_length; 
+		final double y_local = this.coldblock_thickness; 
+		final double z_local = this.coldblock_width;	
+		Hep3Vector box_dim_local = new BasicHep3Vector( x_local, y_local, z_local); 
+		// rotate to module coordinate system
+		Hep3Vector box_dim_module = transToModuleCoord.rotated(box_dim_local);
+		// apply the same rotation as to mother 
+		Hep3Vector box_dim = transModuleToSupportCoord.rotated(box_dim_module);
+		
+		if(_debug) {
+			print(String.format("box_dim_local:\n%s", box_dim_local.toString()));
+			print(String.format("box_dim_module:\n%s", box_dim_module.toString()));
+			print(String.format("box_dim:\n%s", box_dim.toString()));
+		}		
+		
+		Box box = new Box(coldBlockName + "Box", box_dim.x(), box_dim.y(), box_dim.z());
+		lcdd.add(box);
+		Volume coldBlockVolume = new Volume(coldBlockName + "_volume", box, lcdd.getMaterial("Vacuum"));
+
+		
+		// vector to the center of the half module box from the half module ball position
+		double box_center_local_x =  this.coldblock_length/2.0; 
+		double box_center_local_y = 0.0;
+		double box_center_local_z = this.coldblock_width/2.0;
+		Hep3Vector box_center_local = new BasicHep3Vector( box_center_local_x, box_center_local_y, box_center_local_z); 
+		//Hep3Vector box_center_local = new BasicHep3Vector( 0.,0.,0.);
+		
+		
+		VolWrapper coldBlockWrap = new VolWrapper();
+		coldBlockWrap.name = coldBlockName;
+		coldBlockWrap.vol = coldBlockVolume;
+		coldBlockWrap.coord = coldblock_coord;
+		coldBlockWrap.center = box_center_local;
+		
+		
+		Hep3Vector box_center_module_coord = transToModuleCoord.transformed(box_center_local);
+		Hep3Vector lcdd_rot_angles = new BasicHep3Vector(0,0,0);
+		
+		// find the displacement from the rotation around an arbitrary point in local coordinates
+		Hep3Vector box_center_module_coord_rot = getRotationDisplacement(ball_pos_coldblock, box_center_module_coord, lcdd_rot_angles);
+		
+		// find the position of the center in the module box
+		Hep3Vector box_center_sub = VecOp.sub(box_center_module_coord_rot, moduleWrap.center);
+		Hep3Vector box_center = transModuleToSupportCoord.rotated(box_center_sub);
+		//Hep3Vector box_center = VecOp.sub(box_center_module_coord, moduleWrap.center);
+
+		// create the lcdd tags
+		Position pos = new Position(coldBlockName + "_position",box_center.x(), box_center.y(), box_center.z());
+		Rotation rot = new Rotation(coldBlockName + "_rotation",lcdd_rot_angles.x(), lcdd_rot_angles.y(), lcdd_rot_angles.z());
+		lcdd.add(pos);
+		lcdd.add(rot);
+		
+		PhysVol physVolume = new PhysVol(coldBlockVolume, moduleWrap.vol, pos, rot);
+		coldBlockWrap.pv = physVolume;
+		coldBlockWrap.pos_vol = pos;
+		coldBlockWrap.rot_vol = rot;
+		coldBlockWrap.mother = moduleWrap;
+		moduleWrap.daughters.add(coldBlockWrap);
+		
+		if(_debug) {
+			print(String.format("box_center_local %s", box_center_local.toString()));
+			print(String.format("box_center_module_coord  %s", box_center_module_coord.toString()));
+			print(String.format("box_center_module_coord_rot %s", box_center_module_coord_rot.toString()));
+			print(String.format("moduleWrap.center %s", moduleWrap.center.toString()));
+			print(String.format("hbox_center %s", box_center.toString()));
+		}
+		
+		
+		//set vis stuff
+		coldBlockVolume.setVisAttributes(lcdd.getVisAttributes("ColdBlockVis"));
+
+		lcdd.add(coldBlockVolume);
+		
+		
+	}
+	
+	
+	
+	
+	
+	/**
+	 * Find the displacement of a point when rotating around an arbitrary position
+	 * @param origin_of_rotation
+	 * @param point
+	 * @param lcdd_rot_angles
+	 * @return
+	 */
+	private Hep3Vector getRotationDisplacement(Hep3Vector origin_of_rotation,
+			Hep3Vector point, Hep3Vector lcdd_rot_angles) {
+
+		// Find the vector from the center of rotation to the point
+		Hep3Vector s = VecOp.sub(point, origin_of_rotation );
+		//Apply the rotation to the vector
+		RotationGeant r = new RotationGeant(lcdd_rot_angles.x(), lcdd_rot_angles.y(), lcdd_rot_angles.z());
+		Hep3Vector s_prime = r.rotated(s);
+		// Find the displaced point
+		Hep3Vector point_rot = VecOp.add(origin_of_rotation, s_prime );
+		if(_debug) {
+			print("--- getRotationDisplacement---");
+			print(String.format("point: %s", point.toString()));
+			print(String.format("origin_of_rotation: %s", origin_of_rotation.toString()));
+			print(String.format("s:\n%s", s.toString()));
+			print(String.format("r:\n%s", r.toString()));
+			print(String.format("s_prime:\n%s", s_prime.toString()));
+			print(String.format("box_center_module_coord_rot:\n%s", point_rot.toString()));
+		}
+		return point_rot;
+	}
+
+
+	private void makeHalfModuleComponentSensor(VolWrapper halfModuleWrap, Hep3Vector ball_pos_sensor_local, Hep3Vector vee_pos_sensor_local, Hep3Vector flat_pos_sensor_local, LCDD lcdd, SensitiveDetector sens) throws JDOMException {
+		
+		if(_debug) {
+			print("--- makeHalfModuleComponents ---");
+		}
+		
+		
+		if(_debug) {
+			print(" Add sensor...");
+		}
+		
+		CoordSysDef sensor_coord = new CoordSysDef(ball_pos_sensor_local, vee_pos_sensor_local, flat_pos_sensor_local);		
+		Transform3D transToHalfModuleCoord = getTransformation(sensor_coord); 
+		Transform3D transToModuleCoord = getTransformation(halfModuleWrap.coord); 
+		Transform3D transToSupportCoord = getTransformation(halfModuleWrap.mother.coord); 
+		
+		if(_debug) {
+			print(String.format("sensor_coord:\n%s", sensor_coord.toString()));
+			print(String.format("transToHalfModuleCoord:\n%s", transToHalfModuleCoord.toString()));
+			print(String.format("transToModuleCoord:\n%s", transToModuleCoord.toString()));
+			print(String.format("transToSupportCoord:\n%s", transToSupportCoord.toString()));
+		}
+		
+		
+		
+		
+		// add sensor
+		
+		int sensor_number = 0;
+		String sensorName = halfModuleWrap.name + "_sensor" + sensor_number;		
+		// Create the box solid for the component.
+		double x_local = this.sensor_length; 
+		double y_local = this.sensor_thickness; 
+		double z_local = this.sensor_width; 
+		Hep3Vector box_dim_local = new BasicHep3Vector(x_local,y_local,z_local);
+		Hep3Vector box_dim_half_module = transToHalfModuleCoord.rotated(box_dim_local);
+		Hep3Vector box_dim_module = transToModuleCoord.rotated(box_dim_half_module);
+		Hep3Vector box_dim = transToSupportCoord.rotated(box_dim_module);
+		
+		if(_debug) {
+			print(String.format("box_dim_local %s", box_dim_local.toString()));
+			print(String.format("box_dim_half_module %s", box_dim_half_module.toString()));
+			print(String.format("box_dim_module %s", box_dim_module.toString()));
+			print(String.format("box_dim %s", box_dim.toString()));
+		}
+		
+		
+		Box sensor_box = new Box(sensorName + "_box",box_dim.x(),box_dim.y(),box_dim.z());
+		lcdd.add(sensor_box);
+
+		// Create the volume for the module component.
+		Volume sensor_volume = new Volume(sensorName + "_volume", sensor_box,lcdd.getMaterial("Silicon"));
+		
+		if(_debug) {
+			print(String.format("ball_pos_sensor_local %s", ball_pos_sensor_local.toString()));
+			print(String.format("vee_pos_sensor_local %s", vee_pos_sensor_local.toString()));
+			print(String.format("flat_pos_sensor_local %s", flat_pos_sensor_local.toString()));
+		}
+		
+		Hep3Vector sensor_box_center_local = new BasicHep3Vector(0.,0.,0.);
+		Hep3Vector sensor_box_center_half_module_coord = transToHalfModuleCoord.transformed(sensor_box_center_local);
+		Hep3Vector sensor_box_center_half_module = VecOp.sub(sensor_box_center_half_module_coord, halfModuleWrap.center);
+		// transform according to mother volumes
+		Hep3Vector sensor_box_center_module = transToModuleCoord.rotated(sensor_box_center_half_module);
+		Hep3Vector sensor_box_center = transToSupportCoord.rotated(sensor_box_center_module);
+		
+		
+
+		if(_debug) {
+			print(String.format("sensor_box_center_local %s", sensor_box_center_local.toString()));
+			print(String.format("sensor_box_center_half_module_coord %s", sensor_box_center_half_module_coord.toString()));
+			print(String.format("half module box center in half module coord  %s", halfModuleWrap.center.toString()));
+			print(String.format("sensor_box_center_half_module  %s", sensor_box_center_half_module.toString()));
+			print(String.format("sensor_box_center_module  %s", sensor_box_center_module.toString()));
+			print(String.format("sensor_box_center  %s", sensor_box_center.toString()));
+		}
+		
+		
+		Position pos = new Position(sensorName + "_position",sensor_box_center.x(), sensor_box_center.y(), sensor_box_center.z());
+		//Position pos = new Position(volName + "_position",0,20.0,0);
+		Hep3Vector lcdd_rot_angles = new BasicHep3Vector(0,0,0); //getLCDDRotation(survey_coord);
+		Rotation rot = new Rotation(sensorName + "_rotation",lcdd_rot_angles.x(), lcdd_rot_angles.y(), lcdd_rot_angles.z());
+		lcdd.add(pos);
+		lcdd.add(rot);
+
+		
+		
+		PhysVol sensor_physvol = new PhysVol(sensor_volume, halfModuleWrap.vol, pos, rot);
+		sensor_volume.setSensitiveDetector(sens);
+		sensor_physvol.addPhysVolID("sensor", sensor_number);
+		sensor_physvol.addPhysVolID("system", 0);
+		sensor_physvol.addPhysVolID("barrel", 0);
+		sensor_physvol.addPhysVolID("layer", 0);
+		sensor_physvol.addPhysVolID("module", 0);    
+		
+		
+	
+		
+		
+		VolWrapper sensorWrap = new VolWrapper();
+		sensorWrap.name = sensorName;
+		sensorWrap.pv = sensor_physvol;
+		sensorWrap.vol = sensor_volume;
+		sensorWrap.pos_vol = pos;
+		sensorWrap.rot_vol = rot;
+		sensorWrap.mother = halfModuleWrap;
+		sensorWrap.center = sensor_box_center_local;
+		sensorWrap.coord = sensor_coord;
+		halfModuleWrap.daughters.add(sensorWrap);
+	
+		
+		sensor_volume.setVisAttributes(lcdd.getVisAttributes("SensorVis"));
+		
+		
+		lcdd.add(sensor_volume);
+		
+		
+		
+	
+
+	}
+
+	
+	
+	
+	
[truncated at 1000 lines; 499 more skipped]

projects/lcsim/trunk/detector-framework/src/test/resources/org/lcsim/geometry/subdetector
HPSTestRunTracker2014.xml added at 3101
--- projects/lcsim/trunk/detector-framework/src/test/resources/org/lcsim/geometry/subdetector/HPSTestRunTracker2014.xml	                        (rev 0)
+++ projects/lcsim/trunk/detector-framework/src/test/resources/org/lcsim/geometry/subdetector/HPSTestRunTracker2014.xml	2014-04-22 05:14:21 UTC (rev 3101)
@@ -0,0 +1,108 @@
+<lccdd xmlns:compact="http://www.lcsim.org/schemas/compact/1.0"
+  xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
+  xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/compact/1.0/compact.xsd">
+  
+  <info name="HPSTestRunTracker2014">
+    <comment>new SVT test run geometry</comment>
+  </info>
+  
+  <define>
+    <!-- world -->
+    <constant name="world_side" value="500.0*cm" />
+    <constant name="world_x" value="world_side" />
+    <constant name="world_y" value="world_side" />
+    <constant name="world_z" value="world_side" />
+  
+ 	 <!-- tracking region -->
+ 	<constant name="tracking_region_radius" value="200.0*cm"/>
+    <constant name="tracking_region_min" value="5.0*cm"/>
+    <constant name="tracking_region_zmax" value="131.8*cm"/>
+   </define>
+  
+  <materials>
+    <!-- Set tracking material to vacuum. -->
+    <material name="TrackingMaterial">
+      <D type="density" unit="g/cm3" value="0.0000000000000001" />
+      <fraction n="1.0" ref="Vacuum" />
+    </material>
+  </materials>
+  
+  <display>
+	
+    <vis name="SensorVis" alpha="1.0" r="1.0" g="0.0" b="0.0" drawingStyle="wireframe" lineStyle="unbroken" showDaughters="true" visible="true"/>
+    <vis name="CarbonFiberVis" alpha="1.0" r="0.88" g="0.88" b="0.88" drawingStyle="solid" lineStyle="unbroken" showDaughters="true" visible="true"/>
+    <vis name="KaptonVis" alpha="1.0" r="0.91" g="0.77" b="0.06" drawingStyle="wireframe" lineStyle="unbroken" showDaughters="true" visible="true"/>
+    <vis name="HybridVis" alpha="1.0" r="0.0" g="1.0" b="0" drawingStyle="wireframe" lineStyle="unbroken" showDaughters="true" visible="true"/>
+    <vis name="HalfModuleVis" alpha="1.0" r="1.0" g="1.0" b="1.0" drawingStyle="wireframe" lineStyle="dashed" showDaughters="true" visible="true"/>
+    <vis name="ColdBlockVis" alpha="1.0" r="1.0" g="0.0" b="0.0" drawingStyle="wireframe" lineStyle="dashed" showDaughters="true" visible="true"/>
+    <vis name="ModuleVis" alpha="1.0" r="1.0" g="1.0" b="1.0" drawingStyle="wireframe" lineStyle="dotted" showDaughters="true" visible="true"/>
+    <vis name="SupportPlateVis" alpha="1.0" r="0.75" g="0.73" b="0.75" drawingStyle="solid" lineStyle="dashed" showDaughters="true" visible="true"/>
+    <vis name="LayerVis" alpha="0.0" r="0.0" g="0.0" b="1.0" drawingStyle="wireframe" showDaughters="true" visible="false"/>
+    <vis name="ComponentVis" alpha="0.0" r="0.0" g="0.2" b="0.4" drawingStyle="solid" showDaughters="false" visible="false"/>
+	
+  </display>
+  
+  <detectors>
+    <detector id="1" name="Tracker" type="HPSTestRunTracker2014" readout="TrackerHits">
+
+      <!-- Definition of half module logical volume. -->
+      <half_modules>
+        <half_module name="SvtHalfModuleLayers1-3">
+          <component x="50.0" y="100.0" z="0.0" material="Silicon" sensitive="true" />
+        </half_module>
+      </half_modules>
+      
+      <!-- Alignment of entire tracker box. -->
+      <alignment x="0.0" y="0.0" z="0.0" />
+      <support_plate name="SupportPlateL1-3bot">
+        <position name="ball" x="0.0" y="0.0" z="0.0"/>
+        <position name="vee" x="0.0" y="0.0" z="0.0"/>
+        <position name="flat" x="0.0" y="0.0" z="0.0"/>
+        <alignment x="5.0" y="5.0" z="5.0" rx="0.1" ry="0.1" rz="0.1"/>
+        <modules>
+          <module layer="1" ref="SvtModule">
+            <position name="ball" x="0.0" y="0.0" z="0.0"/>
+        	<position name="vee" x="0.0" y="0.0" z="0.0"/>
+        	<position name="flat" x="0.0" y="0.0" z="0.0"/>
+        	<alignment x="4.0" y="4.0" z="4.0" rx="0.1" ry="0.1" rz="0.1"/>
+        	<half_module type="axial" ref="SvtHalfModuleLayers1-3">
+	        	<position name="ball" x="0.0" y="0.0" z="0.0"/>
+    	    	<position name="vee" x="0.0" y="0.0" z="0.0"/>
+        		<position name="flat" x="0.0" y="0.0" z="0.0"/>
+            	<alignment x="3.0" y="3.0" z="3.0" rx="0.1" ry="0.1" rz="0.1" />
+            </half_module>
+	<!-- 
+            <half_module type="stereo" ref="SvtHalfModuleLayers1-3">
+	       		<position name="ball" x="0.0" y="0.0" z="0.0"/>
+    	    	<position name="vee" x="0.0" y="0.0" z="0.0"/>
+        		<position name="flat" x="0.0" y="0.0" z="0.0"/>
+            	<alignment x="2.0" y="2.0" z="2.0" rx="0.1" ry="0.1" rz="0.1" />
+            </half_module>
+            -->
+          </module>
+          <!-- 
+          <module layer="2" ref="SvtModule">
+            <alignment x="0.0" y="0.0" z="" rx="0.0" ry="0.0"
+              rz="0.0" />
+          </module>
+          <module layer="3" ref="SvtModule">
+            <alignment x="0.0" y="0.0" z="" rx="0.0" ry="0.0"
+              rz="0.0" />
+          </module>
+           -->
+        </modules>
+      </support_plate>
+    </detector>
+  </detectors>
+  <readouts>
+    <readout name="TrackerHits">
+      <id>system:6,barrel:3,layer:4,module:12,sensor:1,side:32:-2,strip:12</id>
+    </readout>
+  </readouts>
+  <fields>
+    <field type="BoxDipole" name="AnalyzingDipole" x="0*cm" y="0*cm"
+      z="45.22*cm" dx="22.86*cm" dy="7.62*cm" dz="46.22*cm" bx="0.0" by="-0.5"
+      bz="0.0">
+    </field>
+  </fields>
+</lccdd>
\ No newline at end of file
SVNspam 0.1


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