Author: [log in to unmask] Date: Wed Jun 24 16:15:02 2015 New Revision: 3197 Log: Added U-channel to box survey Modified: java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/HPSTestRunTracker2014GeometryDefinition.java java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/HPSTracker2014GeometryDefinition.java java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/HPSTrackerBuilder.java java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/HPSTrackerGeometryDefinition.java java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/SurveyVolume.java java/trunk/detector-model/src/test/resources/org/lcsim/geometry/subdetector/HPSTracker2014v1Survey.xml Modified: java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/HPSTestRunTracker2014GeometryDefinition.java ============================================================================= --- java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/HPSTestRunTracker2014GeometryDefinition.java (original) +++ java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/HPSTestRunTracker2014GeometryDefinition.java Wed Jun 24 16:15:02 2015 @@ -69,7 +69,7 @@ CSupport cSupport = new CSupport("c_support", base); surveyVolumes.add(cSupport); - AlignmentCorrection alignmentCorrectionSupportBottom = getSupportAlignmentCorrection(false); + AlignmentCorrection alignmentCorrectionSupportBottom = getL13UChannelAlignmentCorrection(false); SupportBottom supportBottom = new SupportBottom("support_bottom", base, alignmentCorrectionSupportBottom, cSupport); surveyVolumes.add(supportBottom); // The support survey positions are now with respect to its mother and not the reference coord. system. @@ -78,7 +78,7 @@ SupportPlateBottom supportPlateBottom = new SupportPlateBottom("support_plate_bottom", base, supportBottom, "Aluminum"); surveyVolumes.add(supportPlateBottom); - AlignmentCorrection alignmentCorrectionSupportTop = getSupportAlignmentCorrection(true); + AlignmentCorrection alignmentCorrectionSupportTop = getL13UChannelAlignmentCorrection(true); SupportTop supportTop = new SupportTop("support_top", base, alignmentCorrectionSupportTop, cSupport); surveyVolumes.add(supportTop); Modified: java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/HPSTracker2014GeometryDefinition.java ============================================================================= --- java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/HPSTracker2014GeometryDefinition.java (original) +++ java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/HPSTracker2014GeometryDefinition.java Wed Jun 24 16:15:02 2015 @@ -46,6 +46,18 @@ if(isDebug()) System.out.printf("%s: constructing the geometry objects\n", this.getClass().getSimpleName()); + + // Create alignment correction objects + // THis is really a ugly approach with MP corrections initialized before and + // the survey corrections based on the XML node + // FIX THIS! //TODO + AlignmentCorrection alignmentCorrections = new AlignmentCorrection(); + alignmentCorrections.setNode(node); + AlignmentCorrection supBotCorr = getL13UChannelAlignmentCorrection(false); + supBotCorr.setNode(node); + AlignmentCorrection supTopCorr = this.getL13UChannelAlignmentCorrection(true); + supTopCorr.setNode(node); + // Build the geometry from the basic building blocks in the geometry definition class // Keep the order correct. // Each item has knowledge of its mother but not its daughters @@ -60,51 +72,38 @@ SvtBoxBasePlate svtBoxBasePlate = new SvtBoxBasePlate("base_plate",svtBox,null); surveyVolumes.add(svtBoxBasePlate); - - //SupportRing supportRing = new SupportRing("c_support", svtBox, null, svtBoxBasePlate); - //surveyVolumes.add(supportRing); - -// AlignmentCorrection supBotCorr = this.getSupportAlignmentCorrection(false); -// SupportRingL13BottomKinMount supportRingKinL13Bottom = new SupportRingL13BottomKinMount("c_support_kin_L13b", svtBox, supBotCorr, supportRing); -// surveyVolumes.add(supportRingKinL13Bottom); - - AlignmentCorrection supBotCorr = this.getSupportAlignmentCorrection(false); + + + SupportRingL13BottomKinMount supportRingKinL13Bottom = new SupportRingL13BottomKinMount("c_support_kin_L13b", svtBox, supBotCorr); surveyVolumes.add(supportRingKinL13Bottom); - UChannelL13 uChannelL13Bottom = new UChannelL13Bottom("support_bottom_L13", svtBox, null, supportRingKinL13Bottom); + UChannelL13 uChannelL13Bottom = new UChannelL13Bottom("support_bottom_L13", svtBox, alignmentCorrections, supportRingKinL13Bottom); surveyVolumes.add(uChannelL13Bottom); UChannelL13Plate uChannelL13BottomPlate = new UChannelL13BottomPlate("support_plate_bottom_L13", svtBox, null, uChannelL13Bottom); surveyVolumes.add(uChannelL13BottomPlate); -// AlignmentCorrection supTopCorr = this.getSupportAlignmentCorrection(true); -// SupportRingL13TopKinMount supportRingKinL13Top = new SupportRingL13TopKinMount("c_support_kin_L13t", svtBox, supTopCorr, supportRing); -// surveyVolumes.add(supportRingKinL13Top); - - AlignmentCorrection supTopCorr = this.getSupportAlignmentCorrection(true); + SupportRingL13TopKinMount supportRingKinL13Top = new SupportRingL13TopKinMount("c_support_kin_L13t", svtBox, supTopCorr); surveyVolumes.add(supportRingKinL13Top); - // Create an alignment correction object for the U-channels -> this is really ugly. FIX THIS! - AlignmentCorrection alignmentCorrectionUChannels = new AlignmentCorrection(); - alignmentCorrectionUChannels.setNode(node); - - - UChannelL13Top uChannelL13Top = new UChannelL13Top("support_top_L13", svtBox, null, supportRingKinL13Top); + + + UChannelL13Top uChannelL13Top = new UChannelL13Top("support_top_L13", svtBox, alignmentCorrections, supportRingKinL13Top); surveyVolumes.add(uChannelL13Top); UChannelL13Plate uChannelL13TopPlate = new UChannelL13TopPlate("support_plate_top_L13", svtBox, null, uChannelL13Top); surveyVolumes.add(uChannelL13TopPlate); - UChannelL46 uChannelL46Bottom = new UChannelL46Bottom("support_bottom_L46", svtBox, alignmentCorrectionUChannels); + UChannelL46 uChannelL46Bottom = new UChannelL46Bottom("support_bottom_L46", svtBox, alignmentCorrections); surveyVolumes.add(uChannelL46Bottom); UChannelL46Plate uChannelL46BottomPlate = new UChannelL46BottomPlate("support_plate_bottom_L46", svtBox, null, uChannelL46Bottom); surveyVolumes.add(uChannelL46BottomPlate); - UChannelL46 uChannelL46Top = new UChannelL46Top("support_top_L46", svtBox, alignmentCorrectionUChannels); + UChannelL46 uChannelL46Top = new UChannelL46Top("support_top_L46", svtBox, alignmentCorrections); surveyVolumes.add(uChannelL46Top); UChannelL46Plate uChannelL46TopPlate = new UChannelL46TopPlate("support_plate_top_L46", svtBox, null, uChannelL46Top); @@ -356,9 +355,9 @@ /** * {@link SurveyVolume} volume defining a coordinate system from the kinematic mount positions for support channels - * Reference: {@SvtBox} coordinate system + * Reference: {@link SvtBox} coordinate system * Origin: cone mount (it's on the electron side) - * Orientation: ball is cone mount, slot mount is vee position and flat is along beamline pointing upstream + * Orientation: ball is cone mount, slot mount is vee position and flat is along beam line pointing upstream * * @author Per Hansson Adrian <[log in to unmask]> * @@ -376,23 +375,6 @@ protected double getKinMountVerticalPos() { return kin_mount_pos_z; } - -// protected void setPos() { -// final double ball_pos_x = (7.0 - 5.444) *inch; -// final double ball_pos_y = 0.574*inch; -// final double ball_pos_z = SupportRing.plateThickness + kin_mount_offset_vertically; -// ballPos = new BasicHep3Vector(ball_pos_x, ball_pos_y, ball_pos_z); -// -// final double vee_pos_x = (2*7.0)*inch; -// final double vee_pos_y = ball_pos_y; -// final double vee_pos_z = ball_pos_z; -// veePos = new BasicHep3Vector(vee_pos_x, vee_pos_y, vee_pos_z); -// -// final double flat_pos_x = ball_pos_x; -// final double flat_pos_y = ball_pos_y + 1.0; // random distance -// final double flat_pos_z = ball_pos_z; -// flatPos = new BasicHep3Vector(flat_pos_x,flat_pos_y,flat_pos_z); -// } } @@ -470,7 +452,7 @@ /** * {@link SurveyVolume} volume defining the coordinate system of the bottom L1-3 u-channel - * Reference: SupportRingL13BottomKinMount coordinate system + * Reference: {@link SupportRingL13BottomKinMount} coordinate system * Origin: midpoint between upstream survey cones * Orientation: u - width pointing towards electron side, v - pointing along the U-channel in the beam direction * Modified: java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/HPSTrackerBuilder.java ============================================================================= --- java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/HPSTrackerBuilder.java (original) +++ java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/HPSTrackerBuilder.java Wed Jun 24 16:15:02 2015 @@ -174,7 +174,7 @@ * @param isTopLayer - top or bottom layer * @return the alignment correction */ - protected AlignmentCorrection getSupportAlignmentCorrection(boolean isTopLayer) { + protected AlignmentCorrection getL13UChannelAlignmentCorrection(boolean isTopLayer) { double r[] = {0, 0, 0}; double t[] = {0, 0, 0}; for (MilleParameter p_loop : milleparameters) { @@ -278,18 +278,13 @@ } // check for other signatures if (half.isEmpty()) { - // 6 layers is arbitrary here - for (int layer = 1; layer <= 6; ++layer) { - if (name.contains(String.format("L%db", layer))) { + Pattern pattern = Pattern.compile(".*_L[1-6][1-6]?([a-z]).*"); + Matcher matcher = pattern.matcher(name); + if(matcher.matches()) { + if(matcher.group(1).equals("t")) { + half = "top"; + } else if(matcher.group(1).equals("b")) { half = "bottom"; - break; - } - if (name.contains(String.format("L%dt", layer))) { - if (half.equals("bottom")) { - throw new RuntimeException("found both halfs from name " + name); - } - half = "top"; - break; } } } @@ -336,25 +331,41 @@ Pattern pattern = Pattern.compile("module_L[1-6][bt]$"); Matcher matcher = pattern.matcher(name); boolean found = false; - while(matcher.find()) { + while(matcher.matches()) { //System.out.printf("isModule: found %s\n", matcher.group()); found = true; } return found?true:false; } + public static int getUChannelSupportLayer(String name) { + if(isUChannelSupport(name)) { + Pattern patter = Pattern.compile("^support_[a-z]*_L([1-6])[1-6]$"); + Matcher matcher = patter.matcher(name); + if(matcher.matches() ) { + int layer = Integer.parseInt(matcher.group(1)); + return layer; + } else { + throw new RuntimeException("this is not a valid u-channel name: " + name); + } + } else { + throw new RuntimeException("this is not a valid u-channel name: " + name); + } + } + + public static boolean isUChannelSupport(String name) { - Pattern patter = Pattern.compile("^support_[a-z]+_L1|3$4|6"); + Pattern patter = Pattern.compile("^support_[a-z]*_L(4|1)(6|3)$"); Matcher matcher = patter.matcher(name); - boolean found = false; - if(matcher.find() ) { - found = true; - System.out.printf("isUChannelSupport: found U-channel: %s\n", name); - } else { - System.out.printf("isUChannelSupport: this is not a U-channel: %s\n", name); - } - return found; - } + return matcher.matches(); + } + + public static boolean isSupportRingKinMount(String name) { + Pattern patter = Pattern.compile("^c_support_kin_L13(b|t)$"); + Matcher matcher = patter.matcher(name); + return matcher.matches(); + } + public static boolean isSensor(String name) { if (name.endsWith("sensor")) { Modified: java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/HPSTrackerGeometryDefinition.java ============================================================================= --- java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/HPSTrackerGeometryDefinition.java (original) +++ java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/HPSTrackerGeometryDefinition.java Wed Jun 24 16:15:02 2015 @@ -36,7 +36,7 @@ //General - static final double inch = 25.4; //mm + protected static final double inch = 25.4; //mm protected static final boolean useSiStripsConvention = true; protected static final boolean use30mradRotation = true; protected static final boolean useFakeHalfModuleAxialPos = false; Modified: java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/SurveyVolume.java ============================================================================= --- java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/SurveyVolume.java (original) +++ java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/SurveyVolume.java Wed Jun 24 16:15:02 2015 @@ -171,44 +171,143 @@ if(debug) System.out.printf("%s: updated found survey results: \n%s \n", this.getClass().getSimpleName(), surveyResult.toString()); - } else if(HPSTrackerBuilder.isUChannelSupport(name)) { - - if(debug) System.out.printf("%s: treating it as a U-channel\n", this.getClass().getSimpleName()); - - // Survey coordinates at upstream end of box need to be translated to the center of the Svt Box used here + + + + + } else if(HPSTrackerBuilder.isSupportRingKinMount(name)) { + + if(debug) System.out.printf("%s: treating it as support ring kinematic mount\n", this.getClass().getSimpleName()); + + + + // Survey SVT box origin translated to the edge of the SVT box + surveyResult.setOrigin(VecOp.sub(surveyResult.getOrigin(), new BasicHep3Vector(0, 0, -0.375*HPSTrackerGeometryDefinition.inch))); + + if(debug) System.out.printf("%s: UPDATE1 found survey results: \n%s \n", this.getClass().getSimpleName(), surveyResult.toString()); + + + // Survey SVT box origin translated to the center of the Svt Box used in the geometry surveyResult.setOrigin(VecOp.sub(surveyResult.getOrigin(),new BasicHep3Vector(0, 0, SvtBox.length/2.0))); - if(debug) System.out.printf("%s: UPDATE1 found survey results: \n%s \n", this.getClass().getSimpleName(), surveyResult.toString()); - + + if(debug) System.out.printf("%s: UPDATE2 found survey results: \n%s \n", this.getClass().getSimpleName(), surveyResult.toString()); + // rotate origin into the SVT box coordinates Rotation r1 = new Rotation(new Vector3D(1, 0, 0), Math.PI/2.0); surveyResult.rotateOrigin(r1); surveyResult.rotateUnitVectors(r1); - - if(debug) System.out.printf("%s: UPDATE2 found survey results: \n%s \n", this.getClass().getSimpleName(), surveyResult.toString()); - + + if(debug) System.out.printf("%s: UPDATE3 found survey results: \n%s \n", this.getClass().getSimpleName(), surveyResult.toString()); + + + // Swap definition of unit axis to the one used in the U-channels if(HPSTrackerBuilder.isTopFromName(name)) { - - Hep3Vector y = new BasicHep3Vector( surveyResult.getZ().v() ); - Hep3Vector z = new BasicHep3Vector( VecOp.mult(-1, surveyResult.getY()).v() ); + + //Hep3Vector x = new BasicHep3Vector( VecOp.mult(-1,surveyResult.getX()).v() ); + Hep3Vector y = new BasicHep3Vector( VecOp.mult(-1,surveyResult.getZ()).v() ); + Hep3Vector z = new BasicHep3Vector( surveyResult.getY().v() ); + //surveyResult.setX(x); surveyResult.setY(y); surveyResult.setZ(z); - + } else { - - Hep3Vector x = new BasicHep3Vector( VecOp.mult(-1,surveyResult.getX()).v() ); - Hep3Vector y = new BasicHep3Vector( surveyResult.getZ().v() ); + + //Hep3Vector x = new BasicHep3Vector( VecOp.mult(-1,surveyResult.getX()).v() ); + Hep3Vector y = new BasicHep3Vector( VecOp.mult(-1,surveyResult.getZ()).v() ); Hep3Vector z = new BasicHep3Vector( surveyResult.getY().v() ); - surveyResult.setX(x); + //surveyResult.setX(x); surveyResult.setY(y); surveyResult.setZ(z); - + } - - - if(debug) System.out.printf("%s: UPDATE3 found survey results: \n%s \n", this.getClass().getSimpleName(), surveyResult.toString()); - + + + + + } else if(HPSTrackerBuilder.isUChannelSupport(name) ) { + + + + int layer = HPSTrackerBuilder.getUChannelSupportLayer(name); + + if(layer >= 4 ) { + if(debug) System.out.printf("%s: treating it as a L4-6 U-channel (%d)\n", this.getClass().getSimpleName(), layer); + + + // Survey SVT box origin translated to the edge of the SVT box + surveyResult.setOrigin(VecOp.sub(surveyResult.getOrigin(), new BasicHep3Vector(0, 0, -0.375*HPSTrackerGeometryDefinition.inch))); + + if(debug) System.out.printf("%s: UPDATE1 found survey results: \n%s \n", this.getClass().getSimpleName(), surveyResult.toString()); + + // Survey SVT box origin translated to the center of the Svt Box used in the geometry + surveyResult.setOrigin(VecOp.sub(surveyResult.getOrigin(),new BasicHep3Vector(0, 0, SvtBox.length/2.0))); + + + if(debug) System.out.printf("%s: UPDATE2 found survey results: \n%s \n", this.getClass().getSimpleName(), surveyResult.toString()); + + // rotate origin into the SVT box coordinates + Rotation r1 = new Rotation(new Vector3D(1, 0, 0), Math.PI/2.0); + surveyResult.rotateOrigin(r1); + surveyResult.rotateUnitVectors(r1); + + if(debug) System.out.printf("%s: UPDATE3 found survey results: \n%s \n", this.getClass().getSimpleName(), surveyResult.toString()); + + // Swap definition of unit axis to the one used in the U-channels + if(HPSTrackerBuilder.isTopFromName(name)) { + + Hep3Vector y = new BasicHep3Vector( surveyResult.getZ().v() ); + Hep3Vector z = new BasicHep3Vector( VecOp.mult(-1, surveyResult.getY()).v() ); + surveyResult.setY(y); + surveyResult.setZ(z); + + } else { + + Hep3Vector x = new BasicHep3Vector( VecOp.mult(-1,surveyResult.getX()).v() ); + Hep3Vector y = new BasicHep3Vector( surveyResult.getZ().v() ); + Hep3Vector z = new BasicHep3Vector( surveyResult.getY().v() ); + surveyResult.setX(x); + surveyResult.setY(y); + surveyResult.setZ(z); + + } + + + } else { + + if(debug) System.out.printf("%s: treating it as a L1-3 U-channel (%d)\n", this.getClass().getSimpleName(), layer); + + // Rotate the survey origin into the kinematic mount coordinate frame used here + Rotation r = new Rotation(new Vector3D(1,0,0), Math.PI/2.0); + surveyResult.rotateOrigin(r); + surveyResult.rotateUnitVectors(r); + + if(debug) System.out.printf("%s: UPDATE1 found survey results: \n%s \n", this.getClass().getSimpleName(), surveyResult.toString()); + + + // Swap definition of unit axis to the one used in the U-channels + if(HPSTrackerBuilder.isTopFromName(name)) { + + Hep3Vector y = new BasicHep3Vector( surveyResult.getZ().v() ); + Hep3Vector z = new BasicHep3Vector( VecOp.mult(-1, surveyResult.getY()).v() ); + surveyResult.setY(y); + surveyResult.setZ(z); + + } else { + + Hep3Vector y = new BasicHep3Vector( surveyResult.getZ().v() ); + Hep3Vector z = new BasicHep3Vector( surveyResult.getY().v() ); + Hep3Vector x = new BasicHep3Vector( VecOp.mult(-1,surveyResult.getX()).v() ); + surveyResult.setX(x); + surveyResult.setY(y); + surveyResult.setZ(z); + + } + + } + + } else { @@ -216,6 +315,10 @@ throw new RuntimeException("I don't think there is a surveyresult defined for this type from " + name); } + + if(debug) System.out.printf("%s: survey results after corrections: \n%s \n", this.getClass().getSimpleName(), surveyResult.toString()); + + // Need to go through the reference/ghost geometries if they exist Modified: java/trunk/detector-model/src/test/resources/org/lcsim/geometry/subdetector/HPSTracker2014v1Survey.xml ============================================================================= --- java/trunk/detector-model/src/test/resources/org/lcsim/geometry/subdetector/HPSTracker2014v1Survey.xml (original) +++ java/trunk/detector-model/src/test/resources/org/lcsim/geometry/subdetector/HPSTracker2014v1Survey.xml Wed Jun 24 16:15:02 2015 @@ -57,56 +57,46 @@ <SurveyVolumes> - <!-- Module support surface survey --> - <SurveyVolume name="support_bottom_L46" desc="B46 ball basis in box fiducial frame:"> - <origin x="-5.9779" y="-8.4112" z="789.6352"/> - <unitvec name="X" x="9.9955e-01" y="-7.7349e-05" z="-3.0082e-02"/> - <unitvec name="Y" x="7.6453e-05" y="1.0000e+00" z="-3.0945e-05"/> - <unitvec name="Z" x="3.0082e-02" y="2.8631e-05" z="9.9955e-01"/> -</SurveyVolume> - -<SurveyVolume name="support_top_L46" desc="T46 ball basis in box fiducial frame:"> - <origin x="-6.3106" y="8.462" z="773.7906"/> - <unitvec name="X" x="9.9954e-01" y="7.3687e-05" z="-3.0209e-02"/> - <unitvec name="Y" x="-7.2695e-05" y="1.0000e+00" z="3.3946e-05"/> - <unitvec name="Z" x="3.0209e-02" y="-3.1734e-05" z="9.9954e-01"/> -</SurveyVolume> - -<!-- -<SurveyVolume name="" desc="B13 ball basis in pivot frame:"> - <origin x="0." y="59.9476" z="-304.9173"/> - <unitvec name="X" x="1." y="0." z="0."/> - <unitvec name="Y" x="0." y="1." z="0."/> - <unitvec name="Z" x="0." y="0." z="1."/> -</SurveyVolume> - -<SurveyVolume name="" desc="B13 pivot basis in box frame:"> - <origin x="-37.3429" y="-68.3632" z="695.2994"/> - <unitvec name="X" x="9.9954e-01" y="1.3427e-04" z="-3.0350e-02"/> - <unitvec name="Y" x="-1.3440e-04" y="1.0000e+00" z="-2.1271e-06"/> - <unitvec name="Z" x="3.0350e-02" y="6.2051e-06" z="9.9954e-01"/> -</SurveyVolume> - -<SurveyVolume name="" desc="T13 ball basis in pivot frame:"> - <origin x="0." y="-50.9272" z="-319.7481"/> - <unitvec name="X" x="1." y="0." z="0."/> - <unitvec name="Y" x="0." y="1." z="0."/> - <unitvec name="Z" x="0." y="0." z="1."/> -</SurveyVolume> - -<SurveyVolume name="" desc="T13 pivot basis in box frame:"> - <origin x="-36.9837" y="59.4777" z="694.2924"/> - <unitvec name="X" x="9.9952e-01" y="4.2882e-05" z="-3.1132e-02"/> - <unitvec name="Y" x="-5.2348e-05" y="1.0000e+00" z="-3.0325e-04"/> - <unitvec name="Z" x="3.1132e-02" y="3.0473e-04" z="9.9952e-01"/> -</SurveyVolume> ---> - - - - - - + <!-- U-channel in Svt box survey survey --> + <SurveyVolume name="support_bottom_L46" desc="B46 ball basis in box fiducial frame:"> + <origin x="-5.9779" y="-8.4112" z="789.6352"/> + <unitvec name="X" x="9.9955e-01" y="-7.7349e-05" z="-3.0082e-02"/> + <unitvec name="Y" x="7.6453e-05" y="1.0000e+00" z="-3.0945e-05"/> + <unitvec name="Z" x="3.0082e-02" y="2.8631e-05" z="9.9955e-01"/> + </SurveyVolume> + <SurveyVolume name="support_top_L46" desc="T46 ball basis in box fiducial frame:"> + <origin x="-6.3106" y="8.462" z="773.7906"/> + <unitvec name="X" x="9.9954e-01" y="7.3687e-05" z="-3.0209e-02"/> + <unitvec name="Y" x="-7.2695e-05" y="1.0000e+00" z="3.3946e-05"/> + <unitvec name="Z" x="3.0209e-02" y="-3.1734e-05" z="9.9954e-01"/> + </SurveyVolume> + <SurveyVolume name="support_bottom_L13" desc="B13 ball basis in pivot frame:"> + <origin x="0." y="59.9476" z="-304.9173"/> + <unitvec name="X" x="1." y="0." z="0."/> + <unitvec name="Y" x="0." y="1." z="0."/> + <unitvec name="Z" x="0." y="0." z="1."/> + </SurveyVolume> + <SurveyVolume name="c_support_kin_L13b" desc="B13 pivot basis in box frame:"> + <origin x="-37.3429" y="-68.3632" z="695.2994"/> + <unitvec name="X" x="9.9954e-01" y="1.3427e-04" z="-3.0350e-02"/> + <unitvec name="Y" x="-1.3440e-04" y="1.0000e+00" z="-2.1271e-06"/> + <unitvec name="Z" x="3.0350e-02" y="6.2051e-06" z="9.9954e-01"/> + </SurveyVolume> + <SurveyVolume name="support_top_L13" desc="T13 ball basis in pivot frame:"> + <origin x="0." y="-50.9272" z="-319.7481"/> + <unitvec name="X" x="1." y="0." z="0."/> + <unitvec name="Y" x="0." y="1." z="0."/> + <unitvec name="Z" x="0." y="0." z="1."/> + </SurveyVolume> + <SurveyVolume name="c_support_kin_L13t" desc="T13 pivot basis in box frame:"> + <origin x="-36.9837" y="59.4777" z="694.2924"/> + <unitvec name="X" x="9.9952e-01" y="4.2882e-05" z="-3.1132e-02"/> + <unitvec name="Y" x="-5.2348e-05" y="1.0000e+00" z="-3.0325e-04"/> + <unitvec name="Z" x="3.1132e-02" y="3.0473e-04" z="9.9952e-01"/> + </SurveyVolume> + + + <!-- Module support surface survey --> <!--