lcsim/src/org/lcsim/job
diff -u -r1.21 -r1.22
--- JobControlManager.java 26 Aug 2009 21:10:06 -0000 1.21
+++ JobControlManager.java 26 Aug 2009 23:34:20 -0000 1.22
@@ -29,12 +29,15 @@
import org.jdom.Document;
import org.jdom.Element;
+import org.jdom.Text;
import org.jdom.input.SAXBuilder;
import org.lcsim.LCSimVersion;
+import org.lcsim.units.Constants;
import org.lcsim.util.Driver;
import org.lcsim.util.cache.FileCache;
import org.lcsim.util.loop.LCIOEventSource;
import org.lcsim.util.loop.LCSimLoop;
+import org.lcsim.util.xml.JDOMExpressionFactory;
/**
* The <code>JobControlManager</code> provides an XML frontend for running LCSim jobs.
@@ -72,6 +75,8 @@
PrintStream logStream = System.out;
LCSimLoop loop;
Element root;
+ Map<String,Double> constants = new HashMap<String,Double>();
+ JDOMExpressionFactory factory;
/**
* Default no-argument constructor.
@@ -203,7 +208,10 @@
*/
public void setup(InputStream in)
{
- SAXBuilder builder = new SAXBuilder();
+ SAXBuilder builder = new SAXBuilder();
+ factory = new JDOMExpressionFactory();
+ builder.setFactory(factory);
+
Document doc = null;
try
{
@@ -227,6 +235,12 @@
// Set the root element.
root = doc.getRootElement();
+
+ // Setup units.
+ setupUnits();
+
+ // Process the variable definitions.
+ processConstants();
// Setup the job control parameters.
setupJobControlParameters();
@@ -818,26 +832,31 @@
String value = parameterElement.getText();
// Single int.
+ // Evaluate expression.
if (propertyType.equals(int.class))
{
- o = Integer.valueOf(value);
+ o = Integer.valueOf((int)factory.computeDouble(value));
}
// Single String.
+ // No expression.
else if (propertyType.equals(String.class))
{
o = value;
}
// Single double.
+ // Evaluate expression.
else if (propertyType.equals(double.class))
{
- o = Double.valueOf(value);
+ o = Double.valueOf(factory.computeDouble(value));
}
// Single float.
+ // Evaluate expression.
else if (propertyType.equals(float.class))
{
- o = Float.valueOf(value);
+ o = Float.valueOf(factory.computeFloat(value));
}
// Single boolean.
+ // No expression.
else if (propertyType.equals(boolean.class))
{
o = Boolean.valueOf(value);
@@ -846,12 +865,13 @@
else if (propertyType.equals(Hep3Vector.class))
{
StringTokenizer tokenize = new StringTokenizer(value);
- double x = Double.valueOf(tokenize.nextToken());
- double y = Double.valueOf(tokenize.nextToken());
- double z = Double.valueOf(tokenize.nextToken());
+ double x = Double.valueOf(factory.computeDouble(tokenize.nextToken()));
+ double y = Double.valueOf(factory.computeDouble(tokenize.nextToken()));
+ double z = Double.valueOf(factory.computeDouble(tokenize.nextToken()));
o = new BasicHep3Vector(x, y, z);
}
// 1d array of doubles.
+ // Each token is evaluated.
else if (propertyType.getName().equals("[D"))
{
StringTokenizer tokenize = new StringTokenizer(value);
@@ -860,12 +880,13 @@
int i = 0;
while (tokenize.hasMoreTokens())
{
- da[i] = Double.valueOf(tokenize.nextToken());
+ da[i] = Double.valueOf(factory.computeDouble(tokenize.nextToken()));
++i;
}
o = da;
}
// 1d array of ints.
+ // Each token is evaluated.
else if (propertyType.getName().equals("[I"))
{
StringTokenizer tokenize = new StringTokenizer(value);
@@ -874,12 +895,13 @@
int i = 0;
while (tokenize.hasMoreTokens())
{
- ia[i] = Integer.valueOf(tokenize.nextToken());
+ ia[i] = Integer.valueOf((int)factory.computeDouble(tokenize.nextToken()));
++i;
}
o = ia;
}
// 1d array of floats.
+ // Each token is evaluated.
else if (propertyType.getName().equals("[F"))
{
StringTokenizer tokenize = new StringTokenizer(value);
@@ -888,12 +910,13 @@
int i = 0;
while (tokenize.hasMoreTokens())
{
- fa[i] = Float.valueOf(tokenize.nextToken());
+ fa[i] = Float.valueOf(factory.computeFloat(tokenize.nextToken()));
++i;
}
o = fa;
}
// 1d array of strings.
+ // No expressions.
else if (propertyType.getName().equals("[Ljava.lang.String;"))
{
StringTokenizer tokenize = new StringTokenizer(value);
@@ -908,6 +931,7 @@
o = sa;
}
// 1d array of booleans.
+ // No expressions.
else if (propertyType.getName().equals("[Z"))
{
StringTokenizer tokenize = new StringTokenizer(value);
@@ -947,6 +971,31 @@
return o;
}
+ private void processConstants()
+ {
+ Element define = root.getChild("define");
+ if (define != null)
+ {
+ for (Object o : define.getChildren())
+ {
+ Element e = (Element)o;
+ Text txt = (Text)e.getContent().get(0);
+ double dval = factory.computeDouble(txt.getValue());
+ this.constants.put(e.getName(), dval);
+ factory.addConstant(e.getName(), dval);
+ }
+ }
+ }
+
+ private void setupUnits()
+ {
+ Constants constants = Constants.getInstance();
+ for (Entry<String,Double> unit : constants.entrySet())
+ {
+ factory.addConstant(unit.getKey(),unit.getValue());
+ }
+ }
+
private static Class getPrimitiveType(String name)
{
if (name.equals("byte")) return byte.class;