Author: [log in to unmask]
Date: Mon Feb 2 14:15:32 2015
New Revision: 3498
Log:
Allow bottom and top gap sizes to be different in HPSEcal3 detector model. HPSJAVA-388
Added:
projects/lcsim/trunk/detector-framework/src/test/java/org/lcsim/geometry/subdetector/HPSEcal3Test.java
Removed:
projects/lcsim/trunk/detector-framework/src/test/java/org/lcsim/detector/converter/compact/HPSEcal3ConverterTest.java
Modified:
projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/detector/converter/compact/HPSEcal3Converter.java
projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/lcdd/HPSEcal3.java
projects/lcsim/trunk/detector-framework/src/test/resources/org/lcsim/geometry/subdetector/HPSEcal3Test.xml
Modified: projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/detector/converter/compact/HPSEcal3Converter.java
=============================================================================
--- projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/detector/converter/compact/HPSEcal3Converter.java (original)
+++ projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/detector/converter/compact/HPSEcal3Converter.java Mon Feb 2 14:15:32 2015
@@ -104,7 +104,8 @@
double dx1, dx2, dy1, dy2, dz;
Element layout;
- double beamgap;
+ double beamgap = 0;
+ double beamgapTop, beamgapBottom;
int nx, ny;
double dface;
double tdx, tdy, tdz;
@@ -120,7 +121,21 @@
// Layout parameters.
layout = subdet.getNode().getChild("layout");
- beamgap = layout.getAttribute("beamgap").getDoubleValue();
+ 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.");
+ }
+ }
+ beamgapTop = beamgap;
+ if (layout.getAttribute("beamgapTop") != null) {
+ beamgapTop = layout.getAttribute("beamgapTop").getDoubleValue();
+ }
+ beamgapBottom = beamgap;
+ if (layout.getAttribute("beamgapBottom") != null) {
+ beamgapBottom = layout.getAttribute("beamgapBottom").getDoubleValue();
+ }
nx = layout.getAttribute("nx").getIntValue();
ny = layout.getAttribute("ny").getIntValue();
dface = layout.getAttribute("dface").getDoubleValue();
@@ -249,7 +264,7 @@
if (checkRange(ix, -iy, ranges)) {
// Transform of positive bottom crystal.
- ITranslation3D iposBot = new Translation3D(xcenter + bdx, -(beamgap + ycenter + tolerance) + bdy, zcenter + tolerance + dface + bdz);
+ ITranslation3D iposBot = new Translation3D(xcenter + bdx, -(beamgapBottom + ycenter + tolerance) + bdy, zcenter + tolerance + dface + bdz);
IRotation3D irotBot = new RotationGeant(-thetax, -thetay, thetaz);
// Place positive crystal.
@@ -262,7 +277,7 @@
if (ix != 0) {
if (checkRange(-ix, -iy, ranges)) {
// Transform of negative.
- ITranslation3D iposnegBot = new Translation3D(-xcenter + bdx, -(beamgap + ycenter + tolerance) + bdy, zcenter + tolerance + dface + bdz);
+ ITranslation3D iposnegBot = new Translation3D(-xcenter + bdx, -(beamgapBottom + ycenter + tolerance) + bdy, zcenter + tolerance + dface + bdz);
IRotation3D irotnegBot = new RotationGeant(-thetax, thetay, thetaz);
// Place negative crystal.
@@ -274,7 +289,7 @@
if (checkRange(ix, iy, ranges)) {
// Transform of positive top crystal.
- Translation3D iposTop = new Translation3D(xcenter + tdx, beamgap + ycenter + tolerance + tdy, zcenter + tolerance + dface + tdz);
+ Translation3D iposTop = new Translation3D(xcenter + tdx, beamgapTop + ycenter + tolerance + tdy, zcenter + tolerance + dface + tdz);
IRotation3D irotTop = new RotationGeant(thetax, -thetay, thetaz);
// Place positive top crystal.
@@ -287,7 +302,7 @@
if (ix != 0) {
if (checkRange(-ix, iy, ranges)) {
// Transform of negative.
- ITranslation3D iposnegTop = new Translation3D(-xcenter + tdx, beamgap + ycenter + tolerance + tdy, zcenter + tolerance + dface + tdz);
+ ITranslation3D iposnegTop = new Translation3D(-xcenter + tdx, beamgapTop + ycenter + tolerance + tdy, zcenter + tolerance + dface + tdz);
IRotation3D irotnegTop = new RotationGeant(thetax, thetay, thetaz);
// Place negative crystal.
Modified: projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/lcdd/HPSEcal3.java
=============================================================================
--- projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/lcdd/HPSEcal3.java (original)
+++ projects/lcsim/trunk/detector-framework/src/main/java/org/lcsim/geometry/compact/converter/lcdd/HPSEcal3.java Mon Feb 2 14:15:32 2015
@@ -36,6 +36,8 @@
*
* <ul>
* <li><b>beamgap</b> - offset from the beamline in the Y coordinate of the top and bottom halves</li>
+ * <li><b>beamgapTop</b> - offset from the beamline in the Y coordinate for the top half (defaults to <b>beamgap</b>)</li>
+ * <li><b>beamgapBottom</b> - offset from the beamline in the Y coordinate for the bottom half (defaults to <b>beamgap</b>)</li>
* <li><b>nx</b> - number of crystals in X</li>
* <li><b>ny</b> - number of crystals in Y along each side of beam</li>
* <li><b>dface</b> - distance from origin to the face of the calorimeter along Z</li>
@@ -142,7 +144,22 @@
// Layout parameters.
Element layout = node.getChild("layout");
- double beamgap = layout.getAttribute("beamgap").getDoubleValue();
+ 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.");
+ }
+ }
+ double beamgapTop = beamgap;
+ if (layout.getAttribute("beamgapTop") != null) {
+ beamgapTop = layout.getAttribute("beamgapTop").getDoubleValue();
+ }
+ double beamgapBottom = beamgap;
+ if (layout.getAttribute("beamgapBottom") != null) {
+ beamgapBottom = layout.getAttribute("beamgapBottom").getDoubleValue();
+ }
int nx = layout.getAttribute("nx").getIntValue();
int ny = layout.getAttribute("ny").getIntValue();
double dface = layout.getAttribute("dface").getDoubleValue();
@@ -269,7 +286,7 @@
if (checkRange(ix, -iy, ranges)) {
// Transform of positive bottom crystal.
- Position iposBot = new Position(baseName + "_pos_pos_bot", xcenter + bdx, -(beamgap + ycenter + tolerance) + bdy, zcenter + tolerance + dface + bdz);
+ Position iposBot = new Position(baseName + "_pos_pos_bot", xcenter + bdx, -(beamgapBottom + ycenter + tolerance) + bdy, zcenter + tolerance + dface + bdz);
//System.out.println("iposBot = " + iposBot.x() + ", " + iposBot.y() + " , " + iposBot.z() + " --> " + ix + ", " + -iy);
Rotation irotBot = new Rotation(baseName + "_rot_pos_bot", -thetax, -thetay, thetaz);
@@ -289,7 +306,7 @@
if (ix != 0) {
if (checkRange(-ix, -iy, ranges)) {
// Transform of negative.
- Position iposnegBot = new Position(baseName + "_pos_neg_bot", -xcenter + bdx, -(beamgap + ycenter + tolerance) + bdy, zcenter + tolerance + dface + bdz);
+ Position iposnegBot = new Position(baseName + "_pos_neg_bot", -xcenter + bdx, -(beamgapBottom + ycenter + tolerance) + bdy, zcenter + tolerance + dface + bdz);
//System.out.println("iposnegBot = " + iposnegBot.x() + ", " + iposnegBot.y() + " , " + iposnegBot.z() + " --> " + -ix + ", " + -iy);
Rotation irotnegBot = new Rotation(baseName + "_rot_neg_bot", -thetax, thetay, thetaz);
@@ -308,7 +325,7 @@
if (checkRange(ix, iy, ranges)) {
// Transform of positive top crystal.
- Position iposTop = new Position(baseName + "_pos_pos_top", xcenter + tdx, beamgap + ycenter + tolerance + tdy, zcenter + tolerance + dface + tdz);
+ Position iposTop = new Position(baseName + "_pos_pos_top", xcenter + tdx, beamgapTop + ycenter + tolerance + tdy, zcenter + tolerance + dface + tdz);
//System.out.println("iposTop = " + iposTop.x() + ", " + iposTop.y() + " , " + iposTop.z() + " --> " + ix + ", " + iy);
Rotation irotTop = new Rotation(baseName + "_rot_pos_top", thetax, -thetay, thetaz);
define.addPosition(iposTop);
@@ -327,7 +344,7 @@
if (ix != 0) {
if (checkRange(-ix, iy, ranges)) {
// Transform of negative.
- Position iposnegTop = new Position(baseName + "_pos_neg_top", -xcenter + tdx, beamgap + ycenter + tolerance + tdy, zcenter + tolerance + dface + tdz);
+ Position iposnegTop = new Position(baseName + "_pos_neg_top", -xcenter + tdx, beamgapTop + ycenter + tolerance + tdy, zcenter + tolerance + dface + tdz);
//System.out.println("iposTop = " + iposnegTop.x() + ", " + iposnegTop.y() + " , " + iposnegTop.z() + " --> " + -ix + ", " + iy);
Rotation irotnegTop = new Rotation(baseName + "_rot_neg_top", thetax, thetay, thetaz);
Added: projects/lcsim/trunk/detector-framework/src/test/java/org/lcsim/geometry/subdetector/HPSEcal3Test.java
=============================================================================
--- projects/lcsim/trunk/detector-framework/src/test/java/org/lcsim/geometry/subdetector/HPSEcal3Test.java (added)
+++ projects/lcsim/trunk/detector-framework/src/test/java/org/lcsim/geometry/subdetector/HPSEcal3Test.java Mon Feb 2 14:15:32 2015
@@ -0,0 +1,57 @@
+package org.lcsim.geometry.subdetector;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+import junit.framework.TestCase;
+
+import org.lcsim.detector.IDetectorElement;
+import org.lcsim.detector.IGeometryInfo;
+import org.lcsim.detector.identifier.IIdentifierHelper;
+import org.lcsim.geometry.Detector;
+import org.lcsim.geometry.GeometryReader;
+import org.lcsim.geometry.compact.converter.lcdd.Main;
+import org.lcsim.util.test.TestUtil.TestOutputFile;
+
+/**
+ * Test conversion of detector type {@link org.lcsim.geometry.subdetector.HPSEcal3}
+ * to LCDD, Heprep, and in-memory Java objects.
+ *
+ * @author Jeremy McCormick <[log in to unmask]>
+ */
+public class HPSEcal3Test extends TestCase {
+
+ public void testLCDD() throws Exception {
+ InputStream in = getClass().getResourceAsStream("/org/lcsim/geometry/subdetector/HPSEcal3Test.xml");
+ new TestOutputFile(getClass().getSimpleName()).mkdir();
+ File file = new TestOutputFile(getClass().getSimpleName() + File.separator + "HPSEcal3Test.lcdd");
+ OutputStream out = new FileOutputStream(file);
+ new Main().convert("HPSEcal3Test", in, out);
+ }
+
+ public void testHeprep() throws Exception {
+ InputStream in = getClass().getResourceAsStream("/org/lcsim/geometry/subdetector/HPSEcal3Test.xml");
+ new TestOutputFile(getClass().getSimpleName()).mkdir();
+ File file = new TestOutputFile(getClass().getSimpleName() + File.separator + "HPSEcal3Test.heprep");
+ OutputStream out = new FileOutputStream(file);
+ new org.lcsim.geometry.compact.converter.heprep.Main().convert("HPSEcal3Test", in, out);
+ }
+
+ public void testDetector() throws Exception {
+ GeometryReader geometryReader = new GeometryReader();
+ InputStream in = getClass().getResourceAsStream("/org/lcsim/geometry/subdetector/HPSEcal3Test.xml");
+ Detector detector = geometryReader.read(in);
+ System.out.println("built detector " + detector.getName());
+
+ IDetectorElement de = detector.getSubdetector("ECAL").getDetectorElement();
+ System.out.println("ECAL has " + de.getChildren().size() + " crystals.");
+ IIdentifierHelper helper = de.getIdentifierHelper();
+ for (IDetectorElement crystal : de.getChildren()) {
+ IGeometryInfo geometry = crystal.getGeometry();
+ System.out.println(crystal.getName() + " - " + helper.unpack(crystal.getIdentifier()) + " @ " + geometry.getPosition());
+ }
+
+ }
+}
Modified: projects/lcsim/trunk/detector-framework/src/test/resources/org/lcsim/geometry/subdetector/HPSEcal3Test.xml
=============================================================================
--- projects/lcsim/trunk/detector-framework/src/test/resources/org/lcsim/geometry/subdetector/HPSEcal3Test.xml (original)
+++ projects/lcsim/trunk/detector-framework/src/test/resources/org/lcsim/geometry/subdetector/HPSEcal3Test.xml Mon Feb 2 14:15:32 2015
@@ -1,7 +1,5 @@
-<lccdd xmlns:compact="http://www.lcsim.org/schemas/compact/1.0"
- xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
- xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/compact/1.0/compact.xsd">
- <info name="HPSEcal3Test"/>
+<lccdd xmlns:compact="http://www.lcsim.org/schemas/compact/1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/compact/1.0/compact.xsd">
+ <info name="HPSEcal3Test" />
<define>
<!-- world volume -->
<constant name="world_side" value="10000.0*cm" />
@@ -9,32 +7,28 @@
<constant name="world_y" value="world_side" />
<constant name="world_z" value="world_side" />
<!-- tracking region -->
- <constant name="tracking_region_radius" value="200.0*cm"/>
- <constant name="tracking_region_min" value="5.0*cm"/>
- <constant name="tracking_region_zmax" value="100.0*cm"/>
- <!-- ECal placement parameters -->
+ <constant name="tracking_region_radius" value="200.0*cm" />
+ <constant name="tracking_region_min" value="5.0*cm" />
+ <constant name="tracking_region_zmax" value="100.0*cm" />
+ <!-- ECal placement parameters -->
<constant name="ecal_front" value="13.3/2*mm" />
<constant name="ecal_back" value="16/2*mm" />
<constant name="ecal_z" value="160/2*mm" />
</define>
<materials>
<material name="LeadTungstate">
- <D value="8.28" unit="g/cm3"/>
- <composite n="1" ref="Pb"/>
- <composite n="1" ref="W"/>
- <composite n="4" ref="O"/>
+ <D value="8.28" unit="g/cm3" />
+ <composite n="1" ref="Pb" />
+ <composite n="1" ref="W" />
+ <composite n="4" ref="O" />
</material>
</materials>
<detectors>
- <detector id="2"
- name="ECAL"
- type="HPSEcal3"
- insideTrackingVolume="false"
- readout="ECAL_HITS">
+ <detector id="2" name="ECAL" type="HPSEcal3" insideTrackingVolume="false" readout="ECAL_HITS">
<material name="LeadTungstate" />
<dimensions x1="ecal_front" y1="ecal_front" x2="ecal_back" y2="ecal_back" z="ecal_z" />
- <layout beamgap="20.0*mm" nx="46" ny="5" dface="120.0*cm">
- <remove ixmin="2" ixmax="7" iymin="-1" iymax="1" />
+ <layout beamgapBottom="40.0*mm" beamgapTop="20.0*mm" nx="46" ny="5" dface="120.0*cm">
+ <remove ixmin="2" ixmax="7" iymin="-1" iymax="1" />
</layout>
</detector>
</detectors>
@@ -44,4 +38,4 @@
<id>system:6,side:-2,layer:4,ix:-8,iy:-6</id>
</readout>
</readouts>
-</lccdd>
+</lccdd>
########################################################################
Use REPLY-ALL to reply to list
To unsubscribe from the LCDET-SVN list, click the following link:
https://listserv.slac.stanford.edu/cgi-bin/wa?SUBED1=LCDET-SVN&A=1
|