mnbins.cxx

Go to the documentation of this file.
00001 // @(#)root/minuit2:$Id: mnbins.cxx 20880 2007-11-19 11:23:41Z rdm $
00002 // Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005  
00003 
00004 /**********************************************************************
00005  *                                                                    *
00006  * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
00007  *                                                                    *
00008  **********************************************************************/
00009 
00010 #include <math.h>
00011 
00012 namespace ROOT {
00013 
00014    namespace Minuit2 {
00015 
00016 
00017 void mnbins(double a1, double a2, int naa, double& bl, double& bh, int& nb, double& bwid) {
00018 
00019 //*-*-*-*-*-*-*-*-*-*-*Compute reasonable histogram intervals*-*-*-*-*-*-*-*-*
00020 //*-*                  ======================================
00021 //*-*        Function TO DETERMINE REASONABLE HISTOGRAM INTERVALS
00022 //*-*        GIVEN ABSOLUTE UPPER AND LOWER BOUNDS  A1 AND A2
00023 //*-*        AND DESIRED MAXIMUM NUMBER OF BINS NAA
00024 //*-*        PROGRAM MAKES REASONABLE BINNING FROM BL TO BH OF WIDTH BWID
00025 //*-*        F. JAMES,   AUGUST, 1974 , stolen for Minuit, 1988
00026 //*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
00027    
00028    /* Local variables */
00029    double awid,ah, al, sigfig, sigrnd, alb;
00030    int kwid, lwid, na=0, log_;
00031    
00032    al = a1 < a2 ? a1 : a2;
00033    //     al = std::min(a1,a2);
00034    //     ah = std::max(a1,a2);
00035    ah = a1 > a2 ? a1 : a2;
00036    if (al == ah) ah = al + 1;
00037    
00038    //*-*-       IF NAA .EQ. -1 , PROGRAM USES BWID INPUT FROM CALLING ROUTINE
00039    if (naa == -1) goto L150;
00040 L10:
00041       na = naa - 1;
00042    if (na < 1) na = 1;
00043    
00044    //*-*-        GET NOMINAL BIN WIDTH IN EXPON FORM
00045 L20:
00046       awid = (ah-al) / double(na);
00047    log_ = int(log10(awid));
00048    if (awid <= 1) --log_;
00049    sigfig = awid*pow(10.0, -log_);
00050    //*-*-       ROUND MANTISSA UP TO 2, 2.5, 5, OR 10
00051    if (sigfig > 2) goto L40;
00052    sigrnd = 2;
00053    goto L100;
00054 L40:
00055       if (sigfig > 2.5) goto L50;
00056    sigrnd = 2.5;
00057    goto L100;
00058 L50:
00059       if (sigfig > 5) goto L60;
00060    sigrnd = 5;
00061    goto L100;
00062 L60:
00063       sigrnd = 1;
00064    ++log_;
00065 L100:
00066       bwid = sigrnd*pow(10.0, log_);
00067    goto L200;
00068    //*-*-       GET NEW BOUNDS FROM NEW WIDTH BWID
00069 L150:
00070       if (bwid <= 0) goto L10;
00071 L200:
00072       alb  = al / bwid;
00073    lwid = int(alb);
00074    if (alb < 0) --lwid;
00075    bl   = bwid*double(lwid);
00076    alb  = ah / bwid + 1;
00077    kwid = int(alb);
00078    if (alb < 0) --kwid;
00079    bh = bwid*double(kwid);
00080    nb = kwid - lwid;
00081    if (naa > 5) goto L240;
00082    if (naa == -1) return;
00083    //*-*-        REQUEST FOR ONE BIN IS DIFFICULT CASE
00084    if (naa > 1 || nb == 1) return;
00085    bwid *= 2;
00086    nb = 1;
00087    return;
00088 L240:
00089       if (nb << 1 != naa) return;
00090    ++na;
00091    goto L20;
00092 } /* mnbins_ */
00093 
00094    }  // namespace Minuit2
00095 
00096 }  // namespace ROOT

Generated on Tue Jul 5 14:37:10 2011 for ROOT_528-00b_version by  doxygen 1.5.1