Print

Print


Commit in GeomConverter on MAIN
src/org/lcsim/geometry/subdetector/AbstractPolyhedraCalorimeter.java+421.8 -> 1.9
src/org/lcsim/geometry/compact/converter/pandora/Main.java+191added 1.1
resources/META-INF/services/org.lcsim.geometry.compact.converter.Converter+2-11.3 -> 1.4
+235-1
1 added + 2 modified, total 3 files
implement pandora output binding

GeomConverter/src/org/lcsim/geometry/subdetector
AbstractPolyhedraCalorimeter.java 1.8 -> 1.9
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
Main.java added at 1.1
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
org.lcsim.geometry.compact.converter.Converter 1.3 -> 1.4
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
CVSspam 0.2.8