Print

Print


Commit in GeomConverter/src/org/lcsim/geometry/compact/converter/GODL on MAIN
Main.java+154-2211.2 -> 1.3
Fixes to GODL converter

GeomConverter/src/org/lcsim/geometry/compact/converter/GODL
Main.java 1.2 -> 1.3
diff -u -r1.2 -r1.3
--- Main.java	23 Jul 2005 01:12:56 -0000	1.2
+++ Main.java	29 Jul 2005 16:39:48 -0000	1.3
@@ -18,7 +18,6 @@
 import org.lcsim.geometry.GeometryReader;
 import org.lcsim.geometry.compact.Field;
 import org.lcsim.geometry.compact.Readout;
-import org.lcsim.geometry.compact.Segmentation;
 import org.lcsim.geometry.compact.Subdetector;
 import org.lcsim.geometry.compact.converter.Converter;
 import org.lcsim.geometry.field.Solenoid;
@@ -33,6 +32,7 @@
 import org.lcsim.geometry.subdetector.CylindricalEndcapCalorimeter;
 import org.lcsim.geometry.subdetector.DiskTracker;
 import org.lcsim.geometry.subdetector.MultiLayerTracker;
+import org.lcsim.geometry.util.IDDecoderBase;
 import org.lcsim.geometry.util.IDDescriptor;
 import org.lcsim.material.Material;
 import org.lcsim.material.MaterialElement;
@@ -41,15 +41,12 @@
  *
  * @author Willy Langeveld
  */
