lcsim/src/org/lcsim/recon/analysis
diff -u -r1.1 -r1.2
--- BetterRMS90Calculator.java 16 Nov 2010 02:26:51 -0000 1.1
+++ BetterRMS90Calculator.java 16 Nov 2010 03:31:56 -0000 1.2
@@ -19,7 +19,7 @@
public Result calculateRMS90(ITuple tuple, String expression) {
AIDA aida = AIDA.defaultInstance();
IEvaluator eval = aida.analysisFactory().createTupleFactory(aida.tree()).createEvaluator(expression);
- return calculate(tuple2array(tuple,eval));
+ return calculate(tuple2array(tuple, eval));
}
public Result calculateRMS90(ITuple tuple, IEvaluator evaluator) {
@@ -31,7 +31,7 @@
int entries = tuple.rows();
double[] elist = new double[entries];
tuple.start();
- for (int i=0; i<entries; i++) {
+ for (int i = 0; i < entries; i++) {
tuple.next();
elist[i] = evaluator.evaluateDouble();
}
@@ -47,17 +47,30 @@
return elist;
}
- private Result calculate(double[] elist) {
+ Result calculate(double[] elist) {
int entries = elist.length;
double rms90 = Double.NaN;
double mean90 = Double.NaN;
int ntail = (int) (.1 * entries);
int ncore = entries - ntail;
Arrays.sort(elist);
- for (int k = 0; k < ntail; k++) {
- double sv = 0.;
- double sv2 = 0.;
- for (int i = k; i < k + ncore; i++) {
+
+ // Calculate invariants once
+ double svi = 0.;
+ double sv2i = 0.;
+ for (int i = ntail; i < ncore; i++) {
+ svi += elist[i];
+ sv2i += elist[i] * elist[i];
+ }
+
+ for (int k = 0; k <= ntail; k++) {
+ double sv = svi;
+ double sv2 = sv2i;
+ for (int i = k; i < ntail; i++) {
+ sv += elist[i];
+ sv2 += elist[i] * elist[i];
+ }
+ for (int i = ncore; i < ncore+k; i++) {
sv += elist[i];
sv2 += elist[i] * elist[i];
}
@@ -91,7 +104,7 @@
@Override
public String toString() {
- return "RMS90.Result{" + "rms=" + rms + "mean=" + mean + '}';
+ return "RMS90.Result{" + "rms=" + rms + " mean=" + mean + '}';
}
}
}
lcsim/test/org/lcsim/recon/analysis
diff -N BetterRMS90CalculatorTest.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ BetterRMS90CalculatorTest.java 16 Nov 2010 03:31:56 -0000 1.1
@@ -0,0 +1,50 @@
+package org.lcsim.recon.analysis;
+
+import hep.aida.ICloud1D;
+import hep.aida.IEvaluator;
+import hep.aida.ITuple;
+import junit.framework.TestCase;
+import org.lcsim.recon.analysis.BetterRMS90Calculator.Result;
+
+/**
+ *
+ * @author tonyj
+ */
+public class BetterRMS90CalculatorTest extends TestCase {
+
+ public BetterRMS90CalculatorTest(String testName) {
+ super(testName);
+ }
+
+ /**
+ * Test of calculateRMS90 method, of class BetterRMS90Calculator.
+ */
+ public void testCalculateRMS90() {
+ BetterRMS90Calculator rms90 = new BetterRMS90Calculator();
+ double[] data = {100, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+ Result result = rms90.calculate(data);
+ assertEquals(0, result.getMean(), 1e-16);
+ assertEquals(0, result.getRms(), 1e-16);
+
+ data = new double[]{-100, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+ result = rms90.calculate(data);
+ assertEquals(0, result.getMean(), 1e-16);
+ assertEquals(0, result.getRms(), 1e-16);
+
+ data = new double[]{-100, -100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+ result = rms90.calculate(data);
+ assertEquals(0, result.getMean(), 1e-16);
+ assertEquals(0, result.getRms(), 1e-16);
+
+ data = new double[]{-100, -100, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
+ result = rms90.calculate(data);
+ assertEquals(1, result.getMean(), 1e-16);
+ assertEquals(0, result.getRms(), 1e-16);
+
+
+ data = new double[]{-100, -100, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2};
+ result = rms90.calculate(data);
+ assertEquals(1.5, result.getMean(), 1e-16);
+ assertEquals(0.5, result.getRms(), 1e-16);
+ }
+}