GeomConverter/src/org/lcsim/geometry/compact/converter/lcdd
diff -u -r1.15 -r1.16
--- PolyhedraEndcapCalorimeter.java 30 Oct 2006 07:39:03 -0000 1.15
+++ PolyhedraEndcapCalorimeter.java 26 Jan 2007 01:37:25 -0000 1.16
@@ -14,7 +14,6 @@
import org.lcsim.geometry.compact.converter.lcdd.util.LCDD;
import org.lcsim.geometry.compact.converter.lcdd.util.Material;
import org.lcsim.geometry.compact.converter.lcdd.util.PhysVol;
-import org.lcsim.geometry.compact.converter.lcdd.util.PolyhedraRegular;
import org.lcsim.geometry.compact.converter.lcdd.util.Position;
import org.lcsim.geometry.compact.converter.lcdd.util.Rotation;
import org.lcsim.geometry.compact.converter.lcdd.util.SensitiveDetector;
@@ -35,11 +34,20 @@
{
private Element node;
- // 25 micron tolerance for staves and layers.
- double tolerance=0.025;
+ // Tolerance applied to subdetector dimensions to avoid overlapping trapezoid faces.
+ private final double STAVE_ENVELOPE_TOLERANCE=10.0;
- // 1 micron tolerance between sublayers.
- double slice_tolerance=0.001;
+ // Subtract from layer dimensions.
+ private final double LAYER_ENVELOPE_TOLERANCE=1.0;
+
+ // Subtract from slice dimensions.
+ private final double SLICE_ENVELOPE_TOLERANCE=1.0;
+
+ // Small gap placed in front of each layer.
+ private final double INTER_LAYER_GAP=1.0;
+
+ // Reduction in size of slice.
+ private final double SLICE_TOLERANCE=0.01;
public PolyhedraEndcapCalorimeter(Element node) throws JDOMException
{
@@ -78,12 +86,20 @@
envelopeRotation.setZ(zrot);
define.addRotation(envelopeRotation);
+ LayerStack layers = Layering.makeLayering(this.node).getLayerStack();
+
// Total thickness of the subdetector.
double subdetector_thickness = org.lcsim.geometry.layer.LayerFromCompactCnv.computeDetectorTotalThickness(node);
- double radial_thickness = rmax - rmin;
- double detZ = subdetector_thickness;
+
+ // DEBUG
+ subdetector_thickness += layers.getNumberOfLayers() * INTER_LAYER_GAP;
+
+ double radial_thickness = rmax - rmin;
+ /*
// The detector envelope volume.
+ *
+ double detZ = subdetector_thickness;
PolyhedraRegular polyhedra = new PolyhedraRegular(
detName + "_polyhedra",
numsides, rmin, rmax, detZ);
@@ -92,6 +108,7 @@
Volume envelopeVolume = new Volume(detName + "_envelope");
envelopeVolume.setSolid(polyhedra);
envelopeVolume.setMaterial(air);
+ */
// The stave's trapezoid.
double innerAngle = Math.PI * 2 / numsides;
@@ -99,29 +116,33 @@
double innerFaceLength = rmin * tan(halfInnerAngle) * 2;
double outerFaceLength = rmax * tan(halfInnerAngle) * 2;
+ // Apply tolerance to dimensions.
+ radial_thickness -= STAVE_ENVELOPE_TOLERANCE;
+ innerFaceLength -= STAVE_ENVELOPE_TOLERANCE;
+ outerFaceLength -= STAVE_ENVELOPE_TOLERANCE;
+
+ //outerFaceLength = (innerFaceLength * outerFaceLength) / (innerFaceLength + STAVE_ENVELOPE_TOLERANCE);
+ //System.out.println("outerFaceLength="+outerFaceLength);
+
Trapezoid sectTrd = new Trapezoid(detName + "_stave_trapezoid");
- sectTrd.setY2(subdetector_thickness - tolerance);
- sectTrd.setY1(subdetector_thickness - tolerance);
- sectTrd.setZ(radial_thickness - tolerance);
- sectTrd.setX1(innerFaceLength - tolerance);
- sectTrd.setX2(outerFaceLength - tolerance);
-
- //sectTrd.setY2(subdetector_thickness);
- //sectTrd.setY1(subdetector_thickness);
- //sectTrd.setZ(radial_thickness);
- //sectTrd.setX1(innerFaceLength);
- //sectTrd.setX2(outerFaceLength);
+ sectTrd.setY2(subdetector_thickness);
+ sectTrd.setY1(subdetector_thickness);
+ sectTrd.setZ(radial_thickness);
+ sectTrd.setX1(innerFaceLength);
+ sectTrd.setX2(outerFaceLength);
solids.addSolid(sectTrd);
Volume sectVolume = new Volume(detName + "_stave");
sectVolume.setMaterial(air);
sectVolume.setSolid(sectTrd);
- LayerStack layers = Layering.makeLayering(this.node).getLayerStack();
-
// Build the layers.
int layer_number = 0;
double layer_position_y = subdetector_thickness / 2;
+
+ // DEBUG
+ layer_position_y -= INTER_LAYER_GAP;
+
for (Iterator i = node.getChildren("layer").iterator(); i.hasNext();)
{
Element layer_element = (Element) i.next();
@@ -144,18 +165,16 @@
// Layer trapezoid.
Trapezoid layer_trd = new Trapezoid(layer_name + "_trapezoid");
- layer_trd.setX1(innerFaceLength - tolerance);
- layer_trd.setX2(outerFaceLength - tolerance);
- layer_trd.setY1(layer_thickness - tolerance);
- layer_trd.setY2(layer_thickness - tolerance);
- layer_trd.setZ(radial_thickness - tolerance);
-
- //layer_trd.setX1(innerFaceLength);
- //layer_trd.setX2(outerFaceLength);
- //layer_trd.setY1(layer_thickness);
- //layer_trd.setY2(layer_thickness);
- //layer_trd.setZ(radial_thickness);
+ double layerInnerFaceLength=innerFaceLength-LAYER_ENVELOPE_TOLERANCE;
+ double layerOuterFaceLength=outerFaceLength-LAYER_ENVELOPE_TOLERANCE;
+ double layerRadialThickness=radial_thickness-LAYER_ENVELOPE_TOLERANCE;
+ layer_trd.setX1(layerInnerFaceLength);
+ layer_trd.setX2(layerOuterFaceLength);
+ layer_trd.setY1(layer_thickness);
+ layer_trd.setY2(layer_thickness);
+ layer_trd.setZ(layerRadialThickness);
+
solids.addSolid(layer_trd);
Volume layer_volume = new Volume(layer_name);
@@ -174,6 +193,10 @@
boolean sensitive = s != null && s.getBooleanValue();
double slice_thickness = slice_element.getAttribute("thickness").getDoubleValue();
+
+ // Apply tolerance factor to given slice thickness.
+ //slice_thickness -= SLICE_TOLERANCE;
+
slice_position_y -= slice_thickness / 2;
Position slicePosition = new Position(slice_name + "_position");
@@ -181,18 +204,16 @@
define.addPosition(slicePosition);
Trapezoid sliceTrd = new Trapezoid(slice_name + "_trapezoid");
-
- sliceTrd.setX1(innerFaceLength - tolerance);
- sliceTrd.setX2(outerFaceLength - tolerance);
- sliceTrd.setY1(slice_thickness - slice_tolerance);
- sliceTrd.setY2(slice_thickness - slice_tolerance);
- sliceTrd.setZ(radial_thickness - tolerance);
- //sliceTrd.setX1(innerFaceLength);
- //sliceTrd.setX2(outerFaceLength);
- //sliceTrd.setY1(slice_thickness);
- //sliceTrd.setY2(slice_thickness);
- //sliceTrd.setZ(radial_thickness);
+ double sliceInnerFaceLength = layerInnerFaceLength - SLICE_ENVELOPE_TOLERANCE;
+ double sliceOuterFaceLength = layerOuterFaceLength - SLICE_ENVELOPE_TOLERANCE;
+ double sliceRadialThickness = layerRadialThickness - SLICE_ENVELOPE_TOLERANCE;
+
+ sliceTrd.setX1(sliceInnerFaceLength);
+ sliceTrd.setX2(sliceOuterFaceLength);
+ sliceTrd.setY1(slice_thickness-SLICE_TOLERANCE);
+ sliceTrd.setY2(slice_thickness-SLICE_TOLERANCE);
+ sliceTrd.setZ(sliceRadialThickness);
solids.addSolid(sliceTrd);
@@ -230,10 +251,15 @@
sectVolume.addPhysVol(layer_physvol);
layer_position_y -= layer_thickness / 2;
+
+ // DEBUG
+ layer_position_y -= INTER_LAYER_GAP;
- ++layer_number;
- }
- }
+ ++layer_number;
+ }
+ // DEBUG
+ //break;
+ }
// Add the section volume after layers created.
setVisAttributes(lcdd, node, sectVolume);
@@ -241,11 +267,15 @@
// Place the sections.
double innerRotation = innerAngle;
- double offsetRotation = -innerRotation / 2;
+ //double offsetRotation = -innerRotation / 2;
+ //double offsetRotation = 0.;
double sectCenterRadius = rmin + radial_thickness / 2;
- double rotY = -offsetRotation;
+ //double rotY = -offsetRotation;
+ double rotY = 0.;
+ //double rotY = 0.;
double rotX = PI / 2;
+ //double rotX = PI / 4;
double posX = -sectCenterRadius * sin(rotY);
double sectPosY = sectCenterRadius * cos(rotY);
for ( int i=0; i < numsides; i++)
@@ -257,6 +287,8 @@
position.setY(sectPosY);
position.setZ(zmin + subdetector_thickness/2);
+ //System.out.println("rotY="+rotY);
+
Rotation rotation = new Rotation(detName + "_stave0_module" + moduleNumber + "_rotation");
rotation.setX(rotX);
rotation.setY(rotY);
@@ -276,6 +308,7 @@
sectPhysVol.addPhysVolID("module",moduleNumber);
// Place the reflected subdetector envelope.
+
boolean reflect = node.getAttribute("reflect").getBooleanValue();
if (reflect)
{
@@ -299,9 +332,7 @@
reflect_position.setZ(-zmin-subdetector_thickness/2);
define.addPosition(reflect_position);
- //PhysVol physvol2 = new PhysVol(envelopeVolume);
PhysVol physvol2 = new PhysVol(sectVolume);
- //physvol2.setZ(-zmin-subdetector_thickness/2);
physvol2.setPosition(reflect_position);
physvol2.setRotation(envelopeRotationReflect);
physvol2.addPhysVolID("system",id);
@@ -314,6 +345,10 @@
rotY -= innerRotation;
posX = -sectCenterRadius * sin(rotY);
sectPosY = sectCenterRadius * cos(rotY);
+
+ // DEBUG
+ //if (i==1)
+ // break;
}
/*