Print

Print


Author: [log in to unmask]
Date: Tue May 17 17:13:42 2016
New Revision: 4357

Log:
[HPSJAVA-409] First round of cleanup on new ECal geometry code (consolidate everything into one package).

Added:
    java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/CenterMass.java
      - copied, changed from r4353, java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/geo2015/geoutils/CenterMass.java
    java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/CrystalTaitBryanAngleCalculator.java
      - copied, changed from r4353, java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/geo2015/crystal/CrystalTaitBryanAngleCalculator.java
    java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/DataLoader.java
      - copied, changed from r4353, java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/geo2015/base/DataLoader.java
    java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/ECalRotationCalculator.java
      - copied, changed from r4356, java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/geo2015/ecal/ECalRotationCalculator.java
    java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/EcalNominal.java
      - copied, changed from r4353, java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/geo2015/ecal/EcalNominal.java
    java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/EcalSurveyData.java
      - copied, changed from r4353, java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/geo2015/ecal/EcalSurveyData.java
    java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/GVector.java
      - copied, changed from r4353, java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/geo2015/geoutils/GVector.java
    java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/Geant4Position.java
      - copied, changed from r4353, java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/geo2015/crystal/Geant4Position.java
    java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/Line.java
      - copied, changed from r4353, java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/geo2015/geoutils/Line.java
    java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/Plane.java
      - copied, changed from r4353, java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/geo2015/geoutils/Plane.java
    java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/StatFunUtils.java
      - copied, changed from r4353, java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/geo2015/base/StatFunUtils.java
    java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/Transformations.java
      - copied, changed from r4356, java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/geo2015/ecal/Transformations.java
Removed:
    java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/geo2015/base/
    java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/geo2015/crystal/
    java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/geo2015/data/
    java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/geo2015/ecal/
    java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/geo2015/geoutils/
    java/branches/HPSJAVA-409/detector-model/src/test/java/org/hps/detector/ecal/EcalTransformationsTest.java
Modified:
    java/branches/HPSJAVA-409/detector-model/src/main/java/org/lcsim/detector/converter/compact/HPSEcal4Converter.java
    java/branches/HPSJAVA-409/detector-model/src/main/java/org/lcsim/geometry/compact/converter/lcdd/HPSEcal4.java

Copied: java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/CenterMass.java (from r4353, java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/geo2015/geoutils/CenterMass.java)
 =============================================================================
