Print

Print


Commit in lcsim on MAIN
src/org/lcsim/recon/analysis/BetterRMS90Calculator.java+21-81.1 -> 1.2
test/org/lcsim/recon/analysis/BetterRMS90CalculatorTest.java+50added 1.1
+71-8
1 added + 1 modified, total 2 files
Bug fix (still present in original RMS90Calculator), optimization and test case

lcsim/src/org/lcsim/recon/analysis
BetterRMS90Calculator.java 1.1 -> 1.2
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
BetterRMS90CalculatorTest.java added at 1.1
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);
+    }
+}
CVSspam 0.2.8