package hep.aida.util.comparison; import hep.aida.ext.IComparisonData; import org.apache.commons.math.distribution.ChiSquaredDistribution; import org.apache.commons.math.distribution.DistributionFactory; /** * * @author The FreeHEP team @ SLAC. * Algorithm taken from http://www.ge.infn.it/geant4/analysis/HEPstatistics/ * */ public class TikuComparisonAlgorithm extends AbstractComparisonAlgorithm { private static final double precision = 1.0e-10; private FiszCramerVonMisesComparisonAlgorithm alg = new FiszCramerVonMisesComparisonAlgorithm(); private static final String[] names = new String[] {"Tiku"}; private static final int dType = ANY_DATA; private static final int eType = ANY_NUMBER_OF_EVENTS; public TikuComparisonAlgorithm() { super(dType, eType); } public String[] algorithmNames() { return names; } public double quality(IComparisonData d1, IComparisonData d2) { double quality = alg.quality(d1,d2); int entries = entries(d1); double c = (4*entries-3); double n2 = entries*entries; double bNum = (32*n2 - 61*entries+30); double bDen = 84*entries*c; double b = bNum / bDen; double aNum = ( 336*n2 - 959*entries +609); double aDen = 210*bNum; double a = aNum / aDen; double distance = Math.abs((quality-a)/b); double nFreedom =(98*(entries)*Math.pow(c,3))/(5*Math.pow(bNum,2)); ChiSquaredDistribution chi2Distribution = DistributionFactory.newInstance().createChiSquareDistribution(nFreedom); double prob = Double.NaN; try { prob = chi2Distribution.cumulativeProbability(distance); } catch ( org.apache.commons.math.MathException me) { throw new RuntimeException("Problems evaluating probability ",me); } return prob; } }