Commit in lcsim/src/org/lcsim/recon/analysis on MAIN
BetterRMS90Calculator.java+97added 1.1
A better RMS90 calculator.
Uses array instead of List of Doubles
Works also for tuples

lcsim/src/org/lcsim/recon/analysis
BetterRMS90Calculator.java added at 1.1
diff -N BetterRMS90Calculator.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ BetterRMS90Calculator.java	16 Nov 2010 02:26:51 -0000	1.1
@@ -0,0 +1,97 @@
+package org.lcsim.recon.analysis;
+
+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;
+    }
+
+    private 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++) {
+                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);
+    }
+
+    public static 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 + '}';
+        }
+    }
+}
CVSspam 0.2.8