示例#1
0
    def fit(self, i, x, y, yerr = None):
        ff = self.ff[i]
        if ff:
            ff = ff.replace(' ', '')
            log.info('fitting function {}'.format(ff))
            fitfunc = eval('lambda x,*p:' + ff)
            x, y = np.array(x), np.array(y)
            m = np.logical_and(np.isfinite(x), np.isfinite(y))
            if yerr is not None:
                yerr = np.array(yerr)
                m = np.logical_and(m, np.isfinite(yerr))
                yerr = yerr[m]
            x , y = x[m], y[m]



            p = eval(self.fp[i])
            try:
                p, c = curve_fit(fitfunc, x, y, p, yerr)
                log.info('parameters = {}'.format(p))
                log.info('covariance = {}'.format(c))
                fit_status = ''
            except Exception as e:
                fit_status = ' (failed: {})'.format(e)
                c = None
                log.exception('fit failed')

            # plot fit result
            xfit = np.linspace(np.nanmin(x), np.nanmax(x), 1000)
            yfit = fitfunc(xfit, *p)
            args = [xfit, yfit]
            if self.fl[i]: args.append(self.fl[i])
            l, = plt.plot(*args)

            N = len(x)
            chi2 = fitfunc(x, *p) - y
            if yerr is not None:
                chi2 = chi2 / yerr
            chi2 = (chi2 ** 2).sum()

            # add textbox
            t = 'y=' + ff
            t += '\n$\\chi^2$/N = {}/{}'.format(number_format(chi2), number_format(N))
            for k, v in enumerate(p):
                try:
                    t += '\np[{}] = {}$\\pm${}'.format(k, number_format(v), number_format(np.sqrt(c[k, k])))
                except:
                    t += '\np[{}] = {}$\\pm${}'.format(k, v, c)
            self.textboxes.append(t)
            ll = ('Fit' + fit_status + ' y=' + ff)
            for k, v in  enumerate(p):
                ll = ll.replace('p[{}]'.format(k), number_format(v, 3))
            self.legend.append((l, ll))
示例#2
0
    def fit(self, i, x, y, yerr=None):
        ff = self.ff[i]
        if ff:
            ff = ff.replace(' ', '')
            log.info('fitting function {}'.format(ff))
            fitfunc = eval('lambda x,*p:' + ff)
            x, y = np.array(x), np.array(y)
            m = np.logical_and(np.isfinite(x), np.isfinite(y))
            if yerr is not None:
                yerr = np.array(yerr)
                m = np.logical_and(m, np.isfinite(yerr))
                yerr = yerr[m]
            x, y = x[m], y[m]

            p = eval(self.fp[i])
            try:
                p, c = curve_fit(fitfunc, x, y, p, yerr)
                log.info('parameters = {}'.format(p))
                log.info('covariance = {}'.format(c))
                fit_status = ''
            except Exception as e:
                fit_status = ' (failed: {})'.format(e)
                c = None
                log.exception('fit failed')

            # plot fit result
            xfit = np.linspace(np.nanmin(x), np.nanmax(x), 1000)
            yfit = fitfunc(xfit, *p)
            args = [xfit, yfit]
            if self.fl[i]: args.append(self.fl[i])
            l, = plt.plot(*args)

            N = len(x)
            chi2 = fitfunc(x, *p) - y
            if yerr is not None:
                chi2 = chi2 / yerr
            chi2 = (chi2**2).sum()

            # add textbox
            t = 'y=' + ff
            t += '\n$\\chi^2$/N = {}/{}'.format(number_format(chi2),
                                                number_format(N))
            for k, v in enumerate(p):
                try:
                    t += '\np[{}] = {}$\\pm${}'.format(
                        k, number_format(v), number_format(np.sqrt(c[k, k])))
                except:
                    t += '\np[{}] = {}$\\pm${}'.format(k, v, c)
            self.textboxes.append(t)
            ll = ('Fit' + fit_status + ' y=' + ff)
            for k, v in enumerate(p):
                ll = ll.replace('p[{}]'.format(k), number_format(v, 3))
            self.legend.append((l, ll))
示例#3
0
    def stats_fields2d(self, i, contents, xcenters, ycenters):
        stats = {}
        stats['N'] = N = contents.sum()
        stats['mean'] = mean = np.array([ (contents.sum(axis = 0) * xcenters).sum(),
                         (contents.sum(axis = 1) * ycenters).sum()]) / N
        stats['std'] = np.sqrt(np.array([(contents.sum(axis = 0) * (xcenters - mean[0]) ** 2).sum(),
                                  (contents.sum(axis = 1) * (ycenters - mean[1]) ** 2).sum()]) / N)
        cov = 0
        for k, l in product(xrange(contents.shape[1]), xrange(contents.shape[0])):
            cov += contents[l, k] * (xcenters[k] - mean[0]) * (ycenters[l] - mean[1])
        stats['cov'] = cov / N
        log.debug(stats)

        text = '{:6} {}'.format('hist', self.llabel(i))
        sb = self.sb[i]
        if 'a' in sb: sb = 'nmscpewx'
        if 'uflow' in stats and stats['uflow']: sb += 'u'
        if 'oflow' in stats and stats['oflow']: sb += 'o'
        for k in sb:
            k = stats_abrv[k]
            if k in stats:
                v = stats[k]
                try:
                    v = number_format(v)
                except:
                    v = '({})'.format(','.join(map(number_format, v)))
                text += '\n{:6} {}'.format(k, v)
        self.textboxes.append(text)
