Print

Print


Author: [log in to unmask]
Date: Tue Jun 16 18:27:16 2015
New Revision: 3150

Log:
Class to hold survey info.

Added:
    java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/SurveyResult.java

Added: java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/SurveyResult.java
 =============================================================================
--- java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/SurveyResult.java	(added)
+++ java/trunk/detector-model/src/main/java/org/lcsim/geometry/compact/converter/SurveyResult.java	Tue Jun 16 18:27:16 2015
@@ -0,0 +1,255 @@
+/**
+ * 
+ */
+package org.lcsim.geometry.compact.converter;
+
+import hep.physics.vec.BasicHep3Matrix;
+import hep.physics.vec.BasicHep3Vector;
+import hep.physics.vec.Hep3Vector;
+import hep.physics.vec.VecOp;
+
+import java.util.List;
+
+import org.apache.commons.math3.geometry.euclidean.threed.Rotation;
+import org.apache.commons.math3.geometry.euclidean.threed.Vector3D;
+import org.jdom.DataConversionException;
+import org.jdom.Element;
+import org.lcsim.detector.IRotation3D;
+import org.lcsim.detector.Rotation3D;
+import org.lcsim.detector.Transform3D;
+import org.lcsim.detector.Translation3D;
+
+/**
+ * Class to keep survey results.
+ * 
+ * @author Per Hansson Adrian <[log in to unmask]>
+ *
+ */
+public class SurveyResult {
+
+    String name;
+    String desc;
+    private Hep3Vector origin;
+    private Hep3Vector x;
+    private Hep3Vector y;
+    private Hep3Vector z;
+    
+    public SurveyResult(String name,Element node) {
+        this.name = name;
+        try {
+            setResults(node);
+        } catch (DataConversionException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+    }
+    
+    
+    private final void initFromDetectorXmlNode(Element detectorNode) {
+        Element element = findResultFromDetector(detectorNode);
+        if(element == null) {
+            System.out.printf("%s: no element from for %s \n", this.getClass().getSimpleName(),this.name);
+        } else {
+
+            try {
+                setResults(element);
+            } catch (DataConversionException e) {
+                new RuntimeException("cannot get the results from xml", e);
+            }
+        }
+    }   
+    
+    public String toString() {
+        StringBuffer sb = new StringBuffer();
+        sb.append("Name: " + this.getName());
+        sb.append(" Desc.: " + this.getDesc() + "\n");
+        sb.append("Origin: " + this.getOrigin().toString() + "\n");
+        sb.append("unit x: " + this.getX().toString() + "\n");
+        sb.append("unit y: " + this.getY().toString() + "\n");
+        sb.append("unit z: " + this.getZ().toString() + "\n");
+        return sb.toString();
+    }
+    
+    
+    public String getDesc() {
+        return this.desc;
+    }
+
+    private void setResults(Element element) throws DataConversionException {
+        
+        setDesc(element.getAttributeValue("desc"));
+        
+        Element eO = element.getChild("origin");
+        if (eO == null) throw new RuntimeException("No origin node foudn for this element");
+
+
+        setOrigin(getUnit(eO));
+
+
+        List<Element> eUnitVectors = element.getChildren("unitvec");
+        if (eUnitVectors == null) throw new RuntimeException("No unitvec node foudn for this element");
+        if(eUnitVectors.size()!=3) throw new RuntimeException("Need 3 unitvecs");
+        for (Element ev : eUnitVectors) {
+            switch (ev.getAttributeValue("name")) {
+            case "X": setX(getUnit(ev));
+            break;
+            case "Y": setY(getUnit(ev));
+            break;
+            case "Z": setZ(getUnit(ev));
+            break;
+            default: throw new RuntimeException("This attribute name is wrong " + ev.getAttributeValue("name"));
+            }
+        }
+
+
+
+    }
+
+    public void setDesc(String desc) {
+       this.desc = desc;
+        
+    }
+
+    public static SurveyResult findResultFromDetector(Element detectorNode,  String name) {
+        Element elementSurveyVolumes = detectorNode.getChild("SurveyVolumes");
+        if(elementSurveyVolumes==null) {
+           System.out.printf("WARNING: no XML file for survey information available.\n");
+           //throw new RuntimeException("no SurveyVolumes in this xml file.");
+           return null;
+        }
+        List<Element> list = elementSurveyVolumes.getChildren("SurveyVolume");
+        for(Element element : list) {
+            if(element.getAttribute("name")!=null) {
+                if(element.getAttributeValue("name").compareTo(name) == 0) {
+                    return new SurveyResult(name, element);
+                } 
+            } else {
+                throw new RuntimeException("this element is not formatted correctly");
+            }
+        }
+        return null;
+    
+    }
+    
+    private Element findResultFromDetector(Element detectorNode) {
+        Element elementSurveyVolumes = detectorNode.getChild("SurveyVolumes");
+             if(elementSurveyVolumes==null) {
+                 throw new RuntimeException("no SurveyVolumes in this xml file.");
+             }
+             List<Element> list = elementSurveyVolumes.getChildren("SurveyVolume");
+             for(Element element : list) {
+                 if(element.getAttribute("name")!=null) {
+                     if(element.getAttributeValue("name").compareTo(name) == 0) {
+                         return element;
+                     } 
+                 } else {
+                     throw new RuntimeException("this element is not formatted correctly");
+                 }
+             }
+             return null;
+         }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Hep3Vector getX() {
+        return x;
+    }
+
+    public Hep3Vector getY() {
+        return y;
+    }
+
+    public Hep3Vector getZ() {
+        return z;
+    }
+    
+    public Hep3Vector getOrigin() {
+        return origin;
+    }
+
+        
+    protected void setX(Hep3Vector unit) {
+        this.x = unit;
+    }
+    protected void setY(Hep3Vector unit) {
+        this.y = unit;
+    }
+    protected void setZ(Hep3Vector unit) {
+        this.z = unit;
+    }
+    protected void setOrigin(Hep3Vector unit) {
+        this.origin = unit;
+    }
+
+    private Hep3Vector getUnit(Element e) throws DataConversionException  {
+        Hep3Vector v = new BasicHep3Vector(e.getAttribute("x").getDoubleValue(), e.getAttribute("y").getDoubleValue(), e.getAttribute("z").getDoubleValue());
+        return v;
+    }
+
+
+    public void rotate(Rotation rot) {
+       setOrigin( new BasicHep3Vector(rot.applyTo(new Vector3D(getOrigin().v())).toArray()) );
+       setX( new BasicHep3Vector(rot.applyTo(new Vector3D(getX().v())).toArray()) );
+       setY( new BasicHep3Vector(rot.applyTo(new Vector3D(getY().v())).toArray()) );
+       setZ( new BasicHep3Vector(rot.applyTo(new Vector3D(getZ().v())).toArray()) );
+        
+    }
+    
+    public void rotateOrigin(Rotation rot) {
+        setOrigin( new BasicHep3Vector(rot.applyTo(new Vector3D(getOrigin().v())).toArray()) );
+    }
+    
+    public void rotateUnitVectors(Rotation rot) {
+        setX( new BasicHep3Vector(rot.applyTo(new Vector3D(getX().v())).toArray()) );
+        setY( new BasicHep3Vector(rot.applyTo(new Vector3D(getY().v())).toArray()) );
+        setZ( new BasicHep3Vector(rot.applyTo(new Vector3D(getZ().v())).toArray()) );
+         
+     }
+
+
+    public Rotation getRotationFrom(SurveyCoordinateSystem coord) {
+        return new Rotation(new Vector3D(coord.u().v()), new Vector3D(coord.v().v()), new Vector3D(getX().v()), new Vector3D(getY().v()));
+    }
+
+
+    public Translation3D getTranslationFrom(SurveyCoordinateSystem coord) {
+        return new Translation3D(VecOp.sub(getOrigin(), coord.origin()));
+    }
+    
+    
+    public Transform3D getTransformation() {
+        // Find the transform between the two frames - use transform classes here (not really needed)
+        Translation3D translation = new Translation3D(origin.x(), origin.y(), origin.z());
+        Rotation3D rotation = new Rotation3D(
+                new BasicHep3Matrix(
+                        x.x(),y.x(),z.x(),
+                        x.y(),y.y(),z.y(),
+                        x.z(),y.z(),z.z()
+                        ));
+        Transform3D envelopeToSupportTransform = new Transform3D(translation, rotation);
+        return envelopeToSupportTransform;
+    }
+    
+    
+    public void transform(Transform3D t) {
+        Transform3D t_this = getTransformation();
+        Hep3Vector v = t_this.getTranslation().getTranslationVector();
+        Hep3Vector vrot = t.rotated(v);
+        Hep3Vector vrottrans = t.translated(vrot);
+        origin = vrottrans;
+        rotate(t.getRotation());
+    }
+    
+    public void rotate(IRotation3D r) {
+        r.rotate(x);
+        r.rotate(y);
+        r.rotate(z);
+    }
+    
+}