Commit in projects/lcsim/trunk/analysis/src on MAIN | |||
main/java/org/lcsim/analysis/util/BetterRMS90Calculator.java | +88 | added 3303 | |
/Result.java | +25 | added 3303 | |
test/java/org/lcsim/analysis/util/BetterRMS90CalculatorTest.java | +46 | added 3303 | |
+159 |
--- 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 (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 (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); + } +}