Author: [log in to unmask] Date: Mon May 16 14:32:37 2016 New Revision: 4356 Log: Minor code cleanup and formatting. 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/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 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 Mon May 16 14:32:37 2016 @@ -1,52 +1,49 @@ - package org.hps.detector.ecal.geo2015.ecal; -import org.hps.detector.ecal.geo2015.geoutils.GVector; +import java.util.HashMap; +import java.util.Map; +import java.util.logging.Logger; + +import org.hps.conditions.database.DatabaseConditionsManager; +import org.hps.conditions.ecal.EcalChannel; import org.hps.detector.ecal.geo2015.crystal.Crystal; import org.hps.detector.ecal.geo2015.crystal.Geant4Position; - -import 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.detector.ecal.geo2015.geoutils.GVector; +import org.hps.conditions.ecal.EcalCrystalPosition.EcalCrystalPositionCollection; 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 :/ + * 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 static Logger LOGGER = Logger.getLogger(HPSEcal3Converter.class.getPackage().getName()); + public static Logger LOGGER = Logger.getLogger(Transformations.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 + /* vector of translation */ + private GVector transVec; + private double[] rotation; - - private Map<String, Crystal> crystalMap; //Map of crystals with key = ("c#column:l#layer") + /* name "top" or "bottom" to tranform Ecal top or bottom module respectively */ + private String module; - //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)); + /* geometrically defined center mass of top module */ + private final GVector CMvec_nom_top = new GVector(109.88, 230.79, 1008.73); + /* geometrically defined center mass of bottom module */ + private final GVector CMvec_nom_bot = new GVector(109.88, -230.79, 1008.73); + + /* Map of crystals with key = ("c#column:l#layer") */ + private Map<String, Crystal> crystalMap; + + // constructor with argumnets + // 1 - module name "top" or "bottom" - case is ignored + // 2 - translation in the space as an array with translation vector coordinates [x,y,z] + // 3 - rotation in the space as an array with rotation angles [Rz-alpha, Ry-beta, Rx-gamma] + public Transformations(String module, double[] trans, double[] rot) { + LOGGER.info(("transformations for the module = " + module)); LOGGER.info(("translation arg " + trans[0] + "\t" + trans[1] + "\t" + trans[2])); LOGGER.info(("rotation arg " + rot[0] + "\t" + rot[1] + "\t" + rot[2])); this.transVec = new GVector(trans); @@ -55,154 +52,141 @@ LOGGER.info(("rotation " + this.rotation[0] + "\t" + this.rotation[1] + "\t" + this.rotation[2])); this.module = module; this.crystalMap = new HashMap<String, Crystal>(); + try { this.makeTransformation(); + } catch (Exception e) { + throw new RuntimeException(e); } - catch (FileNotFoundException ex) { - Logger.getLogger(Transformations.class.getName()).log(Level.SEVERE, null, ex); - } - } - //returns the map of crystals + // returns the map of crystals public Map<String, Crystal> getCrystalMap() { return this.crystalMap; } - //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(); + // does all the transformatios initiated in constructor + private void makeTransformation() throws Exception { + // trying to access database to read ecal crystal positions and channels - //define number of crystals - int Ncrys = positions.size(); + // initializing database access + DatabaseConditionsManager mgr = DatabaseConditionsManager.getInstance(); + EcalCrystalPositionCollection positions = mgr.getCachedConditions(EcalCrystalPositionCollection.class, + "ecal_crystal_positions").getCachedData(); - //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("Got " + positions.size() + " ECal crystal positions from database."); - // LOGGER.info(data.toString()); - GVector[] frontXYZ = new GVector[Ncrys]; - GVector[] backXYZ = new GVector[Ncrys]; + EcalChannel.EcalChannelCollection channels = mgr.getCachedConditions(EcalChannel.EcalChannelCollection.class, + "ecal_channels").getCachedData(); - //declaring temp center mass vector to be used in the loop - GVector CMvec_nom = new GVector(); + LOGGER.info("Got " + channels.size() + " ECal crystal positions from database."); + // define number of crystals + int Ncrys = positions.size(); + + // crystal layer is equivalent to Y(-5;5) and col-> to X(-23;23) of ecal mapping + int[] layer = new int[Ncrys]; + int[] col = new int[Ncrys]; + + // LOGGER.info(data.toString()); + GVector[] frontXYZ = new GVector[Ncrys]; + GVector[] backXYZ = new GVector[Ncrys]; + + // declaring temp center mass vector to be used in the loop + GVector CMvec_nom = new GVector(); + + // translate the coordinate system to CM + for (int loop = 0; loop < Ncrys; loop++) { + + // getting the EcalCrystalPosition object for a crystal + EcalCrystalPosition position = positions.get(loop); + int channelId = position.getChannelId(); + // reading crystal layer(row)-Y and column-X from channels collection in database + layer[loop] = channels.findChannel(channelId).getY(); + col[loop] = channels.findChannel(channelId).getX(); + // reading crystal position from positions collection in database + frontXYZ[loop] = new GVector(position.getFrontX(), position.getFrontY(), position.getFrontZ()); + backXYZ[loop] = new GVector(position.getBackX(), position.getBackY(), position.getBackZ()); + + if (this.module.compareToIgnoreCase("bottom") == 0 && layer[loop] > 0) { + // crystalMap.put(String.format("c%d:l%d", col[loop].intValue(), layer[loop].intValue()), + // new Crystal(col[loop].intValue(), layer[loop].intValue(), + // new Geant4Position(frontXYZ[loop], backXYZ[loop]))); + continue; + } else if (this.module.compareToIgnoreCase("top") == 0 && layer[loop] < 0) { + // crystalMap.put(String.format("c%d:l%d", col[loop].intValue(), layer[loop].intValue()), + // new Crystal(col[loop].intValue(), layer[loop].intValue(), + // new Geant4Position(frontXYZ[loop], backXYZ[loop]))); + continue; + } + + LOGGER.info("Initial position are:"); + LOGGER.info(frontXYZ[loop].toString()); + LOGGER.info(backXYZ[loop].toString()); + + // setting the right vector to move to center mass system of a module + if (layer[loop] > 0) { + CMvec_nom = CMvec_nom_top; + } else if (layer[loop] < 0) { + CMvec_nom = CMvec_nom_bot; + } + + // translate by the vector = center of coordinate system, I mean + // where the ecal is. + frontXYZ[loop] = frontXYZ[loop].TranslateBy(CMvec_nom.getOpposite()); + backXYZ[loop] = backXYZ[loop].TranslateBy(CMvec_nom.getOpposite()); + // frontXYZ[loop] = frontXYZ[loop].TranslateBy(CMvec_nom); + // backXYZ[loop] = backXYZ[loop].TranslateBy(CMvec_nom); + + // LOGGER.info(CMvec_nom.toString()); + // LOGGER.info("after translation to CM COO-system"); + // LOGGER.info(frontXYZ[loop].toString()); + // LOGGER.info(backXYZ[loop].toString()); + + // / Rotate the modules by angle calc from suvey data + frontXYZ[loop] = frontXYZ[loop].RotateBy(this.rotation[0], this.rotation[1], this.rotation[2]); + backXYZ[loop] = backXYZ[loop].RotateBy(this.rotation[0], this.rotation[1], this.rotation[2]); + + // LOGGER.info("after module plane rotation"); + // LOGGER.info(frontXYZ[loop].toString()); + // LOGGER.info(backXYZ[loop].toString()); + + // Translate modules by the translation vector the diff of CM + frontXYZ[loop] = frontXYZ[loop].TranslateBy(transVec); + backXYZ[loop] = backXYZ[loop].TranslateBy(transVec); + + // LOGGER.info("after translation by survey shift"); + // LOGGER.info(frontXYZ[loop].toString()); + // LOGGER.info(backXYZ[loop].toString()); + + // / Translate back to initial coordinate system + frontXYZ[loop] = frontXYZ[loop].TranslateBy(CMvec_nom); + backXYZ[loop] = backXYZ[loop].TranslateBy(CMvec_nom); + // LOGGER.info("after translation back to initial system"); + // LOGGER.info(frontXYZ[loop].toString()); + // LOGGER.info(backXYZ[loop].toString()); + + // uncomment if need to write things in a file /* - * 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" ); + * 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"); */ - // translate the coordinate system to CM - for (int loop = 0; loop < Ncrys; loop++) { + if (frontXYZ[loop] == null || backXYZ[loop] == null) { + throw new RuntimeException("The front or back vectors are null."); + } - //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()); + // dfine the position as a geant4position object for a crystal + Geant4Position g4pos = new Geant4Position(frontXYZ[loop], backXYZ[loop]); - if (this.module.compareToIgnoreCase("bottom") == 0 && layer[loop] > 0) { - // crystalMap.put(String.format("c%d:l%d", col[loop].intValue(), layer[loop].intValue()), - // new Crystal(col[loop].intValue(), layer[loop].intValue(), - // new Geant4Position(frontXYZ[loop], backXYZ[loop]))); - continue; - } - else if (this.module.compareToIgnoreCase("top") == 0 && layer[loop] < 0) { - // crystalMap.put(String.format("c%d:l%d", col[loop].intValue(), layer[loop].intValue()), - // new Crystal(col[loop].intValue(), layer[loop].intValue(), - // new Geant4Position(frontXYZ[loop], backXYZ[loop]))); - continue; - } - - LOGGER.info("Initial position are:"); - LOGGER.info(frontXYZ[loop].toString()); - LOGGER.info(backXYZ[loop].toString()); - - //setting the right vector to move to center mass system of a module - if (layer[loop] > 0) { - CMvec_nom = CMvec_nom_top; - } - else if (layer[loop] < 0) { - CMvec_nom = CMvec_nom_bot; - } - - // translate by the vector = center of coordinate system, I mean - // where the ecal is. - frontXYZ[loop] = frontXYZ[loop].TranslateBy(CMvec_nom.getOpposite()); - backXYZ[loop] = backXYZ[loop].TranslateBy(CMvec_nom.getOpposite()); - // frontXYZ[loop] = frontXYZ[loop].TranslateBy(CMvec_nom); - // backXYZ[loop] = backXYZ[loop].TranslateBy(CMvec_nom); - - LOGGER.info(CMvec_nom.toString()); - LOGGER.info("after translation to CM COO-system"); - //LOGGER.info(frontXYZ[loop].toString()); - //LOGGER.info(backXYZ[loop].toString()); - - // / Rotate the modules by angle calc from suvey data - frontXYZ[loop] = frontXYZ[loop].RotateBy(this.rotation[0], this.rotation[1], this.rotation[2]); - backXYZ[loop] = backXYZ[loop].RotateBy(this.rotation[0], this.rotation[1], this.rotation[2]); - - LOGGER.info("after module plane rotation"); - //LOGGER.info(frontXYZ[loop].toString()); - //LOGGER.info(backXYZ[loop].toString()); - - // Translate modules by the translation vector the diff of CM - frontXYZ[loop] = frontXYZ[loop].TranslateBy(transVec); - backXYZ[loop] = backXYZ[loop].TranslateBy(transVec); - - LOGGER.info("after translation by survey shift"); - //LOGGER.info(frontXYZ[loop].toString()); - //LOGGER.info(backXYZ[loop].toString()); - - // / Translate back to initial coordinate system - frontXYZ[loop] = frontXYZ[loop].TranslateBy(CMvec_nom); - backXYZ[loop] = backXYZ[loop].TranslateBy(CMvec_nom); - LOGGER.info("after translation back to initial system"); - //LOGGER.info(frontXYZ[loop].toString()); - //LOGGER.info(backXYZ[loop].toString()); - - //uncomment if need to write things in a file - /* - * bw.write(String.valueOf(col[loop].intValue()) + "\t" + - * String.valueOf(layer[loop].intValue()) + "\t" + - * String.valueOf(frontXYZ[loop].x) + "\t" + - * String.valueOf(frontXYZ[loop].y) + "\t" + - * String.valueOf(frontXYZ[loop].z) + "\t" + - * String.valueOf(backXYZ[loop].x) + "\t" + - * String.valueOf(backXYZ[loop].y) + "\t" + - * String.valueOf(backXYZ[loop].z) + "\n"); - */ - if (frontXYZ[loop] == null || backXYZ[loop] == null) { - throw new RuntimeException("The 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()); - } - LOGGER.info(("Number of crystal map content after transformations in the "+this.module+" module = " + crystalMap.size())); + // 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()); } - catch (RuntimeException e) { - e.printStackTrace(new PrintStream("Database manager object was not initialized properly or required data were not cached.")); - } + LOGGER.info(("Number of crystal map content after transformations in the " + this.module + " module = " + + crystalMap.size())); } } 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 Mon May 16 14:32:37 2016 @@ -1,7 +1,6 @@ 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; @@ -11,7 +10,6 @@ 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; @@ -34,13 +32,10 @@ import org.lcsim.geometry.subdetector.HPSEcal4; /* - * For class description contact Jeremy - * For implementatoin details contact Annie - * + * 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()); @@ -56,127 +51,120 @@ @Override public void convert(final Subdetector subdet, final Detector detector) { + LOGGER.info(("converting subdetector " + subdet.getName())); + helper = subdet.getDetectorElement().getIdentifierHelper(); + dict = helper.getIdentifierDictionary(); + final Element dimensions = subdet.getNode().getChild("dimensions"); + double dx1, dx2, dy1, dy2, dz; + + double tr_top[] = {-100, -100, -100}; + double tr_bot[] = {-100, -100, -100}; + double rot_top[] = {-100, -100, -100}; + double rot_bot[] = {-100, -100, -100}; try { - - 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); + 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(); + + } 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++; + } - 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); } + LOGGER.info(("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 Mon May 16 14:32:37 2016 @@ -1,16 +1,13 @@ 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; import org.lcsim.geometry.compact.converter.lcdd.util.PhysVol; @@ -20,132 +17,113 @@ 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]) + * @author annie + * @author jeremym */ 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 { - 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."); + + 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(); + + 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."); + + if (crystal.getCrystalG4Pos() == null) + throw new RuntimeException("g4pos of crystal is null."); + + double[] centerxyz = crystal.getCrystalG4Pos().getCenterArr(); + double[] thetaxyz = crystal.getCrystalG4Pos().getTaitBryanAngles(); + + // Transform of crystal. + Position ipos = new Position(baseName + "_pos", centerxyz[0], centerxyz[1], centerxyz[2]); + Rotation irot = new Rotation(baseName + "_rot", thetaxyz[0], thetaxyz[1], thetaxyz[2] - zrot_cry); + define.addPosition(ipos); + define.addRotation(irot); + + // Place the crystal. + PhysVol CrystalPlacementBot = new PhysVol(crystalLogVol, world, ipos, irot); + // Add volume IDs. + CrystalPlacementBot.addPhysVolID("system", system); + CrystalPlacementBot.addPhysVolID("ix", ix); + CrystalPlacementBot.addPhysVolID("iy", iy); + } - 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); - - } - - } - } - catch (ConditionsManager.ConditionsNotFoundException ex) { - Logger.getLogger(HPSEcal4.class.getName()).log(Level.SEVERE, null, ex); + } - } public boolean isCalorimeter() { 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 Mon May 16 14:32:37 2016 @@ -41,6 +41,14 @@ EcalChannel channel = channels.findChannel(channelId); System.out.println(channel); //System.out.println(position); + double frontX = position.getFrontX(); + double frontY = position.getFrontY(); + double frontZ = position.getFrontZ(); + double backX = position.getBackX(); + double backY = position.getBackY(); + double backZ = position.getBackZ(); + System.out.println("fx, fy, fz, bx, by, bz = " + frontX + ", " + frontY + ", " + frontZ + ", " + + backX + ", " + backY + ", " + backZ); System.out.println(); System.out.println("back "+xback+" "+yback+" "+zback+" "); System.out.println("front "+xfront+" "+yfront+" "+zfront+" ");