Author: phansson Date: Tue Oct 28 10:10:44 2014 New Revision: 3397 Log: Fix rotation correction. Modified: projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/HPSTestRunTracker2014GeometryDefinition.java projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/SurveyCoordinateSystem.java projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/SurveyVolume.java Modified: projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/HPSTestRunTracker2014GeometryDefinition.java ============================================================================= --- projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/HPSTestRunTracker2014GeometryDefinition.java (original) +++ projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/HPSTestRunTracker2014GeometryDefinition.java Tue Oct 28 10:10:44 2014 @@ -30,7 +30,7 @@ public final boolean doColdBlock = false; public final boolean doBottom = true; public final boolean doTop = true; - public final int layerBitMask = 0x1F; //0x1;// + public final int layerBitMask = 0x1F; //0x1;// //General @@ -223,26 +223,34 @@ // find layer int layer = mother.getLayer(); + // axial or stereo + boolean isAxial = isAxialFromName(volName); + + // find layer according to old definition + int oldLayer = getOldGeomDefLayerFromVolumeName(isTopLayer, layer, isAxial); + //if(isDebug()) System.out.printf("%s: half? %s layer %d oldlayer %d axial? %s\n", + // this.getClass().getSimpleName(), isTopLayer?"top":"bottom", layer,oldLayer,isAxial?"yes":"no"); + + // find alignment correction to this volume + AlignmentCorrection alignmentCorrection = getHalfModuleAlignmentCorrection(isTopLayer, oldLayer); + + + // find the bundle that it will be added to TestRunModuleBundle bundle = (TestRunModuleBundle)getModuleBundle(mother); TestRunHalfModuleBundle halfModuleBundle; // Build the half-module TestRunHalfModule halfModule; - AlignmentCorrection alignmentCorrection = null; - if(side == "axial") { - //alignmentCorrection = getHalfModuleAlignmentCorrection(isTopLayer, getOldGeomDefLayerFromVolumeName(isTopLayer, layer, true)); + if(isAxial) { halfModule = new TestRunHalfModuleAxial(volName, mother, alignmentCorrection, layer, half); halfModuleBundle = new TestRunHalfModuleBundle(halfModule); bundle.halfModuleAxial = halfModuleBundle; - } else if(side == "stereo") { - //alignmentCorrection = getHalfModuleAlignmentCorrection(isTopLayer, getOldGeomDefLayerFromVolumeName(isTopLayer, layer, false)); + } else { halfModule = new TestRunHalfModuleStereo(volName, mother, alignmentCorrection, layer, half); halfModuleBundle = new TestRunHalfModuleBundle(halfModule); bundle.halfModuleStereo = halfModuleBundle; - } else { - throw new IllegalArgumentException("not a valid half-module side " + side); - } + } // create the half module components @@ -339,18 +347,8 @@ // sensor id is hard coded in old geometry to be zero by counting over the components of the module int component_number = 0; - boolean isTopLayer = getHalfFromName(volName) == "top" ? true : false; - int layer = getLayerFromVolumeName(volName); - boolean isAxial = isAxialFromName(volName); - int oldLayer = getOldGeomDefLayerFromVolumeName(isTopLayer, layer, isAxial); - if(isDebug()) System.out.printf("%s: half? %s layer %d oldlayer %d axial? %s\n", - this.getClass().getSimpleName(), isTopLayer?"top":"bottom", layer,oldLayer,isAxial?"yes":"no"); - - AlignmentCorrection alignmentCorrection = getHalfModuleAlignmentCorrection(isTopLayer, oldLayer); - - // - Sensor sensor = new Sensor(volName, mother, alignmentCorrection, component_number); + Sensor sensor = new Sensor(volName, mother, null, component_number); sensor.setMaterial("Silicon"); TestRunHalfModuleBundle hm = (TestRunHalfModuleBundle) getHalfModuleBundle((TestRunModule) mother.getMother(), mother.getName()); Modified: projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/SurveyCoordinateSystem.java ============================================================================= --- projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/SurveyCoordinateSystem.java (original) +++ projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/SurveyCoordinateSystem.java Tue Oct 28 10:10:44 2014 @@ -114,6 +114,15 @@ public Hep3Vector w() { return w; } + public void u(Hep3Vector vec) { + u = vec; + } + public void v(Hep3Vector vec) { + v = vec; + } + public void w(Hep3Vector vec) { + w = vec; + } public String toString() { return "Coordinate system: \norigin " + origin.toString() + "\nu " + u.toString() + "\nv " + v.toString() + "\nw " + w.toString(); Modified: projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/SurveyVolume.java ============================================================================= --- projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/SurveyVolume.java (original) +++ projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/SurveyVolume.java Tue Oct 28 10:10:44 2014 @@ -1,12 +1,16 @@ package org.lcsim.geometry.compact.converter; +import hep.physics.vec.BasicHep3Matrix; import hep.physics.vec.BasicHep3Vector; +import hep.physics.vec.Hep3Matrix; import hep.physics.vec.Hep3Vector; import java.util.ArrayList; import java.util.List; import org.apache.commons.math3.geometry.euclidean.threed.RotationOrder; +import org.apache.commons.math3.geometry.euclidean.threed.Vector3D; +import org.lcsim.detector.Rotation3D; import org.lcsim.geometry.util.TransformationUtils; /** @@ -126,21 +130,65 @@ } // rotate - if(alignmentCorrections.getRotation()!=null) { - - if(debug_local) { - System.out.printf("%s: Apply rotation to coordinate system. Matrix:\n", this.getClass().getSimpleName()); - double mat[][] = alignmentCorrections.getRotation().getMatrix(); - TransformationUtils.printMatrix(mat); - // Get the Cardan angles of the rotation - double res[] = alignmentCorrections.getRotation().getAngles(RotationOrder.ZYX); - // Since the rotation was created based on active transformations convert to passive right here. - // This conversion is simply to reverse the order of rotations. - Hep3Vector res_passive = new BasicHep3Vector(res[2],res[1],res[0]); - System.out.printf("%s: Corresponding LCDD Cardan angles: %s\n", this.getClass().getSimpleName(), res_passive.toString()); - } - - getCoord().rotateApache(alignmentCorrections.getRotation()); + if(alignmentCorrections.getRotation()!=null) { + + if(debug_local) { + System.out.printf("%s: Apply rotation matrix:\n", this.getClass().getSimpleName()); + TransformationUtils.printMatrix(alignmentCorrections.getRotation().getMatrix()); + System.out.printf("%s: coord system before:\n%s\n", this.getClass().getSimpleName(),getCoord().toString()); + } + + + // correct rotation of the local unit vectors + Vector3D u_rot_local = alignmentCorrections.getRotation().applyTo(new Vector3D(1,0,0)); + Vector3D v_rot_local = alignmentCorrections.getRotation().applyTo(new Vector3D(0,1,0)); + Vector3D w_rot_local = alignmentCorrections.getRotation().applyTo(new Vector3D(0,0,1)); + + // rotate the local unit vectors to the mother coordinates + + Hep3Vector u_rot = getCoord().getTransformation().getRotation().rotated(new BasicHep3Vector(u_rot_local.toArray())); + Hep3Vector v_rot = getCoord().getTransformation().getRotation().rotated(new BasicHep3Vector(v_rot_local.toArray())); + Hep3Vector w_rot = getCoord().getTransformation().getRotation().rotated(new BasicHep3Vector(w_rot_local.toArray())); + + getCoord().u(u_rot); + getCoord().v(v_rot); + getCoord().w(w_rot); + + if(debug_local) { + System.out.printf("%s: coord system after:\n%s\n", this.getClass().getSimpleName(),getCoord().toString()); + } + + + // Do some gymnastics from Apache rotation to use the rotation class + //double matMP_v[][] = alignmentCorrections.getRotation().getMatrix(); + //Hep3Matrix matMP = new BasicHep3Matrix(matMP_v[0][0], matMP_v[0][1], matMP_v[0][2], + // matMP_v[1][0], matMP_v[1][1], matMP_v[1][2], + // matMP_v[2][0], matMP_v[2][1], matMP_v[2][2]); + // + //Rotation3D rotMP = new Rotation3D(matMP); + + // get the rotation correction in the mother coordinate system + //Rotation3D r = Rotation3D.multiply(getCoord().getTransformation().getRotation(),rotMP); + +// if(debug_local) { +// System.out.printf("%s: Apply rotation matrix:\n", this.getClass().getSimpleName()); +// double mat[][] = alignmentCorrections.getRotation().getMatrix(); +// TransformationUtils.printMatrix(mat); +// System.out.printf("%s: corresponding Rotation3D object:\n%s\n",this.getClass().getSimpleName(), rotMP.toString()); +// // Get the Cardan angles of the rotation +// double res[] = alignmentCorrections.getRotation().getAngles(RotationOrder.ZYX); +// // Since the rotation was created based on active transformations convert to passive right here. +// // This conversion is simply to reverse the order of rotations. +// Hep3Vector res_passive = new BasicHep3Vector(res[2],res[1],res[0]); +// System.out.printf("%s: Corresponding LCDD Cardan angles: %s\n", this.getClass().getSimpleName(), res_passive.toString()); +// System.out.printf("%s: Apply local to mother rotation\n%s\n",this.getClass().getSimpleName(), getCoord().getTransformation().getRotation().toString()); +// System.out.printf("%s: resulting rotation correction to apply\n%s\n",this.getClass().getSimpleName(), r.toString()); +// +// } + + // Apply correction to coordinate system + //getCoord().rotateApache(alignmentCorrections.getRotation()); + //getCoord().rotate(r); } else { if(debug_local) System.out.printf("%s: No rotation to coordinate system\n", this.getClass().getSimpleName()); ######################################################################## 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