lcsim/src/org/lcsim/recon/analysis
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 + '}';
+ }
+ }
+}