package org.freehep.math.minuit; import java.io.PrintWriter; import java.io.StringWriter; /** * Utilities for printing various minuit results. * @version $Id: MnPrint.java 8584 2006-08-10 23:06:37Z duns $ */ public abstract class MnPrint { private MnPrint() { } static String toString(MnAlgebraicVector x) { StringWriter writer = new StringWriter(); PrintWriter pw = new PrintWriter(writer); MnPrint.print(pw,x); pw.close(); return writer.toString(); } public static void print(PrintWriter os, MnAlgebraicVector vec) { os.println("LAVector parameters:"); { os.println(); int nrow = vec.size(); for (int i = 0; i < nrow; i++) { os.printf("%g ",vec.get(i)); } os.println(); } } static String toString(MnAlgebraicSymMatrix x) { StringWriter writer = new StringWriter(); PrintWriter pw = new PrintWriter(writer); MnPrint.print(pw,x); pw.close(); return writer.toString(); } public static void print(PrintWriter os, MnAlgebraicSymMatrix matrix) { os.println("LASymMatrix parameters:"); { os.println(); int n = matrix.nrow(); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { os.printf("%10g ",matrix.get(i,j)); } os.println(); } } } static String toString(FunctionMinimum min) { StringWriter writer = new StringWriter(); PrintWriter pw = new PrintWriter(writer); MnPrint.print(pw,min); pw.close(); return writer.toString(); } public static void print(PrintWriter os, FunctionMinimum min) { os.println(); if(!min.isValid()) { os.println(); os.println("WARNING: Minuit did not converge."); os.println(); } else { os.println(); os.println("Minuit did successfully converge."); os.println(); } os.printf("# of function calls: %d\n",min.nfcn()); os.printf("minimum function value: %g\n",min.fval()); os.printf("minimum edm: %g\n",min.edm()); os.println("minimum internal state vector: "+min.parameters().vec()); if(min.hasValidCovariance()) os.println("minimum internal covariance matrix: "+min.error().matrix()); os.println(min.userParameters()); os.println(min.userCovariance()); os.println(min.userState().globalCC()); if(!min.isValid()) os.println("WARNING: FunctionMinimum is invalid."); os.println(); }; static String toString(MinimumState x) { StringWriter writer = new StringWriter(); PrintWriter pw = new PrintWriter(writer); MnPrint.print(pw,x); pw.close(); return writer.toString(); } public static void print(PrintWriter os, MinimumState min) { os.println(); os.printf("minimum function value: %g\n",min.fval()); os.printf("minimum edm: %g\n",min.edm()); os.println("minimum internal state vector: "+min.vec()); os.println("minimum internal gradient vector: "+min.gradient().vec()); if(min.hasCovariance()) os.println("minimum internal covariance matrix: "+min.error().matrix()); os.println(); }; static String toString(MnUserParameters x) { StringWriter writer = new StringWriter(); PrintWriter pw = new PrintWriter(writer); MnPrint.print(pw,x); pw.close(); return writer.toString(); } public static void print(PrintWriter os, MnUserParameters par) { os.println(); os.println("# ext. |" + "| name |" + "| type |" + "| value |" + "| error +/- "); os.println(); boolean atLoLim = false; boolean atHiLim = false; for(MinuitParameter ipar : par.parameters()) { os.printf(" %5d || %9s || ",ipar.number(),ipar.name()); if(ipar.isConst()) { os.printf(" || %10g ||",ipar.value()); } else if(ipar.isFixed()) { os.printf(" fixed || %10g ||\n",ipar.value()); } else if(ipar.hasLimits()) { if(ipar.error() > 0.) { os.printf( " limited || %10g",ipar.value()); if(Math.abs(ipar.value() - ipar.lowerLimit()) < par.precision().eps2()) { os.print("* "); atLoLim = true; } if(Math.abs(ipar.value() - ipar.upperLimit()) < par.precision().eps2()) { os.print("**"); atHiLim = true; } os.printf(" || %10g\n",ipar.error() ); } else os.printf(" free || %10g || no\n", ipar.value() ); } else { if(ipar.error() > 0.) os.printf(" free || %10g || %10g\n",ipar.value(),ipar.error()); else os.printf(" free || %10g || no\n",ipar.value()); } } os.println(); if(atLoLim) os.print("* parameter is at lower limit"); if(atHiLim) os.print("** parameter is at upper limit"); os.println(); } static String toString(MnUserCovariance x) { StringWriter writer = new StringWriter(); PrintWriter pw = new PrintWriter(writer); MnPrint.print(pw,x); pw.close(); return writer.toString(); } public static void print(PrintWriter os, MnUserCovariance matrix) { os.println(); os.println( "MnUserCovariance: "); { os.println(); int n = matrix.nrow(); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { os.printf("%10g ",matrix.get(i,j)); } os.println(); } } os.println(); os.println( "MnUserCovariance parameter correlations: "); { os.println(); int n = matrix.nrow(); for (int i = 0; i < n; i++) { double di = matrix.get(i,i); for (int j = 0; j < n; j++) { double dj = matrix.get(j,j); os.printf("%g ", matrix.get(i,j)/Math.sqrt(Math.abs(di*dj))); } os.println(); } } } static String toString(MnGlobalCorrelationCoeff x) { StringWriter writer = new StringWriter(); PrintWriter pw = new PrintWriter(writer); MnPrint.print(pw,x); pw.close(); return writer.toString(); } public static void print(PrintWriter os, MnGlobalCorrelationCoeff coeff) { os.println(); os.println( "MnGlobalCorrelationCoeff: "); { os.println(); for (int i = 0; i < coeff.globalCC().length; i++) { os.printf("%g\n",coeff.globalCC()[i]); } } } static String toString(MnUserParameterState x) { StringWriter writer = new StringWriter(); PrintWriter pw = new PrintWriter(writer); MnPrint.print(pw,x); pw.close(); return writer.toString(); } public static void print(PrintWriter os, MnUserParameterState state) { os.println(); if(!state.isValid()) { os.println(); os.println("WARNING: MnUserParameterState is not valid."); os.println(); } os.println("# of function calls: "+state.nfcn()); os.println("function value: "+state.fval()); os.println("expected distance to the minimum (edm): "+state.edm()); os.println("external parameters: "+state.parameters()); if(state.hasCovariance()) os.println("covariance matrix: "+state.covariance()); if(state.hasGlobalCC()) os.println("global correlation coefficients : "+state.globalCC()); if(!state.isValid()) os.println("WARNING: MnUserParameterState is not valid."); os.println(); } static String toString(MinosError x) { StringWriter writer = new StringWriter(); PrintWriter pw = new PrintWriter(writer); MnPrint.print(pw,x); pw.close(); return writer.toString(); } public static void print(PrintWriter os, MinosError me) { os.println(); os.printf("Minos # of function calls: %d\n",me.nfcn()); if(!me.isValid()) os.println("Minos error is not valid."); if(!me.lowerValid()) os.println("lower Minos error is not valid." ); if(!me.upperValid()) os.println("upper Minos error is not valid." ); if(me.atLowerLimit()) os.println("Minos error is lower limit of parameter "+me.parameter()); if(me.atUpperLimit()) os.println("Minos error is upper limit of parameter "+me.parameter()); if(me.atLowerMaxFcn()) os.println("Minos number of function calls for lower error exhausted."); if(me.atUpperMaxFcn()) os.println("Minos number of function calls for upper error exhausted."); if(me.lowerNewMin()) { os.println("Minos found a new minimum in negative direction."); os.println(me.lowerState()); } if(me.upperNewMin()) { os.println("Minos found a new minimum in positive direction."); os.println(me.upperState()); } os.println("# ext. || name || value@min || negative || positive "); os.printf("%4d||%10s||%10g||%10g||%10g\n",me.parameter(),me.lowerState().name(me.parameter()),me.min(),me.lower(),me.upper()); os.println(); } static String toString(ContoursError x) { StringWriter writer = new StringWriter(); PrintWriter pw = new PrintWriter(writer); MnPrint.print(pw,x); pw.close(); return writer.toString(); } public static void print(PrintWriter os, ContoursError ce) { os.println(); os.println("Contours # of function calls: "+ce.nfcn()); os.println("MinosError in x: "); os.println(ce.xMinosError()); os.println("MinosError in y: "); os.println(ce.yMinosError()); MnPlot plot = new MnPlot(); plot.plot(ce.xmin(), ce.ymin(), ce.points()); int i = 0; for(Point ipoint : ce.points()) { os.printf("%d %10g %10g\n",i++,ipoint.first,ipoint.second); } os.println(); } }