GeomConverter/src/org/lcsim/geometry/subdetector
diff -u -r1.8 -r1.9
--- AbstractPolyhedraCalorimeter.java 5 Feb 2009 21:43:23 -0000 1.8
+++ AbstractPolyhedraCalorimeter.java 18 Dec 2009 19:32:16 -0000 1.9
@@ -86,6 +86,48 @@
return getSectionPhi() / 2;
}
+ // Parameters for Pandora.
+
+ public double getInnerNumberOfSides()
+ {
+ return this.getNumberOfSides();
+ }
+
+ public double getInnerPhi()
+ {
+ return 0.;
+ }
+
+ public double getInnerRadius()
+ {
+ return this.getInnerR();
+ }
+
+ public double getInnerZ()
+ {
+ return this.getZMin();
+ }
+
+ public double getOuterNumberOfSides()
+ {
+ return this.getNumberOfSides();
+ }
+
+ public double getOuterPhi()
+ {
+ return 0.;
+ }
+
+ public double getOuterRadius()
+ {
+ return getInnerRadius() + getLayering().getThickness();
+ }
+
+ public double getOuterZ()
+ {
+ return this.getZMax();
+ }
+
public void appendHepRep(HepRepFactory factory, HepRep heprep)
{
HepRepInstanceTree instanceTree = heprep.getInstanceTreeTop("Detector","1.0");
GeomConverter/src/org/lcsim/geometry/compact/converter/pandora
diff -N Main.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ Main.java 18 Dec 2009 19:32:16 -0000 1.1
@@ -0,0 +1,191 @@
+package org.lcsim.geometry.compact.converter.pandora;
+
+import static org.lcsim.geometry.Calorimeter.CalorimeterType.EM_BARREL;
+import static org.lcsim.geometry.Calorimeter.CalorimeterType.EM_ENDCAP;
+import static org.lcsim.geometry.Calorimeter.CalorimeterType.HAD_BARREL;
+import static org.lcsim.geometry.Calorimeter.CalorimeterType.HAD_ENDCAP;
+import hep.physics.vec.BasicHep3Vector;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.text.DecimalFormat;
+
+import javax.swing.filechooser.FileFilter;
+
+import org.jdom.Document;
+import org.jdom.Element;
+import org.jdom.output.Format;
+import org.jdom.output.XMLOutputter;
+import org.lcsim.detector.solids.Tube;
+import org.lcsim.geometry.Calorimeter;
+import org.lcsim.geometry.Detector;
+import org.lcsim.geometry.GeometryReader;
+import org.lcsim.geometry.compact.Field;
+import org.lcsim.geometry.compact.Subdetector;
+import org.lcsim.geometry.compact.converter.Converter;
+import org.lcsim.geometry.field.Solenoid;
+import org.lcsim.geometry.layer.Layer;
+import org.lcsim.geometry.layer.LayerSlice;
+import org.lcsim.geometry.layer.LayerStack;
+import org.lcsim.geometry.subdetector.AbstractPolyhedraCalorimeter;
+
+/**
+ * This class converts from a compact detector description to a format
+ * suitable for reading the geometry into the new Pandora PFA API.
+ *
+ * @author jeremym
+ */
+public class Main implements Converter
+{
+ public void convert(String inputFileName, InputStream in, OutputStream out) throws Exception
+ {
+ GeometryReader reader = new GeometryReader();
+ Detector det = reader.read(in);
+ Document doc = convertDetectorToPandora(det);
+ XMLOutputter outputter = new XMLOutputter();
+ if (out != null)
+ {
+ outputter.setFormat(Format.getPrettyFormat());
+ outputter.output(doc,out);
+ out.close();
+ }
+ }
+
+ public Document convertDetectorToPandora(Detector detector)
+ {
+ Document outputDoc = new Document();
+ Element root = new Element("pandoraSetup");
+ outputDoc.setRootElement(root);
+
+ Element calorimeters = new Element("calorimeters");
+ root.addContent(calorimeters);
+
+ DecimalFormat xlen = new DecimalFormat("#.########");
+ DecimalFormat xthick = new DecimalFormat("#.##");
+
+ for ( Subdetector subdetector : detector.getSubdetectors().values() )
+ {
+ // Only handle polyhedra calorimeters for now.
+ if (subdetector instanceof AbstractPolyhedraCalorimeter)
+ {
+ Element calorimeter = new Element("calorimeter");
+ AbstractPolyhedraCalorimeter polycal = (AbstractPolyhedraCalorimeter) subdetector;
+ Calorimeter.CalorimeterType calType = polycal.getCalorimeterType();
+ if (calType.equals(HAD_BARREL) ||
+ calType.equals(HAD_ENDCAP) ||
+ calType.equals(EM_ENDCAP) ||
+ calType.equals(EM_BARREL))
+ {
+ calorimeter.setAttribute(
+ "type",
+ Calorimeter.CalorimeterType.toString( calType )
+ );
+
+ calorimeter.setAttribute("innerR", Double.toString( polycal.getInnerR()));
+ calorimeter.setAttribute("innerZ", Double.toString( polycal.getInnerZ()));
+ calorimeter.setAttribute("innerPhi", Double.toString( polycal.getInnerPhi()));
+ calorimeter.setAttribute("innerSymmetryOrder", Double.toString(polycal.getInnerNumberOfSides()));
+ calorimeter.setAttribute("outerR", Double.toString(polycal.getOuterR()));
+ calorimeter.setAttribute("outerZ", Double.toString(polycal.getOuterZ()));
+ calorimeter.setAttribute("outerPhi", Double.toString(polycal.getOuterPhi()));
+ calorimeter.setAttribute("outerSymmetryOrder", Double.toString(polycal.getOuterNumberOfSides()));
+
+ calorimeters.addContent( calorimeter );
+
+ LayerStack layers = polycal.getLayering().getLayerStack();
+
+ Element layersElem = new Element("layers");
+ layersElem.setAttribute("nlayers", Integer.toString(layers.getNumberOfLayers()));
+
+ calorimeter.addContent(layersElem);
+
+ double layerD = 0.;
+
+ if (polycal.isBarrel())
+ {
+ layerD = polycal.getInnerR();
+ }
+ else if (polycal.isEndcap())
+ {
+ layerD = polycal.getInnerZ();
+ }
+
+ for (int i=0; i<layers.getNumberOfLayers(); i++)
+ {
+ Layer layer = layers.getLayer(i);
+
+ Element layerElem = new Element("layer");
+ layersElem.addContent(layerElem);
+
+ double intLen = 0;
+ double radLen = 0;
+
+ boolean gotSensor = false;
+
+ for (int j=0; j<layer.getNumberOfSlices(); j++)
+ {
+ LayerSlice slice = layer.getSlice(j);
+ radLen += slice.getThickness() / slice.getMaterial().getRadiationLength();
+ intLen += slice.getThickness() / slice.getMaterial().getNuclearInteractionLength();
+ }
+
+ double layerD2 = layerD + layer.getThicknessToSensitiveMid();
+
+ layerElem.setAttribute("distanceToIp", xthick.format(layerD2));
+ layerElem.setAttribute("radLen", xlen.format(radLen));
+ layerElem.setAttribute("intLen", xlen.format(intLen));
+
+ layerD += layer.getThickness();
+ }
+ }
+ }
+ }
+
+ for (Field f : detector.getFields().values())
+ {
+ if (f instanceof Solenoid)
+ {
+ Solenoid s = (Solenoid)f;
+ Element coil = new Element("coil");
+ coil.setAttribute("bfield", Double.toString(s.getField(new BasicHep3Vector(0,0,0)).z()));
+ coil.setAttribute("innerR", Double.toString(0.));
+ coil.setAttribute("z", Double.toString(s.getZMax()));
+ coil.setAttribute("outerR", Double.toString(Math.sqrt(s.getOuterRadius2())));
+ root.addContent(coil);
+ }
+ break;
+ }
+
+ Tube tube = (Tube)detector.getTrackingVolume().getLogicalVolume().getSolid();
+ Element tracking = new Element("tracking");
+ tracking.setAttribute("innerR", Double.toString(tube.getInnerRadius()));
+ tracking.setAttribute("outerR", Double.toString(tube.getOuterRadius()));
+ tracking.setAttribute("z", Double.toString(tube.getZHalfLength()));
+ root.addContent(tracking);
+
+ return outputDoc;
+ }
+
+ public String getOutputFormat()
+ {
+ return "pandora";
+ }
+
+ public FileFilter getFileFilter()
+ {
+ return new PandoraFileFilter();
+ }
+
+ private static class PandoraFileFilter extends FileFilter
+ {
+ public boolean accept(java.io.File file)
+ {
+ return file.isDirectory() || file.getName().endsWith( ".xml" );
+ }
+
+ public String getDescription()
+ {
+ return "Pandora Geometry file (*.xml)";
+ }
+ }
+}
\ No newline at end of file
GeomConverter/resources/META-INF/services
diff -u -r1.3 -r1.4
--- org.lcsim.geometry.compact.converter.Converter 13 Nov 2007 19:22:27 -0000 1.3
+++ org.lcsim.geometry.compact.converter.Converter 18 Dec 2009 19:32:16 -0000 1.4
@@ -1,3 +1,4 @@
org.lcsim.geometry.compact.converter.heprep.Main
org.lcsim.geometry.compact.converter.lcdd.Main
-org.lcsim.geometry.compact.converter.GODL.Main
\ No newline at end of file
+org.lcsim.geometry.compact.converter.GODL.Main
+org.lcsim.geometry.compact.converter.pandora.Main