--- java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/geo2015/geoutils/CenterMass.java	(original)
+++ java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/CenterMass.java	Tue May 17 17:13:42 2016
@@ -1,14 +1,10 @@
-/*
- * To change this license header, choose License Headers in Project Properties. To change this template file, choose
- * Tools | Templates and open the template in the editor.
- */
-package org.hps.detector.ecal.geo2015.geoutils;
+package org.hps.detector.ecal;
 
 /**
  * The Class is implemented to calculate not fairly called "center mass" of a system from geometrical points
  * Center mass here is defined as a Point with a coordinates = arithmetical mean of the corresponding coordinates of points-arguments
  *
- * @author Annie Simonyan [log in to unmask]
+ * @author Annie Simonyan
  */
 public class CenterMass {
 
@@ -22,24 +18,21 @@
      * Meaningful constructor, with Vvectors as argument for 4 points only
      */
     public CenterMass(GVector pointA, GVector pointB, GVector pointC, GVector pointD) {
-
-        xc = (pointA.x + pointB.x + pointC.x + pointD.x) / 4;
-        yc = (pointA.y + pointB.y + pointC.y + pointD.y) / 4;
-        zc = (pointA.z + pointB.z + pointC.z + pointD.z) / 4;
+        xc = (pointA.x() + pointB.x() + pointC.x() + pointD.x()) / 4;
+        yc = (pointA.y() + pointB.y() + pointC.y() + pointD.y()) / 4;
+        zc = (pointA.z() + pointB.z() + pointC.z() + pointD.z()) / 4;
     }
 
     /*
      * Meaningful constructor, for any number of points arguments should be arrays of (Xs[], Ys[], Zs[]) of points
      */
     public CenterMass(double[] x, double[] y, double[] z) {
-
         int N = x.length;
         for (int loop = 0; loop < N; loop++) {
             xc = xc + x[loop];
             yc = yc + y[loop];
             zc = zc + z[loop];
         }
-
         xc = xc / N;
         yc = yc / N;
         zc = zc / N;

Copied: java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/CrystalTaitBryanAngleCalculator.java (from r4353, java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/geo2015/crystal/CrystalTaitBryanAngleCalculator.java)
 =============================================================================
--- java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/geo2015/crystal/CrystalTaitBryanAngleCalculator.java	(original)
+++ java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/CrystalTaitBryanAngleCalculator.java	Tue May 17 17:13:42 2016
@@ -2,9 +2,8 @@
  * To change this license header, choose License Headers in Project Properties. To change this template file, choose
  * Tools | Templates and open the template in the editor.
  */
-package org.hps.detector.ecal.geo2015.crystal;
+package org.hps.detector.ecal;
 
-import org.hps.detector.ecal.geo2015.geoutils.GVector;
 
 /**
  * Calculates Euler(actually Tait-Bryan) angles for a rotation, that transfers the crystal from it's initial
@@ -17,57 +16,47 @@
  * 
  * @author Annie Simonyan [log in to unmask]
  */
-public class CrystalTaitBryanAngleCalculator {
+class CrystalTaitBryanAngleCalculator {
     
-    private double phi = 0;  //Tait-Bryan phi angle
-    private double theta = 0;  ////Tait-Bryan theta angle
-    private final double psi = 0; ////Tait-Bryan psi angle
+    private double phi = 0;  
+    private double theta = 0;
+    private final double psi = 0;
 
-    private static final GVector ini = new GVector(0, 0, 1); //initial state vector
+    // final state vector
+    private GVector fin; 
 
-    private GVector fin; //final state vector
-
-    private double cosTheta = 0;
     private double sinTheta = 0;
     private double cosPhi = 0;
     private double sinPhi = 0;
-
     
     //contractor: the argument is the final state unitary vector,
     //if not unit, it will be redefined as unitary
     //initial state is defined as (0,0,1) vector, which is parallel to Z(beam direction)
-    public CrystalTaitBryanAngleCalculator(GVector vec_fin) {
-
-        fin = vec_fin;
-        if (vec_fin.isUnitary() == false) {
-            fin = vec_fin.getUnitVector();
+    public CrystalTaitBryanAngleCalculator(GVector vecFin) {
+        fin = vecFin;
+        if (vecFin.isUnitary() == false) {
+            fin = vecFin.getUnitVector();
         }
-
-        this.phi = this.CalcPhi();
-        this.theta = this.CalcTheta();
+        this.phi = this.calculatePhi();
+        this.theta = this.calculateTheta();
     }
 
     //calculates phi angle
-    private double CalcPhi() {
-
-        sinPhi = -fin.y;
+    private double calculatePhi() {
+        sinPhi = -fin.y();
         cosPhi = Math.sqrt(1 - this.sinPhi * this.sinPhi);
-
         return Math.asin(this.sinPhi);
     }
-
     
     //calculates theta angle after phi is calculated
-    private double CalcTheta() {
-
-        if (this.cosPhi == 0)
+    private double calculateTheta() {
+        if (this.cosPhi == 0) {
             this.sinTheta = Double.NaN;
-        else
-            this.sinTheta = fin.x / this.cosPhi;
-
+        } else {
+            this.sinTheta = fin.x() / this.cosPhi;
+        }
         return Math.asin(this.sinTheta);
     }
-
     
     //returns value of theta in rad
     public double getTheta() {

Copied: java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/DataLoader.java (from r4353, java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/geo2015/base/DataLoader.java)
 =============================================================================
--- java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/geo2015/base/DataLoader.java	(original)
+++ java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/DataLoader.java	Tue May 17 17:13:42 2016
@@ -1,9 +1,4 @@
-/*
- * To change this license header, choose License Headers in Project Properties.
- * To change this template file, choose Tools | Templates
- * and open the template in the editor.
- */
-package org.hps.detector.ecal.geo2015.base;
+package org.hps.detector.ecal;
 
 //import static com.sun.org.apache.xalan.internal.xsltc.compiler.util.Type.Int;
 import java.io.BufferedReader;
@@ -17,11 +12,11 @@
 
 
 /**
- * Class to read the data from a file
- * @author Annie Simonyan [log in to unmask]
+ * Class to read the data from a file.
+ * 
+ * @author Annie Simonyan
  */
-
-public class DataLoader {
+class DataLoader {
     
     private final ArrayList<String[]> dataset = new ArrayList<>();
 

Copied: java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/ECalRotationCalculator.java (from r4356, java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/geo2015/ecal/ECalRotationCalculator.java)
 =============================================================================
--- java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/geo2015/ecal/ECalRotationCalculator.java	(original)
+++ java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/ECalRotationCalculator.java	Tue May 17 17:13:42 2016
@@ -1,118 +1,105 @@
-package org.hps.detector.ecal.geo2015.ecal;
+package org.hps.detector.ecal;
 
-import org.hps.detector.ecal.geo2015.geoutils.GVector;
-import org.hps.detector.ecal.geo2015.base.StatFunUtils;
-
-/*
- * This class will calculate rotation angles of ECal top or bottom module plane defind by (4 measuring target points)
- * in XYZ space  
- * 
- * Rotation angles are defined as follows:
- * alpha - rotation around Z
- * beta - rotation around Y=0 for this calculations
- * gamma - rotation around X
- */
 /**
- *
+ * This class will calculate rotation angles of ECal top or bottom module plane defind by (4 measuring target points) in
+ * XYZ space Rotation angles are defined as follows: alpha - rotation around Z beta - rotation around Y=0 for this
+ * calculations gamma - rotation around X
  * @author Annie Simonyan
  */
 public class ECalRotationCalculator {
 
-    private GVector n_ini, n_fin; //normal of the plane before and after rotation.
+    private GVector n_ini, n_fin; // normal of the plane before and after rotation.
 
-    private double a0 = 0.0, b0 = 0.0, c0 = 0.0; //parameters of initial plane equation
-    private double a = 0.0, b = 0, c = 0; //parameters of final plane equation
+    private double a0 = 0.0, b0 = 0.0, c0 = 0.0; // parameters of initial plane equation
+    private double a = 0.0, b = 0, c = 0; // parameters of final plane equation
 
-    private double alpha = 0.0; //Rz
-    //private double betta = 0.0; //Ry
-    private double gamma = 0.0; //Rx
+    private double alpha = 0.0; // Rz
+    // private double betta = 0.0; //Ry
+    private double gamma = 0.0; // Rx
 
-    //default constractor, don't really use it
-    public ECalRotationCalculator(){}
-    
-    //meaningful constructor
-    //argument should be:
-    //"top" - for top module calculation
-    //"bottom" - for bottom module calculation
-    public ECalRotationCalculator(String str /*str = top(default) or str = bottom*/) {
+    // default constractor, don't really use it
+    public ECalRotationCalculator() {
+    }
+
+    // meaningful constructor
+    // argument should be:
+    // "top" - for top module calculation
+    // "bottom" - for bottom module calculation
+    public ECalRotationCalculator(String str /* str = top(default) or str = bottom */) {
 
         n_ini = EcalSurveyData.plABCDtop_ini.getNormalUnitVector();
         n_fin = EcalSurveyData.plABCDtop_fin.getNormalUnitVector();
-       
-        
-        if (str.compareToIgnoreCase("bottom")==0) {
-            n_ini = EcalSurveyData.plABCDbot_ini.getNormalUnitVector();           
-            
+
+        if (str.compareToIgnoreCase("bottom") == 0) {
+            n_ini = EcalSurveyData.plABCDbot_ini.getNormalUnitVector();
+
             n_fin = EcalSurveyData.plABCDbot_fin.getNormalUnitVector();
-           
-            
+
         }
 
-        
-        //for tests
-       // n_ini = EcalSurveyData.plYZ.getNormalUnitVector();
-       // n_fin = EcalSurveyData.plXY.getNormalUnitVector();
-        
+        // for tests
+        // n_ini = EcalSurveyData.plYZ.getNormalUnitVector();
+        // n_fin = EcalSurveyData.plXY.getNormalUnitVector();
+
         if (!checkNormals()) {
-            System.err.print("In class **** "+this.getClass()+" ****   normals are not fine\n");
+            System.err.print("In class **** " + this.getClass() + " ****   normals are not fine\n");
             return;
         }
 
-        a0 = n_ini.x;
-        b0 = n_ini.y;
-        c0 = n_ini.z;
+        a0 = n_ini.x();
+        b0 = n_ini.y();
+        c0 = n_ini.z();
 
-        a = n_fin.x;
-        b = n_fin.y;
-        c = n_fin.z;
+        a = n_fin.x();
+        b = n_fin.y();
+        c = n_fin.z();
 
-       // System.out.println(a + " " + b + " " + c);
-       // System.out.println(a0 + " " + b0 + " " + c0);
+        // System.out.println(a + " " + b + " " + c);
+        // System.out.println(a0 + " " + b0 + " " + c0);
 
         calcGamma();
         calcAlpha();
     };
 
-    //Calculate gamma rotation angle
+    // Calculate gamma rotation angle
     private void calcGamma() {
 
         double tg_gamma = 0.0;
         if (b0 == 0) {
             gamma = Math.PI / 2;
-        }
-        else {
+        } else {
             tg_gamma = (c - c0) / b0;
             gamma = Math.atan(tg_gamma);
         }
-       
 
     }
 
-    //calculate alpha rotation angle
+    // calculate alpha rotation angle
     private void calcAlpha() {
 
         double ham = (a * a0 - b * (b0 * Math.cos(gamma) - c0 * Math.sin(gamma)));
         double hayt = a0 * (a0 + c0 * Math.cos(gamma)) + Math.pow((b0 * Math.cos(gamma) - c0 * Math.sin(gamma)), 2);
 
         alpha = Math.acos(ham / hayt);
-        if(alpha>Math.PI/2)
-            alpha = Math.PI-alpha;
+        if (alpha > Math.PI / 2)
+            alpha = Math.PI - alpha;
     }
 
-    //return value of alpha - rotatoin around Z
+    // return value of alpha - rotatoin around Z
     public double getAlpha() {
         return this.alpha;
     }
 
-    //return value of gamma - rotatoin around X
+    // return value of gamma - rotatoin around X
     public double getGamma() {
         return this.gamma;
     }
 
-    //returns true if the normal vectors of the initial and final plane are actually normal
+    // returns true if the normal vectors of the initial and final plane are actually normal
     private boolean checkNormals() {
 
-        return(Double.compare(StatFunUtils.round(n_ini.Module(),12),1.0)==0 && Double.compare(StatFunUtils.round(n_fin.Module(),12),1.0)==0);
-    }        
+        return (Double.compare(StatFunUtils.round(n_ini.Module(), 12), 1.0) == 0 && Double.compare(
+                StatFunUtils.round(n_fin.Module(), 12), 1.0) == 0);
+    }
 
 }

Copied: java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/EcalNominal.java (from r4353, java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/geo2015/ecal/EcalNominal.java)
 =============================================================================
--- java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/geo2015/ecal/EcalNominal.java	(original)
+++ java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/EcalNominal.java	Tue May 17 17:13:42 2016
@@ -1,7 +1,4 @@
-package org.hps.detector.ecal.geo2015.ecal;
-
-import org.hps.detector.ecal.geo2015.geoutils.Plane;
-import org.hps.detector.ecal.geo2015.geoutils.GVector;
+package org.hps.detector.ecal;
 
 /**
  * This class holds the nominal(by initial design) coordinates for 4 measuring points of each ecal module
@@ -22,7 +19,6 @@
     public static final GVector CtopVec = new GVector(Ctop);
     public static final GVector DtopVec = new GVector(Dtop);
 
-  
     //Nominal plane of top module
     public static Plane plABCDtop_ini = new Plane(Atop, Btop, Ctop);
   

Copied: java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/EcalSurveyData.java (from r4353, java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/geo2015/ecal/EcalSurveyData.java)
 =============================================================================
--- java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/geo2015/ecal/EcalSurveyData.java	(original)
+++ java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/EcalSurveyData.java	Tue May 17 17:13:42 2016
@@ -3,10 +3,8 @@
  * To change this template file, choose Tools | Templates
  * and open the template in the editor.
  */
-package org.hps.detector.ecal.geo2015.ecal;
+package org.hps.detector.ecal;
 
-import org.hps.detector.ecal.geo2015.geoutils.Plane;
-import org.hps.detector.ecal.geo2015.geoutils.GVector;
 
 /**
  * Class to hold the survey results (positions of 4 targets of calorimeter in the hall)

Copied: java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/GVector.java (from r4353, java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/geo2015/geoutils/GVector.java)
 =============================================================================
--- java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/geo2015/geoutils/GVector.java	(original)
+++ java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/GVector.java	Tue May 17 17:13:42 2016
@@ -1,19 +1,16 @@
-package org.hps.detector.ecal.geo2015.geoutils;
+package org.hps.detector.ecal;
 
 import hep.physics.vec.BasicHep3Vector;
-import org.hps.detector.ecal.geo2015.base.StatFunUtils;
-
 
 /**
- * To define a vector in (XYZ) coordinate system as a geometrical object,
- * define operations, manipulations with the vectors
+ * Defines a vector in (XYZ) coordinate system as a geometrical object.
  * This class is similar to HepVector 
  * 
- * @author Annie Simonyan [log in to unmask]
+ * CrystalTaitBryanAngleCalculator.java
  */
 public class GVector {
 
-    public double x = 0, y = 0, z = 0;
+    private double x = 0, y = 0, z = 0;
     private double[] vec;
 
     //default constructor
@@ -42,7 +39,18 @@
         vec[0] = x;
         vec[1] = y;
         vec[2] = z;
-
+    }
+    
+    public double x() {
+        return x;
+    }
+    
+    public double y() {
+        return y;
+    }
+    
+    public double z() {
+        return z;
     }
 
     //set vector x coordinate
@@ -176,7 +184,6 @@
     
     //returns the center coordinates of this vector as a Vvector object
     public GVector getCenter() {
-
         return (this.Multiply(0.5));
     }
 

Copied: java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/Geant4Position.java (from r4353, java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/geo2015/crystal/Geant4Position.java)
 =============================================================================
--- java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/geo2015/crystal/Geant4Position.java	(original)
+++ java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/Geant4Position.java	Tue May 17 17:13:42 2016
@@ -1,14 +1,12 @@
-package org.hps.detector.ecal.geo2015.crystal;
-
-import java.util.logging.Logger;
-import org.hps.detector.ecal.geo2015.geoutils.GVector;
+package org.hps.detector.ecal;
 
 
 /**
  * Calculates G4 position for a crystal, by it's front and back face coordinates calculates the position for the center
- * of the crystal calculates the rotation of the crystal in convention of Tait-Bryan angles, {phi, theta, psi} *****
- * dear reader google it if confused :P
+ * of the crystal calculates the rotation of the crystal in convention of Tait-Bryan angles, {phi, theta, psi} 
+ * 
  * or look here: http://sedris.org/wg8home/Documents/WG80485.pdf
+ * 
  * Brief:
  * phi-rotation around X
  * theta-rotation around Y
@@ -17,8 +15,6 @@
  * @author Annie Simonyan [log in to unmask]
  */
 public class Geant4Position {
-
-    private static Logger LOGGER = Logger.getLogger(Geant4Position.class.getPackage().getName());
     
     private GVector centerPoint; // center coordinate
     private GVector crysvec; // crystal vector formed by front face center point and back face center point
@@ -31,17 +27,12 @@
     public Geant4Position(GVector point1, GVector point2) {       
         centerPoint = point2.Add(point1).Multiply(0.5);
         centerArr = new double[3];
-        centerArr[0] = centerPoint.x;
-        centerArr[1] = centerPoint.y;
-        centerArr[2] = centerPoint.z;
+        centerArr[0] = centerPoint.x();
+        centerArr[1] = centerPoint.y();
+        centerArr[2] = centerPoint.z();
         crysvec = (point2.Substract(centerPoint)).getUnitVector();
-        LOGGER.info("*************** center unit vector **********");
-        LOGGER.info(crysvec.toString());
-        LOGGER.info("*********************************************");
-
         taitbriangles = new double[3];
-        this.TaitBryanAnglesforCrys();
-
+        this.calculateTaitBryanAngles();
     }
 
     //returns the center coordinates as a Vector
@@ -61,28 +52,19 @@
 
     //calculates Tait-Bryan angles for the object orientation  defined by initial and final state vectors
     //throws arithmetical exception if the phi angle is calculated wrong or 0
-    private void TaitBryanAnglesforCrys() throws ArithmeticException{
+    private void calculateTaitBryanAngles() throws ArithmeticException{
         CrystalTaitBryanAngleCalculator crysTBang = new CrystalTaitBryanAngleCalculator(crysvec);
-        /*
-         * please vec should go from the center, even though it's not changing much
-         */
-
-        if (crysTBang.getPhi() == Double.NaN) {          
-            this.taitbriangles[0] = -111111;
-            throw new ArithmeticException("chert: Phi is undefined\n");
-        } else {
-            this.taitbriangles[0] = -crysTBang.getPhi();
+        if (crysTBang.getPhi() == Double.NaN) {
+            throw new ArithmeticException("Calculated Tait-Bryan phi angle is NaN.");
         }
+        this.taitbriangles[0] = -crysTBang.getPhi();
         this.taitbriangles[1] = -crysTBang.getTheta();
         this.taitbriangles[2] = -crysTBang.getPsi();
     }
 
     //Print crystal center coordinates(X,Y,Z) and Tait-Bryan angles
     public void Print() {
-        System.out.println("Crys Center coordinates:\t");
         this.centerPoint.Print();
-        System.out.println("Tait Brian angles phi = " + Math.toDegrees(this.taitbriangles[0]) + "\t theta = "
-                + Math.toDegrees(this.taitbriangles[1]) + "\t psi = " + Math.toDegrees(this.taitbriangles[2]) + "\n");
     }
     
     //return Geant4Position object attributes as a String 

Copied: java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/Line.java (from r4353, java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/geo2015/geoutils/Line.java)
 =============================================================================
--- java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/geo2015/geoutils/Line.java	(original)
+++ java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/Line.java	Tue May 17 17:13:42 2016
@@ -3,7 +3,7 @@
  * Tools | Templates and open the template in the editor.
  */
 
-package org.hps.detector.ecal.geo2015.geoutils;
+package org.hps.detector.ecal;
 
 /**
  * @author Annie Simonyan
@@ -16,7 +16,7 @@
 
     // Define a line with a vector and a point it goes through
     public Line(GVector vec, double x, double y, double z) {
-        this.setVec_n(new GVector(vec.x, vec.y, vec.z));
+        this.setVec_n(new GVector(vec.x(), vec.y(), vec.z()));
         point = new double[3];
         point[0] = x;
         point[1] = y;

Copied: java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/Plane.java (from r4353, java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/geo2015/geoutils/Plane.java)
 =============================================================================
--- java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/geo2015/geoutils/Plane.java	(original)
+++ java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/Plane.java	Tue May 17 17:13:42 2016
@@ -1,12 +1,11 @@
-/*
+package org.hps.detector.ecal;
+
+/**
  * Supposed to calculate plane equation for any 3 points not in one line I will not check this, so please take care the
  * shape is Ax+By+Cy+D=0 Get the ABCD constants as array or whatever.
  * 
  * @author Annie Simonyan
  */
-
-package org.hps.detector.ecal.geo2015.geoutils;
-
 public class Plane {
 
     private double c1 = 0., c2 = 0., c3 = 0., c4 = 0., c5 = 0., c6 = 0.;
@@ -46,7 +45,7 @@
 
     public GVector getNormalUnitVector() {
         double mod = normal.Module();
-        GVector uNorm = new GVector(normal.x / mod, normal.y / mod, normal.z / mod);
+        GVector uNorm = new GVector(normal.x() / mod, normal.y() / mod, normal.z() / mod);
         return uNorm;
     }
 

Copied: java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/StatFunUtils.java (from r4353, java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/geo2015/base/StatFunUtils.java)
 =============================================================================
--- java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/geo2015/base/StatFunUtils.java	(original)
+++ java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/StatFunUtils.java	Tue May 17 17:13:42 2016
@@ -1,11 +1,11 @@
-package org.hps.detector.ecal.geo2015.base;
+package org.hps.detector.ecal;
 
 /**
  * Some static functions which I couldn't find in java standard libraries
  * 
- * @author Annie Simonyan [log in to unmask]
+ * @author Annie Simonyan
  */
-public class StatFunUtils {
+class StatFunUtils {
 
     /*****
      * Function for double to round up the arg. value to 'places' digits after the semicolon 

Copied: java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/Transformations.java (from r4356, java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/geo2015/ecal/Transformations.java)
 =============================================================================
--- java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/geo2015/ecal/Transformations.java	(original)
+++ java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/Transformations.java	Tue May 17 17:13:42 2016
@@ -1,25 +1,17 @@
-package org.hps.detector.ecal.geo2015.ecal;
+package org.hps.detector.ecal;
 
-import java.util.HashMap;
-import java.util.Map;
 import java.util.logging.Logger;
 
-import org.hps.conditions.database.DatabaseConditionsManager;
 import org.hps.conditions.ecal.EcalChannel;
-import org.hps.detector.ecal.geo2015.crystal.Crystal;
-import org.hps.detector.ecal.geo2015.crystal.Geant4Position;
-import org.hps.detector.ecal.geo2015.geoutils.GVector;
-import org.hps.conditions.ecal.EcalCrystalPosition.EcalCrystalPositionCollection;
 import org.hps.conditions.ecal.EcalCrystalPosition;
 
 /**
- * Class does all the transformations to rotate and translate the modules of ecal by given arguments from rel to it's
- * nominal pos. An issue is, that once a module is transformed, the non modified module map remains undefined This needs
- * to be fixed or not? Has bunch of printouts for debuging, will be removed soon, I hope soon :/
+ * Performs vector transformations to calculate center of crystal volume from front and back
+ * positions as defined in the conditions database.
  *
- * @author Annie Simonyan [log in to unmask]
+ * @author Annie Simonyan
  */
-public class Transformations {
+public final class Transformations {
 
     public static Logger LOGGER = Logger.getLogger(Transformations.class.getPackage().getName());
 
@@ -27,166 +19,48 @@
     private GVector transVec; 
     private double[] rotation;
 
-    /* name "top" or "bottom" to tranform Ecal top or bottom module respectively */
-    private String module;
-
     /* geometrically defined center mass of top module */
-    private final GVector CMvec_nom_top = new GVector(109.88, 230.79, 1008.73); 
+    private final GVector vecTop = new GVector(109.88, 230.79, 1008.73); 
     /* geometrically defined center mass of bottom module */
-    private final GVector CMvec_nom_bot = new GVector(109.88, -230.79, 1008.73); 
-
-    /* Map of crystals with key = ("c#column:l#layer") */
-    private Map<String, Crystal> crystalMap; 
-
-    // constructor with argumnets
-    // 1 - module name "top" or "bottom" - case is ignored
-    // 2 - translation in the space as an array with translation vector coordinates [x,y,z]
-    // 3 - rotation in the space as an array with rotation angles [Rz-alpha, Ry-beta, Rx-gamma]
-    public Transformations(String module, double[] trans, double[] rot) {
-        LOGGER.info(("transformations for the module = " + module));
-        LOGGER.info(("translation arg " + trans[0] + "\t" + trans[1] + "\t" + trans[2]));
-        LOGGER.info(("rotation arg " + rot[0] + "\t" + rot[1] + "\t" + rot[2]));
+    private final GVector vecBot = new GVector(109.88, -230.79, 1008.73); 
+    
+    /**
+     * Create a new <code>Transformations</code> object. 
+     * 
+     * @param trans translation in space as an array containing [x,y,z] coordinates
+     * @param rot rotation in space as an array with angles [alpha, beta, gamma] or [rx, ry, rz]
+     */
+    public Transformations(double[] trans, double[] rot) {
         this.transVec = new GVector(trans);
-        LOGGER.info(transVec.toString());
         this.rotation = rot;
-        LOGGER.info(("rotation " + this.rotation[0] + "\t" + this.rotation[1] + "\t" + this.rotation[2]));
-        this.module = module;
-        this.crystalMap = new HashMap<String, Crystal>();
-
-        try {
-            this.makeTransformation();
-        } catch (Exception e) {
-            throw new RuntimeException(e);
+    }
+    
+    public Geant4Position transformToGeant4(EcalCrystalPosition position, EcalChannel channel) {
+        
+        // Define untransformed front and back positions.
+        GVector frontVec = new GVector(position.getFrontX(), position.getFrontY(), position.getFrontZ());
+        GVector backVec = new GVector(position.getBackX(), position.getBackY(), position.getBackZ());
+        
+        // Determine local coordinate system based on top or bottom half.
+        GVector coordOrigin;
+        if (channel.getY() > 0) {
+            coordOrigin = vecTop;
+        } else {
+            coordOrigin = vecBot;
         }
+        
+        // Transform front and back global positions into the local coordinate system.
+        frontVec = transformVector(frontVec, coordOrigin);
+        backVec = transformVector(backVec, coordOrigin);
+        
+        // Return G4 position using front and back position vectors.
+        return new Geant4Position(frontVec, backVec);
     }
-
-    // returns the map of crystals
-    public Map<String, Crystal> getCrystalMap() {
-        return this.crystalMap;
-    }
-
-    // does all the transformatios initiated in constructor
-    private void makeTransformation() throws Exception {
-        // trying to access database to read ecal crystal positions and channels
-
-        // initializing database access
-        DatabaseConditionsManager mgr = DatabaseConditionsManager.getInstance();
-        EcalCrystalPositionCollection positions = mgr.getCachedConditions(EcalCrystalPositionCollection.class,
-                "ecal_crystal_positions").getCachedData();
-
-        LOGGER.info("Got " + positions.size() + " ECal crystal positions from database.");
-
-        EcalChannel.EcalChannelCollection channels = mgr.getCachedConditions(EcalChannel.EcalChannelCollection.class,
-                "ecal_channels").getCachedData();
-
-        LOGGER.info("Got " + channels.size() + " ECal crystal positions from database.");
-
-        // define number of crystals
-        int Ncrys = positions.size();
-        
-        // crystal layer is equivalent to Y(-5;5) and col-> to X(-23;23) of ecal mapping
-        int[] layer = new int[Ncrys];
-        int[] col = new int[Ncrys];
-
-        // LOGGER.info(data.toString());
-        GVector[] frontXYZ = new GVector[Ncrys];
-        GVector[] backXYZ = new GVector[Ncrys];
-
-        // declaring temp center mass vector to be used in the loop
-        GVector CMvec_nom = new GVector();
-        
-        // translate the coordinate system to CM
-        for (int loop = 0; loop < Ncrys; loop++) {
-
-            // getting the EcalCrystalPosition object for a crystal
-            EcalCrystalPosition position = positions.get(loop);
-            int channelId = position.getChannelId();
-            // reading crystal layer(row)-Y and column-X from channels collection in database
-            layer[loop] = channels.findChannel(channelId).getY();
-            col[loop] = channels.findChannel(channelId).getX();
-            // reading crystal position from positions collection in database
-            frontXYZ[loop] = new GVector(position.getFrontX(), position.getFrontY(), position.getFrontZ());
-            backXYZ[loop] = new GVector(position.getBackX(), position.getBackY(), position.getBackZ());
-
-            if (this.module.compareToIgnoreCase("bottom") == 0 && layer[loop] > 0) {
-                // crystalMap.put(String.format("c%d:l%d", col[loop].intValue(), layer[loop].intValue()),
-                // new Crystal(col[loop].intValue(), layer[loop].intValue(),
-                // new Geant4Position(frontXYZ[loop], backXYZ[loop])));
-                continue;
-            } else if (this.module.compareToIgnoreCase("top") == 0 && layer[loop] < 0) {
-                // crystalMap.put(String.format("c%d:l%d", col[loop].intValue(), layer[loop].intValue()),
-                // new Crystal(col[loop].intValue(), layer[loop].intValue(),
-                // new Geant4Position(frontXYZ[loop], backXYZ[loop])));
-                continue;
-            }
-
-            LOGGER.info("Initial position are:");
-            LOGGER.info(frontXYZ[loop].toString());
-            LOGGER.info(backXYZ[loop].toString());
-
-            // setting the right vector to move to center mass system of a module
-            if (layer[loop] > 0) {
-                CMvec_nom = CMvec_nom_top;
-            } else if (layer[loop] < 0) {
-                CMvec_nom = CMvec_nom_bot;
-            }
-
-            // translate by the vector = center of coordinate system, I mean
-            // where the ecal is.
-            frontXYZ[loop] = frontXYZ[loop].TranslateBy(CMvec_nom.getOpposite());
-            backXYZ[loop] = backXYZ[loop].TranslateBy(CMvec_nom.getOpposite());
-            // frontXYZ[loop] = frontXYZ[loop].TranslateBy(CMvec_nom);
-            // backXYZ[loop] = backXYZ[loop].TranslateBy(CMvec_nom);
-
-            // LOGGER.info(CMvec_nom.toString());
-            // LOGGER.info("after translation to CM COO-system");
-            // LOGGER.info(frontXYZ[loop].toString());
-            // LOGGER.info(backXYZ[loop].toString());
-
-            // / Rotate the modules by angle calc from suvey data
-            frontXYZ[loop] = frontXYZ[loop].RotateBy(this.rotation[0], this.rotation[1], this.rotation[2]);
-            backXYZ[loop] = backXYZ[loop].RotateBy(this.rotation[0], this.rotation[1], this.rotation[2]);
-
-            // LOGGER.info("after module plane rotation");
-            // LOGGER.info(frontXYZ[loop].toString());
-            // LOGGER.info(backXYZ[loop].toString());
-
-            // Translate modules by the translation vector the diff of CM
-            frontXYZ[loop] = frontXYZ[loop].TranslateBy(transVec);
-            backXYZ[loop] = backXYZ[loop].TranslateBy(transVec);
-
-            // LOGGER.info("after translation by survey shift");
-            // LOGGER.info(frontXYZ[loop].toString());
-            // LOGGER.info(backXYZ[loop].toString());
-
-            // / Translate back to initial coordinate system
-            frontXYZ[loop] = frontXYZ[loop].TranslateBy(CMvec_nom);
-            backXYZ[loop] = backXYZ[loop].TranslateBy(CMvec_nom);
-            // LOGGER.info("after translation back to initial system");
-            // LOGGER.info(frontXYZ[loop].toString());
-            // LOGGER.info(backXYZ[loop].toString());
-
-            // uncomment if need to write things in a file
-            /*
-             * bw.write(String.valueOf(col[loop].intValue()) + "\t" + String.valueOf(layer[loop].intValue()) + "\t" +
-             * String.valueOf(frontXYZ[loop].x) + "\t" + String.valueOf(frontXYZ[loop].y) + "\t" +
-             * String.valueOf(frontXYZ[loop].z) + "\t" + String.valueOf(backXYZ[loop].x) + "\t" +
-             * String.valueOf(backXYZ[loop].y) + "\t" + String.valueOf(backXYZ[loop].z) + "\n");
-             */
-            if (frontXYZ[loop] == null || backXYZ[loop] == null) {
-                throw new RuntimeException("The front or back vectors are null.");
-            }
-
-            // dfine the position as a geant4position object for a crystal
-            Geant4Position g4pos = new Geant4Position(frontXYZ[loop], backXYZ[loop]);
-
-            // put the crystal in the map with the corresponding key
-            crystalMap.put(String.format("c%d:l%d", col[loop], layer[loop]), 
-                    new Crystal(col[loop], layer[loop], g4pos));
-            LOGGER.info(("icol = " + col[loop] + " ilay = " + layer[loop]));
-            LOGGER.info(g4pos.toString());
-        }
-        LOGGER.info(("Number of crystal map content after transformations in the " + this.module + " module = " 
-                + crystalMap.size()));
+       
+    private GVector transformVector(GVector vec, GVector coordOrigin) {
+        return vec.TranslateBy(coordOrigin.getOpposite())
+                .RotateBy(this.rotation[0], this.rotation[1], this.rotation[2])
+                .TranslateBy(transVec)
+                .TranslateBy(coordOrigin);
     }
 }

Modified: java/branches/HPSJAVA-409/detector-model/src/main/java/org/lcsim/detector/converter/compact/HPSEcal4Converter.java
 =============================================================================
--- java/branches/HPSJAVA-409/detector-model/src/main/java/org/lcsim/detector/converter/compact/HPSEcal4Converter.java	(original)
+++ java/branches/HPSJAVA-409/detector-model/src/main/java/org/lcsim/detector/converter/compact/HPSEcal4Converter.java	Tue May 17 17:13:42 2016
@@ -1,25 +1,28 @@
 package org.lcsim.detector.converter.compact;
 
-import java.util.Map;
 import java.util.logging.Logger;
 
-import org.hps.detector.ecal.geo2015.crystal.Crystal;
-import org.hps.detector.ecal.geo2015.ecal.Transformations;
-
+import org.hps.conditions.database.DatabaseConditionsManager;
+import org.hps.conditions.ecal.EcalChannel.EcalChannelCollection;
+import org.hps.conditions.ecal.EcalCrystalPosition;
+import org.hps.conditions.ecal.EcalCrystalPosition.EcalCrystalPositionCollection;
+import org.hps.conditions.ecal.EcalChannel;
 import org.hps.detector.ecal.EcalCrystal;
+import org.hps.detector.ecal.Geant4Position;
 import org.hps.detector.ecal.HPSEcalDetectorElement;
+import org.hps.detector.ecal.Transformations;
 import org.jdom.DataConversionException;
 import org.jdom.Element;
+import org.lcsim.detector.ITranslation3D;
+import org.lcsim.detector.IRotation3D;
+import org.lcsim.detector.Translation3D;
+import org.lcsim.detector.RotationGeant;
+import org.lcsim.detector.Transform3D;
+import org.lcsim.detector.PhysicalVolume;
 import org.lcsim.detector.IDetectorElement;
 import org.lcsim.detector.ILogicalVolume;
 import org.lcsim.detector.IPhysicalVolume;
-import org.lcsim.detector.IRotation3D;
-import org.lcsim.detector.ITranslation3D;
 import org.lcsim.detector.LogicalVolume;
-import org.lcsim.detector.PhysicalVolume;
-import org.lcsim.detector.RotationGeant;
-import org.lcsim.detector.Transform3D;
-import org.lcsim.detector.Translation3D;
 import org.lcsim.detector.identifier.ExpandedIdentifier;
 import org.lcsim.detector.identifier.IExpandedIdentifier;
 import org.lcsim.detector.identifier.IIdentifier;
@@ -32,35 +35,31 @@
 import org.lcsim.geometry.subdetector.HPSEcal4;
 
 /*
- * For class description contact Jeremy For implementatoin details contact Annie
- * @author Annie Simonyan ([log in to unmask]), Jeremy McCormick ([log in to unmask])
+ * 
+ * @author annie
+ * @author jeremym
  */
 
 public class HPSEcal4Converter extends AbstractSubdetectorConverter {
 
     private static Logger LOGGER = Logger.getLogger(HPSEcal4Converter.class.getPackage().getName());
 
-    // Margin for mother volume.
-    // private static final double margin = 1.1;
-
     private IIdentifierDictionary dict;
     private IIdentifierHelper helper;
-
-    // private List<CrystalRange> ranges = new ArrayList<CrystalRange>();
 
     @Override
     public void convert(final Subdetector subdet, final Detector detector) {
 
-        LOGGER.info(("converting subdetector " + subdet.getName()));
         helper = subdet.getDetectorElement().getIdentifierHelper();
         dict = helper.getIdentifierDictionary();
         final Element dimensions = subdet.getNode().getChild("dimensions");
         double dx1, dx2, dy1, dy2, dz;
 
-        double tr_top[] = {-100, -100, -100};
-        double tr_bot[] = {-100, -100, -100};
-        double rot_top[] = {-100, -100, -100};
-        double rot_bot[] = {-100, -100, -100};
+        double trTop[] = new double[3];
+        double trBot[] = new double[3];
+        double rotTop[] = new double[3];
+        double rotBot[] = new double[3];
+        
         try {
             dx1 = dimensions.getAttribute("x1").getDoubleValue();
             dx2 = dimensions.getAttribute("x2").getDoubleValue();
@@ -70,23 +69,23 @@
 
             Element tra = subdet.getNode().getChild("translations");
 
-            tr_top[0] = tra.getAttribute("top_tr_x").getDoubleValue();
-            tr_top[1] = tra.getAttribute("top_tr_y").getDoubleValue();
-            tr_top[2] = tra.getAttribute("top_tr_z").getDoubleValue();
+            trTop[0] = tra.getAttribute("top_tr_x").getDoubleValue();
+            trTop[1] = tra.getAttribute("top_tr_y").getDoubleValue();
+            trTop[2] = tra.getAttribute("top_tr_z").getDoubleValue();
 
-            tr_bot[0] = tra.getAttribute("bot_tr_x").getDoubleValue();
-            tr_bot[1] = tra.getAttribute("bot_tr_y").getDoubleValue();
-            tr_bot[2] = tra.getAttribute("bot_tr_z").getDoubleValue();
+            trBot[0] = tra.getAttribute("bot_tr_x").getDoubleValue();
+            trBot[1] = tra.getAttribute("bot_tr_y").getDoubleValue();
+            trBot[2] = tra.getAttribute("bot_tr_z").getDoubleValue();
 
             Element rota = subdet.getNode().getChild("rotations");
 
-            rot_top[0] = rota.getAttribute("top_rot_alpha").getDoubleValue();
-            rot_top[1] = rota.getAttribute("top_rot_beta").getDoubleValue();
-            rot_top[2] = rota.getAttribute("top_rot_gamma").getDoubleValue();
+            rotTop[0] = rota.getAttribute("top_rot_alpha").getDoubleValue();
+            rotTop[1] = rota.getAttribute("top_rot_beta").getDoubleValue();
+            rotTop[2] = rota.getAttribute("top_rot_gamma").getDoubleValue();
 
-            rot_bot[0] = rota.getAttribute("bot_rot_alpha").getDoubleValue();
-            rot_bot[1] = rota.getAttribute("bot_rot_beta").getDoubleValue();
-            rot_bot[2] = rota.getAttribute("bot_rot_gamma").getDoubleValue();
+            rotBot[0] = rota.getAttribute("bot_rot_alpha").getDoubleValue();
+            rotBot[1] = rota.getAttribute("bot_rot_beta").getDoubleValue();
+            rotBot[2] = rota.getAttribute("bot_rot_gamma").getDoubleValue();
 
         } catch (final DataConversionException e) {
             throw new RuntimeException("Error converting HPSEcal4 from XML.", e);
@@ -96,75 +95,56 @@
         final Trd crystalTrap = new Trd("crystal_trap", dx1, dx2, dy1, dy2, dz);
         final ILogicalVolume crystalLogVol = new LogicalVolume("crystal_volume", crystalTrap, MaterialStore
                 .getInstance().get(materialName));
-        Transformations trans_top = new Transformations("top", tr_top, rot_top);
-        Map<String, Crystal> topMap = trans_top.getCrystalMap();
-        Transformations trans_bot = new Transformations("bottom", tr_bot, rot_bot);
-        Map<String, Crystal> botMap = trans_bot.getCrystalMap();
-        LOGGER.info(("Number of crystal map content for bottom module   " + botMap.size()));
-        LOGGER.info(("Number of crystal map content for top module  " + topMap.size()));
+        Transformations transTop = new Transformations(trTop, rotTop);
+        Transformations transBot = new Transformations(trBot, rotBot);
         final String baseName = subdet.getName() + "_crystal";
         final ILogicalVolume mom = detector.getWorldVolume().getLogicalVolume();
-        int crystaln = 1;
-        for (int iy = -5; iy <= 5; iy++) {
-            if (iy == 0)
-                continue;
+        
+        // Get database conditions.
+        DatabaseConditionsManager mgr = DatabaseConditionsManager.getInstance();
+        EcalCrystalPositionCollection positions = mgr.getCachedConditions(EcalCrystalPositionCollection.class,
+                "ecal_crystal_positions").getCachedData();
+        EcalChannelCollection channels = mgr.getCachedConditions(EcalChannelCollection.class,
+                "ecal_channels").getCachedData();
+        
+        // Loop over crystal positions.
+        for (EcalCrystalPosition position : positions) {
 
-            // loop over columns
-            for (int ix = -23; ix <= 23; ix++) {
-                if (ix == 0) {
-                    continue;
-                }
+            // Get channel info.
+            int channelId = position.getChannelId();
+            EcalChannel channel = channels.findChannel((long) channelId);
+            int iy = channel.getY();
+            int ix = channel.getX();
 
-                // z axis rotation parameter of the whole module
-                double zrot_cry = rot_bot[0];
+            // z axis rotation parameter of the whole module
+            double zrotCry;
+            Transformations trans;
+            if (iy > 0) {
+                zrotCry = rotTop[0];
+                trans = transTop;
+            } else {
+                zrotCry = rotBot[0];
+                trans = transBot;
+            }
+            
+            Geant4Position g4pos = trans.transformToGeant4(position, channel);
+            double[] centerxyz = g4pos.getCenterArr();
+            double[] thetaxyz = g4pos.getTaitBryanAngles();
+            
+            final ITranslation3D iposBot = new Translation3D(centerxyz[0], centerxyz[1], centerxyz[2]);
+            final IRotation3D irotBot = new RotationGeant(thetaxyz[0], thetaxyz[1], thetaxyz[2] - zrotCry);
 
-                Crystal crystal = botMap.get(String.format("c%d:l%d", ix, iy));
-
-                if (iy > 0) {
-                    crystal = topMap.get(String.format("c%d:l%d", ix, iy));
-                    // z axis rotation parameter of the whole module
-                    zrot_cry = rot_top[0];
-                }
-
-                if (crystal == null)
-                    // skip the ecal gap
-                    if ((iy == -1 && ix > -11 && ix < -1) || (iy == 1 && ix > -11 && ix < -1))
-                        continue;
-                    else
-                        throw new NullPointerException(iy + " " + ix
-                                + " crystal is null, the map is screwed, the compiler really feels sorry for you.");
-
-                if (crystal.getCrystalG4Pos() == null)
-                    throw new NullPointerException("g4pos of crystal is null, the map is screwed, sorry\n");
-
-                // double[] centerxyz = {0, 0, 0};
-                // double[] thetaxyz = {0, 0, 0};
-
-                double[] centerxyz = crystal.getCrystalG4Pos().getCenterArr();
-                double[] thetaxyz = crystal.getCrystalG4Pos().getTaitBryanAngles();
-
-                final ITranslation3D iposBot = new Translation3D(centerxyz[0], centerxyz[1], centerxyz[2]);
-                final IRotation3D irotBot = new RotationGeant(thetaxyz[0], thetaxyz[1], thetaxyz[2] - zrot_cry); // thetaxyz[2]-zrot_cry=
-                // the
-                // compound
-                // rotation
-                // for
-                // the
-                // Psie
-                // final IRotation3D irotBot = new RotationGeant(thetaxyz[0], thetaxyz[1], thetaxyz[2]+zrot_cry); //
-                // thetaxyz[2]+zrot_cry= the compound rotation for the Psie
-
-                // Place the crystal.
-                final IPhysicalVolume CrystalPlacement = new PhysicalVolume(new Transform3D(iposBot, irotBot), baseName
-                        + crystaln, crystalLogVol, mom, crystaln);
-                this.createDetectorElement(detector, subdet, CrystalPlacement, ix, iy);
-                crystaln++;
-
-            }
-        }
-        LOGGER.info(("In HPSEcal4Converter crystal in top module:" + topMap.size() + "   crystals in bottom module:  " + botMap
-                .size()));
-
+            // Place the crystal.
+            final IPhysicalVolume CrystalPlacement = new PhysicalVolume(
+                    new Transform3D(iposBot, irotBot), 
+                    baseName + channelId, 
+                    crystalLogVol, 
+                    mom, 
+                    channelId);
+            
+            // Create the DE pointing to the crystal vol.
+            this.createDetectorElement(detector, subdet, CrystalPlacement, ix, iy);
+        }       
     }
 
     /**
@@ -194,7 +174,6 @@
 
     @Override
     public IDetectorElement makeSubdetectorDetectorElement(final Detector detector, final Subdetector subdetector) {
-        LOGGER.info("creating detector element for subdetector " + subdetector.getName());
         final IDetectorElement subdetectorDE = new HPSEcalDetectorElement(subdetector.getName(),
                 detector.getDetectorElement());
         subdetector.setDetectorElement(subdetectorDE);

Modified: java/branches/HPSJAVA-409/detector-model/src/main/java/org/lcsim/geometry/compact/converter/lcdd/HPSEcal4.java
 =============================================================================
--- java/branches/HPSJAVA-409/detector-model/src/main/java/org/lcsim/geometry/compact/converter/lcdd/HPSEcal4.java	(original)
+++ java/branches/HPSJAVA-409/detector-model/src/main/java/org/lcsim/geometry/compact/converter/lcdd/HPSEcal4.java	Tue May 17 17:13:42 2016
@@ -1,10 +1,10 @@
 package org.lcsim.geometry.compact.converter.lcdd;
 
-import java.util.Map;
 import java.util.logging.Logger;
 
-import org.hps.detector.ecal.geo2015.crystal.Crystal;
-import org.hps.detector.ecal.geo2015.ecal.Transformations;
+import org.hps.conditions.database.DatabaseConditionsManager;
+import org.hps.detector.ecal.Geant4Position;
+import org.hps.detector.ecal.Transformations;
 import org.jdom.Element;
 import org.jdom.JDOMException;
 import org.lcsim.detector.converter.compact.HPSEcal4Converter;
@@ -16,12 +16,18 @@
 import org.lcsim.geometry.compact.converter.lcdd.util.SensitiveDetector;
 import org.lcsim.geometry.compact.converter.lcdd.util.Trapezoid;
 import org.lcsim.geometry.compact.converter.lcdd.util.Volume;
+import org.hps.conditions.ecal.EcalCrystalPosition;
+import org.hps.conditions.ecal.EcalCrystalPosition.EcalCrystalPositionCollection;
+import org.hps.conditions.ecal.EcalChannel;
+import org.hps.conditions.ecal.EcalChannel.EcalChannelCollection;
 
-/*
+/**
+ * Convert a compact subdetector to LCDD output using ECal database conditions
+ * for the crystal positions.
+ * 
  * @author annie
  * @author jeremym
  */
-
 public class HPSEcal4 extends LCDDSubdetector {
 
     private static Logger LOGGER = Logger.getLogger(HPSEcal4Converter.class.getPackage().getName());
@@ -32,35 +38,40 @@
 
     void addToLCDD(LCDD lcdd, SensitiveDetector sens) throws JDOMException {
 
-        if (sens == null)
+        if (sens == null) {
             throw new RuntimeException("SensitiveDetector parameter points to null.");
+        }
+        
+        int system = this.getSystemID();
+        Element mat = node.getChild("material");
+        String materialName = mat.getAttributeValue("name");
+        
         Element dimensions = node.getChild("dimensions");
         double dx1 = dimensions.getAttribute("x1").getDoubleValue();
         double dx2 = dimensions.getAttribute("x2").getDoubleValue();
         double dy1 = dimensions.getAttribute("y1").getDoubleValue();
         double dy2 = dimensions.getAttribute("y2").getDoubleValue();
         double dz = dimensions.getAttribute("z").getDoubleValue();
-        int system = this.getSystemID();
-        Element mat = node.getChild("material");
-        String materialName = mat.getAttributeValue("name");
+        
         Element tra = node.getChild("translations");
-        double tr_top[] = {-100, -100, -100};
-        tr_top[0] = tra.getAttribute("top_tr_x").getDoubleValue();
-        tr_top[1] = tra.getAttribute("top_tr_y").getDoubleValue();
-        tr_top[2] = tra.getAttribute("top_tr_z").getDoubleValue();
-        double tr_bot[] = {-100, -100, -100};
-        tr_bot[0] = tra.getAttribute("bot_tr_x").getDoubleValue();
-        tr_bot[1] = tra.getAttribute("bot_tr_y").getDoubleValue();
-        tr_bot[2] = tra.getAttribute("bot_tr_z").getDoubleValue();
+        double trTop[] = new double[3];
+        trTop[0] = tra.getAttribute("top_tr_x").getDoubleValue();
+        trTop[1] = tra.getAttribute("top_tr_y").getDoubleValue();
+        trTop[2] = tra.getAttribute("top_tr_z").getDoubleValue();        
+        double trBot[] = new double[3];
+        trBot[0] = tra.getAttribute("bot_tr_x").getDoubleValue();
+        trBot[1] = tra.getAttribute("bot_tr_y").getDoubleValue();
+        trBot[2] = tra.getAttribute("bot_tr_z").getDoubleValue();
+        
         Element rota = node.getChild("rotations");
-        double rot_top[] = {-100, -100, -100};
-        rot_top[0] = rota.getAttribute("top_rot_alpha").getDoubleValue();
-        rot_top[1] = rota.getAttribute("top_rot_beta").getDoubleValue();
-        rot_top[2] = rota.getAttribute("top_rot_gamma").getDoubleValue();
-        double rot_bot[] = {-100, -100, -100};
-        rot_bot[0] = rota.getAttribute("bot_rot_alpha").getDoubleValue();
-        rot_bot[1] = rota.getAttribute("bot_rot_beta").getDoubleValue();
-        rot_bot[2] = rota.getAttribute("bot_rot_gamma").getDoubleValue();
+        double rotTop[] = new double[3];
+        rotTop[0] = rota.getAttribute("top_rot_alpha").getDoubleValue();
+        rotTop[1] = rota.getAttribute("top_rot_beta").getDoubleValue();
+        rotTop[2] = rota.getAttribute("top_rot_gamma").getDoubleValue();
+        double rotBot[] = new double[3];
+        rotBot[0] = rota.getAttribute("bot_rot_alpha").getDoubleValue();
+        rotBot[1] = rota.getAttribute("bot_rot_beta").getDoubleValue();
+        rotBot[2] = rota.getAttribute("bot_rot_gamma").getDoubleValue();
         
         Trapezoid crystalTrap = new Trapezoid("crystal_trap", dx1, dx2, dy1, dy2, dz);
         Volume crystalLogVol = new Volume("crystal_volume", crystalTrap, lcdd.getMaterial(materialName));
@@ -70,62 +81,60 @@
         lcdd.add(crystalLogVol);
         Volume world = lcdd.pickMotherVolume(this);
         Define define = lcdd.getDefine();
-        Transformations trans_top = new Transformations("top", tr_top, rot_top);
-        Map<String, Crystal> topMap = trans_top.getCrystalMap();
-        Transformations trans_bot = new Transformations("bottom", tr_bot, rot_bot);
-        Map<String, Crystal> botMap = trans_bot.getCrystalMap();
-        LOGGER.info(("Number of crystal map content for bottom module   " + botMap.size()));
-        LOGGER.info(("Number of crystal map content for top module  " + topMap.size()));
-        for (int iy = -5; iy <= 5; iy++) {
-            if (iy == 0)
-                continue;
-            for (int ix = -23; ix <= 23; ix++) {
-                if (ix == 0) {
-                    continue;
-                }
+        
+        Transformations transTop = new Transformations(trTop, rotTop);
+        Transformations transBot = new Transformations(trBot, rotBot);
+        
+        // Get database conditions.
+        DatabaseConditionsManager mgr = DatabaseConditionsManager.getInstance();
+        EcalCrystalPositionCollection positions = mgr.getCachedConditions(EcalCrystalPositionCollection.class,
+                "ecal_crystal_positions").getCachedData();
+        EcalChannelCollection channels = mgr.getCachedConditions(EcalChannelCollection.class,
+                "ecal_channels").getCachedData();
+        
+        LOGGER.info("Read " + positions.size() + " ECal crystal positions from conditions database.");
+        
+        // Loop over crystal positions.
+        for (EcalCrystalPosition position : positions) {
+            
+            int channelId = position.getChannelId();
+            EcalChannel channel = channels.findChannel((long) channelId);
+            int iy = channel.getY();
+            int ix = channel.getX();                                    
+            String baseName = "crystal" + ix + "_" + iy;
+            
+            // z axis rotation parameter of the whole module
+            double zrot_cry = rotBot[0];
+            Transformations trans = transBot;
+            if (iy > 0) {
+                // z axis rotation parameter of entire module
+                zrot_cry = rotTop[0];
+                trans = transTop;
+            }
+            
+            Geant4Position g4pos = trans.transformToGeant4(position, channel);
+            double[] centerxyz = g4pos.getCenterArr();
+            double[] thetaxyz = g4pos.getTaitBryanAngles();
 
-                // z axis rotation parameter of the whole module
-                double zrot_cry = rot_bot[0];
-                String baseName = "crystal" + ix + "-" + iy;
+            // Transform of crystal.
+            Position ipos = new Position(baseName + "_pos", centerxyz[0], centerxyz[1], centerxyz[2]);
+            Rotation irot = new Rotation(baseName + "_rot", thetaxyz[0], thetaxyz[1], thetaxyz[2] - zrot_cry);
+            define.addPosition(ipos);
+            define.addRotation(irot);
 
-                Crystal crystal = botMap.get(String.format("c%d:l%d", ix, iy));
-
-                if (iy > 0) {
-                    crystal = topMap.get(String.format("c%d:l%d", ix, iy));
-                    // z axis rotation parameter of entire module
-                    zrot_cry = rot_top[0];
-                }
-
-                if (crystal == null)
-                    if ((iy == -1 && ix > -11 && ix < -1) || (iy == 1 && ix > -11 && ix < -1))
-                        continue;
-                    else
-                        throw new RuntimeException(iy + " " + ix + " crystal is null.");
-
-                if (crystal.getCrystalG4Pos() == null)
-                    throw new RuntimeException("g4pos of crystal is null.");
-
-                double[] centerxyz = crystal.getCrystalG4Pos().getCenterArr();
-                double[] thetaxyz = crystal.getCrystalG4Pos().getTaitBryanAngles();
-
-                // Transform of crystal.
-                Position ipos = new Position(baseName + "_pos", centerxyz[0], centerxyz[1], centerxyz[2]);
-                Rotation irot = new Rotation(baseName + "_rot", thetaxyz[0], thetaxyz[1], thetaxyz[2] - zrot_cry);
-                define.addPosition(ipos);
-                define.addRotation(irot);
-
-                // Place the crystal.
-                PhysVol CrystalPlacementBot = new PhysVol(crystalLogVol, world, ipos, irot);
-                // Add volume IDs.
-                CrystalPlacementBot.addPhysVolID("system", system);
-                CrystalPlacementBot.addPhysVolID("ix", ix);
-                CrystalPlacementBot.addPhysVolID("iy", iy);
-
-            }
-
-        }
+            // Place the crystal with volume IDs.
+            PhysVol CrystalPlacementBot = new PhysVol(crystalLogVol, world, ipos, irot);
+            CrystalPlacementBot.addPhysVolID("system", system);
+            CrystalPlacementBot.addPhysVolID("ix", ix);
+            CrystalPlacementBot.addPhysVolID("iy", iy);
+            
+            // Debug print all info about physvol.
+            LOGGER.fine("Created physvol for crystal (" + ix + ", " + iy + "); channel ID " + channelId 
+                    + "; pos (" + centerxyz[0] + ", " + centerxyz[1] + ", " + centerxyz[2] 
+                    + "); rot (" + thetaxyz[0] + ", " + thetaxyz[1] + ", " + (thetaxyz[2] - zrot_cry) + ")");
+        }      
     }
-
+           
     public boolean isCalorimeter() {
         return true;
     }