コード例 #1
0
    def predict_values(self, refresh=False):
        self.debug('predict values {}'.format(refresh))
        try:
            x, y, z, ze, j, je, sj, sje = self._extract_position_arrays()
            t = AffineTransform()
            t.rotate(self.rotation)

            x, y = t.transforms(x, y)
            # print(x)
        except ValueError as e:
            self.debug('no monitor positions to fit, {}'.format(e))
            return

        # print(x)
        # print(y)
        # print(z)
        # print(ze)
        n = x.shape[0]
        if n >= 3 or self.plotter_options.model_kind in (WEIGHTED_MEAN,
                                                         MATCHING, BRACKETING):
            # n = z.shape[0] * 10
            r = max((max(abs(x)), max(abs(y))))
            # r *= 1.25
            reg = self._regressor_factory(x, y, z, ze)
            self._regressor = reg
        else:
            msg = 'Not enough monitor positions. At least 3 required. Currently only {} active'.format(
                n)
            self.debug(msg)
            self.information_dialog(msg)
            return

        options = self.plotter_options
        ipositions = self.unknown_positions + self.monitor_positions

        if options.model_kind == LEAST_SQUARES_1D:
            k = options.one_d_axis.lower()
            pts = array([getattr(p, k) for p in ipositions])
        else:
            pts = array([[p.x, p.y] for p in ipositions])

        if options.use_monte_carlo and options.model_kind not in (MATCHING,
                                                                  BRACKETING,
                                                                  NN):
            fe = FluxEstimator(options.monte_carlo_ntrials, reg)

            split = len(self.unknown_positions)
            nominals, errors = fe.estimate(pts)
            if options.position_error:
                _, pos_errors = fe.estimate_position_err(
                    pts, options.position_error)
            else:
                pos_errors = zeros(pts.shape[0])

            for positions, s, e in ((self.unknown_positions, 0, split),
                                    (self.monitor_positions, split, None)):
                noms, es, ps = nominals[s:e], errors[s:e], pos_errors[s:e]
                for p, j, je, pe in zip(positions, noms, es, ps):
                    oj = p.saved_j
                    p.j = j
                    p.jerr = je
                    p.position_jerr = pe
                    p.dev = (oj - j) / j * 100
        else:
            js = reg.predict(pts)
            jes = reg.predict_error(pts)

            for j, je, p in zip(js, jes, ipositions):
                p.j = float(j)
                p.jerr = float(je)

                p.dev = (p.saved_j - j) / j * 100
                p.mean_dev = (p.mean_j - j) / j * 100

        if options.plot_kind == '2D':
            self._graph_contour(x, y, z, r, reg, refresh)
        elif options.plot_kind == 'Grid':
            self._graph_grid(x, y, z, ze, r, reg, refresh)
        else:
            if options.model_kind in (LEAST_SQUARES_1D, WEIGHTED_MEAN_1D):
                self._graph_linear_j(x, y, r, reg, refresh)
            else:
                self._graph_hole_vs_j(x, y, r, reg, refresh)
コード例 #2
0
    def predict_values(self, refresh=False):
        self.debug('predict values {}'.format(refresh))
        try:
            x, y, z, ze, j, je, sj, sje = self._extract_position_arrays()
            t = AffineTransform()
            t.rotate(self.rotation)

            x, y = t.transforms(x, y)
            # print(x)
        except ValueError as e:
            self.debug('no monitor positions to fit, {}'.format(e))
            return

        # print(x)
        # print(y)
        # print(z)
        # print(ze)
        n = x.shape[0]
        if n >= 3:
            # n = z.shape[0] * 10
            r = max((max(abs(x)), max(abs(y))))
            # r *= 1.25
            reg = self._regressor_factory(x, y, z, ze)
            self._regressor = reg
        else:
            msg = 'Not enough monitor positions. At least 3 required. Currently only {} active'.format(n)
            self.debug(msg)
            self.information_dialog(msg)
            return

        options = self.plotter_options
        ipositions = self.unknown_positions + self.monitor_positions
        pts = array([[p.x, p.y] for p in ipositions])
        if options.use_monte_carlo and options.model_kind not in ['Matching', 'Bracketing']:
            fe = FluxEstimator(options.monte_carlo_ntrials, reg)

            split = len(self.unknown_positions)
            nominals, errors = fe.estimate(pts)
            if options.position_error:
                _, pos_errors = fe.estimate_position_err(pts, options.position_error)
            else:
                pos_errors = zeros(pts.shape[0])

            for positions, s, e in ((self.unknown_positions, 0, split),
                                    (self.monitor_positions, split, None)):
                noms, es, ps = nominals[s:e], errors[s:e], pos_errors[s:e]
                for p, j, je, pe in zip(positions, noms, es, ps):
                    oj = p.saved_j
                    p.j = j
                    p.jerr = je
                    p.position_jerr = pe
                    p.dev = (oj - j) / j * 100
        else:
            js = reg.predict(pts)
            jes = reg.predict_error(pts)

            for j, je, p in zip(js, jes, ipositions):
                p.j = float(j)
                p.jerr = float(je)

                p.dev = (p.saved_j - j) / j * 100

        if options.plot_kind == '2D':
            self._graph_contour(x, y, z, r, reg, refresh)
        elif options.plot_kind == 'Grid':
            self._graph_grid(x, y, z, ze, r, reg, refresh)
        else:
            self._graph_hole_vs_j(x, y, r, reg, refresh)