GeomConverter/src/org/lcsim/geometry/compact/converter/lcdd
diff -u -r1.7 -r1.7.2.1
--- ForwardDetector.java 18 Jul 2005 22:04:11 -0000 1.7
+++ ForwardDetector.java 27 Oct 2005 22:56:58 -0000 1.7.2.1
@@ -33,12 +33,12 @@
/** Creates a new instance of ForwardDetector */
public ForwardDetector(Element node) throws JDOMException
{
- super(node);
+ super(node);
}
/** FIXME: This method is horrible spaghetti code. --JM */
public void addToLCDD(LCDD lcdd, SensitiveDetector sens) throws JDOMException
- {
+ {
String detectorName = node.getAttributeValue("name");
int id = node.getAttribute("id").getIntValue();
@@ -56,22 +56,22 @@
Element dimensions = node.getChild("dimensions");
double zinner = dimensions.getAttribute("inner_z").getDoubleValue();
double rmax = dimensions.getAttribute("outer_r").getDoubleValue();
- double rmin = dimensions.getAttribute("inner_r").getDoubleValue();
+ double rmin = dimensions.getAttribute("inner_r").getDoubleValue();
/** Beampipe parameters. */
Element beam = node.getChild("beampipe");
double outgoingR = beam.getAttribute("outgoing_r").getDoubleValue();
double incomingR = beam.getAttribute("incoming_r").getDoubleValue();
- double xangle = beam.getAttribute("crossing_angle").getDoubleValue();
- double xangleHalf = xangle / 2;
+ double xangle = beam.getAttribute("crossing_angle").getDoubleValue();
+ double xangleHalf = xangle / 2;
/** Computed z values. */
- double thickness = layers.getLayerStack().getTotalThickness();
+ double thickness = layers.getLayerStack().getTotalThickness();
double zpos = zinner + (thickness / 2);
double zouter = zinner + thickness;
/** Beampipe position in envelope. */
- double beamPosX = Math.tan(xangleHalf) * zpos;
+ double beamPosX = Math.tan(xangleHalf) * zpos;
//System.out.println("xangleHalf: " + xangleHalf);
//System.out.println("thickness: " + thickness);
//System.out.println("zpos: " + zpos);
@@ -85,7 +85,7 @@
solids.addSolid(envelopeTube);
/** Incoming beampipe solid. */
- Tube beamInTube = new Tube(detectorName + "_beampipe_incoming_tube");
+ Tube beamInTube = new Tube(detectorName + "_beampipe_incoming_tube");
beamInTube.setZ(thickness * 2);
beamInTube.setRMin(0);
beamInTube.setRMax(outgoingR);
@@ -98,17 +98,17 @@
beamOutTube.setRMax(incomingR);
solids.addSolid(beamOutTube);
- /** /\/\/\/\ First envelope boolean subtraction of incoming beampipe. /\/\/\/\ */
- SubtractionSolid envelopeSubtraction1 =
+ /** /\/\/\/\ First envelope boolean subtraction of incoming beampipe. /\/\/\/\ */
+ SubtractionSolid envelopeSubtraction1 =
new SubtractionSolid(detectorName + "_subtraction1_tube");
envelopeSubtraction1.setFirstSolid(envelopeTube);
envelopeSubtraction1.setSecondSolid(beamInTube);
- solids.addSolid(envelopeSubtraction1);
+ solids.addSolid(envelopeSubtraction1);
/** Position of incoming beampipe. */
- Position beamInPos = new Position(detectorName + "_subtraction1_tube_pos");
+ Position beamInPos = new Position(detectorName + "_subtraction1_tube_pos");
defines.addPosition(beamInPos);
- beamInPos.setX(beamPosX);
+ beamInPos.setX(beamPosX);
envelopeSubtraction1.setPosition(beamInPos);
/** Rotation of incoming beampipe. */
@@ -116,7 +116,7 @@
defines.addRotation(beamInRot);
beamInRot.setY(xangleHalf);
envelopeSubtraction1.setRotation(beamInRot);
-
+
/** /\/\/\/\ Second envelope boolean subtracion of outgoing beampipe. /\/\/\/\ */
SubtractionSolid envelopeSubtraction2 =
new SubtractionSolid(detectorName + "_subtraction2_tube");
@@ -127,7 +127,7 @@
/** Position of outgoing beampipe. */
Position beamOutPos = new Position(detectorName + "_subtraction2_tube_pos");
defines.addPosition(beamOutPos);
- beamOutPos.setX(-beamPosX);
+ beamOutPos.setX(-beamPosX);
envelopeSubtraction2.setPosition(beamOutPos);
/** Rotation of outgoing beampipe. */
@@ -135,26 +135,26 @@
defines.addRotation(beamOutRot);
beamOutRot.setY(-xangleHalf);
envelopeSubtraction2.setRotation(beamOutRot);
-
+
/** Final envelope boolean volume. */
Volume envelopeVolume = new Volume(detectorName + "_envelope_volume");
- envelopeVolume.setSolid(envelopeSubtraction2);
- envelopeVolume.setMaterial(air);
+ envelopeVolume.setSolid(envelopeSubtraction2);
+ envelopeVolume.setMaterial(air);
/** Process each layer element. */
- double layerPosZ = -thickness / 2;
- double layerDisplZ = 0;
+ double layerPosZ = -thickness / 2;
+ double layerDisplZ = 0;
for (Object o : node.getChildren("layer") )
- {
- Element layerElem = (Element) o;
+ {
+ Element layerElem = (Element) o;
int repeat = layerElem.getAttribute("repeat").getIntValue();
- double layerThickness = LayerFromCompactCnv.computeSingleLayerThickness(layerElem);
+ double layerThickness = LayerFromCompactCnv.computeSingleLayerThickness(layerElem);
- /**
- * Create tube envelope for this layer, which can be reused in boolean definition
- * in the repeat loop below.
+ /**
+ * Create tube envelope for this layer, which can be reused in boolean definition
+ * in the repeat loop below.
*/
Tube layerTube = new Tube(detectorName + "_layer_tube");
layerTube.setRMin(rmin);
@@ -168,41 +168,41 @@
//System.out.println("proc layer repeat: " + i);
String layerBasename = detectorName + "_layer" + i;
-
+
/** Increment to new layer position. */
layerDisplZ += layerThickness / 2;
layerPosZ += layerThickness / 2;
- //System.out.println("layerPosZ: " + layerPosZ);
+ //System.out.println("layerPosZ: " + layerPosZ);
/** First layer subtraction solid. */
- SubtractionSolid layerSubtraction1 =
+ SubtractionSolid layerSubtraction1 =
new SubtractionSolid(layerBasename + "_subtraction1");
layerSubtraction1.setFirstSolid(layerTube);
layerSubtraction1.setSecondSolid(beamInTube);
solids.addSolid(layerSubtraction1);
Position layerSubtraction1Pos = new Position(layerBasename + "_subtraction1_pos");
-
+
double layerGlobalZ = zinner + layerDisplZ;
// System.out.println("layerGlobalZ: " + layerGlobalZ);
- double layerPosX = Math.tan(xangleHalf) * layerGlobalZ;
+ double layerPosX = Math.tan(xangleHalf) * layerGlobalZ;
// System.out.println("layerPosX: " + layerPosX);
layerSubtraction1Pos.setX(layerPosX);
- defines.addPosition(layerSubtraction1Pos);
+ defines.addPosition(layerSubtraction1Pos);
layerSubtraction1.setPosition(layerSubtraction1Pos);
layerSubtraction1.setRotation(beamInRot);
/** Second layer subtraction solid. */
- SubtractionSolid layerSubtraction2 =
+ SubtractionSolid layerSubtraction2 =
new SubtractionSolid(layerBasename + "_subtraction2");
layerSubtraction2.setFirstSolid(layerSubtraction1);
layerSubtraction2.setSecondSolid(beamOutTube);
solids.addSolid(layerSubtraction2);
Position layerSubtraction2Pos = new Position(layerBasename + "_subtraction2_pos");
- layerSubtraction2Pos.setX(-layerPosX);
+ layerSubtraction2Pos.setX(-layerPosX);
defines.addPosition(layerSubtraction2Pos);
layerSubtraction2.setPosition(layerSubtraction2Pos);
@@ -212,7 +212,7 @@
Volume layerVolume = new Volume(layerBasename + "_volume");
layerVolume.setMaterial(air);
layerVolume.setSolid(layerSubtraction2);
-
+
/** Slice loop. */
double slicePosZ = -layerThickness / 2;
double sliceDisplZ = 0;
@@ -231,7 +231,7 @@
/** Go to mid of this slice. */
sliceDisplZ += sliceThickness / 2;
- slicePosZ += sliceThickness / 2;
+ slicePosZ += sliceThickness / 2;
// System.out.println("sliceDisplZ: " + sliceDisplZ );
// System.out.println("slicePosZ: " + slicePosZ );
@@ -244,7 +244,7 @@
/** First slice subtraction solid. */
SubtractionSolid sliceSubtraction1 =
- new SubtractionSolid(sliceBasename + "_subtraction1");
+ new SubtractionSolid(sliceBasename + "_subtraction1");
sliceSubtraction1.setFirstSolid(sliceTube);
sliceSubtraction1.setSecondSolid(beamInTube);
solids.addSolid(sliceSubtraction1);
@@ -265,7 +265,7 @@
sliceSubtraction1.setRotation(beamInRot);
/** Second slice subtraction solid. */
- SubtractionSolid sliceSubtraction2 =
+ SubtractionSolid sliceSubtraction2 =
new SubtractionSolid(sliceBasename + "_subtraction2");
sliceSubtraction2.setFirstSolid(sliceSubtraction1);
sliceSubtraction2.setSecondSolid(beamOutTube);
@@ -282,16 +282,21 @@
Volume sliceVolume = new Volume(sliceBasename + "_volume");
sliceVolume.setMaterial(lcdd.getMaterial(sliceElem.getAttributeValue("material")));
sliceVolume.setSolid(sliceSubtraction2);
-
- if ( sensitive )
+
+ if ( sensitive )
{
sliceVolume.setSensitiveDetector(sens);
}
+
+ /* FIXME: these need to be called automatically whenever a new volume is created --JM */
+ setLimitSet(lcdd, sliceElem, sliceVolume);
+ setRegion(lcdd, sliceElem, sliceVolume);
+
structure.addVolume(sliceVolume);
/** Slice PV. */
PhysVol slicePV = new PhysVol(sliceVolume);
- slicePV.setZ(slicePosZ);
+ slicePV.setZ(slicePosZ);
layerVolume.addPhysVol(slicePV);
/** Start of next slice. */
@@ -300,20 +305,20 @@
++sliceCount;
}
- structure.addVolume(layerVolume);
+ structure.addVolume(layerVolume);
/** Layer PV. */
PhysVol layerPV = new PhysVol(layerVolume);
layerPV.setZ(layerPosZ);
layerPV.addPhysVolID("layer", i);
- envelopeVolume.addPhysVol(layerPV);
+ envelopeVolume.addPhysVol(layerPV);
/** Increment to start of next layer. */
layerDisplZ += layerThickness / 2;
- layerPosZ += layerThickness / 2;
+ layerPosZ += layerThickness / 2;
}
}
-
+
/** Add envelope LV. */
structure.addVolume(envelopeVolume);
GeomConverter/src/org/lcsim/geometry/compact/converter/lcdd
diff -u -r1.5 -r1.5.2.1
--- PolyhedraBarrelCalorimeter.java 27 Aug 2005 01:09:48 -0000 1.5
+++ PolyhedraBarrelCalorimeter.java 27 Oct 2005 22:56:58 -0000 1.5.2.1
@@ -50,11 +50,11 @@
Volume motherVolume = lcdd.pickMotherVolume(this);
Material air = lcdd.getMaterial("Air");
Define define = lcdd.getDefine();
-
+
/* name and id */
String detName = node.getAttributeValue("name");
int id = node.getAttribute("id").getIntValue();
-
+
/* get dimensions */
Element dimensions = node.getChild("dimensions");
double detZ = dimensions.getAttribute("z").getDoubleValue();
@@ -66,7 +66,7 @@
Rotation rot = new Rotation(detName + "_rotation");
rot.setZ(zrot);
define.addRotation(rot);
-
+
/* total thickness of the detector */
double totalThickness = org.lcsim.geometry.layer.LayerFromCompactCnv.computeDetectorTotalThickness(node);
@@ -89,7 +89,7 @@
/* single stave trapezoid */
double innerAngle = Math.PI * 2 / numsides;
double halfInnerAngle = innerAngle/2;
-
+
Trapezoid sectTrd = new Trapezoid(detName + "_stave_trapezoid");
sectTrd.setY2(detZ);
sectTrd.setY1(detZ);
@@ -105,7 +105,7 @@
Volume sectVolume = new Volume(detName + "_stave");
sectVolume.setMaterial(air);
sectVolume.setSolid(sectTrd);
-
+
/* build the box layers in the stave */
double layerOuterAngle = (PI - innerAngle) / 2;
double layerInnerAngle = (PI/2 - layerOuterAngle);
@@ -128,7 +128,7 @@
Attribute s = slice.getAttribute("sensitive");
boolean sensitive = s != null && s.getBooleanValue();
-
+
double thickness = slice.getAttribute("thickness").getDoubleValue();
posZ += thickness / 2;
@@ -138,7 +138,7 @@
define.addPosition(slicePosition);
/* slice box */
- Box sliceBox = new Box(sliceName + "_box");
+ Box sliceBox = new Box(sliceName + "_box");
sliceBox.setX(dimX);
sliceBox.setY(detZ);
sliceBox.setZ(thickness);
@@ -150,6 +150,11 @@
Material sliceMaterial = lcdd.getMaterial(slice.getAttributeValue("material"));
sliceVolume.setMaterial(sliceMaterial);
if ( sensitive ) sliceVolume.setSensitiveDetector(sens);
+
+ /* FIXME: these need to be called automatically whenever a new volume is created --JM */
+ setLimitSet(lcdd, slice, sliceVolume);
+ setRegion(lcdd, slice, sliceVolume);
+
structure.addVolume(sliceVolume);
/* slice PhysVol */
@@ -158,9 +163,9 @@
slicePhysVol.addPhysVolID("layer", layerNum);
slicePhysVol.addPhysVolID("slice", sliceNum);
sectVolume.addPhysVol(slicePhysVol);
-
+
/* incr X dim */
- dimX += thickness * tan( layerInnerAngle ) * 2;
+ dimX += thickness * tan( layerInnerAngle ) * 2;
/* incr Z position */
posZ += thickness / 2;
@@ -171,11 +176,11 @@
/* incr layer number */
++layerNum;
}
- }
+ }
/* add section volume after all slices */
structure.addVolume(sectVolume);
-
+
/* place the staves */
double innerRotation = innerAngle;
double offsetRotation = -innerRotation / 2;
@@ -204,11 +209,11 @@
PhysVol sectPhysVol = new PhysVol(sectVolume);
sectPhysVol.setPosition(position);
sectPhysVol.setRotation(rotation);
-
+
envelopeVolume.addPhysVol(sectPhysVol);
sectPhysVol.addPhysVolID("stave",0);
sectPhysVol.addPhysVolID("module",moduleNumber);
-
+
rotY -= innerRotation;
posX = -sectCenterRadius * sin(rotY);
posY = sectCenterRadius * cos(rotY);