GeomConverter/src/org/lcsim/detector/converter/compact
diff -u -r1.4 -r1.5
--- PolyhedraEndcapCalorimeterConverter.java 24 Mar 2009 21:50:18 -0000 1.4
+++ PolyhedraEndcapCalorimeterConverter.java 10 Sep 2009 01:07:43 -0000 1.5
@@ -17,12 +17,17 @@
import org.lcsim.detector.RotationPassiveXYZ;
import org.lcsim.detector.Transform3D;
import org.lcsim.detector.Translation3D;
+import org.lcsim.detector.identifier.ExpandedIdentifier;
+import org.lcsim.detector.identifier.IExpandedIdentifier;
+import org.lcsim.detector.identifier.IIdentifier;
+import org.lcsim.detector.identifier.IIdentifierHelper;
import org.lcsim.detector.material.IMaterial;
import org.lcsim.detector.material.MaterialStore;
import org.lcsim.detector.solids.Trd;
import org.lcsim.geometry.compact.Detector;
import org.lcsim.geometry.compact.Subdetector;
import org.lcsim.geometry.layer.LayerStack;
+import org.lcsim.geometry.subdetector.BarrelEndcapFlag;
import org.lcsim.geometry.subdetector.PolyhedraEndcapCalorimeter;
public class PolyhedraEndcapCalorimeterConverter
@@ -34,11 +39,27 @@
String detName = node.getAttributeValue("name");
+ int sysId = subdet.getSystemID();
+
+ boolean reflect = true;
+ try
+ {
+ if (node.getAttribute("reflect") != null)
+ {
+ reflect = node.getAttribute("reflect").getBooleanValue();
+ }
+ }
+ catch (Exception t)
+ {
+ throw new RuntimeException(t);
+ }
+
Element dimensions = node.getChild("dimensions");
double zmin, rmin, rmax;
int numsides;
- try {
+ try
+ {
zmin = dimensions.getAttribute("zmin").getDoubleValue();
rmin = dimensions.getAttribute("rmin").getDoubleValue();
rmax = dimensions.getAttribute("rmax").getDoubleValue();
@@ -50,7 +71,8 @@
}
double subdetectorThickness;
- try {
+ try
+ {
subdetectorThickness = org.lcsim.geometry.layer.LayerFromCompactCnv.computeDetectorTotalThickness(node);
}
catch (Exception x)
@@ -64,6 +86,16 @@
double outerFaceLength = rmax * tan(halfInnerAngle) * 2;
double radialThickness = rmax - rmin;
+ DetectorElement endcapPositive =
+ new DetectorElement(subdet.getName() + "_positive", subdet.getDetectorElement());
+
+ DetectorElement endcapNegative = null;
+ if (reflect)
+ {
+ endcapNegative =
+ new DetectorElement(subdet.getName() + "_negative", subdet.getDetectorElement());
+ }
+
Trd sectTrd =
new Trd(detName + "_stave_trapezoid",
innerFaceLength/2,
@@ -78,16 +110,17 @@
LayerStack layers = subdet.getLayering().getLayerStack();
- int layer_number = 0;
- double layer_position_y = subdetectorThickness / 2;
+ int layerNumber = 0;
+ double layerPositionY = subdetectorThickness / 2;
for (Iterator i = node.getChildren("layer").iterator(); i.hasNext();)
{
- Element layer_element = (Element) i.next();
+ Element layerElement = (Element) i.next();
int repeat;
- try {
- repeat = (int)layer_element.getAttribute("repeat").getDoubleValue();
+ try
+ {
+ repeat = (int)layerElement.getAttribute("repeat").getDoubleValue();
}
catch (Exception x)
{
@@ -96,44 +129,45 @@
for ( int j=0; j<repeat; j++)
{
- String layer_name = detName + "_stave_layer" + layer_number;
+ String layerName = detName + "_stave_layer" + layerNumber;
- double layer_thickness = layers.getLayer(layer_number).getThickness();
+ double layerThickness = layers.getLayer(layerNumber).getThickness();
- layer_position_y -= layer_thickness / 2;
+ layerPositionY -= layerThickness / 2;
- Translation3D layer_position = new Translation3D(0,layer_position_y,0);
+ Translation3D layer_position = new Translation3D(0,layerPositionY,0);
double layerInnerFaceLength = innerFaceLength;//-LAYER_ENVELOPE_TOLERANCE;
double layerOuterFaceLength = outerFaceLength;//-LAYER_ENVELOPE_TOLERANCE;
double layerRadialThickness = radialThickness;//-LAYER_ENVELOPE_TOLERANCE;
// Layer trapezoid.
- Trd layer_trd = new Trd(
- layer_name + "_trapezoid",
+ Trd layerTrd = new Trd(
+ layerName + "_trapezoid",
layerInnerFaceLength,
layerOuterFaceLength,
- layer_thickness,
- layer_thickness,
+ layerThickness,
+ layerThickness,
layerRadialThickness);
- ILogicalVolume layer_volume =
+ ILogicalVolume layerVolume =
new LogicalVolume(
- layer_name,
- layer_trd,
+ layerName,
+ layerTrd,
air);
- int slice_number = 0;
- double slice_position_y = layer_thickness / 2;
- for ( Iterator k = layer_element.getChildren("slice").iterator(); k.hasNext();)
+ int sliceNumber = 0;
+ double slicePositionY = layerThickness / 2;
+ for ( Iterator k = layerElement.getChildren("slice").iterator(); k.hasNext();)
{
Element slice_element = (Element)k.next();
- String slice_name = layer_name + "_slice" + slice_number;
+ String sliceName = layerName + "_slice" + sliceNumber;
Attribute s = slice_element.getAttribute("sensitive");
boolean sensitive = false;
- try {
+ try
+ {
sensitive = s != null && s.getBooleanValue();
}
catch (Exception x)
@@ -141,9 +175,10 @@
throw new RuntimeException(x);
}
- double slice_thickness;
- try {
- slice_thickness = slice_element.getAttribute("thickness").getDoubleValue();
+ double sliceThickness;
+ try
+ {
+ sliceThickness = slice_element.getAttribute("thickness").getDoubleValue();
}
catch (Exception x)
{
@@ -153,60 +188,60 @@
// Apply tolerance factor to given slice thickness.
//slice_thickness -= SLICE_TOLERANCE;
- slice_position_y -= slice_thickness / 2;
+ slicePositionY -= sliceThickness / 2;
- Translation3D slicePosition = new Translation3D(0,slice_position_y,0);
+ Translation3D slicePosition = new Translation3D(0,slicePositionY,0);
double sliceInnerFaceLength = layerInnerFaceLength;// - SLICE_ENVELOPE_TOLERANCE;
double sliceOuterFaceLength = layerOuterFaceLength;// - SLICE_ENVELOPE_TOLERANCE;
double sliceRadialThickness = layerRadialThickness;// - SLICE_ENVELOPE_TOLERANCE;
Trd sliceTrd = new Trd(
- slice_name + "_trapezoid",
+ sliceName + "_trapezoid",
sliceInnerFaceLength/2,
sliceOuterFaceLength/2,
- slice_thickness/2,
- slice_thickness/2,
+ sliceThickness/2,
+ sliceThickness/2,
sliceRadialThickness/2);
ILogicalVolume sliceVolume =
new LogicalVolume(
- slice_name,
+ sliceName,
sliceTrd,
MaterialStore.getInstance().get(slice_element.getAttributeValue("material")));
PhysicalVolume slicePhysVol =
new PhysicalVolume(
new Transform3D(slicePosition),
- slice_name,
+ sliceName,
sliceVolume,
- layer_volume,
- 0);
+ layerVolume,
+ sliceNumber);
if (sensitive) slicePhysVol.setSensitive(true);
// The slice thickness is the original, NOT adjusted for tolerance,
// so that the center of the slice is in the right place with tolerance
// gaps on either side.
- slice_position_y -= slice_thickness / 2;
+ slicePositionY -= sliceThickness / 2;
// Increment the slice counter.
- ++slice_number;
+ ++sliceNumber;
}
new PhysicalVolume(
new Transform3D(layer_position),
- layer_name,
- layer_volume,
+ layerName,
+ layerVolume,
sectVolume,
- 0);
+ layerNumber);
- layer_position_y -= layer_thickness / 2;
+ layerPositionY -= layerThickness / 2;
// DEBUG
//layer_position_y -= INTER_LAYER_GAP;
- ++layer_number;
+ ++layerNumber;
}
// DEBUG - Uncomment to build only one layer.
//break;
@@ -220,8 +255,10 @@
for ( int i=0; i < numsides; i++)
{
- double phi = 2*Math.PI*((double)i)/numsides;
- double zc = -phi + Math.PI/2;
+ double phi=-(2*Math.PI*((double)i)/numsides-Math.PI/2);
+ //double phi = 2*Math.PI*((double)i)/numsides;
+ double zc=-phi+Math.PI/2;
+ //double zc = -phi + Math.PI/2;
double x = sectCenter*Math.cos(phi);
double y = sectCenter*Math.sin(phi);
@@ -234,61 +271,85 @@
detName + "_stave_positive" + i,
sectVolume,
motherVolume,
- 0);
+ i);
- new DetectorElement(sectPhysVol.getName(), subdet.getDetectorElement(), "/" + sectPhysVol.getName());
-
- boolean reflect = true;
- try
- {
- if (node.getAttribute("reflect") != null)
- {
- reflect = node.getAttribute("reflect").getBooleanValue();
- }
- }
- catch (Exception t)
- {
- throw new RuntimeException(t);
- }
+ new DetectorElement(
+ sectPhysVol.getName(),
+ endcapPositive,
+ "/" + sectPhysVol.getName());
if (reflect)
{
- IRotation3D reflectRotation = new RotationPassiveXYZ(-Math.PI/2, 0, zc);
- ITranslation3D reflectPosition = new Translation3D(-x, -y, -zmin - subdetectorThickness/2);
+ IRotation3D reflectRotation = new RotationPassiveXYZ(-Math.PI/2, 0, zc + Math.PI);
+ ITranslation3D reflectPosition = new Translation3D(x, y, -zmin - subdetectorThickness/2);
IPhysicalVolume physVolReflect =
new PhysicalVolume(
new Transform3D(reflectPosition, reflectRotation),
- detName + "_stave_reflect" + i,
+ detName + "_stave_negative" + i,
sectVolume,
motherVolume,
- 0);
+ i);
- new DetectorElement(physVolReflect.getName(), subdet.getDetectorElement(), "/" + physVolReflect.getName());
+ new DetectorElement(
+ physVolReflect.getName(),
+ endcapNegative,
+ "/" + physVolReflect.getName());
}
}
-
- int sensorNum = 0;
+
for (IDetectorElement endcap : subdet.getDetectorElement().getChildren())
{
+ //System.out.println("endcap: " + endcap.getName());
+ IIdentifierHelper helper = endcap.getIdentifierHelper();
for (IDetectorElement module : endcap.getChildren())
- {
+ {
for (IPhysicalVolume layer : module.getGeometry().getLogicalVolume().getDaughters())
{
+ int sensorNum = 0;
for (IPhysicalVolume slice : layer.getLogicalVolume().getDaughters())
{
if (slice.isSensitive())
- {
+ {
+ IExpandedIdentifier expId = new ExpandedIdentifier(helper.getIdentifierDictionary().getNumberOfFields());
+
+ expId.setValue(helper.getFieldIndex("system"),sysId);
+
+ int endcapFlag = BarrelEndcapFlag.ENDCAP_NORTH.getFlag();
+ if (endcap.getName().contains("negative"))
+ {
+ endcapFlag = BarrelEndcapFlag.ENDCAP_SOUTH.getFlag();;
+ }
+ expId.setValue(helper.getFieldIndex("barrel"), endcapFlag);
+ expId.setValue(helper.getFieldIndex("module"), module.getGeometry().getPhysicalVolume().getCopyNumber());
+ expId.setValue(helper.getFieldIndex("layer"), layer.getCopyNumber());
+ expId.setValue(helper.getFieldIndex("slice"), slice.getCopyNumber());
+
+ IIdentifier id = helper.pack(expId);
+
String sliceDetElemName =
- subdet.getName()
+ endcap.getName()
+ "_module" + module.getGeometry().getPhysicalVolume().getCopyNumber()
+ "_layer" + layer.getCopyNumber()
+ "_sensor" + sensorNum;
- //String sliceDetElemName = subdet.getName() + "_" + module.getName() + "_" + layer.getName() + "_" + slice.getName();
- new DetectorElement(
+
+ IDetectorElement sensor =
+ new DetectorElement(
sliceDetElemName,
- endcap,
- "/" + module.getName() + "/" + layer.getName() + "/" + slice.getName());
+ module,
+ "/" + module.getName() + "/" + layer.getName() + "/" + slice.getName(),
+ id);
+ /*
+ IDetectorElement x = sensor;
+ System.out.println("---print sensor---");
+ while (x != null)
+ {
+ System.out.println(x.getName());
+ x = x.getParent();
+ }
+ System.out.println("------------");
+ */
+
++sensorNum;
}
}