Author: phansson Date: Fri Oct 31 16:41:15 2014 New Revision: 3408 Log: Adding 2014 LCDD converter skeleton. Added: projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/HPSTracker2014LCDDBuilder.java 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/lcdd/HPSTracker2014.java 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 16:41:15 2014 @@ -33,7 +33,7 @@ public void build(Volume worldVolume) { // build geometry - setBuilder(new HPSTestRunTracker2014GeometryDefinition(this._debug, this.node)); + setBuilder(new HPSTestRunTracker2014GeometryDefinition(_debug, node)); if(_builder==null) throw new RuntimeException("need to set builder class before calling build!"); Added: projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/HPSTracker2014LCDDBuilder.java ============================================================================= --- projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/HPSTracker2014LCDDBuilder.java (added) +++ projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/HPSTracker2014LCDDBuilder.java Fri Oct 31 16:41:15 2014 @@ -0,0 +1,19 @@ +package org.lcsim.geometry.compact.converter; + +import org.jdom.Element; +import org.lcsim.geometry.compact.converter.lcdd.util.LCDD; +import org.lcsim.geometry.compact.converter.lcdd.util.SensitiveDetector; + +public class HPSTracker2014LCDDBuilder extends HPSTestRunTracker2014LCDDBuilder { + + public HPSTracker2014LCDDBuilder(boolean debugFlag, Element node, + LCDD lcdd, SensitiveDetector sens) { + + super(debugFlag, node, lcdd, sens); + + } + + + + +} Modified: projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/lcdd/HPSTracker2014.java ============================================================================= --- projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/lcdd/HPSTracker2014.java (original) +++ projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/lcdd/HPSTracker2014.java Fri Oct 31 16:41:15 2014 @@ -1,1083 +1,34 @@ 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.HPSTracker2014LCDDBuilder; +import org.lcsim.geometry.compact.converter.HPSTrackerLCDDBuilder; 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. + * Convert the HPS Test run tracker 2014 to the LCDD format. * - * @author Jeremy McCormick <[log in to unmask]> - * @author Tim Nelson <[log in to unmask]> + * @author Per Hansson <[log in to unmask]> * */ -public class HPSTracker2014 extends LCDDSubdetector +public class HPSTracker2014 extends HPSTracker2014Base { - private boolean _debug = false; - public static final double inch = 25.4; + public HPSTracker2014(Element node) throws JDOMException + { + super(node); + } - 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 = 55.0; // excluding the "tung" where the sensor lays on - 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_thickness = 0.150; - private final double kapton_thickness = 0.050; - - - - - - - public HPSTracker2014(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 = 15.0*inch; // along z - final double support_width = 9.25*inch; // along x - final double support_height = 2.5*inch + 1.5*inch; // along y TODO made this up! - - - 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 - - // build the position of the support plate in the support box volume - // easy since the support box position is arbitrary here. - Hep3Vector ball_pos_support_plate = new BasicHep3Vector(support_width/2.0-0.625*inch, -1.0*support_height/2.0 + 0.755*inch, support_length/2.0 - 0.25*inch); - Hep3Vector vee_pos_support_plate = new BasicHep3Vector(-1.0*ball_pos_support_plate.x(),ball_pos_support_plate.y(),ball_pos_support_plate.z()); - Hep3Vector flat_pos_support_plate = new BasicHep3Vector(0.0,ball_pos_support_plate.y(),-0.5*support_length + 0.25*inch); - - 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); - - - - print("Make modules on support plate"); - - for(int ilayer = 1; ilayer <=3; ++ilayer) { - - String layerName = String.format("L%db", ilayer); - - print(layerName); - - final double module_ball_local_u = 7.7*inch; - double module_ball_local_v = 11.625*inch; - double offset = 0.; - if(ilayer == 2) { - offset = -100.0; - } else if(ilayer == 3) { - offset = -200.0; - } - module_ball_local_v = module_ball_local_v + offset; - - // place module mounting surface at support plate surface - // the kin mount on support plate is sunk into plate TODO check this!! - final double module_ball_local_w = -0.3195*inch; - Hep3Vector ball_pos_mod_local = new BasicHep3Vector(module_ball_local_u,module_ball_local_v,module_ball_local_w); - - final double module_vee_local_u = (support_width - (7.7+0.625)*inch ) - 0.625*inch; - final double module_vee_local_v = module_ball_local_v; - final double module_vee_local_w = module_ball_local_w; - Hep3Vector vee_pos_mod_local = new BasicHep3Vector(module_vee_local_u,module_vee_local_v,module_vee_local_w); - - final double module_flat_local_u = (module_ball_local_u - module_vee_local_u) / 2.0 + module_vee_local_u; - final double module_flat_local_v = module_ball_local_v + 0.5*inch; - final double module_flat_local_w = module_ball_local_w; - Hep3Vector flat_pos_mod_local = new BasicHep3Vector(module_flat_local_u,module_flat_local_v,module_flat_local_w); - - //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 { - - final double support_plate_height = 3.0/8.0*inch; - final double support_plate_length = 15.0*inch; - final double support_plate_width = 9.25*inch; - - - - String volName = "supportplate"; - Box box = new Box(volName + "Box", support_plate_width, support_plate_height , support_plate_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 the LCDD position and rotation of this support plate - Transform3D trans_support_plate_to_support = getTransformation(support_plate_coord.origin(), support_plate_coord.u(), support_plate_coord.v(), support_plate_coord.w()); - double du = support_plate_width/2.0-0.625*inch; // - double dv = support_plate_length/2.0 - 0.25*inch; - double dw = support_plate_height/2.0 - 0.3195*inch; // TODO how far is the kin mount sunk into the plate? - Hep3Vector box_center_support_plate_local = new BasicHep3Vector(du, dv, dw); - 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() ------")); - - - 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 - final double x = 8*inch; // ~along sensors - final double y = 0.526*inch + hybrid_thickness; // ~perpendicular to sensors - final double z = 1.543*inch + sensor_width/2.0 + sensor_length/2.0*0.1; // ~height from support plate - Box box = new Box(moduleName + "_box", x, y, z); - lcdd.add(box); - Volume moduleVolume = new Volume(moduleName + "_volume", box, lcdd.getMaterial("Vacuum")); - - - // 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); - - if(_debug) { - print(String.format("module_coord:\n%s", module_coord.toString())); - } - - 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 - // TODO get these from Shawn - Hep3Vector box_center_local = new BasicHep3Vector(x/2.0-0.25*inch, y/2.0, z/2.0); - moduleWrap.center = box_center_local; - - // Find the LCDD position and rotation of this module - Transform3D trans = getTransformation(module_coord); //.origin(), module_coord.u(), module_coord.v(), module_coord.w()); - // 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())); - } - - //Create the half modules - - // 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. - - // Start with stereo half-module - - final double ball_pos_halfmod_stereo_local_x = 4.818*inch; - final double ball_pos_halfmod_stereo_local_y = 0.526*inch - sensor_thickness/2.0; - final double ball_pos_halfmod_stereo_local_z = 1.543*inch; - 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); - - Hep3Vector ball_pos_halfmod_axial_local = new BasicHep3Vector(ball_pos_halfmod_stereo_local.x(),0.224*inch - sensor_thickness/2.0,ball_pos_halfmod_stereo_local.z()); - Hep3Vector vee_pos_halfmod_axial_local = new BasicHep3Vector(ball_pos_halfmod_axial_local.x() + sensor_length/2.0, ball_pos_halfmod_axial_local.y(),ball_pos_halfmod_axial_local.z()); - Hep3Vector flat_pos_halfmod_axial_local = new BasicHep3Vector(ball_pos_halfmod_axial_local.x(), ball_pos_halfmod_axial_local.y() + sensor_thickness/2.0,ball_pos_halfmod_axial_local.z()); - - /* - final double ball_pos_halfmod_axial_local_x = 4.818*inch; - final double ball_pos_halfmod_axial_local_y = 0.224*inch - sensor_thickness/2.0; // only difference! - final double ball_pos_halfmod_axial_local_z = 1.543*inch; - 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); -*/ - - - makeHalfModule("axial",moduleWrap, ball_pos_halfmod_axial_local, vee_pos_halfmod_axial_local, flat_pos_halfmod_axial_local,lcdd,sens); - - - moduleVolume.setVisAttributes(lcdd.getVisAttributes("ModuleVis")); - - lcdd.add(moduleVolume); - - + /* (non-Javadoc) + * @see org.lcsim.geometry.compact.converter.lcdd.HPSTracker2014Base#initializeBuilder(org.lcsim.geometry.compact.converter.lcdd.util.LCDD, org.lcsim.geometry.compact.converter.lcdd.util.SensitiveDetector) + */ + protected HPSTrackerLCDDBuilder initializeBuilder(LCDD lcdd, SensitiveDetector sens) { + HPSTrackerLCDDBuilder b = new HPSTracker2014LCDDBuilder(_debug,node,lcdd,sens); + return b; } - - - 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); - } - - - // 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 = hybrid_length+sensor_length; //4.818*inch + 70.0/inch; //~along sensors, made this up TODO Fix this! - final double y = this.hybrid_thickness + this.CF_thickness + this.kapton_thickness; //2*(hybrid_thickness - sensor_thickness/2.0); //~ perpendicular to sensors - final double z = hybrid_width; // ~height in direction ~perpendicular to the support plate - - Box box = new Box(halfModuleName + "Box", x, y, z); - lcdd.add(box); - Volume halfModuleVolume = new Volume(halfModuleName + "_volume", box, lcdd.getMaterial("Vacuum")); - - CoordSysDef half_module_coord = new CoordSysDef(ball_pos_halfmod, vee_pos_halfmod, flat_pos_halfmod); - - // vector to the center of the half module box from the module ball position - double box_center_local_x = -1.0 * ( (x - (hybrid_length + sensor_length))/2.0 + hybrid_length + sensor_length/2.0 - x/2.0); - double box_center_local_y = (y/2.0 - (CF_thickness + kapton_thickness + sensor_thickness/2.0)); - double box_center_local_z = .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.); - if(_debug) { - print(String.format("half-module_coord:\n%s", half_module_coord.toString())); - } - - - VolWrapper halfModuleWrap = new VolWrapper(); - halfModuleWrap.name = halfModuleName; - halfModuleWrap.vol = halfModuleVolume; - halfModuleWrap.coord = half_module_coord; - halfModuleWrap.center = box_center_local; - - - - - // Find the LCDD position and rotation of this volume - - Transform3D transToModuleCoord = getTransformation(half_module_coord); - Hep3Vector box_center_module_coord = transToModuleCoord.transformed(box_center_local); - Hep3Vector lcdd_rot_angles; - if(side.equals("stereo")) { - lcdd_rot_angles = new BasicHep3Vector(0,0.1,0); //getLCDDRotation(survey_coord); - } - else { - lcdd_rot_angles = new BasicHep3Vector(0,0,0); //getLCDDRotation(survey_coord); - } - - // 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 = VecOp.sub(box_center_module_coord_rot, moduleWrap.center); - //Hep3Vector box_center = VecOp.sub(box_center_module_coord, moduleWrap.center); - - // 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.x(), lcdd_rot_angles.y(), lcdd_rot_angles.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("half module box center local %s", box_center_local.toString())); - print(String.format("half module box center in module coord %s", box_center_module_coord.toString())); - print(String.format("half module box center in module coord rot %s", box_center_module_coord_rot.toString())); - print(String.format("module box center in module coord %s", moduleWrap.center.toString())); - print(String.format("half module box center in module box %s", box_center.toString())); - } - - // create the half module components based on the position of the sensor center in the half-module coordinates - // Note that the origin is the same and the unit vectors are parallel to the half-module - - 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()); - - makeHalfModuleComponents(halfModuleWrap,ball_pos_sensor_local,vee_pos_sensor_local,flat_pos_sensor_local, lcdd, sens); - - //set vis stuff - halfModuleVolume.setVisAttributes(lcdd.getVisAttributes("HalfModuleVis")); - - lcdd.add(halfModuleVolume); - - - } - - /** - * 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("box_center_module_coord:\n%s", point.toString())); - print(String.format("ball_pos_halfmod:\n%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 makeHalfModuleComponents(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 ---"); - } - - // add sensor - - int sensor_number = 0; - String sensorName = halfModuleWrap.name + "_sensor" + sensor_number; - // Create the box solid for the component. - Box sensor_box = new Box(sensorName + "_box",sensor_length,sensor_thickness, sensor_width); - 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())); - } - - CoordSysDef sensor_coord = new CoordSysDef(ball_pos_sensor_local, vee_pos_sensor_local, flat_pos_sensor_local); - - if(_debug) { - print(String.format("sensor_coord:\n%s", sensor_coord.toString())); - } - - // Find the LCDD position and rotation of this module - Transform3D transToHalfModuleCoord = getTransformation(sensor_coord); - //Hep3Vector sensor_box_center_local = new BasicHep3Vector(sensor_length/2.0, sensor_width/2.0, -1.0*sensor_thickness/2.0); - 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 = VecOp.sub(sensor_box_center_half_module_coord, halfModuleWrap.center); - 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); - - - if(_debug) { - print(String.format("sensor box center local %s", sensor_box_center_local.toString())); - print(String.format("sensor box center in 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 in half module box %s", sensor_box_center.toString())); - } - - - - - // add the hybrid - - String hybrid_name = halfModuleWrap.name + "_hybrid" + sensor_number; - // Create the box solid for the component. - Box hybrid_box = new Box(hybrid_name + "_box",hybrid_length,hybrid_thickness, hybrid_width); - lcdd.add(hybrid_box); - - // Create the volume for the module component. - Volume hybrid_volume = new Volume(hybrid_name + "_volume", hybrid_box,lcdd.getMaterial("G10")); - - // Place at the height of the sensor and back-to-back to sensor - final double hybrid_box_center_x = sensor_box_center.x() - sensor_length/2.0 - hybrid_length/2.0; - final double hybrid_box_center_y = sensor_box_center.y() - sensor_thickness/2.0 + hybrid_thickness/2.0; - final double hybrid_box_center_z = sensor_box_center.z(); - pos = new Position(hybrid_name + "_position",hybrid_box_center_x, hybrid_box_center_y, hybrid_box_center_z); - rot = new Rotation(hybrid_name + "_rotation", 0, 0, 0); - lcdd.add(pos); - lcdd.add(rot); - PhysVol hybrid_physvol = new PhysVol(hybrid_volume, halfModuleWrap.vol, pos, rot); - - VolWrapper hybridWrap = new VolWrapper(); - hybridWrap.name = hybrid_name; - hybridWrap.pv = hybrid_physvol; - hybridWrap.vol = hybrid_volume; - hybridWrap.pos_vol = pos; - hybridWrap.rot_vol = rot; - hybridWrap.mother = halfModuleWrap; - halfModuleWrap.daughters.add(hybridWrap); - - hybrid_volume.setVisAttributes(lcdd.getVisAttributes("HybridVis")); - - lcdd.add(hybrid_volume); - - - - - // add the kapton - // fill the entire sensor length and width with kapton - - String kapton_name = halfModuleWrap.name + "_kapton" + sensor_number; - // Create the box solid for the component. - Box kapton_box = new Box(kapton_name + "_box",sensor_length+hybrid_length,kapton_thickness, sensor_width); - lcdd.add(kapton_box); - - // Create the volume for the module component. - Volume kapton_volume = new Volume(kapton_name + "_volume", kapton_box,lcdd.getMaterial("Kapton")); - pos = new Position(kapton_name + "_position", sensor_box_center.x()-hybrid_length/2.0, - sensor_box_center.y() - sensor_thickness/2.0 - kapton_thickness/2.0, sensor_box_center.z()); - rot = new Rotation(kapton_name + "_rotation", 0, 0, 0); - lcdd.add(pos); - lcdd.add(rot); - PhysVol kapton_physvol = new PhysVol(kapton_volume, halfModuleWrap.vol, pos, rot); - - VolWrapper kaptonWrap = new VolWrapper(); - kaptonWrap.name = kapton_name; - kaptonWrap.pv = kapton_physvol; - kaptonWrap.vol = kapton_volume; - kaptonWrap.pos_vol = pos; - kaptonWrap.rot_vol = rot; - kaptonWrap.mother = halfModuleWrap; - halfModuleWrap.daughters.add(kaptonWrap); - - kapton_volume.setVisAttributes(lcdd.getVisAttributes("KaptonVis")); - - lcdd.add(kapton_volume); - - - - String cf_name = halfModuleWrap.name + "_carbonfiber" + sensor_number; - // Create the box solid for the component. - Box cf_box = new Box(cf_name + "_box",sensor_length+hybrid_length,CF_thickness, sensor_width); - lcdd.add(cf_box); - - // Create the volume for the module component. - Volume cf_volume = new Volume(cf_name + "_volume", cf_box,lcdd.getMaterial("CarbonFiber")); - pos = new Position(cf_name + "_position", sensor_box_center.x()-hybrid_length/2.0, - sensor_box_center.y() - sensor_thickness/2.0 - kapton_thickness - CF_thickness/2.0, - sensor_box_center.z()); - rot = new Rotation(cf_name + "_rotation", 0, 0, 0); - lcdd.add(pos); - lcdd.add(rot); - PhysVol cf_physvol = new PhysVol(cf_volume, halfModuleWrap.vol, pos, rot); - - VolWrapper cfWrap = new VolWrapper(); - cfWrap.name = cf_name; - cfWrap.pv = cf_physvol; - cfWrap.vol = cf_volume; - cfWrap.pos_vol = pos; - cfWrap.rot_vol = rot; - cfWrap.mother = halfModuleWrap; - halfModuleWrap.daughters.add(cfWrap); - - cf_volume.setVisAttributes(lcdd.getVisAttributes("CarbonFiberVis")); - - lcdd.add(cf_volume); - - - } - - - - - - - private void makeEnvelope(LCDD lcdd, SensitiveDetector sens) throws JDOMException { - - Volume trackingVolume = lcdd.getTrackingVolume(); - - - String volName = "envelope"; - int componentNumber = 0; - String envelopeName = "envelope"; - final double trackingEnvelopeBoxLength = 50.5*inch; - final double trackingEnvelopeBoxWidth = 16.0*inch; - final double trackingEnvelopeBoxHeight = 8.0*inch; - Box envelopeBox = new Box(envelopeName + "Box", trackingEnvelopeBoxLength, trackingEnvelopeBoxWidth, trackingEnvelopeBoxHeight); - lcdd.add(envelopeBox); - Volume envelopeVolume = new Volume(envelopeName + "_volume", envelopeBox, lcdd.getMaterial("Vacuum")); - Position envelopePosition = new Position(envelopeName + "_position",0, 0, 0); - Rotation envelopeRotation = new Rotation(envelopeName + "_rotation",0, 0, 0); - lcdd.add(envelopePosition); - lcdd.add(envelopeRotation); - - - PhysVol envelopePV = new PhysVol(envelopeVolume, trackingVolume, envelopePosition, envelopeRotation); - envelopePV.addPhysVolID(envelopeName, 0); - - - VolWrapper envWrap = new VolWrapper(); - envWrap.name = volName; - envWrap.pv = envelopePV; - envWrap.vol = envelopeVolume; - envWrap.pos_vol = envelopePosition; - envWrap.rot_vol = envelopeRotation; - - - // now add the base plate solid - - volName = "envelope"; - componentNumber = 0; - String envelopePlateName = volName + "_base" + componentNumber; - Material envelopePlateMaterial = lcdd.getMaterial("Aluminum"); //Oxide"); // TODO fix material! - final double envelopePlateLength = trackingEnvelopeBoxLength; - final double envelopePlateWidth = trackingEnvelopeBoxWidth; - final double envelopePlateHeight = 0.3125*inch; - Box envelopePlateBox = new Box(envelopePlateName + "Box", envelopePlateLength, envelopePlateWidth, envelopePlateHeight); - lcdd.add(envelopePlateBox); - - Volume envelopePlateVolume = new Volume(envelopePlateName + "_volume", envelopePlateBox, envelopePlateMaterial); - - Position envelopePlatePosition = new Position(envelopePlateName + "_position", 0, 0, 0); - Rotation envelopePlateRotation = new Rotation(envelopePlateName + "_rotation", 0, 0, 0); - lcdd.add(envelopePlatePosition); - lcdd.add(envelopePlateRotation); - - //PhysVol envelopePlatePV = new PhysVol(envelopePlateVolume, lcdd.pickMotherVolume(this) /*envelopeVolume*/, envelopePlatePosition, envelopePlateRotation); - PhysVol envelopePlatePV = new PhysVol(envelopePlateVolume, envelopeVolume, envelopePlatePosition, envelopePlateRotation); - envelopePlatePV.addPhysVolID(envelopePlateName, 0); - lcdd.add(envelopePlateVolume); - lcdd.add(envelopeVolume); - - VolWrapper plateWrap = new VolWrapper(); - plateWrap.name = envelopePlateName; - plateWrap.vol = envelopePlateVolume; - plateWrap.pv = envelopePlatePV; - plateWrap.pos_vol = envelopePlatePosition; - plateWrap.rot_vol = envelopePlateRotation; - plateWrap.mother = envWrap; - envWrap.daughters.add(plateWrap); - //RotationGeant g; - - - } - - private void makeSupportPlate(VolWrapper envWrapper, LCDD lcdd, SensitiveDetector sens) throws JDOMException { - - // Add a new support plate inside the envelope - // TODO add a volume aroundit - - //final double length = (50.5 - 3.5 - 0.5)*inch; - //final double width = (16.0 - 1.0*2)*inch; - //final double envelopePlateHeight = 0.3125*inch; - - - String volName = "supportplate"; - int componentNumber = 0; - final double length = 15.0*inch; - final double width = 9.25*inch; - final double height = 3.0/8.0*inch; - Box box = new Box(volName + "Box", length, width, height); - lcdd.add(box); - Volume volume = new Volume(volName + "_volume", box, lcdd.getMaterial("Aluminum")); - Position position = new Position(volName + "_position",0, 0, 0); - Rotation rotation = new Rotation(volName + "_rotation",0, 0, 0); - lcdd.add(position); - lcdd.add(rotation); - - PhysVol pv = new PhysVol(volume, lcdd.pickMotherVolume(this) /*envWrapper.vol*/, /*lcdd.pickMotherVolume(this)*/ /*envelopeVolume*/ position, rotation); - pv.addPhysVolID(volName, 0); - lcdd.add(volume); - - VolWrapper supportPlateWrap = new VolWrapper(); - supportPlateWrap.name = volName; - supportPlateWrap.vol = volume; - supportPlateWrap.pos_vol = position; - supportPlateWrap.rot_vol = rotation; - supportPlateWrap.mother = envWrapper; - envWrapper.daughters.add(supportPlateWrap); - - - - - - /* - - - - - - - // calculate the transform to the envelope - Hep3Vector ball_pos = new BasicHep3Vector(-0.5*envelopePlateLength + 3.5*inch, -0.5*envelopePlateWidth, -1.0*envelopePlateHeight + 0.755); - Hep3Vector vee_pos = new BasicHep3Vector(ball_pos.x(), 0.5*envelopePlateWidth, ball_pos.z()); - Hep3Vector flat_pos = new BasicHep3Vector(0.5*envelopePlateLength - 0.5*inch, 0., ball_pos.z()); - - - // create the coordinate system - CoordSysDef envelope_coord = new CoordSysDef(ball_pos, vee_pos, flat_pos); - - // Find the transform between the two frames - Transform3D trackingToEnvelopeTransform = getTransformation(envelope_coord); - //getTransformation(envelope_coord.origin(), envelope_coord.u(), envelope_coord.v(), envelope_coord.w()); - RotationGeant trackingToEnvelopeRotation = new RotationGeant(Math.PI, 0, Math.PI/2.0); - - // Get translation and rotation from mother to local - //Rotation componentRotation = getLCDDRotation(trackingToEnvelopeTransform, componentName); - - //Hep3Vector box_vec = new BasicHep3Vector(trackingEnvelopeBoxLength, trackingEnvelopeBoxWidth, trackingEnvelopeBoxHeight); - - - //Hep3Vector box_vec_mother = trackingToEnvelopeTransform.inverse().transformed(box_vec_local); - - if(_debug) { - print(String.format("Envelope survey ball positions in mother:")); - print(String.format("ball at %s",ball_pos.toString())); - print(String.format("vee at %s",vee_pos.toString())); - print(String.format("flat at %s",flat_pos.toString())); - print(String.format("Resulting envelope coord system:\n%s",envelope_coord.toString())); - //print(String.format("box vec local %s",box_vec_local.toString())); - print(String.format("transformation \n%s",trackingToEnvelopeTransform.inverse().toString())); - //print(String.format("box vec mother %s",box_vec_mother.toString())); - } - - */ - - } - - - private static class VolWrapper { - public String name; - Volume vol = null; - PhysVol pv = null; - Position pos_vol = null; - Rotation rot_vol = null; - VolWrapper mother = null; - List<VolWrapper> daughters = new ArrayList<VolWrapper>(); - CoordSysDef coord = null; - Hep3Vector center = null; - public VolWrapper() { - } - } - - private void print(String str) { - System.out.printf("%s: %s\n", this.getClass().getSimpleName(),str); - } - - - private Transform3D getTransformation(CoordSysDef coordSys) { - return getTransformation(coordSys.origin(), coordSys.u(), coordSys.v(), coordSys.w()); - } - - /** - * Find @ITransform3D to the coordinate system defined by the input. - * @param origin of new coordinate system - * @param u unit vector - * @param v unit vector - * @param w unit vector - * @return resulting 3D transform - */ - private Transform3D getTransformation(Hep3Vector origin, Hep3Vector u, Hep3Vector v, Hep3Vector w) { - // Find the transform between the two frames - use transform classes here (not really needed) - Translation3D translation = new Translation3D(origin.x(), origin.y(), origin.z()); - //RotationGeant trackingToEnvelopeRotation = new RotationGeant(0, 0, 0); - Rotation3D rotation = new Rotation3D( - new BasicHep3Matrix( - u.x(),v.x(),w.x(), - u.y(),v.y(),w.y(), - u.z(),v.z(),w.z() - )); - Transform3D envelopeToSupportTransform = new Transform3D(translation, rotation); - return envelopeToSupportTransform; - } - - private Position getLCDDPosition(ITransform3D transform, String name) { - Position componentPosition = new Position(name + "_position", - transform.getTranslation().x(), - transform.getTranslation().y(), - transform.getTranslation().z()); - return componentPosition; - } - - private Rotation getLCDDRotation(Transform3D transform, String name) { - Hep3Matrix rotationMatrix = transform.getRotation().getRotationMatrix(); - // Extract the rotation angles from the combined matrix - // Assumes rotation matrix built A = RzRyRx - double rotation_z = Math.atan2(rotationMatrix.e(2, 0), rotationMatrix.e(2, 1)); - double rotation_y = Math.acos(rotationMatrix.e(2, 2)); - double rotation_x = -1.0 * Math.atan2(rotationMatrix.e(0, 2), rotationMatrix.e(1, 2)); - - Rotation componentRotation = new Rotation(name + "_rotation",rotation_x, rotation_y, rotation_z); - return componentRotation; - } - - - - private static class CoordSysDef { - private Hep3Vector origin; - private Hep3Vector u; - private Hep3Vector v; - private Hep3Vector w; - - public CoordSysDef(Hep3Vector org, Hep3Vector unit_x, Hep3Vector unit_y, Hep3Vector unit_z) { - origin = org; - u = unit_x; - v = unit_y; - w = unit_z; - } - - private void check() { - if(u.magnitude()-1>0.00001 || v.magnitude()-1>0.00001 || v.magnitude()-1>0.00001) { - System.out.printf("Error: this coordinate system is ill-defined\n%s\n",this.toString()); - System.exit(1); - } - } - - public CoordSysDef(Hep3Vector ball, Hep3Vector vee, Hep3Vector flat) { - origin = ball; - Hep3Vector ball_to_vee = VecOp.sub(vee, ball); - u = VecOp.unit(ball_to_vee); - Hep3Vector ball_to_flat = VecOp.sub(flat, ball); - w = VecOp.unit(VecOp.cross(ball_to_vee,ball_to_flat)); - v = VecOp.cross(w, u); - } - public void rotate(Hep3Vector euler_angles) { - RotationGeant rotation = new RotationGeant(euler_angles.x(), euler_angles.y(), euler_angles.z()); - rotation.rotate(u); - rotation.rotate(v); - rotation.rotate(w); - } -/* - public void rotate(Hep3Vector euler_angles) { - RotationGeant rotation = new RotationGeant(euler_angles.x(), euler_angles.y(), euler_angles.z()); - rotation.rotate(u); - rotation.rotate(v); - rotation.rotate(w); - } - */ - public void translate(Hep3Vector translation) { - // update origin with local translation in u,v,w - origin = VecOp.add(origin, translation); - } - public Hep3Vector origin() { - return origin; - } - public Hep3Vector u() { - return u; - } - public Hep3Vector v() { - return v; - } - public Hep3Vector w() { - return w; - } - public String toString() { - return "Coordinate system: \norigin " + origin.toString() + "\nu " + u.toString() + "\nv " + v.toString() + "\nw " + w.toString(); - } - - } - - - - - - - - - - - + } ######################################################################## 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