Author: [log in to unmask]
Date: Wed Jul 1 03:29:53 2015
New Revision: 3215
Log:
read rotations from survey
Added:
java/trunk/users/src/main/java/org/hps/users/phansson/ReadSurveyRotations.java
Added: java/trunk/users/src/main/java/org/hps/users/phansson/ReadSurveyRotations.java
=============================================================================
--- java/trunk/users/src/main/java/org/hps/users/phansson/ReadSurveyRotations.java (added)
+++ java/trunk/users/src/main/java/org/hps/users/phansson/ReadSurveyRotations.java Wed Jul 1 03:29:53 2015
@@ -0,0 +1,183 @@
+/**
+ *
+ */
+package org.hps.users.phansson;
+
+import hep.physics.vec.BasicHep3Vector;
+import hep.physics.vec.Hep3Vector;
+
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.apache.commons.math3.geometry.euclidean.threed.Rotation;
+import org.apache.commons.math3.geometry.euclidean.threed.RotationOrder;
+import org.apache.commons.math3.geometry.euclidean.threed.Vector3D;
+import org.hps.util.BasicLogFormatter;
+import org.lcsim.util.log.LogUtil;
+
+/**
+ * @author Per Hansson Adrian <[log in to unmask]>
+ *
+ */
+public class ReadSurveyRotations {
+
+ final static Logger logger = LogUtil.create(ReadSurveyRotations.class.getSimpleName(), new BasicLogFormatter(), Level.INFO);
+
+ String name;
+ String parent;
+ Hep3Vector u;
+ Hep3Vector v;
+ Hep3Vector w;
+
+ /**
+ * @param args
+ */
+ public static void main(String[] args) {
+
+
+ List<ReadSurveyRotations> rotSurvey = getRotations(args[0]);
+ logger.info("Found " + rotSurvey.size() + " survey rotations");
+
+ List<ReadSurveyRotations> rotIdeal = getRotations(args[1]);
+ logger.info("Found " + rotIdeal.size() + " ideal rotations");
+
+
+
+ for (ReadSurveyRotations r : rotIdeal) {
+ for (ReadSurveyRotations rs : rotSurvey) {
+ if(rs.equals(r)) {
+ Rotation rotation = new Rotation(get3DVector(r.u), get3DVector(r.v), get3DVector(rs.u), get3DVector(rs.v));
+ //logger.fine(r.name + " in " + r.parent + " u " + r.u.toString() + " v " + r.v.toString() + " v " + r.w.toString());
+ if(args.length>3) {
+ if(!Pattern.matches(args[2], r.name) || !Pattern.matches(args[3], r.parent)) {
+ continue;
+ }
+ }
+ StringBuffer sb = new StringBuffer();
+ sb.append( String.format("%s in %s\n", r.name,r.parent) );
+ sb.append( String.format("u: %s -> %s\n", r.u.toString(),rs.u.toString()) );
+ sb.append( String.format("v: %s -> %s\n", r.v.toString(),rs.v.toString()) );
+ sb.append( String.format("w: %s -> %s\n", r.w.toString(),rs.w.toString()) );
+ sb.append( String.format("w: %s -> %s\n", r.w.toString(),rs.w.toString()) );
+ double cardanAngles[] = rotation.getAngles(RotationOrder.XYZ);
+ sb.append( String.format("%s in %s Cardan XYZ: %f,%f,%f\n", r.name, r.parent, cardanAngles[0],cardanAngles[1],cardanAngles[2]) );
+ System.out.printf("%s\n", sb.toString());
+ }
+ }
+ }
+
+
+
+
+
+ }
+
+
+ private static Vector3D get3DVector(Hep3Vector x) {
+ return new Vector3D(x.x(), x.y(), x.z());
+ }
+
+ public boolean equals(ReadSurveyRotations other) {
+ return other==null ? false : this.name.equals(other.name) && this.parent.equals(other.parent);
+ }
+
+
+ private static double convertDouble(String str) {
+ return new BigDecimal(str).doubleValue();
+ }
+
+ private static Hep3Vector getVector(String str) {
+ Pattern p = Pattern.compile("\\s*(\\S+),\\s*(\\S+),\\s*(\\S+).*");
+ Matcher matcher = p.matcher(str);
+ if(!matcher.matches()) {
+ throw new RuntimeException("cannot match vector to string \"" + str + "\"");
+ }
+ return new BasicHep3Vector(convertDouble(matcher.group(1)), convertDouble(matcher.group(2)), convertDouble(matcher.group(3)));
+
+ }
+
+
+
+ public ReadSurveyRotations(String name, String parent, Hep3Vector u, Hep3Vector v, Hep3Vector w) {
+ this.name = name;
+ this.parent = parent;
+ this.u = u;
+ this.v = v;
+ this.w = w;
+ }
+
+
+ private static List<ReadSurveyRotations> getRotations(String fileName) {
+
+ List<ReadSurveyRotations> list = new ArrayList<ReadSurveyRotations>();
+
+
+ Pattern pattern = Pattern.compile("(.*)\\sorigin\\sin\\s(\\S+)\\s.*\\(mm\\)\\su.*\\[(.*)\\]\\sv.*\\[(.*)\\]\\sw.*\\[(.*)\\].*");
+ //Pattern.compile(".*mm.*u\s[(.*)].*v\s[(.*)].*w\s[(.*)]");
+ Matcher matcher;
+ File file = new File(fileName);
+ //File outputFile = new File(fileName+".rot");
+ try {
+
+ //FileWriter writer = new FileWriter(outputFile);
+ //BufferedWriter bWriter = new BufferedWriter(writer);
+ FileReader reader = new FileReader(file);
+ BufferedReader bReader = new BufferedReader(reader);
+
+ String line;
+ try {
+ while((line = bReader.readLine()) != null) {
+ //logger.info(line);
+ matcher = pattern.matcher(line);
+ if(matcher.matches()) {
+ String name = matcher.group(1);
+ String parent = matcher.group(2);
+ //logger.info("matched " + name + " g1 " + matcher.group(3));
+ Hep3Vector u = getVector(matcher.group(3));
+ Hep3Vector v = getVector(matcher.group(4));
+ Hep3Vector w = getVector(matcher.group(5));
+ if(Math.abs(u.magnitude()-1.0)>0.0001 || Math.abs(v.magnitude()-1.0)>0.0001 ||Math.abs(w.magnitude()-1.0)>0.0001 ) {
+ logger.warning(line);
+ logger.warning("name: " + name + " unit vectors: " + u.toString() + " " + v.toString() + " " + w.toString());
+ throw new RuntimeException("error reading vectors");
+ }
+ ReadSurveyRotations rot = new ReadSurveyRotations(name, parent, u, v, w);
+ list.add(rot);
+ }
+ }
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ try {
+ bReader.close();
+ reader.close();
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+
+
+
+ } catch (FileNotFoundException e) {
+ throw new RuntimeException(e);
+ }
+
+ return list;
+
+
+ }
+
+
+
+}
|