00001
00002
00003
00004
00005
00006
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
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 double awid,ah, al, sigfig, sigrnd, alb;
00030 int kwid, lwid, na=0, log_;
00031
00032 al = a1 < a2 ? a1 : a2;
00033
00034
00035 ah = a1 > a2 ? a1 : a2;
00036 if (al == ah) ah = al + 1;
00037
00038
00039 if (naa == -1) goto L150;
00040 L10:
00041 na = naa - 1;
00042 if (na < 1) na = 1;
00043
00044
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
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
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
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 }
00093
00094 }
00095
00096 }