GeomConverter/src/org/lcsim/geometry/compact/converter/GODL
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)";
}
}