-public class Main implements Converter
-{
+public class Main implements Converter {
     private HashSet materials;
-    private boolean existsMaterial(String mat)
-    {
+    private boolean existsMaterial(String mat) {
         return(materials.contains(mat));
     }
-    private void addMaterial(String mat)
-    {
+    private void addMaterial(String mat) {
         materials.add(mat);
         return;
     }
@@ -58,8 +55,7 @@
     /**
      * @param args the command line arguments
      */
-    public static void main(String[] args) throws Exception
-    {
+    public static void main(String[] args) throws Exception {
         if (args.length < 1 || args.length >2) usage();
         String fn = args[0];
         InputStream in = new BufferedInputStream(new FileInputStream(args[0]));
@@ -69,72 +65,62 @@
         //OutputStream out = new BufferedOutputStream(new FileOutputStream("C:/cygwin/home/wglp09/lelaps/lelaps/foo.godl"));
         new Main(validateDefault).convert(fn,in,out);
     }
-    Main(boolean validate) throws Exception
-    {
+    Main(boolean validate) throws Exception {
         materials = new HashSet();
         this.validate = validate;
     }
-    public Main() throws Exception
-    {
+    public Main() throws Exception {
         this(validateDefault);
     }
-    public void val(PrintStream p, String s, String t)
-    {
-        if (t != null) p.println(s + " = \"" + t + "\";");
-        else           p.println(s + " = \"\";");
+    public void line(PrintStream p, String s) {
+        if (p != null) {
+            if (s != null) p.println(s);
+            else           p.println("");
+        }
         return;
     }
-    public void vald(PrintStream p, String s, String t)
-    {
-        if (t != null) p.println(s + " = " + t + ";");
-        else           p.println(s + " = 0;");
+    public void line(PrintStream p) {
+        if (p != null) p.println("");
         return;
     }
-    public void valdc(PrintStream p, String s, String t)
-    {
-        if (t != null) p.println(s + " = " + t);
-        else           p.println(s + " = 0;");
+    public void val(PrintStream p, String s, String t) {
+        if (t != null) line(p, s + " = \"" + t + "\";");
+        else           line(p, s + " = \"\";");
         return;
     }
-    public void val(PrintStream p, String s, double t)
-    {
-        p.println(s + " = " + t + ";");
+    public void vald(PrintStream p, String s, String t) {
+        if (t != null) line(p, s + " = " + t + ";");
+        else           line(p, s + " = 0;");
         return;
     }
-    public void pval(PrintStream p, String s, String t)
-    {
-        if (t != null) p.println(s + " += \"" + t + "\";");
+    public void valdc(PrintStream p, String s, String t) {
+        if (t != null) line(p, s + " = " + t);
+        else           line(p, s + " = 0;");
         return;
     }
-    public void pvald(PrintStream p, String s, String t)
-    {
-        if (t != null) p.println(s + " += " + t + ";");
+    public void val(PrintStream p, String s, double t) {
+        line(p, s + " = " + t + ";");
         return;
     }
-    public void pval(PrintStream p, String s, double t)
-    {
-        p.println(s + " += " + t + ";");
+    public void pval(PrintStream p, String s, String t) {
+        if (t != null) line(p, s + " += \"" + t + "\";");
         return;
     }
-    public void line(PrintStream p, String s)
-    {
-        if (s != null) p.println(s);
-        else           p.println("");
+    public void pvald(PrintStream p, String s, String t) {
+        if (t != null) line(p, s + " += " + t + ";");
         return;
     }
-    public void line(PrintStream p)
-    {
-        p.println("");
+    public void pval(PrintStream p, String s, double t) {
+        line(p, s + " += " + t + ";");
         return;
     }
-    public void preamble(PrintStream p, String inputFileName, Detector det)
-    {
+    public void preamble(PrintStream p, String inputFileName, Detector det) {
         line(p, "###");
-        line(p);
+        line(p, "#");
         line(p, "# GeomConverter-generated GODL output");
         line(p, "# -- GODL converter version 1.0 --");
         line(p, "# From: " + inputFileName);
-        line(p);
+        line(p, "#");
         line(p, "###");
         line(p, "cm  = 0.01 _meter;");
         line(p, "m   = _meter;");
@@ -146,8 +132,7 @@
         line(p, "unit(\"cm\", \"m\", \"g\", \"atm\", \"K\", \"T\", \"deg\");");
         return;
     }
-    public void header(PrintStream p, Detector det)
-    {
+    public void header(PrintStream p, Detector det) {
         line(p, "#");
         line(p, "# Header");
         line(p, "#");
@@ -160,22 +145,19 @@
         val(p, "detectorVersion", h.getVersion());
         return;
     }
-    public void constants(PrintStream p, Detector det)
-    {
+    public void constants(PrintStream p, Detector det) {
         line(p, "#");
         line(p, "# Constants");
         line(p, "#");
         
         Map<String,Constant> cl = det.getConstants();
         Set<Map.Entry<String, Constant>> set = cl.entrySet();
-        for (Map.Entry<String, Constant> i: set)
-        {
+        for (Map.Entry<String, Constant> i: set) {
             val(p, "data_" + i.getKey(), i.getValue().getValue());
         }
         return;
     }
-    public void materials(PrintStream p, Detector det)
-    {
+    public void materials(PrintStream p, Detector det) {
         line(p, "#");
         line(p, "# Materials");
         line(p, "#");
@@ -183,20 +165,15 @@
         addMaterial("vacuum");
         MaterialManager mm = MaterialManager.instance();
         Map<String, Material> mmap = mm.materials();
-        for (Material i: mmap.values())
-        {
+        for (Material i: mmap.values()) {
             List<MaterialElement> el = i.getElements();
             List<Double> elf = i.getMassFractions();
             String formula = "";
-            if (el.size() == 1)
-            {
+            if (el.size() == 1) {
                 formula += el.get(0).getName();
                 vald(p, "mat_" + i.getName(), "element(\"" + formula + "\")");
-            }
-            else
-            {
-                for (int j = 0; j < el.size(); j++)
-                {
+            } else {
+                for (int j = 0; j < el.size(); j++) {
                     formula += el.get(j).getName();
                     formula += "" + elf.get(j);
                 }
@@ -207,28 +184,23 @@
         }
         return;
     }
-    public void fields(PrintStream p, Detector det)
-    {
+    public void fields(PrintStream p, Detector det) {
         line(p, "#");
         line(p, "# Magnetic field");
         line(p, "#");
         
         Map<String, Field> fl = det.getFields();
-        for (Field f: fl.values())
-        {
+        for (Field f: fl.values()) {
             double[] fi = {0., 0., 5.0};
             double[] fo = {0., 0., -0.6};
             double or = 5000.0;
             double zm = 2810.0;
-            if (f instanceof Solenoid)
-            {
+            if (f instanceof Solenoid) {
                 fi = ((Solenoid) f).getInnerField();
                 fo = ((Solenoid) f).getOuterField();
                 or = Math.sqrt(((Solenoid) f).getOuterRadius2());
                 zm = ((Solenoid) f).getZMax();
-            }
-            else
-            {
+            } else {
                 System.err.println(" -- Ignoring field " + f.getName() + ", GeomConverter doesn't support fields properly.");
                 System.err.println(" -- Using standard 5 tesla field");
             }
@@ -242,39 +214,31 @@
         }
         return;
     }
-    public void readouts(PrintStream p, Detector det)
-    {
+    public void readouts(PrintStream p, Detector det) {
         line(p, "#");
         line(p, "# ID Codes (Readouts)");
+        line(p, "# Note that the order on the stack is id1 id0.");
         line(p, "#");
         
         Map<String, Readout> rl = det.getReadouts();
-        for (Readout r: rl.values())
-        {
+        for (Readout r: rl.values()) {
             IDDescriptor id = r.getIDDescriptor();
-            Segmentation seg = r.getSegmentation();
+            org.lcsim.geometry.IDDecoder seg = r.getIDDecoder();
             int theta_seg = 0;
             int phi_seg = 0;
             double x_seg = 0;
             double y_seg = 0;
             double z_seg = 0;
-            if (seg instanceof ProjectiveCylinder)
-            {
+            if (seg instanceof ProjectiveCylinder) {
                 theta_seg = ((ProjectiveCylinder) seg).getThetaBins();
                 phi_seg = ((ProjectiveCylinder) seg).getPhiBins();
-            }
-            else if (seg instanceof NonprojectiveCylinder)
-            {
+            } else if (seg instanceof NonprojectiveCylinder) {
                 z_seg = ((NonprojectiveCylinder) seg).getGridSizeZ();
                 phi_seg = (int) (2 * Math.PI / ((NonprojectiveCylinder) seg).getGridSizePhi());
-            }
-            else if (seg instanceof ProjectiveZPlane)
-            {
+            } else if (seg instanceof ProjectiveZPlane) {
                 theta_seg = ((ProjectiveZPlane) seg).getThetaBins();
                 phi_seg = ((ProjectiveZPlane) seg).getPhiBins();
-            }
-            else if (seg instanceof GridXYZ)
-            {
+            } else if (seg instanceof GridXYZ) {
                 x_seg = ((GridXYZ) seg).getGridSizeX();
                 y_seg = ((GridXYZ) seg).getGridSizeY();
                 z_seg = ((GridXYZ) seg).getGridSizeZ();
@@ -284,64 +248,45 @@
             val(p, rname, "x: fp0 y: fp1 z: fp2 layer: d3 0 0");
             boolean usingfirst = true;
             int rotations = 0;
-            for (int i = 0; i < id.fieldCount(); i++)
-            {
+            for (int i = 0; i < id.fieldCount(); i++) {
                 String name = id.fieldName(i);
                 int    start = id.fieldStart(i);
                 int    length = id.fieldLength(i);
-                if (length < 0)
-                {
+                if (length < 0) {
                     length = - length;
                 }
                 String code = "";
-                if (name.equals("layer"))
-                {
+                if (name.equals("layer")) {
                     code =  " layer 1 " + length + " bitshift 1 sub and";
-                }
-                else if (name.equals("system"))
-                {
+                } else if (name.equals("system")) {
                     code =  " system 1 " + length + " bitshift 1 sub and";
-                }
-                else if (name.equals("barrel"))
-                {
+                } else if (name.equals("barrel")) {
                     //
                     // Note that barrel may be one or zero. If 1, then we make it 2 if z < 0.
                     //
                     code =  " barrel barrel z neg H truncate mul add 1 " + length + " bitshift 1 sub and";
-                }
-                else if(name.equals("theta"))
-                {
+                } else if(name.equals("theta")) {
                     code =  " x x mul y y mul add sqrt z atan2 " + theta_seg +
                             " mul _pi div truncate 1 " + length + " bitshift 1 sub and";
-                }
-                else if(name.equals("phi"))
-                {
+                } else if(name.equals("phi")) {
                     code =  " y x atan2m " + phi_seg +
                             " mul 0.5 mul _pi div truncate 1 " + length +
                             " bitshift 1 sub and";
-                }
-                else if(name.equals("x"))
-                {
+                } else if(name.equals("x")) {
                     code =  " x " + x_seg + " div truncate 1 " + length + " bitshift 1 sub and";
-                }
-                else if(name.equals("y"))
-                {
+                } else if(name.equals("y")) {
                     code =  " y " + y_seg + " div truncate 1 " + length + " bitshift 1 sub and";
-                }
-                else if(name.equals("z"))
-                {
+                } else if(name.equals("z")) {
                     code =  " z " + z_seg + " div truncate 1 " + length + " bitshift 1 sub and";
                 }
-                if (start > 31)
-                {
+                if (start > 31) {
                     code = " exch" + code;
                     usingfirst = false;
                     start -= 32;
                 }
                 if (start > 0) code += " " + start + " bitshift";
                 code += " or";
-                if (!usingfirst)
-                {
+                if (!usingfirst) {
                     usingfirst = true;
                     code += " exch";
                 }
@@ -350,25 +295,27 @@
         }
         return;
     }
-    String findMaterial(PrintStream p, Layer layer)
-    {
+    String findMaterial(PrintStream p, Layer layer) {
         List<LayerSlice> lslist = layer.getSlices();
         String material = "mat_";
-        int nslices = 0;
-        for (LayerSlice lsl: lslist)
-        {
-            String partname = lsl.getMaterial().getName();
-            material += partname;
-            nslices++;
+        int nslices = lslist.size();
+        if (nslices == 1) {
+            return(material +  lslist.get(0).getMaterial().getName());
+        }
+        //
+        // Create name
+        //
+        for (LayerSlice lsl: lslist) {
+            material += lsl.getMaterial().getName();
+            int t1000 = (int) (lsl.getThickness() * 1000.0);
+            material += t1000;
         }
         //
         // Make a new material if this one doesn't exist yet
         //
-        if (nslices > 1 && !existsMaterial(material))
-        {
+        if (!existsMaterial(material)) {
             valdc(p, material, "mixture(name(\"" + material + "\"),");
-            for (LayerSlice lsl: lslist)
-            {
+            for (LayerSlice lsl: lslist) {
                 double t = lsl.getThickness();
                 String partname = lsl.getMaterial().getName();
                 line(p, "   part(@mat_" + partname + ", fraction(" + t + ")),");
@@ -379,8 +326,7 @@
         }
         return(material);
     }
-    public void beampipe(PrintStream p, Detector det)
-    {
+    public void beampipe(PrintStream p, Detector det) {
         line(p, "#");
         line(p, "# Since the GODL converter does not yet support polycone beampipes,");
         line(p, "# we supply here a generic beampipe plus various masks");
@@ -479,8 +425,7 @@
         line(p, "World += placement(@Mask_Cone, rotate(axis(\"x\"), angle(180 deg)), translate(0, 0, -offset));");
         return;
     }
-    public void detectors(PrintStream p, Detector det)
-    {
+    public void detectors(PrintStream p, Detector det) {
         line(p, "#");
         line(p, "# Detector and subdetectors");
         line(p, "# First create a world cylinder from the box coordinates already specified");
@@ -491,14 +436,15 @@
         line(p, "# Now create other detectors and add them to the world");
         line(p, "#");
         Map<String, Subdetector> dl = det.getSubdetectors();
-        for (Subdetector s: dl.values())
-        {
-            if (s instanceof CylindricalBarrelCalorimeter)
-            {
+        for (Subdetector s: dl.values()) {
+            if (s instanceof CylindricalBarrelCalorimeter) {
                 CylindricalBarrelCalorimeter m = (CylindricalBarrelCalorimeter) s;
                 String name     = m.getName();
                 int sysid       = m.getSystemID();
-                String rname    = m.getReadout().getName();
+                String rname = null;
+                if ( m.getReadout() != null ) {
+                    rname = m.getReadout().getName();
+                }
                 double innerR   = m.getInnerRadius();
                 double outerR   = m.getOuterRadius();
                 double zmin     = m.getZMin();
@@ -508,20 +454,21 @@
                 
                 Layer layer       = ls.getLayer(0);
                 boolean sensitive = layer.findIndexOfFirstSensitiveSlice() != -1;
+                if (rname == null) sensitive = false;
                 String material   = findMaterial(p, layer);
                 
                 valdc(p, name, "cylinder(name(\"" + name + "\"), ");
+                line(p, "   @" + material + ",");
                 line(p, "   length(" + (zmax - zmin) + " mm), ");
                 line(p, "   innerRadius(" + innerR + " mm),");
                 line(p, "   outerRadius(" + outerR + " mm),");
-                line(p, "   nLayers(" + nlayers + "),");
                 String comma = "";
                 if (sensitive) comma = ",";
-                String type = "hadcal";
-                if (name.startsWith("EM") || name.startsWith("LUM")) type = "emcal";
-                line(p, "   @" + material + ", type(\"" + type + "\")" + comma);
-                if (sensitive)
-                {
+                line(p, "   nLayers(" + nlayers + ")" + comma);
+                if (sensitive) {
+                    String type = "hadcal";
+                    if (name.startsWith("EM") || name.startsWith("LUM")) type = "emcal";
+                    line(p, "   type(\"" + type + "\"),");
                     line(p, "   idCode(code(" + rname + "),");
                     line(p, "          data(\"system\", " + sysid + "),");
                     line(p, "          data(\"barrel\", 0)");
@@ -529,14 +476,15 @@
                 }
                 line(p, ");");
                 line(p, "World += placement(@" + name + ", translate(0, 0, " + (0.5 * (zmax + zmin)) + " mm));");
-            }
-            else if (s instanceof CylindricalEndcapCalorimeter)
-            {
+            } else if (s instanceof CylindricalEndcapCalorimeter) {
                 CylindricalEndcapCalorimeter m = (CylindricalEndcapCalorimeter) s;
                 String name     = m.getName();
                 int sysid       = m.getSystemID();
                 boolean reflect = m.getReflect();
-                String rname    = m.getReadout().getName();
+                String rname = null;
+                if ( m.getReadout() != null ) {
+                    rname = m.getReadout().getName();
+                }
                 double innerR   = m.getInnerRadius();
                 double outerR   = m.getOuterRadius();
                 double zmin     = m.getZMin();
@@ -546,20 +494,21 @@
                 
                 Layer layer       = ls.getLayer(0);
                 boolean sensitive = layer.findIndexOfFirstSensitiveSlice() != -1;
+                if (rname == null) sensitive = false;
                 String material   = findMaterial(p, layer);
                 
                 valdc(p, name, "cylinder(name(\"" + name + "\"), ");
+                line(p, "   @" + material + ",");
                 line(p, "   length(" + (zmax - zmin) + " mm), ");
                 line(p, "   innerRadius(" + innerR + " mm),");
                 line(p, "   outerRadius(" + outerR + " mm),");
-                line(p, "   nSlices(" + nlayers + "),");
                 String comma = "";
                 if (sensitive) comma = ",";
-                String type = "hadcal";
-                if (name.startsWith("EM") || name.startsWith("LUM")) type = "emcal";
-                line(p, "   @" + material + ", type(\"" + type + "\")" + comma);
-                if (sensitive)
-                {
+                line(p, "   nSlices(" + nlayers + ")" + comma);
+                if (sensitive) {
+                    String type = "hadcal";
+                    if (name.startsWith("EM") || name.startsWith("LUM")) type = "emcal";
+                    line(p, "   type(\"" + type + "\"),");
                     line(p, "   idCode(code(" + rname + "),");
                     line(p, "          data(\"system\", " + sysid + "),");
                     line(p, "          data(\"barrel\", 1)");
@@ -567,22 +516,18 @@
                 }
                 line(p, ");");
                 line(p, "World += placement(@" + name + ", translate(0, 0, " + (0.5 * (zmax + zmin)) + " mm));");
-                if (reflect)
-                {
+                if (reflect) {
                     line(p, "World += placement(@" + name
                             + ", rotate(axis(\"x\"), angle(180 deg)), translate(0, 0, "
                             + (- 0.5 * (zmax + zmin)) + " mm));");
                 }
-            }
-            else if (s instanceof DiskTracker)
-            {
+            } else if (s instanceof DiskTracker) {
                 DiskTracker m = (DiskTracker) s;
                 String name     = m.getName();
                 int sysid       = m.getSystemID();
                 boolean reflect = m.getReflect();
                 String rname = null;
-                if ( m.getReadout() != null )
-                {
+                if ( m.getReadout() != null ) {
                     rname = m.getReadout().getName();
                 }
                 double[] innerR = m.getInnerR();
@@ -591,25 +536,25 @@
                 LayerStack ls   = m.getLayering().getLayerStack();
                 int nlayers     = ls.getNumberOfLayers();
                 
-                for (int i = 0; i < nlayers; i++)
-                {
+                for (int i = 0; i < nlayers; i++) {
                     Layer layer       = ls.getLayer(i);
                     double thickness  = layer.getThickness();
                     boolean sensitive = layer.findIndexOfFirstSensitiveSlice() != -1;
+                    if (rname == null) sensitive = false;
                     String material   = findMaterial(p, layer);
                     
                     String detname = name;
                     if (nlayers > 1) detname += "." + i;
                     
                     valdc(p, detname, "cylinder(name(\"" + name + "\"), ");
+                    line(p, "   @" + material + ",");
                     line(p, "   length(" + thickness + " mm), ");
                     line(p, "   innerRadius(" + innerR[i] + " mm),");
-                    line(p, "   outerRadius(" + outerR[i] + " mm),");
                     String comma = "";
-                    if (sensitive) comma = ", ";
-                    line(p, "   @" + material + ", type(\"tracker\")" + comma);
-                    if (sensitive)
-                    {
+                    if (sensitive) comma = ",";
+                    line(p, "   outerRadius(" + outerR[i] + " mm)" + comma);
+                    if (sensitive) {
+                        line(p, "   type(\"tracker\"),");
                         line(p, "   idCode(code(" + rname + "),");
                         line(p, "          data(\"layer\", " + i + "),");
                         line(p, "          data(\"system\", " + sysid + "),");
@@ -618,22 +563,18 @@
                     }
                     line(p, ");");
                     line(p, "World += placement(@" + detname + ", translate(0, 0, " + (innerZ[i] + 0.5 * thickness) + " mm));");
-                    if (reflect)
-                    {
+                    if (reflect) {
                         line(p, "World += placement(@" + detname
                                 + ", rotate(axis(\"x\"), angle(180 deg)), translate(0, 0, "
                                 + (- innerZ[i] - 0.5 * thickness) + " mm));");
                     }
                 }
-            }
-            else if (s instanceof MultiLayerTracker)
-            {
+            } else if (s instanceof MultiLayerTracker) {
                 MultiLayerTracker m = (MultiLayerTracker) s;
                 String name     = m.getName();
                 int sysid       = m.getSystemID();
                 String rname = null;
-                if ( m.getReadout() != null )
-                {
+                if ( m.getReadout() != null ) {
                     rname    = m.getReadout().getName();
                 }
                 double[] innerR = m.getInnerR();
@@ -641,25 +582,25 @@
                 LayerStack ls   = m.getLayering().getLayerStack();
                 int nlayers     = ls.getNumberOfLayers();
                 
-                for (int i = 0; i < nlayers; i++)
-                {
+                for (int i = 0; i < nlayers; i++) {
                     Layer layer       = ls.getLayer(i);
                     double thickness  = layer.getThickness();
                     boolean sensitive = layer.findIndexOfFirstSensitiveSlice() != -1;
+                    if (rname == null) sensitive = false;
                     String material   = findMaterial(p, layer);
                     
                     String detname = name;
                     if (nlayers > 1) detname += "." + i;
                     
                     valdc(p, detname, "cylinder(name(\"" + name + "\"), ");
+                    line(p, "   @" + material + ",");
                     line(p, "   length(" + outerZ[i] * 2 + " mm), ");
                     line(p, "   innerRadius(" + innerR[i] + " mm),");
-                    line(p, "   outerRadius(" + (innerR[i] + thickness) + " mm),");
                     String comma = "";
-                    if (sensitive) comma = ", ";
-                    line(p, "   @" + material + ", type(\"tracker\")" + comma);
-                    if (sensitive)
-                    {
+                    if (sensitive) comma = ",";
+                    line(p, "   outerRadius(" + (innerR[i] + thickness) + " mm)" + comma);
+                    if (sensitive) {
+                        line(p, "   type(\"tracker\"),");
                         line(p, "   idCode(code(" + rname + "),");
                         line(p, "          data(\"layer\", " + i + "),");
                         line(p, "          data(\"system\", " + sysid + "),");
@@ -674,57 +615,49 @@
         return;
     }
     
-    public void convert(String inputFileName, InputStream in, OutputStream out) throws Exception
-    {
-        if ( out != null )
-        {
-            GeometryReader reader = new GeometryReader();
-            Detector det = reader.read(in);
-            PrintStream p = new PrintStream(out);
-            
-            preamble(p, inputFileName, det);
-            header(p,  det);
-            constants(p, det);
-            materials(p, det);
-            fields(p, det);
-            readouts(p, det);
-            detectors(p, det);
-            beampipe(p, det);
-            
-            line(p, "#");
-            line(p, "# End of file");
-            line(p, "#");
-            
-            out.close();
-        }
+    public void convert(String inputFileName, InputStream in, OutputStream out) throws Exception {
+        materials.clear();
+        GeometryReader reader = new GeometryReader();
+        Detector det = reader.read(in);
+        PrintStream p = null;
+        if (out != null) p = new PrintStream(out);
+        
+        preamble(p, inputFileName, det);
+        header(p,  det);
+        constants(p, det);
+        materials(p, det);
+        fields(p, det);
+        readouts(p, det);
+        detectors(p, det);
+        beampipe(p, det);
+        
+        line(p, "#");
+        line(p, "# End of file");
+        line(p, "#");
+        
+        if (out != null) out.close();
         return;
     }
     
-    private static void usage()
-    {
+    private static void usage() {
         System.out.println("java "+Main.class.getName()+" <compact> [<GODL>]");
         System.exit(0);
     }
     
-    public String getOutputFormat()
-    {
+    public String getOutputFormat() {
         return "GODL";
     }
     
-    public FileFilter getFileFilter()
-    {
+    public FileFilter getFileFilter() {
         return new GODLFileFilter();
     }
     
-    private static class GODLFileFilter extends FileFilter
-    {
-        public boolean accept(java.io.File file)
-        {
+    private static class GODLFileFilter extends FileFilter {
+        public boolean accept(java.io.File file) {
             return file.isDirectory() || file.getName().endsWith(".godl");
         }
         
-        public String getDescription()
-        {
+        public String getDescription() {
             return "GODL file (*.godl)";
         }
     }
CVSspam 0.2.8