Author: [log in to unmask] Date: Wed Apr 27 12:23:44 2016 New Revision: 4348 Log: Code formatting; convert tabs to spaces. 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/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/Transformations.java 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/hps/detector/ecal/geo2015/geoutils/Vector.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/main/java/org/lcsim/geometry/subdetector/HPSEcal4.java 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 Apr 27 12:23:44 2016 @@ -1,35 +1,27 @@ -/* - * 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; /** * Some static functions, well, just one + * * @author SA */ public class StatFunUtils { - - /***** - * Function to doubles to rounds up the value - * to 'places' digits after the "," - * ******/ + + /***** + * Function to doubles to rounds up the value to 'places' digits after the "," + ******/ public static double round(double value, int places) { - if (places < 0 || places>16) { + if (places < 0 || places > 16) { throw new IllegalArgumentException(); } long factor = (long) Math.pow(10, places); - //System.out.println(factor+" val = "+value); + // System.out.println(factor+" val = "+value); value = value * factor; - // System.out.println("again "+value); + // System.out.println("again "+value); long tmp = Math.round(value); - //System.out.println("tmp = "+tmp); - // System.out.println((double) tmp / factor); + // System.out.println("tmp = "+tmp); + // System.out.println((double) tmp / factor); 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 Apr 27 12:23:44 2016 @@ -1,39 +1,39 @@ package org.hps.detector.ecal.geo2015.crystal; +public class Crystal { -public class Crystal{ - - private int layer; - private int column; - private Geant4Position pos; - - public Crystal(int icol, int ilayer, Geant4Position ipos){ - this.layer = ilayer; - this.column = icol; - this.pos = ipos; - } - - public Geant4Position getCrystalG4Pos(){ - return this.pos; - } - - public int getLayer(){ - return this.layer; - } - - public int getColumn(){ - return this.column; - } - - public void setLayer(int ilayer){ - this.layer=ilayer; - } - - public void setColumn(int icol){ - this.column=icol; - } - public void setG4Position(Geant4Position ipos){ - this.pos = ipos; - } - + private int layer; + private int column; + private Geant4Position pos; + + public Crystal(int icol, int ilayer, Geant4Position ipos) { + this.layer = ilayer; + this.column = icol; + this.pos = ipos; + } + + public Geant4Position getCrystalG4Pos() { + return this.pos; + } + + public int getLayer() { + return this.layer; + } + + public int getColumn() { + return this.column; + } + + public void setLayer(int ilayer) { + this.layer = ilayer; + } + + public void setColumn(int icol) { + this.column = icol; + } + + public void setG4Position(Geant4Position ipos) { + this.pos = ipos; + } + } 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 Apr 27 12:23:44 2016 @@ -1,23 +1,21 @@ /* - * 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. + * 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; import org.hps.detector.ecal.geo2015.geoutils.Vector; /** - * 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. + * 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 */ public class CrystalTaitBryanAngleCalculator { - private double phi=0; - private double theta=0; + private double phi = 0; + private double theta = 0; private final double psi = 0; private static final Vector ini = new Vector(0, 0, 1); @@ -31,35 +29,33 @@ public CrystalTaitBryanAngleCalculator(Vector vec_fin) { - fin = vec_fin; - if (vec_fin.isUnitary() == false) { + fin = vec_fin; + if (vec_fin.isUnitary() == false) { fin = vec_fin.getUnitVector(); } - + this.phi = this.CalcPhi(); - this.theta = this.CalcTheta(); + this.theta = this.CalcTheta(); } - - private double CalcPhi(){ - - sinPhi = -fin.y ; - cosPhi = Math.sqrt(1-this.sinPhi*this.sinPhi); - - return Math.asin(this.sinPhi); - } - - private double CalcTheta(){ - - if(this.cosPhi==0) - this.sinTheta=Double.NaN; - else - this.sinTheta = fin.x/this.cosPhi; - - return Math.asin(this.sinTheta); + private double CalcPhi() { + + sinPhi = -fin.y; + cosPhi = Math.sqrt(1 - this.sinPhi * this.sinPhi); + + return Math.asin(this.sinPhi); } - - + + private double CalcTheta() { + + if (this.cosPhi == 0) + this.sinTheta = Double.NaN; + else + this.sinTheta = fin.x / this.cosPhi; + + return Math.asin(this.sinTheta); + } + public double getTheta() { return this.theta; } 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 Apr 27 12:23:44 2016 @@ -3,10 +3,9 @@ import org.hps.detector.ecal.geo2015.geoutils.Vector; /** - * 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 + * 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 * * @author SA */ @@ -14,14 +13,14 @@ private Vector centerPoint; private Vector crysvec; - private double[] taitbriangles; //{ phi,theta,psi=0}; - private double[] center_arr; - + private double[] taitbriangles; // { phi,theta,psi=0}; + private double[] center_arr; + public Geant4Position(Vector point1, Vector point2) { - if(point1==null || point2==null) - System.err.println("The arguments can't be 0."); - + if (point1 == null || point2 == null) + System.err.println("The arguments can't be 0."); + centerPoint = point2.Add(point1).Multiply(0.5); center_arr = new double[3]; center_arr[0] = centerPoint.x; @@ -31,35 +30,35 @@ System.out.println("*************** center unit vector **********"); crysvec.Print(); System.out.println("*********************************************"); - + taitbriangles = new double[3]; this.TaitBryanAnglesforCrys(); - + } public Vector getCenter() { return this.centerPoint; } - + public double[] getCenterArr() { - double [] center_arr = {centerPoint.x,centerPoint.y,centerPoint.z}; + double[] center_arr = {centerPoint.x, centerPoint.y, centerPoint.z}; return center_arr; } + public double[] getTaitBryanAngles() { return this.taitbriangles; } private void TaitBryanAnglesforCrys() { - CrystalTaitBryanAngleCalculator crysTBang = new CrystalTaitBryanAngleCalculator(crysvec); + CrystalTaitBryanAngleCalculator crysTBang = new CrystalTaitBryanAngleCalculator(crysvec); /* - * please vec should go from the center, even though it's not changing much - */ + * 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"); this.taitbriangles[0] = -111111; - } - else { + } else { this.taitbriangles[0] = -crysTBang.getPhi(); } this.taitbriangles[1] = -crysTBang.getTheta(); @@ -69,7 +68,8 @@ 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"); + 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"); } } 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 Apr 27 12:23:44 2016 @@ -1,10 +1,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. + * 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; @@ -17,152 +15,158 @@ import java.util.HashMap; /** - * 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 :/ + * 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 */ 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); + 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(); - this.rotation = rot; - System.out.println("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());} - } + private Map<String, Crystal> crystalMap; - public Map<String, Crystal> getCrystalMap() { - return this.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(); + this.rotation = rot; + System.out.println("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()); + } + } - private void makeTransformation() throws IOException{ - DataLoader data = new DataLoader(); + public Map<String, Crystal> getCrystalMap() { + return this.crystalMap; + } - 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()); + private void makeTransformation() throws IOException { + DataLoader data = new DataLoader(); - 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.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.Print(); - Vector[] frontXYZ = new Vector[N.length]; - Vector[] backXYZ = new Vector[N.length]; + // 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()); - Vector CMvec_nom = new Vector(); + 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); - /* 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++) { - + // data.Print(); + Vector[] frontXYZ = new Vector[N.length]; + Vector[] backXYZ = new Vector[N.length]; - 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; - } - 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; - } + Vector CMvec_nom = new Vector(); - // 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); + /* + * 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++) { - CMvec_nom.Print(); - System.out.println("after translation to CM COO-system"); - // frontXYZ[loop].Print(); - // backXYZ[loop].Print(); + 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; + } + frontXYZ[loop] = new Vector(Xfront[loop], Yfront[loop], Zfront[loop]); + backXYZ[loop] = new Vector(Xback[loop], Yback[loop], Zback[loop]); - /// 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("Initial position"); + frontXYZ[loop].Print(); + backXYZ[loop].Print(); - System.out.println("after module plane rotation"); - //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 modules by the translation vector the diff of CM - frontXYZ[loop] = frontXYZ[loop].TranslateBy(transVec); - backXYZ[loop] = backXYZ[loop].TranslateBy(transVec); + // 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); - System.out.println("after translation by survey shift"); - // frontXYZ[loop].Print(); - // backXYZ[loop].Print(); + CMvec_nom.Print(); + System.out.println("after translation to CM COO-system"); + // 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(); + // / 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]); - /*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");*/ + System.out.println("after module plane rotation"); + // frontXYZ[loop].Print(); + // backXYZ[loop].Print(); - 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]); + // Translate modules by the translation vector the diff of CM + frontXYZ[loop] = frontXYZ[loop].TranslateBy(transVec); + backXYZ[loop] = backXYZ[loop].TranslateBy(transVec); - 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()); - - } + 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()); + + } } 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 Apr 27 12:23:44 2016 @@ -1,14 +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. + * 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; /** - * 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" Defined as a Point with a coordinates as + * arithmetical mean of the corresponding coordinates of points-arguments * * @author AS */ @@ -31,8 +29,7 @@ } /* - * Meaningful constructor, for any number of points arguments should be - * arrays of (Xs[], Ys[], Zs[]) of points + * 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) { @@ -67,7 +64,7 @@ } public double[] getCMarray() { - double[] center = {this.xc, this.yc, this.zc}; - return center; + double[] center = {this.xc, this.yc, this.zc}; + return center; } } 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 Apr 27 12:23:44 2016 @@ -1,54 +1,45 @@ /* - * 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. + * 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; /** - * * @author AS */ public class Line { - - //private double a=0, b=0, c=0; //ax+by+c=0 - private Vector 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){ + + // private double a=0, b=0, c=0; //ax+by+c=0 + private Vector 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)); - point = new double [3]; - point[0]=x; - point[1]=y; - point[2]=z; - } - - - //Define a line that goes through 2 points, M0 and M1 - public Line(Vector vecM0, Vector vecM1){ - setVec_n(vecM1.Substract(vecM0)); - point = vecM0.getVector(); - } - - public Vector getCenter(Vector vecM0, Vector vecM1){ - - return (vecM1.Substract(vecM0)).Multiply(0.5); + point = new double[3]; + point[0] = x; + point[1] = y; + point[2] = z; } + // Define a line that goes through 2 points, M0 and M1 + public Line(Vector vecM0, Vector vecM1) { + setVec_n(vecM1.Substract(vecM0)); + point = vecM0.getVector(); + } - public Vector getVec_n() { - return vec_n; - } + public Vector getCenter(Vector vecM0, Vector vecM1) { + return (vecM1.Substract(vecM0)).Multiply(0.5); + } - public void setVec_n(Vector vec_n) { - this.vec_n = vec_n; - } - - - - + public Vector getVec_n() { + return vec_n; + } + + public void setVec_n(Vector 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 Apr 27 12:23:44 2016 @@ -1,44 +1,40 @@ /* - * 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. + * 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. */ package org.hps.detector.ecal.geo2015.geoutils; +public class Plane { -public class Plane { - private double c1=0.,c2=0.,c3=0.,c4=0.,c5=0.,c6=0.; - - //Plane full equation constants - private double A,B,C,D; + private double c1 = 0., c2 = 0., c3 = 0., c4 = 0., c5 = 0., c6 = 0.; + + // Plane full equation constants + private double A, B, C, D; private Vector normal = new Vector(); - - //Plane as a ranges on XYZ axises - private double a=0., b=0., c=0.; - - - - //define plane by 3 points not in one line - public Plane(double [] P1,double [] P2,double [] P3){ - defConsts(P1, P2, P3); - normal.SetXYZ(A,B,C); + + // Plane as a ranges on XYZ axises + private double a = 0., b = 0., c = 0.; + + // define plane by 3 points not in one line + public Plane(double[] P1, double[] P2, double[] P3) { + defConsts(P1, P2, P3); + normal.SetXYZ(A, B, C); this.Plane2GeoRanges(); } - + // define plane by constants Ax+By+Cz+D=0 - public Plane(double A, double B, double C, double D){ + public Plane(double A, double B, double C, double D) { this.A = A; this.B = B; this.C = C; this.D = D; normal.SetXYZ(A, B, C); - + this.Plane2GeoRanges(); } - - public void SetABCDcoeff(double AA, double BB, double CC, double DD){ + + public void SetABCDcoeff(double AA, double BB, double CC, double DD) { this.A = AA; this.B = BB; this.C = CC; @@ -46,143 +42,131 @@ normal.SetXYZ(A, B, C); } - public Vector getNormalUnitVector(){ - double mod = normal.Module(); - Vector uNorm = new Vector(normal.x/mod, normal.y/mod, normal.z/mod); - return uNorm; - } - - private void defConsts(double [] P1,double [] P2,double [] P3){ - double x1 = P1[0], x2=P2[0], x3=P3[0]; - double y1 = P1[1], y2=P2[1], y3=P3[1]; - double z1 = P1[2], z2=P2[2], z3=P3[2]; - - c1 = (x2-x1); - c2 = (y2-y1); - c3 = (z2-z1); - c4 = (x3-x1); - c5 = (y3-y1); - c6 = (z3-z1); - - A = c2*c6 - c5*c3; - B=-(c1*c6 - c4*c3); - C = c1*c5 - c2*c4; - D = -(A*x1-(-B)*y1+C*z1); - //D = -x1*y2*z3 +x1*y3*z2 +x2*y1*z3 -x3*y1*z2 -x2*z1*y3 +x3*y2*z1; ///or this + public Vector getNormalUnitVector() { + double mod = normal.Module(); + Vector uNorm = new Vector(normal.x / mod, normal.y / mod, normal.z / mod); + return uNorm; } - - - - public double [] getPlaneConsts(){ - - double [] K = {A,B,C,D}; + + private void defConsts(double[] P1, double[] P2, double[] P3) { + double x1 = P1[0], x2 = P2[0], x3 = P3[0]; + double y1 = P1[1], y2 = P2[1], y3 = P3[1]; + double z1 = P1[2], z2 = P2[2], z3 = P3[2]; + + c1 = (x2 - x1); + c2 = (y2 - y1); + c3 = (z2 - z1); + c4 = (x3 - x1); + c5 = (y3 - y1); + c6 = (z3 - z1); + + A = c2 * c6 - c5 * c3; + B = -(c1 * c6 - c4 * c3); + C = c1 * c5 - c2 * c4; + D = -(A * x1 - (-B) * y1 + C * z1); + // D = -x1*y2*z3 +x1*y3*z2 +x2*y1*z3 -x3*y1*z2 -x2*z1*y3 +x3*y2*z1; ///or this + } + + public double[] getPlaneConsts() { + + double[] K = {A, B, C, D}; return K; } - - public double [] getNormalCoor(){ - double [] K = {A,B,C}; - return K; + + public double[] getNormalCoor() { + double[] K = {A, B, C}; + return K; } - - public Vector getNormal(){ - return this.normal; + + public Vector getNormal() { + return this.normal; } - - public double getAngle(double [] normal2){ - double [] normal1 = this.getNormalCoor(); - - double cosalpha = (normal1[0]*normal2[0]+normal1[1]*normal2[1]+normal1[2]*normal2[2])/ - (Math.sqrt(normal1[0]*normal1[0]+normal1[1]*normal1[0]+normal1[2]*normal1[2])* - Math.sqrt(normal2[0]*normal2[0]+normal2[1]*normal2[0]+normal2[2]*normal2[2])); - - + public double getAngle(double[] normal2) { + + double[] normal1 = this.getNormalCoor(); + + double cosalpha = (normal1[0] * normal2[0] + normal1[1] * normal2[1] + normal1[2] * normal2[2]) + / (Math.sqrt(normal1[0] * normal1[0] + normal1[1] * normal1[0] + normal1[2] * normal1[2]) * Math + .sqrt(normal2[0] * normal2[0] + normal2[1] * normal2[0] + normal2[2] * normal2[2])); + return Math.acos(cosalpha); } - - public double getAngle(Plane pl2){ + + public double getAngle(Plane pl2) { Vector normal2 = pl2.getNormal(); - double angle = this.normal.Angle(normal2); - - return Math.PI/2 - angle; + double angle = this.normal.Angle(normal2); + + return Math.PI / 2 - angle; } - - public double getEffAngle(Plane pl2){ + + public double getEffAngle(Plane pl2) { Vector normal2 = pl2.getNormal(); - double angle = this.normal.Angle(normal2); - if(angle>(Math.PI/2.0)) - angle = Math.PI - angle ; - + double angle = this.normal.Angle(normal2); + if (angle > (Math.PI / 2.0)) + angle = Math.PI - angle; + return angle; } - - public double getK1(){ + + public double getK1() { return A; } - public double getK2(){ + public double getK2() { return B; } - - public double getK3(){ + + public double getK3() { return C; } - - public double getK4(){ + + public double getK4() { return D; } - public double geta(){ + public double geta() { return this.a; } - - public double getb(){ + + public double getb() { return this.b; } - - public double getc(){ + + public double getc() { return this.c; } - - public double [] getabc(){ - double [] r = {a,b,c}; + + public double[] getabc() { + double[] r = {a, b, c}; return r; } - - - - - /* - * if A || B || C = 0 - * a = posInfinity - * b = posInfinity - * c = posInfinity - */ - private void Plane2GeoRanges(){ - - - - if(A!=0 && B!=0 && C!=0){ - this.a = -this.D/this.A; - this.b = -this.D/this.B; - this.c = -this.D/this.C; - } - else - { - if(A==0) - this.a = Double.NEGATIVE_INFINITY; - if(B==0) - this.b = Double.NEGATIVE_INFINITY; - if(C==0) - this.c = Double.NEGATIVE_INFINITY; - } - } - - public void Print(){ - System.out.print(this.A+"x + " +"("+(this.B)+")"+"y + "+" ("+this.C+")"+"z + "+"("+this.D+")"+"= 0\n"); - } - - public void PrintGeoRanges(){ - System.out.print("X/("+this.a + ") + Y/("+this.b + ") + Z/("+this.c+") =1\n"); - } + + /* + * if A || B || C = 0 a = posInfinity b = posInfinity c = posInfinity + */ + private void Plane2GeoRanges() { + + if (A != 0 && B != 0 && C != 0) { + this.a = -this.D / this.A; + this.b = -this.D / this.B; + this.c = -this.D / this.C; + } else { + if (A == 0) + this.a = Double.NEGATIVE_INFINITY; + if (B == 0) + this.b = Double.NEGATIVE_INFINITY; + if (C == 0) + this.c = Double.NEGATIVE_INFINITY; + } + } + + public void Print() { + System.out.print(this.A + "x + " + "(" + (this.B) + ")" + "y + " + " (" + this.C + ")" + "z + " + "(" + this.D + + ")" + "= 0\n"); + } + + public void PrintGeoRanges() { + System.out.print("X/(" + this.a + ") + Y/(" + this.b + ") + Z/(" + this.c + ") =1\n"); + } } Modified: 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/Vector.java Wed Apr 27 12:23:44 2016 @@ -1,7 +1,6 @@ /* - * 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. + * 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; @@ -9,155 +8,151 @@ import org.hps.detector.ecal.geo2015.base.StatFunUtils; /** - *Define Vector in a 3D coordinate system - * operations and manipulations with the characteristics of the line + * Define Vector in a 3D coordinate system operations and manipulations with the characteristics of the line + * * @author AS */ public class Vector { - public double x=0, y=0, z=0; - private double [] vec; - - public Vector(){} - - public Vector(double [] array){ + + public double x = 0, y = 0, z = 0; + private double[] vec; + + public Vector() { + } + + public Vector(double[] array) { vec = array; this.x = array[0]; this.y = array[1]; this.z = array[2]; } - - public Vector(double x, double y, double z){ - this.x=x; this.y=y; this.z=z; - vec = new double[3]; - vec[0] = x; - vec[1] = y; - vec[2] = z; - + + public Vector(double x, double y, double z) { + this.x = x; + this.y = y; + this.z = z; + vec = new double[3]; + vec[0] = x; + vec[1] = y; + vec[2] = z; + } - - - public void SetX(double x){ + + public void SetX(double x) { this.x = x; } - - public void SetY(double y){ + + public void SetY(double y) { this.y = y; - } - - public void SetZ(double z){ + } + + public void SetZ(double z) { this.z = z; } - - public void SetXYZ(double x, double y, double z){ + + public void SetXYZ(double x, double y, double z) { this.x = x; this.y = y; this.z = z; } - - - public boolean isUnitary(){ - return (Double.compare(StatFunUtils.round(this.Module(),12), 1.0)==0); + + public boolean isUnitary() { + return (Double.compare(StatFunUtils.round(this.Module(), 12), 1.0) == 0); } - - ///Vector Module - public double Module(){ - return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z); + + // /Vector Module + public double Module() { + return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z); } - - public Vector Multiply(double k){ - + + public Vector Multiply(double k) { + return (new Vector(k * this.x, k * this.y, k * this.z)); } - - public Vector Add(Vector vec2){ - - return (new Vector(this.x+vec2.x, this.y+vec2.y, this.z+vec2.z)); - + + public Vector Add(Vector vec2) { + + return (new Vector(this.x + vec2.x, this.y + vec2.y, this.z + vec2.z)); + } - - public Vector getOpposite(){ + + public Vector getOpposite() { return (new Vector(-this.x, -this.y, -this.z)); } - - public Vector Substract(Vector vec2){ - - return (new Vector(this.x-vec2.x, this.y-vec2.y, this.z-vec2.z)); - + + public Vector Substract(Vector vec2) { + + return (new Vector(this.x - vec2.x, this.y - vec2.y, this.z - vec2.z)); + } - - public Vector TranslateBy(Vector trvec){ - // return this.Substract(trvec); - return this.Add(trvec); + + public Vector TranslateBy(Vector trvec) { + // return this.Substract(trvec); + return this.Add(trvec); } - + /* * Rotation as Rz-alpha Ry-beta Rx-gamma - */ - public Vector RotateBy(double alpha, double betta, double gamma){ - + */ + public Vector RotateBy(double alpha, double betta, double gamma) { + double cos_alpha = Math.cos(alpha); double sin_alpha = Math.sin(alpha); - + double cos_betta = Math.cos(betta); double sin_betta = Math.sin(betta); - + double cos_gamma = Math.cos(gamma); double sin_gamma = Math.sin(gamma); - - - double xx = this.x*cos_alpha*cos_betta+ - this.y*(-sin_alpha*cos_gamma + cos_alpha*sin_betta*sin_gamma)+ - this.z*(sin_alpha*sin_gamma+cos_alpha*sin_betta*sin_gamma); - - double yy = this.x*sin_alpha*cos_betta+ - this.y*(cos_alpha*cos_gamma+sin_alpha*sin_betta*sin_gamma)+ - this.z*(-cos_alpha*sin_gamma+sin_alpha*sin_betta*sin_gamma); - double zz = this.x*(-sin_betta)+ - this.y*(cos_betta*sin_gamma)+ - this.z*(cos_betta*cos_gamma); - + double xx = this.x * cos_alpha * cos_betta + this.y + * (-sin_alpha * cos_gamma + cos_alpha * sin_betta * sin_gamma) + this.z + * (sin_alpha * sin_gamma + cos_alpha * sin_betta * sin_gamma); + + double yy = this.x * sin_alpha * cos_betta + this.y + * (cos_alpha * cos_gamma + sin_alpha * sin_betta * sin_gamma) + this.z + * (-cos_alpha * sin_gamma + sin_alpha * sin_betta * sin_gamma); + + double zz = this.x * (-sin_betta) + this.y * (cos_betta * sin_gamma) + this.z * (cos_betta * cos_gamma); + return (new Vector(xx, yy, zz)); } - - - //Scaliar multiplication of vectors - public double ScaliarM(Vector vec2){ - return this.x*vec2.x+this.y*vec2.y+this.z*vec2.z; + + // Scaliar multiplication of vectors + public double ScaliarM(Vector vec2) { + return this.x * vec2.x + this.y * vec2.y + this.z * vec2.z; } - - //angle between vectors - public double Angle(Vector 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()))); + + // angle between vectors + public double Angle(Vector 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()))); double cosAlpha = this.ScaliarM(vec2) / (this.Module() * vec2.Module()); - - if (Double.compare(StatFunUtils.round(cosAlpha,12),1.0)==0) { + + if (Double.compare(StatFunUtils.round(cosAlpha, 12), 1.0) == 0) { cosAlpha = 1.0; - } - else if (Double.compare(StatFunUtils.round(cosAlpha,12),-1.0)==0) { + } else if (Double.compare(StatFunUtils.round(cosAlpha, 12), -1.0) == 0) { cosAlpha = -1.0; } return Math.acos(cosAlpha); } - - public double [] getVector(){ + + public double[] getVector() { return this.vec; } - - public Vector getUnitVector(){ - return new Vector(this.x/this.Module(), this.y/this.Module(), this.z/this.Module()); + + public Vector getUnitVector() { + return new Vector(this.x / this.Module(), this.y / this.Module(), this.z / this.Module()); } - - public Vector getCenter(){ - - return (this.Multiply(0.5)); + + public Vector getCenter() { + + return (this.Multiply(0.5)); } - - - public void Print(){ - System.out.println("("+this.x+", "+this.y+", "+this.z+")"); + + public void Print() { + System.out.println("(" + this.x + ", " + this.y + ", " + this.z + ")"); } } 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 Apr 27 12:23:44 2016 @@ -1,5 +1,4 @@ package org.lcsim.detector.converter.compact; - import java.util.Map; import java.util.logging.Logger; @@ -34,192 +33,196 @@ 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(); - - // 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); - } - - // 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()); - } - - /** - * Create a DetectorElement for an ECal crystal. - * - * @param detector - * The full detector. - * @param subdet - * The sub detector. - * @param crystal - * The crystal physical volume. - * @param ix - * The value of the ix field. - * @param iy - * The value of the iy field. - */ - private final void createDetectorElement(final Detector detector, final Subdetector subdet, - final IPhysicalVolume crystal, final int ix, final int iy) { - final String path = "/" + crystal.getName(); - final IExpandedIdentifier expId = new ExpandedIdentifier(helper.getIdentifierDictionary().getNumberOfFields()); - expId.setValue(dict.getFieldIndex("system"), subdet.getSystemID()); - expId.setValue(dict.getFieldIndex("ix"), ix); - expId.setValue(dict.getFieldIndex("iy"), iy); - final IIdentifier id = helper.pack(expId); - new EcalCrystal(subdet.getName() + "_crystal" + crystal.getCopyNumber(), subdet.getDetectorElement(), path, id); - } - - @Override - public Class getSubdetectorType() { - return HPSEcal4.class; - } - - @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); - return subdetectorDE; - } + 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(); + + // 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); + } + + // 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()); + } + + /** + * Create a DetectorElement for an ECal crystal. + * + * @param detector The full detector. + * @param subdet The sub detector. + * @param crystal The crystal physical volume. + * @param ix The value of the ix field. + * @param iy The value of the iy field. + */ + private final void createDetectorElement(final Detector detector, final Subdetector subdet, + final IPhysicalVolume crystal, final int ix, final int iy) { + final String path = "/" + crystal.getName(); + final IExpandedIdentifier expId = new ExpandedIdentifier(helper.getIdentifierDictionary().getNumberOfFields()); + expId.setValue(dict.getFieldIndex("system"), subdet.getSystemID()); + expId.setValue(dict.getFieldIndex("ix"), ix); + expId.setValue(dict.getFieldIndex("iy"), iy); + final IIdentifier id = helper.pack(expId); + new EcalCrystal(subdet.getName() + "_crystal" + crystal.getCopyNumber(), subdet.getDetectorElement(), path, id); + } + + @Override + public Class getSubdetectorType() { + return HPSEcal4.class; + } + + @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); + return 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 Wed Apr 27 12:23:44 2016 @@ -18,179 +18,177 @@ public class HPSEcal4 extends LCDDSubdetector { - HPSEcal4(Element node) throws JDOMException { - super(node); - } + 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."); + 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(); + // 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(); + int system = this.getSystemID(); - // Crystal material. - Element mat = node.getChild("material"); - String materialName = mat.getAttributeValue("name"); + // 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."); - } - } - - int nx = layout.getAttribute("nx").getIntValue(); - int ny = layout.getAttribute("ny").getIntValue(); - double dface = layout.getAttribute("dface").getDoubleValue(); + 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(); - - // 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); + 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(); - // Set vis attributes on crystal log vol. - setVisAttributes(lcdd, this.getNode(), crystalLogVol); + // 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."); + } + } - // Add shape and log vol to lcdd. - lcdd.add(crystalTrap); - lcdd.add(crystalLogVol); + int nx = layout.getAttribute("nx").getIntValue(); + int ny = layout.getAttribute("ny").getIntValue(); + double dface = layout.getAttribute("dface").getDoubleValue(); - // Place crystals in world volume. - Volume world = lcdd.pickMotherVolume(this); + // 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); - // - // defines the constant from compact.xml, may be - // + // Set vis attributes on crystal log vol. + setVisAttributes(lcdd, this.getNode(), crystalLogVol); - Define define = lcdd.getDefine(); + // Add shape and log vol to lcdd. + lcdd.add(crystalTrap); + lcdd.add(crystalLogVol); - // - // 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) { - continue; - } - - //z axis rotation parameter of the whole module - double zrot_cry = bot_rot[0]; - String baseName = "crystal" + ix + "-" + iy; + // Place crystals in world volume. + Volume world = lcdd.pickMotherVolume(this); - Crystal crystal = botMap.get(String.format("c%d:l%d", ix, iy)); + // + // defines the constant from compact.xml, may be + // - 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"); + Define define = lcdd.getDefine(); - double[] centerxyz = { 0, 0, 0 }; - double[] thetaxyz = { 0, 0, 0 }; - if (crystal != null) { - centerxyz = crystal.getCrystalG4Pos().getCenterArr(); - thetaxyz = crystal.getCrystalG4Pos().getTaitBryanAngles(); - } + // + // Defining the translation and the rotation of top and bottom based on + // Survey Aug2015 + // - // 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); + double[] top_tr = {0, 0, 0}; + double[] top_rot = {0, 0, 0}; + double[] bot_tr = {0, 0, 0}; + double[] bot_rot = {0, 0, 0}; - // 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); + /* + * 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()); - public boolean isCalorimeter() { - return true; - } + 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 = 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); + + } + + } + + } + + public boolean isCalorimeter() { + return true; + } } Modified: java/branches/HPSJAVA-409/detector-model/src/main/java/org/lcsim/geometry/subdetector/HPSEcal4.java ============================================================================= --- java/branches/HPSJAVA-409/detector-model/src/main/java/org/lcsim/geometry/subdetector/HPSEcal4.java (original) +++ java/branches/HPSJAVA-409/detector-model/src/main/java/org/lcsim/geometry/subdetector/HPSEcal4.java Wed Apr 27 12:23:44 2016 @@ -5,16 +5,10 @@ /** * Reconstruction version of HPS ECal with crystal array. - * - * @author Jeremy McCormick <[log in to unmask]> - * @author Timothy Nelson <[log in to unmask]> - * @version $Id: HPSEcal4.java,v 1.3 2012/04/30 18:04:38 jeremy Exp $ */ -//public class HPSEcal4 -public class HPSEcal4 extends HPSEcal3{ - - HPSEcal4(Element node) throws JDOMException - { - super(node); - } -} +public class HPSEcal4 extends HPSEcal3 { + + HPSEcal4(Element node) throws JDOMException { + super(node); + } +}