示例#4
0
    def stats_fields1d(self, i, data, contents, errors, edges):
        centers = (edges[1:] + edges[:-1]) / 2
        widths = np.diff(edges)

        stats = {}
        stats['N'] = N = np.sum(contents)
        stats['uflow'] = np.sum(data < edges[0])
        stats['oflow'] = np.sum(edges[-1] < data)
        stats['mean'] = mean = np.sum(centers * contents) / N
        stats['std'] = std = np.sqrt(np.sum((centers - mean) ** 2 * contents) / N)
        stats['mode'] = centers[np.argmax(contents)]
        bc, be = get_density(contents, errors, widths)
        bc, be = get_cumulative(bc, be, 1, widths)
        median_i = np.minimum(len(centers)-1, np.searchsorted(bc, 0.5, side = 'right'))
        stats['median'] = median = centers[median_i]
        if len(centers) % 2 == 0:  # even # of s
            stats['median'] = median = (median + centers[median_i - 1]) / 2
        stats['skew'] = np.sum(((centers - mean) / std) ** 3 * contents) / N
        stats['kurtos'] = kurtosis = np.sum(((centers - mean) / std) ** 4 * contents) / N
        stats['excess'] = kurtosis - 3
        log.debug(stats)

        text = '{:6} {}'.format('hist', self.llabel(i))
        sb = self.sb[i]
        if 'a' in sb: sb = 'nmscpewx'
        if 'uflow' in stats and stats['uflow']: sb += 'u'
        if 'oflow' in stats and stats['oflow']: sb += 'o'
        for k in sb:
            k = stats_abrv[k]
            if k in stats:
                text += '\n{:6} {}'.format(k, number_format(stats[k]))
        self.textboxes.append(text)
示例#5
0
    def stats_fields2d(self, i, contents, xcenters, ycenters):
        stats = {}
        stats['N'] = N = contents.sum()
        stats['mean'] = mean = np.array(
            [(contents.sum(axis=0) * xcenters).sum(),
             (contents.sum(axis=1) * ycenters).sum()]) / N
        stats['std'] = np.sqrt(
            np.array([(contents.sum(axis=0) * (xcenters - mean[0])**2).sum(),
                      (contents.sum(axis=1) *
                       (ycenters - mean[1])**2).sum()]) / N)
        cov = 0
        for k, l in product(xrange(contents.shape[1]),
                            xrange(contents.shape[0])):
            cov += contents[l, k] * (xcenters[k] - mean[0]) * (ycenters[l] -
                                                               mean[1])
        stats['cov'] = cov / N
        log.debug(stats)

        text = '{:6} {}'.format('hist', self.llabel(i))
        sb = self.sb[i]
        if 'a' in sb: sb = 'nmscpewx'
        if 'uflow' in stats and stats['uflow']: sb += 'u'
        if 'oflow' in stats and stats['oflow']: sb += 'o'
        for k in sb:
            k = stats_abrv[k]
            if k in stats:
                v = stats[k]
                try:
                    v = number_format(v)
                except:
                    v = '({})'.format(','.join(map(number_format, v)))
                text += '\n{:6} {}'.format(k, v)
        self.textboxes.append(text)
示例#6
0
    def stats_fields1d(self, i, data, contents, errors, edges):
        centers = (edges[1:] + edges[:-1]) / 2
        widths = np.diff(edges)

        stats = {}
        stats['N'] = N = np.sum(contents)
        stats['uflow'] = np.sum(data < edges[0])
        stats['oflow'] = np.sum(edges[-1] < data)
        stats['mean'] = mean = np.sum(centers * contents) / N
        stats['std'] = std = np.sqrt(
            np.sum((centers - mean)**2 * contents) / N)
        stats['mode'] = centers[np.argmax(contents)]
        bc, be = get_density(contents, errors, widths)
        bc, be = get_cumulative(bc, be, 1, widths)
        median_i = np.minimum(
            len(centers) - 1, np.searchsorted(bc, 0.5, side='right'))
        stats['median'] = median = centers[median_i]
        if len(centers) % 2 == 0:  # even # of s
            stats['median'] = median = (median + centers[median_i - 1]) / 2
        stats['skew'] = np.sum(((centers - mean) / std)**3 * contents) / N
        stats['kurtos'] = kurtosis = np.sum(
            ((centers - mean) / std)**4 * contents) / N
        stats['excess'] = kurtosis - 3
        log.debug(stats)

        text = '{:6} {}'.format('hist', self.llabel(i))
        sb = self.sb[i]
        if 'a' in sb: sb = 'nmscpewx'
        if 'uflow' in stats and stats['uflow']: sb += 'u'
        if 'oflow' in stats and stats['oflow']: sb += 'o'
        for k in sb:
            k = stats_abrv[k]
            if k in stats:
                text += '\n{:6} {}'.format(k, number_format(stats[k]))
        self.textboxes.append(text)