Commit in projects/lcsim/trunk/analysis/src on MAIN
main/java/org/lcsim/analysis/util/BetterRMS90Calculator.java+88added 3303
                                 /Result.java+25added 3303
test/java/org/lcsim/analysis/util/BetterRMS90CalculatorTest.java+46added 3303
+159
3 added files


projects/lcsim/trunk/analysis/src/main/java/org/lcsim/analysis/util
BetterRMS90Calculator.java added at 3303
--- projects/lcsim/trunk/analysis/src/main/java/org/lcsim/analysis/util/BetterRMS90Calculator.java	                        (rev 0)
+++ projects/lcsim/trunk/analysis/src/main/java/org/lcsim/analysis/util/BetterRMS90Calculator.java	2014-09-03 23:34:43 UTC (rev 3303)
@@ -0,0 +1,88 @@
+package org.lcsim.analysis.util;
+
+import hep.aida.ICloud1D;
+import hep.aida.IEvaluator;
+import hep.aida.ITuple;
+import java.util.Arrays;
+import org.lcsim.util.aida.AIDA;
+
+/**
+ *
+ * @author tonyj
+ */
+public class BetterRMS90Calculator {
+
+    public Result calculateRMS90(ICloud1D cloud) {
+        return calculate(cloud2array(cloud));
+    }
+
+    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));
+    }
+
+    public Result calculateRMS90(ITuple tuple, IEvaluator evaluator) {
+        return calculate(tuple2array(tuple, evaluator));
+    }
+
+    private double[] tuple2array(ITuple tuple, IEvaluator evaluator) {
+        evaluator.initialize(tuple);
+        int entries = tuple.rows();
+        double[] elist = new double[entries];
+        tuple.start();
+        for (int i = 0; i < entries; i++) {
+            tuple.next();
+            elist[i] = evaluator.evaluateDouble();
+        }
+        return elist;
+    }
+
+    private double[] cloud2array(ICloud1D cloud) {
+        int entries = cloud.entries();
+        double[] elist = new double[entries];
+        for (int i = 0; i < entries; i++) {
+            elist[i] = cloud.value(i);
+        }
+        return 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);
+
+        // 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];
+            }
+            double mean = sv / ncore;
+            double rms = Math.sqrt(sv2 / ncore - mean * mean);
+            if (Double.isNaN(rms90) || rms < rms90) {
+                rms90 = rms;
+                mean90 = mean;
+            }
+        }
+        return new Result(rms90, mean90);
+    }
+
+
+}

projects/lcsim/trunk/analysis/src/main/java/org/lcsim/analysis/util
Result.java added at 3303
--- projects/lcsim/trunk/analysis/src/main/java/org/lcsim/analysis/util/Result.java	                        (rev 0)
+++ projects/lcsim/trunk/analysis/src/main/java/org/lcsim/analysis/util/Result.java	2014-09-03 23:34:43 UTC (rev 3303)
@@ -0,0 +1,25 @@
+package org.lcsim.analysis.util;
+
+public class Result {
+
+        private double rms;
+        private double mean;
+
+        public Result(double rms, double mean) {
+            this.rms = rms;
+            this.mean = mean;
+        }
+
+        public double getMean() {
+            return mean;
+        }
+
+        public double getRms() {
+            return rms;
+        }
+
+        @Override
+        public String toString() {
+            return "RMS90.Result{" + "rms=" + rms + " mean=" + mean + '}';
+        }
+    }
\ No newline at end of file

projects/lcsim/trunk/analysis/src/test/java/org/lcsim/analysis/util
BetterRMS90CalculatorTest.java added at 3303
--- projects/lcsim/trunk/analysis/src/test/java/org/lcsim/analysis/util/BetterRMS90CalculatorTest.java	                        (rev 0)
+++ projects/lcsim/trunk/analysis/src/test/java/org/lcsim/analysis/util/BetterRMS90CalculatorTest.java	2014-09-03 23:34:43 UTC (rev 3303)
@@ -0,0 +1,46 @@
+package org.lcsim.analysis.util;
+
+import junit.framework.TestCase;
+
+/**
+ *
+ * @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);
+    }
+}
SVNspam 0.1


Use REPLY-ALL to reply to list

To unsubscribe from the LCDET-SVN list, click the following link:
https://listserv.slac.stanford.edu/cgi-bin/wa?SUBED1=LCDET-SVN&A=1