GeomConverter/src/org/lcsim/geometry/compact
diff -u -r1.27 -r1.28
--- CompactReader.java 1 Mar 2007 19:06:57 -0000 1.27
+++ CompactReader.java 8 Mar 2007 20:04:38 -0000 1.28
@@ -5,13 +5,17 @@
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
-import java.util.Set;
import java.util.Map.Entry;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
+import org.lcsim.geometry.layer.Layering;
+import org.lcsim.geometry.subdetector.CylindricalBarrelCalorimeter;
+import org.lcsim.geometry.subdetector.CylindricalEndcapCalorimeter;
+import org.lcsim.geometry.subdetector.DiskTracker;
+import org.lcsim.geometry.subdetector.MultiLayerTracker;
import org.lcsim.material.XMLMaterialManager;
import org.lcsim.units.clhep.SystemOfUnitsMap;
import org.lcsim.util.cache.CachingEntityResolver;
@@ -27,12 +31,13 @@
* org.lcsim.geometry.GeometryReader class, which extends this.
*
* @author tonyj
- * @version $Id: CompactReader.java,v 1.27 2007/03/01 19:06:57 jeremy Exp $
+ * @version $Id: CompactReader.java,v 1.28 2007/03/08 20:04:38 jeremy Exp $
*
*/
public class CompactReader
{
private ElementFactory factory;
+ private JDOMExpressionFactory expr;
/**
* Create a CompactReader using a DefaultElementFactory.
@@ -60,13 +65,13 @@
*/
public Detector read(InputStream in) throws IOException, JDOMException, ElementCreationException
{
- JDOMExpressionFactory jdom = new JDOMExpressionFactory();
+ expr = new JDOMExpressionFactory();
// Setup CLHEP units in the expression evaluator.
- registerCLHEPConstants(jdom);
+ registerCLHEPConstants(expr);
SAXBuilder builder = new SAXBuilder();
- builder.setFactory(jdom);
+ builder.setFactory(expr);
// Enable schema validation
builder.setValidation(true);
@@ -80,7 +85,7 @@
Element lccdd = doc.getRootElement();
Detector det = factory.createElement(Detector.class,lccdd,null);
- readHeader(lccdd, det, jdom);
+ readHeader(lccdd, det, expr);
readRegions(lccdd, det);
readLimits(lccdd, det);
readMaterials(lccdd, det);
@@ -201,6 +206,8 @@
}
det.addSubdetector(sub);
+
+ setupScalingVariables(expr, sub);
}
}
@@ -261,4 +268,75 @@
f.addConstant(unit.getKey(),unit.getValue());
}
}
+
+ /**
+ * Setup scaling variables for compact description.
+ * These are usable within subsequent <detector> elements.
+ *
+ * ---Examples---
+ *
+ * HcalBarrel_outer_radius
+ * HcalBarrel_total_thickness
+ *
+ * HcalEndcap_zmax
+ * HcalEndcap_total_thickness
+ *
+ * @param expr
+ * @param subdet
+ */
+ private void setupScalingVariables(JDOMExpressionFactory expr, Subdetector subdet)
+ {
+ // Get the layering.
+ Layering layering=null;
+ try {
+ layering = subdet.getLayering();
+ if ( layering == null )
+ {
+ //System.out.println("layering is null for <" + subdet.getName()+">");
+ return;
+ }
+ }
+ catch ( Throwable x )
+ {
+ //System.out.println("exception getting layering for <" + subdet.getName()+">");
+ return;
+ }
+
+ //System.out.println("Computing scaling variables for " + subdet.getName());
+
+ // Compute total thickness from layers.
+ double totalLayerThickness = layering.getThickness();
+ String name = subdet.getName() + "_total_thickness";
+
+ // Add to JDOMExpressionFactory.
+ expr.addConstant(name, totalLayerThickness);
+
+ // Handle specific subtypes here.
+ if ( subdet instanceof CylindricalBarrelCalorimeter )
+ {
+ CylindricalBarrelCalorimeter cal = (CylindricalBarrelCalorimeter)subdet;
+ double outerRadius = cal.getOuterRadius();
+ expr.addConstant(cal.getName() + "_outer_r", outerRadius);
+ }
+ else if ( subdet instanceof CylindricalEndcapCalorimeter )
+ {
+ CylindricalEndcapCalorimeter cal = (CylindricalEndcapCalorimeter)subdet;
+ double zmax = cal.getZMax();
+ expr.addConstant(cal.getName() + "_outer_z", zmax);
+ }
+ else if ( subdet instanceof MultiLayerTracker )
+ {
+ MultiLayerTracker tkr = (MultiLayerTracker)subdet;
+ Layering l = tkr.getLayering();
+ double outerRadius = tkr.getLayering().getDistanceToLayerBack(l.getNumberOfLayers()-1);
+ expr.addConstant(tkr.getName() + "_outer_radius", outerRadius);
+ }
+ else if ( subdet instanceof DiskTracker )
+ {
+ DiskTracker tkr = (DiskTracker)subdet;
+ Layering l = tkr.getLayering();
+ double zmax = tkr.getLayering().getDistanceToLayerBack(l.getNumberOfLayers()-1);
+ expr.addConstant(tkr.getName() + "_outer_z", zmax);
+ }
+ }
}
\ No newline at end of file
GeomConverter/src/org/lcsim/geometry/subdetector
diff -u -r1.14 -r1.15
--- CylindricalCalorimeter.java 24 Aug 2005 07:05:07 -0000 1.14
+++ CylindricalCalorimeter.java 8 Mar 2007 20:04:38 -0000 1.15
@@ -1,14 +1,8 @@
package org.lcsim.geometry.subdetector;
-import hep.graphics.heprep.HepRep;
-import hep.graphics.heprep.HepRepFactory;
import org.jdom.Element;
import org.jdom.JDOMException;
-import org.lcsim.geometry.Calorimeter;
import org.lcsim.geometry.CylindricalSubdetector;
-import org.lcsim.geometry.HepRepProvider;
-import org.lcsim.geometry.IDDecoder;
-import org.lcsim.geometry.layer.Layering;
/**
*
GeomConverter/test/org/lcsim/geometry/subdetector
diff -N ScalingTest.xml
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ ScalingTest.xml 8 Mar 2007 20:04:38 -0000 1.1
@@ -0,0 +1,81 @@
+<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="sidmay05">
+ <comment>The compact format for sidmay05 detector.</comment>
+ </info>
+
+ <!-- Constants -->
+ <define>
+
+ <constant name="cm" value="10"/>
+
+ <!-- world -->
+ <constant name="world_side" value="30000" />
+ <constant name="world_x" value="world_side" />
+ <constant name="world_y" value="world_side" />
+ <constant name="world_z" value="world_side" />
+
+ <!-- tracking region -->
+ <constant name="tracking_region_radius" value="0.1*cm"/>
+ <constant name="tracking_region_zmax" value="0.1*cm"/>
+
+ </define>
+
+ <materials>
+ </materials>
+
+ <detectors>
+ <detector id="1" name="EMBarrel" type="CylindricalBarrelCalorimeter" readout="EcalBarrHits">
+ <dimensions inner_r = "127.0*cm" outer_z = "179.5*cm" />
+ <layer repeat="2">
+ <slice material = "Tungsten" thickness = "0.25*cm" />
+ <slice material = "Silicon" thickness = "0.25*cm" sensitive = "yes" />
+ </layer>
+ </detector>
+
+ <detector id="2" name="HadBarrel" type="CylindricalBarrelCalorimeter" readout="EcalBarrHits">
+ <dimensions inner_r = "EMBarrel_outer_r" outer_z = "179.5*cm" />
+ <layer repeat="2">
+ <slice material = "Tungsten" thickness = "0.5*cm" />
+ <slice material = "Polystyrene" thickness = "0.5*cm" sensitive = "yes" />
+ </layer>
+ </detector>
+
+ <detector id="3" name="EMEndcap" reflect="true" type="CylindricalEndcapCalorimeter" readout="EcalEndcapHits">
+ <dimensions inner_r = "20.0*cm" inner_z = "168.0*cm" outer_r = "125.0*cm" />
+ <layer repeat="2" >
+ <slice material = "Tungsten" thickness = "0.25*cm" />
+ <slice material = "Silicon" thickness = "0.032*cm" sensitive = "yes" />
+ </layer>
+ </detector>
+
+ <detector id="4" name="HadEndcap" reflect="true" type="CylindricalEndcapCalorimeter" readout="EcalEndcapHits">
+ <dimensions inner_r = "20.0*cm" inner_z = "EMEndcap_outer_z" outer_r = "125.0*cm" />
+ <layer repeat="2" >
+ <slice material = "Tungsten" thickness = "0.5*cm" />
+ <slice material = "Polystyrene" thickness = "0.5*cm" sensitive = "yes" />
+ </layer>
+ </detector>
+
+ </detectors>
+
+ <readouts>
+ <readout name="EcalEndcapHits">
+ <segmentation type="ProjectiveZPlane" thetaBins="1024" phiBins="1024"/>
+ <id>layer:7,system:3,barrel:3,theta:32:11,phi:11</id>
+ </readout>
+ <readout name="EcalBarrHits">
+ <segmentation type="ProjectiveCylinder" thetaBins="1000" phiBins="2000"/>
+ <id>layer:7,system:3,barrel:3,theta:32:11,phi:11</id>
+ </readout>
+ </readouts>
+ <fields>
+ <field type="Solenoid" name="GlobalSolenoid"
+ inner_field="5.0"
+ outer_field="-0.6"
+ zmax="1000"
+ outer_radius="(221.0+ 5.0 + 17.5 + 40./2.)*cm"/> <!-- SolenoidCoilBarrel inner_radius + Al support + Oxygen gap + half coil-->
+ </fields>
+</lccdd>