Author: [log in to unmask] Date: Wed May 4 16:15:15 2016 New Revision: 4350 Log: Crystal positions now are read from database, some comments added, minor modifications Added: java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/geo2015/geoutils/GVector.java - copied, changed from r4349, java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/geo2015/geoutils/Vector.java java/branches/HPSJAVA-409/detector-model/src/test/java/org/hps/detector/ecal/EcalTransformationsTest.java - copied, changed from r4349, java/branches/HPSJAVA-409/detector-model/src/test/java/org/hps/detector/ecal/EcalCrystalPositionTest.java Removed: java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/geo2015/geoutils/Vector.java Modified: 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/StatFunUtils.java java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/geo2015/crystal/Crystal.java 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/Geant4Position.java 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/EcalNominal.java 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/Transformations.java java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/geo2015/geoutils/ (props changed) 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/Line.java 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/lcsim/detector/converter/compact/HPSEcal4Converter.java java/branches/HPSJAVA-409/detector-model/src/main/java/org/lcsim/geometry/compact/converter/lcdd/HPSEcal4.java java/branches/HPSJAVA-409/detector-model/src/test/java/org/hps/detector/ecal/EcalCrystalPositionTest.java java/branches/HPSJAVA-409/detector-model/src/test/java/org/lcsim/detector/converter/compact/HPSEcal4ConverterTest.java java/branches/HPSJAVA-409/detector-model/src/test/java/org/lcsim/geometry/compact/converter/lcdd/HPSEcal4LCDDTest.java Modified: 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/geo2015/base/DataLoader.java Wed May 4 16:15:15 2016 @@ -18,7 +18,7 @@ /** * Class to read the data from a file - * @author SA + * @author Annie Simonyan [log in to unmask] */ public class DataLoader { Modified: 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/geo2015/base/StatFunUtils.java Wed May 4 16:15:15 2016 @@ -1,26 +1,22 @@ package org.hps.detector.ecal.geo2015.base; /** - * Some static functions, well, just one + * Some static functions which I couldn't find in java standard libraries * - * @author SA + * @author Annie Simonyan [log in to unmask] */ public class StatFunUtils { /***** - * Function to doubles to rounds up the value to 'places' digits after the "," + * Function for double to round up the arg. value to 'places' digits after the semicolon ******/ public static double round(double value, int places) { if (places < 0 || places > 16) { throw new IllegalArgumentException(); } - long factor = (long) Math.pow(10, places); - // System.out.println(factor+" val = "+value); + long factor = (long) Math.pow(10, places); value = value * factor; - // System.out.println("again "+value); - long tmp = Math.round(value); - // System.out.println("tmp = "+tmp); - // System.out.println((double) tmp / factor); + long tmp = Math.round(value); return (double) tmp / factor; } Modified: java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/geo2015/crystal/Crystal.java ============================================================================= --- java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/geo2015/crystal/Crystal.java (original) +++ java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/geo2015/crystal/Crystal.java Wed May 4 16:15:15 2016 @@ -1,39 +1,65 @@ package org.hps.detector.ecal.geo2015.crystal; + +/* + * This class describes a single crystal + * as an object with layer and column number (Y and X in ECal) and position coordinates in geant4 convention, + * (it's center (x,y,z) coordinates and Tait-Bryan (phi, theta, psi) angles to define rotation) + * + * @author Annie Simonyan [log in to unmask] + */ + public class Crystal { - private int layer; - private int column; - private Geant4Position pos; + private int layer; //crystal Y(row) (-5;5) + private int column; //crystal X(column) (-23;23) + private Geant4Position pos; //crystal position in Geant4 convention + //arguments for constructor are + //1 int-X crystal column number (-23;23), exclude 0 + //2 int-Y crystal row number (-5;5). exclude 0 + //3 Geant4Position - crystal position coordinates in geant4 convention, + //(it's center (x,y,z) coordinates and Tait-Bryan (phi, theta, psi) angles to define rotation) public Crystal(int icol, int ilayer, Geant4Position ipos) { this.layer = ilayer; this.column = icol; this.pos = ipos; } + //returns crystal position coordinates in geant4 convention, + //(it's center (x,y,z) coordinates and Tait-Bryan (phi, theta, psi) angles to define rotation) public Geant4Position getCrystalG4Pos() { return this.pos; } + //returns crystal Y(row) number (-5;5), except 0 public int getLayer() { return this.layer; } + ///returns crystal X(column) number (-23;23), except 0 public int getColumn() { return this.column; } + //set crystal Y(row) number (-5;5), except 0 public void setLayer(int ilayer) { this.layer = ilayer; } + //set crystal X(column) number (-23;23), except 0 public void setColumn(int icol) { this.column = icol; } + //set crystal position coordinates in geant4 convention, + //(it's center (x,y,z) coordinates and Tait-Bryan (phi, theta, psi) angles to define rotation) public void setG4Position(Geant4Position ipos) { this.pos = ipos; } - + + //returns crystal attributes as String - (X,Y)Geant4Position + public String toString(){ + return ("("+column+","+layer+")"+ pos.toString()); + } } Modified: 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/geo2015/crystal/CrystalTaitBryanAngleCalculator.java Wed May 4 16:15:15 2016 @@ -4,30 +4,39 @@ */ package org.hps.detector.ecal.geo2015.crystal; -import org.hps.detector.ecal.geo2015.geoutils.Vector; +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 - * state-parallel to Z axis To final state-defined by 2 points in front and back faces. - * - * @author SA + * Calculates Euler(actually Tait-Bryan) angles for a rotation, that transfers the crystal from it's initial + * state-parallel to Z axis To final state-defined by 2 center points in front and back faces of the crystal. + * for information about Tait-Bryan angles look here: http://sedris.org/wg8home/Documents/WG80485.pdf + * + * phi - rotation angle around x + * theta - rotation angle around y + * psi - rotation angle around z + * + * @author Annie Simonyan [log in to unmask] */ public 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 - private static final Vector ini = new Vector(0, 0, 1); - - private Vector fin; + private GVector fin; //final state vector private double cosTheta = 0; private double sinTheta = 0; private double cosPhi = 0; private double sinPhi = 0; - public CrystalTaitBryanAngleCalculator(Vector vec_fin) { + + //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) { @@ -38,6 +47,7 @@ this.theta = this.CalcTheta(); } + //calculates phi angle private double CalcPhi() { sinPhi = -fin.y; @@ -46,6 +56,8 @@ return Math.asin(this.sinPhi); } + + //calculates theta angle after phi is calculated private double CalcTheta() { if (this.cosPhi == 0) @@ -56,16 +68,24 @@ return Math.asin(this.sinTheta); } + + //returns value of theta in rad public double getTheta() { return this.theta; } + //returns value of phi anlge in rad public double getPhi() { return this.phi; } - + + //returns value of psi angle in rad public double getPsi() { return this.psi; } - + + //returns Tait-Bryan angles as a String in the format of (phi, theta, psi) + public String toString(){ + return ("("+this.phi+","+this.theta+","+this.psi+")"); + } } Modified: 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/geo2015/crystal/Geant4Position.java Wed May 4 16:15:15 2016 @@ -1,63 +1,75 @@ package org.hps.detector.ecal.geo2015.crystal; -import org.hps.detector.ecal.geo2015.geoutils.Vector; +import java.util.logging.Logger; +import org.hps.detector.ecal.geo2015.geoutils.GVector; + /** * 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 + * or look here: http://sedris.org/wg8home/Documents/WG80485.pdf + * Brief: + * phi-rotation around X + * theta-rotation around Y + * psi-rotation around Z * - * @author SA + * @author Annie Simonyan [log in to unmask] */ public class Geant4Position { - private Vector centerPoint; - private Vector crysvec; - private double[] taitbriangles; // { phi,theta,psi=0}; - private double[] center_arr; + 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 + private double[] taitbriangles; // { phi,theta,psi=0}; Tait-Bryan angles to define crystal orientation in the space + private double[] centerArr; //crystal center coordinates as a double[3] array - public Geant4Position(Vector point1, Vector point2) { - - if (point1 == null || point2 == null) - System.err.println("The arguments can't be 0."); - + //contsructor arguments + //1 Vector - (x,y,z) of crystal front face center point as Vector + //2 Vector - (x,y,z) of crystal back face center point as Vector + public Geant4Position(GVector point1, GVector point2) { centerPoint = point2.Add(point1).Multiply(0.5); - center_arr = new double[3]; - center_arr[0] = centerPoint.x; - center_arr[1] = centerPoint.y; - center_arr[2] = centerPoint.z; + centerArr = new double[3]; + centerArr[0] = centerPoint.x; + centerArr[1] = centerPoint.y; + centerArr[2] = centerPoint.z; crysvec = (point2.Substract(centerPoint)).getUnitVector(); - System.out.println("*************** center unit vector **********"); - crysvec.Print(); - System.out.println("*********************************************"); + LOGGER.info("*************** center unit vector **********"); + LOGGER.info(crysvec.toString()); + LOGGER.info("*********************************************"); taitbriangles = new double[3]; this.TaitBryanAnglesforCrys(); } - public Vector getCenter() { + //returns the center coordinates as a Vector + public GVector getCenter() { return this.centerPoint; } + //returns center coordinates as an array of doubles public double[] getCenterArr() { - double[] center_arr = {centerPoint.x, centerPoint.y, centerPoint.z}; - return center_arr; + return centerArr; } + //returns Tait-Bryan angles as an array of doubles [phi, theta, psi] public double[] getTaitBryanAngles() { return this.taitbriangles; } - private void TaitBryanAnglesforCrys() { + //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{ CrystalTaitBryanAngleCalculator crysTBang = new CrystalTaitBryanAngleCalculator(crysvec); /* * please vec should go from the center, even though it's not changing much */ - if (crysTBang.getPhi() == Double.NaN) { - System.out.print("chert: Phi is undefined\n"); + if (crysTBang.getPhi() == Double.NaN) { this.taitbriangles[0] = -111111; + throw new ArithmeticException("chert: Phi is undefined\n"); } else { this.taitbriangles[0] = -crysTBang.getPhi(); } @@ -65,11 +77,18 @@ 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 + public String toString(){ + return ("\"Crys Center coordinates:\\t\""+this.centerPoint.toString()+"Tait Brian angles phi = " + Math.toDegrees(this.taitbriangles[0]) + "\t theta = " + + Math.toDegrees(this.taitbriangles[1]) + "\t psi = " + Math.toDegrees(this.taitbriangles[2]) + "\n"); + } } Modified: 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/geo2015/ecal/ECalRotationCalculator.java Wed May 4 16:15:15 2016 @@ -1,28 +1,39 @@ package org.hps.detector.ecal.geo2015.ecal; -import org.hps.detector.ecal.geo2015.geoutils.Vector; +import org.hps.detector.ecal.geo2015.geoutils.GVector; import org.hps.detector.ecal.geo2015.base.StatFunUtils; /* - * This class will calculate rotation angles of ECal modules plane (4 measuring - * points), for ecal conditions + * 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 SA + * @author Annie Simonyan */ public class ECalRotationCalculator { - private Vector 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; - private double a = 0.0, b = 0, c = 0; + 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 + //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(); @@ -60,8 +71,9 @@ calcGamma(); calcAlpha(); - } + }; + //Calculate gamma rotation angle private void calcGamma() { double tg_gamma = 0.0; @@ -76,6 +88,7 @@ } + //calculate alpha rotation angle private void calcAlpha() { double ham = (a * a0 - b * (b0 * Math.cos(gamma) - c0 * Math.sin(gamma))); @@ -86,21 +99,20 @@ alpha = Math.PI-alpha; } + //return value of alpha - rotatoin around Z public double getAlpha() { return this.alpha; } + //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 private boolean checkNormals() { - if (Double.compare(StatFunUtils.round(n_ini.Module(),12),1.0)==0 && Double.compare(StatFunUtils.round(n_fin.Module(),12),1.0)==0) { - return true; - } - - return false; - } + return(Double.compare(StatFunUtils.round(n_ini.Module(),12),1.0)==0 && Double.compare(StatFunUtils.round(n_fin.Module(),12),1.0)==0); + } } Modified: 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/geo2015/ecal/EcalNominal.java Wed May 4 16:15:15 2016 @@ -1,16 +1,12 @@ -/* - * 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.ecal; import org.hps.detector.ecal.geo2015.geoutils.Plane; -import org.hps.detector.ecal.geo2015.geoutils.Vector; +import org.hps.detector.ecal.geo2015.geoutils.GVector; /** - * - * @author AS + * This class holds the nominal(by initial design) coordinates for 4 measuring points of each ecal module + * + * @author Annie Simonyan ([log in to unmask]) */ public class EcalNominal { @@ -21,10 +17,10 @@ public static final double[] Ctop = {517.38, 230.79, 933.73}; //(x,y,z) point C initial public static final double[] Dtop = {517.38, 230.79, 1083.73}; //(x,y,z) point D initial - public static final Vector AtopVec = new Vector(Atop); - public static final Vector BtopVec = new Vector(Btop); - public static final Vector CtopVec = new Vector(Ctop); - public static final Vector DtopVec = new Vector(Dtop); + public static final GVector AtopVec = new GVector(Atop); + public static final GVector BtopVec = new GVector(Btop); + public static final GVector CtopVec = new GVector(Ctop); + public static final GVector DtopVec = new GVector(Dtop); //Nominal plane of top module @@ -38,10 +34,10 @@ public static final double[] Cbot = {517.38, -230.93, 933.73}; //(x,y,z) point C initial public static final double[] Dbot = {517.38, -230.93, 1083.73}; //(x,y,z) point D initial - public static final Vector AbotVec = new Vector(Abot); - public static final Vector BbotVec = new Vector(Bbot); - public static final Vector CbotVec = new Vector(Cbot); - public static final Vector DbotVec = new Vector(Dbot); + public static final GVector AbotVec = new GVector(Abot); + public static final GVector BbotVec = new GVector(Bbot); + public static final GVector CbotVec = new GVector(Cbot); + public static final GVector DbotVec = new GVector(Dbot); //Nominal plane of bottom module public static Plane plABCDbot_ini = new Plane(Abot, Bbot, Cbot); Modified: 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/geo2015/ecal/EcalSurveyData.java Wed May 4 16:15:15 2016 @@ -6,12 +6,12 @@ package org.hps.detector.ecal.geo2015.ecal; import org.hps.detector.ecal.geo2015.geoutils.Plane; -import org.hps.detector.ecal.geo2015.geoutils.Vector; +import org.hps.detector.ecal.geo2015.geoutils.GVector; /** * Class to hold the survey results (positions of 4 targets of calorimeter in the hall) * I agree, probably not the best idea to have a class as a "data-holder" - * @author SA + * @author Annie Simonyan */ public class EcalSurveyData { @@ -22,10 +22,10 @@ public static final double[] Ctop = {517.38, 230.79, 933.73}; //(x,y,z) point C initial public static final double[] Dtop = {517.38, 230.79, 1083.73}; //(x,y,z) point D initial - public static final Vector AtopVec = new Vector(Atop); - public static final Vector BtopVec = new Vector(Btop); - public static final Vector CtopVec = new Vector(Ctop); - public static final Vector DtopVec = new Vector(Dtop); + public static final GVector AtopVec = new GVector(Atop); + public static final GVector BtopVec = new GVector(Btop); + public static final GVector CtopVec = new GVector(Ctop); + public static final GVector DtopVec = new GVector(Dtop); //Survey measurements for top module public static final double[] topAsur = {-298.67, 233.7, 939.11}; //{x,y,z} point Atop final=measured=from survey @@ -33,10 +33,10 @@ public static final double[] topCsur = {516.53, 233.26, 938.25}; //(x,y,z) point C final public static final double[] topDsur = {517.07, 233.24, 1088.29}; //(x,y,z) point D final - public static final Vector topAsurVec = new Vector(topAsur); - public static final Vector topBsurVec = new Vector(topBsur); - public static final Vector topCsurVec = new Vector(topCsur); - public static final Vector topDsurVec = new Vector(topDsur); + public static final GVector topAsurVec = new GVector(topAsur); + public static final GVector topBsurVec = new GVector(topBsur); + public static final GVector topCsurVec = new GVector(topCsur); + public static final GVector topDsurVec = new GVector(topDsur); //Nominal plane of top module public static Plane plABCDtop_ini = new Plane(Atop, Btop, Ctop); @@ -76,10 +76,10 @@ public static final double[] Cbot = {517.38, -230.93, 933.73}; //(x,y,z) point C initial public static final double[] Dbot = {517.38, -230.93, 1083.73}; //(x,y,z) point D initial - public static final Vector AbotVec = new Vector(Abot); - public static final Vector BbotVec = new Vector(Bbot); - public static final Vector CbotVec = new Vector(Cbot); - public static final Vector DbotVec = new Vector(Dbot); + public static final GVector AbotVec = new GVector(Abot); + public static final GVector BbotVec = new GVector(Bbot); + public static final GVector CbotVec = new GVector(Cbot); + public static final GVector DbotVec = new GVector(Dbot); //Survey measurements for top module public static final double[] botAsur = {-299.94, -232.07, 937.16}; //{x,y,z} point Atop final=measured=from survey @@ -87,10 +87,10 @@ public static final double[] botCsur = {517.21, -231.41, 935.97}; //(x,y,z) point C final public static final double[] botDsur = {517.44, -231.45, 1086.01}; //(x,y,z) point D final - public static final Vector botAsurVec = new Vector(botAsur); - public static final Vector botBsurVec = new Vector(botBsur); - public static final Vector botCsurVec = new Vector(botCsur); - public static final Vector botDsurVec = new Vector(botDsur); + public static final GVector botAsurVec = new GVector(botAsur); + public static final GVector botBsurVec = new GVector(botBsur); + public static final GVector botCsurVec = new GVector(botCsur); + public static final GVector botDsurVec = new GVector(botDsur); //Nominal plane of top module public static Plane plABCDbot_ini = new Plane(Abot, Bbot, Cbot); Modified: 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/geo2015/ecal/Transformations.java Wed May 4 16:15:15 2016 @@ -1,172 +1,208 @@ -/* - * 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.ecal; -import org.hps.detector.ecal.geo2015.geoutils.Vector; -import org.hps.detector.ecal.geo2015.base.DataLoader; +import org.hps.detector.ecal.geo2015.geoutils.GVector; import org.hps.detector.ecal.geo2015.crystal.Crystal; import org.hps.detector.ecal.geo2015.crystal.Geant4Position; -import java.io.File; -import java.io.IOException; +import java.io.FileNotFoundException; +import java.io.PrintStream; import java.util.Map; import java.util.HashMap; +import java.util.logging.Level; +import java.util.logging.Logger; +import org.hps.conditions.database.DatabaseConditionsManager; +import org.hps.conditions.ecal.EcalChannel; +import org.hps.conditions.ecal.EcalCrystalPosition; +import org.lcsim.conditions.ConditionsManager; +import org.lcsim.detector.converter.compact.HPSEcal3Converter; /** - * 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 :/ - * - * @author SA + * 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 :/ + * + * @author Annie Simonyan [log in to unmask] */ public class Transformations { - public Vector transVec; - public double[] rotation; - private String module;// top or bottom or all - private Vector CMvec_nom_top = new Vector(109.88, 230.79, 1008.73); - private Vector CMvec_nom_bot = new Vector(109.88, -230.79, 1008.73); - - private Map<String, Crystal> crystalMap; - - public Transformations(String module, double[] trans, double[] rot) { - System.out.println(module); - System.out.println("trans arg " + trans[0] + "\t" + trans[1] + "\t" + trans[2]); - System.out.println("rot arg " + rot[0] + "\t" + rot[1] + "\t" + rot[2]); - this.transVec = new Vector(trans); - transVec.Print(); + public static Logger LOGGER = Logger.getLogger(HPSEcal3Converter.class.getPackage().getName()); + + public GVector transVec; //vector of translation + public double[] rotation; // rotation + + private String module;// name "top" or "bottom" to tranform Ecal top or bottom module respectively + + private final GVector CMvec_nom_top = new GVector(109.88, 230.79, 1008.73); //geometrically defined center mass of top module + private final GVector CMvec_nom_bot = new GVector(109.88, -230.79, 1008.73); //geometrically defined center mass of bottom module + + + private Map<String, Crystal> crystalMap; //Map of crystals with key = ("c#column:l#layer") + + //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) throws ConditionsManager.ConditionsNotFoundException { + 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])); + this.transVec = new GVector(trans); + LOGGER.info(transVec.toString()); this.rotation = rot; - System.out.println("rotation " + this.rotation[0] + "\t" + this.rotation[1] + "\t" + this.rotation[2]); + 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 (IOException e) { - System.err.print("Can't do transformations, for some reason " + crystalMap.size()); - } + } + catch (FileNotFoundException ex) { + Logger.getLogger(Transformations.class.getName()).log(Level.SEVERE, null, ex); + } + } + //returns the map of crystals public Map<String, Crystal> getCrystalMap() { return this.crystalMap; } - private void makeTransformation() throws IOException { - DataLoader data = new DataLoader(); - - data.setSplitSimbol("\t"); - data.LoadData("/projet/nucleon2/annie/HPS/withHPS_Java/SENA/hps_trunk_dev/HPSJAVA_409anothercopy02_02_2016/detector-model/src/main/java/org/hps/detector/ecal/geo2015/data/Crystal_COORDINATES_relTarget.txt"); - System.out.println("FILE PATHHHHHH " + (new File(".").getAbsolutePath().toString())); - System.out.println("FILE PATH11111 " + System.getProperty("user.dir") - + "/src/main/java/org/hps/detector/ecal/geo2015/data/Crystal_COORDINATES_relTarget.txt"); - - // data.LoadData(System.getProperty("user.dir")+"/src/main/java/org/hps/detector/ecal/geo2015/data/Crystal_COORDINATES_relTarget.txt"); - // data.LoadData(FileSystems.getDefault().getPath("data", "Crystal_COORDINATES_relTarget.txt").toString()); - System.out.println("Number of coloms read from the file = " + data.getNumberCols()); - - Double[] N = data.getColumn(0); - Double[] layer = data.getColumn(1); - Double[] col = data.getColumn(2); - Double[] Xfront = data.getColumn(3); - Double[] Yfront = data.getColumn(4); - Double[] Zfront = data.getColumn(5); - Double[] Xback = data.getColumn(6); - Double[] Yback = data.getColumn(7); - Double[] Zback = data.getColumn(8); - - // data.Print(); - Vector[] frontXYZ = new Vector[N.length]; - Vector[] backXYZ = new Vector[N.length]; - - Vector CMvec_nom = new Vector(); - - /* - * File wfile = new File("../data/output_relTarget.txt"); FileWriter fw = new - * FileWriter(wfile.getAbsoluteFile()); BufferedWriter bw = new BufferedWriter(fw); bw.write( - * "#column /t #layer /t #front_faceX /t #front_faceY /t #front_faceZ /t #back_faceX /t #back_faceY /t #back_faceZ \n" - * ); - */ - // translate the coordinate system to CM - for (int loop = 0; loop < N.length; loop++) { - - if (this.module.compareToIgnoreCase("bottom") == 0 && layer[loop] > 0) { + //does all the transformatios initiated in constructor + private void makeTransformation() throws FileNotFoundException, ConditionsManager.ConditionsNotFoundException{ + //trying to access database to read ecal crystal positions and channels + try { + + //initializing database access + DatabaseConditionsManager mgr = DatabaseConditionsManager.getInstance(); + EcalCrystalPosition.EcalCrystalPositionCollection positions + = mgr.getCachedConditions(EcalCrystalPosition.EcalCrystalPositionCollection.class, "ecal_crystal_positions").getCachedData(); + + EcalChannel.EcalChannelCollection channels + = mgr.getCachedConditions(EcalChannel.EcalChannelCollection.class, "ecal_channels").getCachedData(); + + //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(); + + /* + * File wfile = new File("../data/output_relTarget.txt"); FileWriter + * fw = new FileWriter(wfile.getAbsoluteFile()); BufferedWriter bw = + * new BufferedWriter(fw); bw.write( "#column /t #layer /t + * #front_faceX /t #front_faceY /t #front_faceZ /t #back_faceX /t + * #back_faceY /t #back_faceZ \n" ); + */ + // 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; + // 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 vectors are 0? really? Should never ever happen, contact the author."); + } + + //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()); } - frontXYZ[loop] = new Vector(Xfront[loop], Yfront[loop], Zfront[loop]); - backXYZ[loop] = new Vector(Xback[loop], Yback[loop], Zback[loop]); - - System.out.println("Initial position"); - frontXYZ[loop].Print(); - backXYZ[loop].Print(); - - 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); - - CMvec_nom.Print(); - System.out.println("after translation to CM COO-system"); - // frontXYZ[loop].Print(); - // backXYZ[loop].Print(); - - // / 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]); - - System.out.println("after module plane rotation"); - // frontXYZ[loop].Print(); - // backXYZ[loop].Print(); - - // Translate modules by the translation vector the diff of CM - frontXYZ[loop] = frontXYZ[loop].TranslateBy(transVec); - backXYZ[loop] = backXYZ[loop].TranslateBy(transVec); - - System.out.println("after translation by survey shift"); - // frontXYZ[loop].Print(); - // backXYZ[loop].Print(); - - // / Translate back to initial coordinate system - frontXYZ[loop] = frontXYZ[loop].TranslateBy(CMvec_nom); - backXYZ[loop] = backXYZ[loop].TranslateBy(CMvec_nom); - System.out.println("after translation back to initial system"); - frontXYZ[loop].Print(); - backXYZ[loop].Print(); - - /* - * 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) - System.err.println("The vectors are 0? really? Should never happen"); - - Geant4Position g4pos = new Geant4Position(frontXYZ[loop], backXYZ[loop]); - - crystalMap.put(String.format("c%d:l%d", col[loop].intValue(), layer[loop].intValue()), new Crystal( - col[loop].intValue(), layer[loop].intValue(), g4pos)); - System.out.println("icol = " + col[loop].intValue() + " ilay = " + layer[loop].intValue()); - g4pos.Print(); - } - System.err.println("Number of map content Transformations " + crystalMap.size()); - + LOGGER.info(("Number of crystal map content after transformations in the "+this.module+" module = " + crystalMap.size())); + } + catch (RuntimeException e) { + e.printStackTrace(new PrintStream("Database manager object was not initialized properly or required data were not cached.")); + } } } Modified: 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/geo2015/geoutils/CenterMass.java Wed May 4 16:15:15 2016 @@ -5,10 +5,10 @@ package org.hps.detector.ecal.geo2015.geoutils; /** - * The Class is implemented to calculate not fairly called "center mass" Defined as a Point with a coordinates as - * arithmetical mean of the corresponding coordinates of points-arguments + * 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 AS + * @author Annie Simonyan [log in to unmask] */ public class CenterMass { @@ -19,9 +19,9 @@ } /* - * Meaningful constructor :D with Vectors as argument for 4 points only + * Meaningful constructor, with Vvectors as argument for 4 points only */ - public CenterMass(Vector pointA, Vector pointB, Vector pointC, Vector pointD) { + 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; @@ -45,24 +45,32 @@ zc = zc / N; } - private double xc = 0., yc = 0., zc = 0.; + private double xc = 0., yc = 0., zc = 0.; //coordinates of center mass + //returns X coordinate of center mass public double getCMx() { return xc; } + + //returns Y coordinate of center mass public double getCMy() { return yc; } + + //reutrns Z coordinate of center mass public double getCMz() { return zc; } - public Vector getCMvector() { - return (new Vector(xc, yc, zc)); + //returns (X,Y,Z) coordinates of center mass as a Vvector object + public GVector getCMvector() { + return (new GVector(xc, yc, zc)); } + + //returns (X,Y,Z) coordinates of center mass as an array of doubles public double[] getCMarray() { double[] center = {this.xc, this.yc, this.zc}; return center; Copied: java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/geo2015/geoutils/GVector.java (from r4349, java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/geo2015/geoutils/Vector.java) ============================================================================= --- java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/geo2015/geoutils/Vector.java (original) +++ java/branches/HPSJAVA-409/detector-model/src/main/java/org/hps/detector/ecal/geo2015/geoutils/GVector.java Wed May 4 16:15:15 2016 @@ -1,33 +1,40 @@ -/* - * 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; +import hep.physics.vec.BasicHep3Vector; import org.hps.detector.ecal.geo2015.base.StatFunUtils; + /** - * Define Vector in a 3D coordinate system operations and manipulations with the characteristics of the line + * To define a vector in (XYZ) coordinate system as a geometrical object, + * define operations, manipulations with the vectors + * This class is similar to HepVector * - * @author AS + * @author Annie Simonyan [log in to unmask] */ -public class Vector { +public class GVector { public double x = 0, y = 0, z = 0; private double[] vec; - public Vector() { + //default constructor + public GVector() { } - public Vector(double[] array) { + //constructor: argument - double[3]={x,y,z} array for vector coordinates + public GVector(double[] array) { vec = array; this.x = array[0]; this.y = array[1]; this.z = array[2]; } - public Vector(double x, double y, double z) { + //converts this Vvector to BasicHep3Vector + public BasicHep3Vector getHepVector(){ + return new BasicHep3Vector(this.x, this.y, this.z); + } + + //constructor: arguments - double(x,y,z) coordinates of vector + public GVector(double x, double y, double z) { this.x = x; this.y = y; this.z = z; @@ -38,63 +45,80 @@ } + //set vector x coordinate public void SetX(double x) { this.x = x; } + //set vector y coordinate public void SetY(double y) { this.y = y; } + + //set vector z coordinate public void SetZ(double z) { this.z = z; } + //set vector (x,y,z) coordinates public void SetXYZ(double x, double y, double z) { this.x = x; this.y = y; this.z = z; } + //check if the vector is unit vector public boolean isUnitary() { return (Double.compare(StatFunUtils.round(this.Module(), 12), 1.0) == 0); } - // /Vector Module + //returns the module of the vector public double Module() { return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z); } - public Vector Multiply(double k) { + //vector multiplication by cooficent k + public GVector Multiply(double k) { - return (new Vector(k * this.x, k * this.y, k * this.z)); + return (new GVector(k * this.x, k * this.y, k * this.z)); } - public Vector Add(Vector vec2) { + //returns new vector = sum of this vector and argument vec2 + public GVector Add(GVector vec2) { - return (new Vector(this.x + vec2.x, this.y + vec2.y, this.z + vec2.z)); + return (new GVector(this.x + vec2.x, this.y + vec2.y, this.z + vec2.z)); } - public Vector getOpposite() { - return (new Vector(-this.x, -this.y, -this.z)); + //returns new vector opposite to this vector + public GVector getOpposite() { + return (new GVector(-this.x, -this.y, -this.z)); } - public Vector Substract(Vector vec2) { + //returns new vector = this vector - argument vector + public GVector Substract(GVector vec2) { - return (new Vector(this.x - vec2.x, this.y - vec2.y, this.z - vec2.z)); + return (new GVector(this.x - vec2.x, this.y - vec2.y, this.z - vec2.z)); } - public Vector TranslateBy(Vector trvec) { + //returns new vector defined as translation of this vector by argument vector + public GVector TranslateBy(GVector trvec) { // return this.Substract(trvec); return this.Add(trvec); } /* - * Rotation as Rz-alpha Ry-beta Rx-gamma + * Returns new vector = this vector rotated by (alpha, betta, gamma) rotation + * (Rz-alpha,Ry-beta,Rx-gamma) + * + * Vector rotation defined as: + * alpha-rotation around Z axis + * beta-rotation around Y axis + * gamma-rotation around X axis */ - public Vector RotateBy(double alpha, double betta, double gamma) { + public GVector RotateBy(double alpha, double betta, double gamma) { double cos_alpha = Math.cos(alpha); double sin_alpha = Math.sin(alpha); @@ -115,16 +139,16 @@ double zz = this.x * (-sin_betta) + this.y * (cos_betta * sin_gamma) + this.z * (cos_betta * cos_gamma); - return (new Vector(xx, yy, zz)); + return (new GVector(xx, yy, zz)); } - // Scaliar multiplication of vectors - public double ScaliarM(Vector vec2) { + // returns scaliar multiplication of vectors + public double ScaliarM(GVector vec2) { return this.x * vec2.x + this.y * vec2.y + this.z * vec2.z; } - // angle between vectors - public double Angle(Vector vec2) { + //returns angle between vectors in rad + public double Angle(GVector vec2) { // System.out.print("Scaliar= "+this.ScaliarM(vec2) +" modN1 = "+this.Module()+" modN2 = "+vec2.Module()+"\n"); // System.out.print(this.ScaliarM(vec2)/(this.Module()*vec2.Module())+ "\n"); // System.out.println(Math.acos(this.ScaliarM(vec2)/(this.Module()*vec2.Module()))); @@ -139,20 +163,30 @@ return Math.acos(cosAlpha); } + //returns coordinates of this vector as an array of doubles public double[] getVector() { return this.vec; } - public Vector getUnitVector() { - return new Vector(this.x / this.Module(), this.y / this.Module(), this.z / this.Module()); + //returns new vector, which is unit vector of this vector + public GVector getUnitVector() { + return new GVector(this.x / this.Module(), this.y / this.Module(), this.z / this.Module()); } - public Vector getCenter() { + + //returns the center coordinates of this vector as a Vvector object + public GVector getCenter() { return (this.Multiply(0.5)); } + //Print the coordinates of the Vector as (x,y,z) public void Print() { System.out.println("(" + this.x + ", " + this.y + ", " + this.z + ")"); } + + //returns coordinates of the vector as a String "(x,y,z)" + public String toString(){ + return ("(" + this.x + ", " + this.y + ", " + this.z + ")"); + } } Modified: 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/geo2015/geoutils/Line.java Wed May 4 16:15:15 2016 @@ -6,17 +6,17 @@ package org.hps.detector.ecal.geo2015.geoutils; /** - * @author AS + * @author Annie Simonyan */ public class Line { // private double a=0, b=0, c=0; //ax+by+c=0 - private Vector vec_n; // napravlyayushiy vector + private GVector vec_n; // napravlyayushiy vector private double[] point; // Define a line with a vector and a point it goes through - public Line(Vector vec, double x, double y, double z) { - this.setVec_n(new Vector(vec.x, vec.y, vec.z)); + public Line(GVector vec, double x, double y, double z) { + this.setVec_n(new GVector(vec.x, vec.y, vec.z)); point = new double[3]; point[0] = x; point[1] = y; @@ -24,21 +24,21 @@ } // Define a line that goes through 2 points, M0 and M1 - public Line(Vector vecM0, Vector vecM1) { + public Line(GVector vecM0, GVector vecM1) { setVec_n(vecM1.Substract(vecM0)); point = vecM0.getVector(); } - public Vector getCenter(Vector vecM0, Vector vecM1) { + public GVector getCenter(GVector vecM0, GVector vecM1) { return (vecM1.Substract(vecM0)).Multiply(0.5); } - public Vector getVec_n() { + public GVector getVec_n() { return vec_n; } - public void setVec_n(Vector vec_n) { + public void setVec_n(GVector vec_n) { this.vec_n = vec_n; } Modified: 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/geo2015/geoutils/Plane.java Wed May 4 16:15:15 2016 @@ -1,6 +1,8 @@ /* * 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; @@ -11,7 +13,7 @@ // Plane full equation constants private double A, B, C, D; - private Vector normal = new Vector(); + private GVector normal = new GVector(); // Plane as a ranges on XYZ axises private double a = 0., b = 0., c = 0.; @@ -42,9 +44,9 @@ normal.SetXYZ(A, B, C); } - public Vector getNormalUnitVector() { + public GVector getNormalUnitVector() { double mod = normal.Module(); - Vector uNorm = new Vector(normal.x / mod, normal.y / mod, normal.z / mod); + GVector uNorm = new GVector(normal.x / mod, normal.y / mod, normal.z / mod); return uNorm; } @@ -78,7 +80,7 @@ return K; } - public Vector getNormal() { + public GVector getNormal() { return this.normal; } @@ -94,14 +96,14 @@ } public double getAngle(Plane pl2) { - Vector normal2 = pl2.getNormal(); + GVector normal2 = pl2.getNormal(); double angle = this.normal.Angle(normal2); return Math.PI / 2 - angle; } public double getEffAngle(Plane pl2) { - Vector normal2 = pl2.getNormal(); + GVector normal2 = pl2.getNormal(); double angle = this.normal.Angle(normal2); if (angle > (Math.PI / 2.0)) angle = Math.PI - angle; @@ -169,4 +171,12 @@ public void PrintGeoRanges() { System.out.print("X/(" + this.a + ") + Y/(" + this.b + ") + Z/(" + this.c + ") =1\n"); } + + public String toString(){ + return (this.A + "x + " + "(" + (this.B) + ")" + "y + " + " (" + this.C + ")" + "z + " + "(" + this.D + + ")" + "= 0\n"); + } + public String toStringGeoRanges(){ + return ("X/(" + this.a + ") + Y/(" + this.b + ") + Z/(" + this.c + ") =1\n"); + } } 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 Wed May 4 16:15:15 2016 @@ -1,6 +1,7 @@ package org.lcsim.detector.converter.compact; import java.util.Map; +import java.util.logging.Level; import java.util.logging.Logger; import org.hps.detector.ecal.geo2015.crystal.Crystal; @@ -10,6 +11,7 @@ import org.hps.detector.ecal.HPSEcalDetectorElement; import org.jdom.DataConversionException; import org.jdom.Element; +import org.lcsim.conditions.ConditionsManager; import org.lcsim.detector.IDetectorElement; import org.lcsim.detector.ILogicalVolume; import org.lcsim.detector.IPhysicalVolume; @@ -31,6 +33,14 @@ import org.lcsim.geometry.compact.Subdetector; 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]) + */ + + public class HPSEcal4Converter extends AbstractSubdetectorConverter { private static Logger LOGGER = Logger.getLogger(HPSEcal4Converter.class.getPackage().getName()); @@ -46,150 +56,127 @@ @Override public void convert(final Subdetector subdet, final Detector detector) { - LOGGER.info("converting subdetector " + subdet.getName()); - - helper = subdet.getDetectorElement().getIdentifierHelper(); - dict = helper.getIdentifierDictionary(); - - // Crystal dimensions. - final Element dimensions = subdet.getNode().getChild("dimensions"); - - double dx1, dx2, dy1, dy2, dz; - Element layout; - int nx, ny; - double dface; - - // initial definitions for translation and rotation parameters - double tr_top[] = {-100, -100, -100}; - double tr_bot[] = {-100, -100, -100}; - double rot_top[] = {-100, -100, -100}; - double rot_bot[] = {-100, -100, -100}; - try { - dx1 = dimensions.getAttribute("x1").getDoubleValue(); - dx2 = dimensions.getAttribute("x2").getDoubleValue(); - dy1 = dimensions.getAttribute("y1").getDoubleValue(); - dy2 = dimensions.getAttribute("y2").getDoubleValue(); - dz = dimensions.getAttribute("z").getDoubleValue(); - - 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(); - - 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(); - - 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(); - - 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(); - - layout = subdet.getNode().getChild("layout"); - nx = layout.getAttribute("nx").getIntValue(); - ny = layout.getAttribute("ny").getIntValue(); - dface = layout.getAttribute("dface").getDoubleValue(); - - } catch (final DataConversionException e) { - throw new RuntimeException("Error converting HPSEcal4 from XML.", e); + + 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; + Element layout; + double tr_top[] = {-100, -100, -100}; + double tr_bot[] = {-100, -100, -100}; + double rot_top[] = {-100, -100, -100}; + double rot_bot[] = {-100, -100, -100}; + try { + dx1 = dimensions.getAttribute("x1").getDoubleValue(); + dx2 = dimensions.getAttribute("x2").getDoubleValue(); + dy1 = dimensions.getAttribute("y1").getDoubleValue(); + dy2 = dimensions.getAttribute("y2").getDoubleValue(); + dz = dimensions.getAttribute("z").getDoubleValue(); + + 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(); + + 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(); + + 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(); + + 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(); + + layout = subdet.getNode().getChild("layout"); + + } catch (final DataConversionException e) { + throw new RuntimeException("Error converting HPSEcal4 from XML.", e); + } + final Element mat = subdet.getNode().getChild("material"); + final String materialName = mat.getAttributeValue("name"); + 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())); + 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; + + // loop over columns + for (int ix = -23; ix <= 23; ix++) { + if (ix == 0) { + continue; + } + + // z axis rotation parameter of the whole module + double zrot_cry = rot_bot[0]; + + 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())); + } catch (ConditionsManager.ConditionsNotFoundException ex) { + Logger.getLogger(HPSEcal4Converter.class.getName()).log(Level.SEVERE, null, ex); } - - // Crystal material. - final Element mat = subdet.getNode().getChild("material"); - final String materialName = mat.getAttributeValue("name"); - - // Setup crystal logical volume. - final Trd crystalTrap = new Trd("crystal_trap", dx1, dx2, dy1, dy2, dz); - final ILogicalVolume crystalLogVol = new LogicalVolume("crystal_volume", crystalTrap, MaterialStore - .getInstance().get(materialName)); - - // - // Translate and rotate the modules by the rotation and translation vectors - // defined in compact.xml file, or by default? - // it's not really clear what you dear hps user want - // - 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(); - System.err.println("Number of map content " + botMap.size()); - System.err.println("Number of map content " + topMap.size()); - - // Base name for volume. - final String baseName = subdet.getName() + "_crystal"; - - // World volume. - final ILogicalVolume mom = detector.getWorldVolume().getLogicalVolume(); - // crystal counter - int crystaln = 1; - - // loop over layers - for (int iy = -5; iy <= 5; iy++) { - if (iy == 0) - continue; - - // loop over columns - for (int ix = -23; ix <= 23; ix++) { - if (ix == 0) { - continue; - } - - // z axis rotation parameter of the whole module - double zrot_cry = rot_bot[0]; - - 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) - if ((iy == -1 && ix > -11 && ix < -1) || (iy == 1 && ix > -11 && ix < -1)) - continue; - else - System.err.println(iy + " " + ix - + " crystal is null, the map is screwed, the compiler really feels sorry for you."); - - if (crystal.getCrystalG4Pos() == null) - System.err.print("g4pos of crystal is null, the map is screwed, sorry\n"); - - double[] centerxyz = {0, 0, 0}; - double[] thetaxyz = {0, 0, 0}; - if (crystal != null) { - centerxyz = crystal.getCrystalG4Pos().getCenterArr(); - 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++; - - } - } - System.err.println("In HPSEcal4Converter crystal in top module:" + topMap.size() - + " crystals in bottom module: " + botMap.size()); } /** 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 Wed May 4 16:15:15 2016 @@ -1,11 +1,15 @@ package org.lcsim.geometry.compact.converter.lcdd; import java.util.Map; +import java.util.logging.Level; +import java.util.logging.Logger; import org.hps.detector.ecal.geo2015.crystal.Crystal; import org.hps.detector.ecal.geo2015.ecal.Transformations; import org.jdom.Element; import org.jdom.JDOMException; +import org.lcsim.conditions.ConditionsManager; +import org.lcsim.detector.converter.compact.HPSEcal4Converter; import org.lcsim.geometry.compact.converter.lcdd.util.Define; import org.lcsim.geometry.compact.converter.lcdd.util.LCDD; @@ -16,174 +20,130 @@ import org.lcsim.geometry.compact.converter.lcdd.util.Trapezoid; import org.lcsim.geometry.compact.converter.lcdd.util.Volume; + +/* + * For class description contact Jeremy + * For implementatoin details contact Annie + * + * @author Annie Simonyan ([log in to unmask]), Jeremy McCormick ([log in to unmask]) + */ + public class HPSEcal4 extends LCDDSubdetector { - + private static Logger LOGGER = Logger.getLogger(HPSEcal4Converter.class.getPackage().getName()); HPSEcal4(Element node) throws JDOMException { super(node); } void addToLCDD(LCDD lcdd, SensitiveDetector sens) throws JDOMException { - if (sens == null) - throw new RuntimeException("SensitiveDetector parameter points to null."); - - // Crystal dimensions. - 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(); - - // Crystal material. - 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(); - - 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(); - - // Layout parameters. - Element layout = node.getChild("layout"); - double beamgap = 0; - if (layout.getAttribute("beamgap") != null) { - beamgap = layout.getAttribute("beamgap").getDoubleValue(); - } else { - if (layout.getAttribute("beamgapTop") == null || layout.getAttribute("beamgapBottom") == null) { - throw new RuntimeException( - "Missing beamgap parameter in layout element, and beamgapTop or beamgapBottom was not provided."); + try { + if (sens == null) + throw new RuntimeException("SensitiveDetector parameter points to null."); + 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(); + 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(); + Element layout = node.getChild("layout"); + double beamgap = 0; + if (layout.getAttribute("beamgap") != null) { + beamgap = layout.getAttribute("beamgap").getDoubleValue(); + } else { + if (layout.getAttribute("beamgapTop") == null || layout.getAttribute("beamgapBottom") == null) { + throw new RuntimeException( + "Missing beamgap parameter in layout element, and beamgapTop or beamgapBottom was not provided."); + } } - } - - int nx = layout.getAttribute("nx").getIntValue(); - int ny = layout.getAttribute("ny").getIntValue(); - double dface = layout.getAttribute("dface").getDoubleValue(); - - // Setup crystal logical volume. - // dy1=dx1=1.00; dy2=dx2=20.00; dz=50; - Trapezoid crystalTrap = new Trapezoid("crystal_trap", dx1, dx2, dy1, dy2, dz); - Volume crystalLogVol = new Volume("crystal_volume", crystalTrap, lcdd.getMaterial(materialName)); - crystalLogVol.setSensitiveDetector(sens); - - // Set vis attributes on crystal log vol. - setVisAttributes(lcdd, this.getNode(), crystalLogVol); - - // Add shape and log vol to lcdd. - lcdd.add(crystalTrap); - lcdd.add(crystalLogVol); - - // Place crystals in world volume. - Volume world = lcdd.pickMotherVolume(this); - - // - // defines the constant from compact.xml, may be - // - - Define define = lcdd.getDefine(); - - // - // Defining the translation and the rotation of top and bottom based on - // Survey Aug2015 - // - - double[] top_tr = {0, 0, 0}; - double[] top_rot = {0, 0, 0}; - double[] bot_tr = {0, 0, 0}; - double[] bot_rot = {0, 0, 0}; - - /* - * double[] top_tr = { -0.710000000000008, 2.7249999999999943, 4.9375 }; double[] top_rot = { - * 6.496421277200071E-4, 0.0, -4.688234741242468E-4 }; double[] bot_tr = { -0.4049999999999727, - * -0.9124999999999659, 2.6224999999999454 }; double[] bot_rot = { 5.150274940439736E-4, 0.0, - * 0.0013469727279283583 }; - */ - - /* - * double[] top_tr = {100, 0, 0 }; double[] top_rot = { Math.toRadians(-20),0,0}; double[] bot_tr = { 0,0,0 }; - * double[] bot_rot = { 0,0,0 }; - */ - - // I had my reasons to do so, will change in the end - top_rot = rot_top; - top_tr = tr_top; - bot_rot = rot_bot; - bot_tr = tr_bot; - - Transformations trans_top = new Transformations("top", top_tr, top_rot); - Map<String, Crystal> topMap = trans_top.getCrystalMap(); - Transformations trans_bot = new Transformations("bottom", bot_tr, bot_rot); - Map<String, Crystal> botMap = trans_bot.getCrystalMap(); - System.err.println("Number of map content " + botMap.size()); - System.err.println("Number of map content " + topMap.size()); - - for (int iy = -5; iy <= 5; iy++) { - if (iy == 0) - continue; - for (int ix = -23; ix <= 23; ix++) { - if (ix == 0) { + int nx = layout.getAttribute("nx").getIntValue(); + int ny = layout.getAttribute("ny").getIntValue(); + double dface = layout.getAttribute("dface").getDoubleValue(); + Trapezoid crystalTrap = new Trapezoid("crystal_trap", dx1, dx2, dy1, dy2, dz); + Volume crystalLogVol = new Volume("crystal_volume", crystalTrap, lcdd.getMaterial(materialName)); + crystalLogVol.setSensitiveDetector(sens); + setVisAttributes(lcdd, this.getNode(), crystalLogVol); + lcdd.add(crystalTrap); + 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; + } + + // z axis rotation parameter of the whole module + double zrot_cry = rot_bot[0]; + String baseName = "crystal" + ix + "-" + iy; + + 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, the map is screwed"); + + if (crystal.getCrystalG4Pos() == null) + throw new RuntimeException("g4pos of crystal is null, the map is screwed, sorry\n"); + + 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); + } - - // z axis rotation parameter of the whole module - double zrot_cry = bot_rot[0]; - String baseName = "crystal" + ix + "-" + iy; - - 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 = top_rot[0]; - } - - if (crystal == null) - if ((iy == -1 && ix > -11 && ix < -1) || (iy == 1 && ix > -11 && ix < -1)) - continue; - else - System.err.println(iy + " " + ix + " crystal is null, the map is screwed"); - - if (crystal.getCrystalG4Pos() == null) - System.err.print("g4pos of crystal is null, the map is screwed, sorry\n"); - - double[] centerxyz = {0, 0, 0}; - double[] thetaxyz = {0, 0, 0}; - if (crystal != null) { - centerxyz = crystal.getCrystalG4Pos().getCenterArr(); - 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); - + } - + } + catch (ConditionsManager.ConditionsNotFoundException ex) { + Logger.getLogger(HPSEcal4.class.getName()).log(Level.SEVERE, null, ex); } } Modified: java/branches/HPSJAVA-409/detector-model/src/test/java/org/hps/detector/ecal/EcalCrystalPositionTest.java ============================================================================= --- java/branches/HPSJAVA-409/detector-model/src/test/java/org/hps/detector/ecal/EcalCrystalPositionTest.java (original) +++ java/branches/HPSJAVA-409/detector-model/src/test/java/org/hps/detector/ecal/EcalCrystalPositionTest.java Wed May 4 16:15:15 2016 @@ -31,10 +31,19 @@ for (EcalCrystalPosition position : positions) { int channelId = position.getChannelId(); + double xback = position.getBackX(); + double yback = position.getBackY(); + double zback = position.getBackZ(); + double xfront = (double)position.getFrontX(); + double yfront = (double)position.getFrontY(); + double zfront = (double)position.getFrontZ(); + position.getRowId(); EcalChannel channel = channels.findChannel(channelId); System.out.println(channel); - System.out.println(position); + //System.out.println(position); System.out.println(); + System.out.println("back "+xback+" "+yback+" "+zback+" "); + System.out.println("front "+xfront+" "+yfront+" "+zfront+" "); } } } Copied: java/branches/HPSJAVA-409/detector-model/src/test/java/org/hps/detector/ecal/EcalTransformationsTest.java (from r4349, java/branches/HPSJAVA-409/detector-model/src/test/java/org/hps/detector/ecal/EcalCrystalPositionTest.java) ============================================================================= --- java/branches/HPSJAVA-409/detector-model/src/test/java/org/hps/detector/ecal/EcalCrystalPositionTest.java (original) +++ java/branches/HPSJAVA-409/detector-model/src/test/java/org/hps/detector/ecal/EcalTransformationsTest.java Wed May 4 16:15:15 2016 @@ -1,40 +1,76 @@ package org.hps.detector.ecal; +import java.util.Map; import junit.framework.TestCase; import org.hps.conditions.database.DatabaseConditionsManager; -import org.hps.conditions.ecal.EcalChannel; -import org.hps.conditions.ecal.EcalCrystalPosition; -import org.hps.conditions.ecal.EcalChannel.EcalChannelCollection; -import org.hps.conditions.ecal.EcalCrystalPosition.EcalCrystalPositionCollection; - +import org.hps.detector.ecal.geo2015.crystal.Crystal; +import org.hps.detector.ecal.geo2015.ecal.Transformations; /** - * Simplistic test of loading ECal crystal positions from the conditions database - * and associating to an ecal channel object. + * Simplistic test of loading ECal crystal positions from the conditions + * database and associating to an ecal channel object. * <p> * This test must go into the <i>detector-model</i> module because the detector - * converters are not available in the <i>conditions</i> package. - * - * @author jeremym + * converters are not available in the <i>conditions</i> package. + * + * @author Annie Simonyan [log in to unmask] */ -public class EcalCrystalPositionTest extends TestCase { - - public void testEcalCrystalPositions() throws Exception { +public class EcalTransformationsTest extends TestCase { + + public void testEcalTransformationsTest() throws Exception { + double[] tr = {0, 0, 0}; + double[] rot = {0, 0, 0}; DatabaseConditionsManager mgr = DatabaseConditionsManager.getInstance(); - mgr.setDetector("HPS-PhysicsRun2016-Nominal-v4-4", 0); /* any run number and detector will work here */ + mgr.setDetector("HPS-PhysicsRun2016-Nominal-v4-4", 0); /* any run number and detector will work here*/ + + Transformations transtop = new Transformations("top", tr, rot); + Transformations transbot = new Transformations("bottom", tr, rot); + + Transformations.LOGGER.toString(); + + Map<String, Crystal> topModule = transtop.getCrystalMap(); + Map<String, Crystal> bottomModule = transbot.getCrystalMap(); + System.out.println(topModule.size() + " for top module\n" + bottomModule.size() + " for bottom module"); + + // loop over crystals + for (int iy = -5; iy <= 5; iy++) { + //there is no crystal with row=0, skip + if (iy == 0) { + continue; + } + + for (int ix = -23; ix <= 23; ix++) { + //there is no crystal with column=0, skip + if (ix == 0) { + continue; + } + + //get the crystal from the Map of crystals, key format is "c#column:l#row" + Crystal crystal = bottomModule.get(String.format("c%d:l%d", ix, iy)); + if (iy > 0) { + crystal = topModule.get(String.format("c%d:l%d", ix, iy)); + } + + if (crystal != null) { + //print the g4 coordinates of the crystal + crystal.getCrystalG4Pos().Print(); + } + else { + //skip the ecal gap + if ((iy == -1 && ix > -11 && ix < -1) || (iy == 1 && ix > -11 && ix < -1)) { + } + else { + throw new NullPointerException(iy + " " + ix + + " crystal is null, the map is screwed, the compiler really feels sorry for you."); + } + } + + } + + } - EcalCrystalPositionCollection positions = - mgr.getCachedConditions(EcalCrystalPositionCollection.class, "ecal_crystal_positions").getCachedData(); - EcalChannelCollection channels = - mgr.getCachedConditions(EcalChannelCollection.class, "ecal_channels").getCachedData(); - for (EcalCrystalPosition position : positions) { - int channelId = position.getChannelId(); - EcalChannel channel = channels.findChannel(channelId); - System.out.println(channel); - System.out.println(position); - System.out.println(); - } } + } Modified: java/branches/HPSJAVA-409/detector-model/src/test/java/org/lcsim/detector/converter/compact/HPSEcal4ConverterTest.java ============================================================================= --- java/branches/HPSJAVA-409/detector-model/src/test/java/org/lcsim/detector/converter/compact/HPSEcal4ConverterTest.java (original) +++ java/branches/HPSJAVA-409/detector-model/src/test/java/org/lcsim/detector/converter/compact/HPSEcal4ConverterTest.java Wed May 4 16:15:15 2016 @@ -1,22 +1,26 @@ package org.lcsim.detector.converter.compact; +import java.io.IOException; import java.io.InputStream; -import java.util.List; import java.util.logging.Logger; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; +import org.hps.conditions.database.DatabaseConditionsManager; +import org.jdom.JDOMException; +import org.lcsim.conditions.ConditionsManager; import org.lcsim.detector.converter.compact.HPSEcal4Converter; import org.lcsim.geometry.subdetector.HPSEcal4; import org.lcsim.geometry.Detector; import org.lcsim.geometry.GeometryReader; +import org.lcsim.util.xml.ElementFactory; /** - * Unit test for the HPSTracker2Coverter. + * Unit test for the HPSTracker2Converter. * * @author SA [log in to unmask] */ @@ -32,7 +36,10 @@ } private static final String resource = "/org/lcsim/geometry/subdetector/HPSEcal4Test.xml"; - public void setUp() { + public void setUp() throws ConditionsManager.ConditionsNotFoundException { + DatabaseConditionsManager mgr = DatabaseConditionsManager.getInstance(); + mgr.setDetector("HPS-PhysicsRun2016-Nominal-v4-4", 0); /* any run number and detector will work here */ + InputStream in = this.getClass().getResourceAsStream(resource); GeometryReader reader = new GeometryReader(); @@ -40,7 +47,7 @@ try { detector = reader.read(in); } - catch (Throwable x) { + catch (IOException | JDOMException | ElementFactory.ElementCreationException x) { throw new RuntimeException(x); } } Modified: java/branches/HPSJAVA-409/detector-model/src/test/java/org/lcsim/geometry/compact/converter/lcdd/HPSEcal4LCDDTest.java ============================================================================= --- java/branches/HPSJAVA-409/detector-model/src/test/java/org/lcsim/geometry/compact/converter/lcdd/HPSEcal4LCDDTest.java (original) +++ java/branches/HPSJAVA-409/detector-model/src/test/java/org/lcsim/geometry/compact/converter/lcdd/HPSEcal4LCDDTest.java Wed May 4 16:15:15 2016 @@ -9,29 +9,32 @@ import junit.framework.TestCase; import junit.framework.TestSuite; +import org.hps.conditions.database.DatabaseConditionsManager; /** -* -* @author Annie Simonyan <[log in to unmask]> -*/ + * + * @author Annie Simonyan <[log in to unmask]> + */ public class HPSEcal4LCDDTest extends TestCase { - - public HPSEcal4LCDDTest(String name) - { - super(name); - } - - public static TestSuite suite() - { - return new TestSuite(HPSEcal4LCDDTest.class); - } - - public void test_converter() throws Exception - { - //InputStream in = HPSTestRunTracker2014.class.getResourceAsStream("/org/lcsim/geometry/subdetector/HPSEcal4Test.xml"); - InputStream in = this.getClass().getResourceAsStream("/org/lcsim/geometry/subdetector/HPSEcal4Test.xml"); - OutputStream out = new BufferedOutputStream(new FileOutputStream(new TestOutputFile("HPSEcal4Test.lcdd"))); - new Main().convert("HPSEcal4Test",in,out); - } - } + public HPSEcal4LCDDTest(String name) { + super(name); + } + + public static TestSuite suite() { + return new TestSuite(HPSEcal4LCDDTest.class); + } + + public void test_converter() throws Exception { + DatabaseConditionsManager mgr = DatabaseConditionsManager.getInstance(); + mgr.setDetector("HPS-PhysicsRun2016-Nominal-v4-4", 0); /* + * any run number and detector will work here + */ + + //InputStream in = HPSTestRunTracker2014.class.getResourceAsStream("/org/lcsim/geometry/subdetector/HPSEcal4Test.xml"); + InputStream in = this.getClass().getResourceAsStream("/org/lcsim/geometry/subdetector/HPSEcal4Test.xml"); + + OutputStream out = new BufferedOutputStream(new FileOutputStream(new TestOutputFile("HPSEcal4Test.lcdd"))); + new Main().convert("HPSEcal4Test", in, out); + } +}