def setup(self):
        self.record_data_manager = CSVDataManager()
        self.record_data_manager.new_frame(directory=paths.device_scan_dir)
        self.graph = StreamStackedGraph()
        self.graph.new_plot()
        self.graph.new_series()
        self.graph.new_plot()
        self.graph.new_series(plotid=1)

        dl = 1.8*600
        self.graph.set_data_limits(dl)
        self.graph.set_scan_widths(600)
Ejemplo n.º 2
0
    def make_graph(self):
        g = StreamStackedGraph(window_x=50,
                               window_y=100)

        for i, (_, name) in enumerate(self.functions):
            kw = dict(ytitle=name, )
            if i == 0:
                kw['xtitle'] = 'Time'

            g.new_plot(
                data_limit=3000,
                **kw)
            g.new_series(plotid=i)
        self._graph = g
        return g
Ejemplo n.º 3
0
    def setup_graph(self):
        self.graph = g = StreamStackedGraph()
        for i, vi in enumerate(self.values):
            vi.plotid = i
            p = g.new_plot()
            if i == 0:
                p.padding_bottom = 25
            p.padding_right = 10

            g.new_series(plotid=i)
            g.set_y_title(vi.display_name, plotid=i)
            g.set_scan_width(24 * 60 * 60, plotid=i)
            g.set_data_limits(24 * 60 * 60, plotid=i)
Ejemplo n.º 4
0
    def make_graph(self):
        g = StreamStackedGraph(window_x=50, window_y=100)

        for i, (_, name) in enumerate(self.functions):
            kw = dict(ytitle=name, )
            if i == 0:
                kw['xtitle'] = 'Time'

            g.new_plot(data_limit=3000, **kw)
            g.new_series(plotid=i)
        self._graph = g
        return g
Ejemplo n.º 5
0
    def _execute_calibration(self):
        name = os.path.join(paths.scripts_dir, '{}_calibration_scan.yaml'.format(self.name))

        import csv

        d = os.path.join(paths.data_dir, 'diode_scans')
        p, _cnt = unique_path(d, 'calibration', extension='csv')
        #        st = None
        #
        #        py = self.laser_manager.pyrometer
        #        tc = self.laser_manager.get_device('temperature_monitor')

        g = StreamStackedGraph()
        g.clear()

        g.new_plot(scan_delay=1)
        g.new_series(x=[], y=[])
        g.new_plot(scan_delay=1)
        g.new_series(x=[], y=[], plotid=1)

        open_view(g)
        record = False
        if record:
            self.laser_manager.stage_manager.start_recording()
            time.sleep(1)
        # def gfunc(t, v1, v2):
        #            g.add_datum((t, v1))
        #            g.add_datum((t, v2), plotid=1)

        def gfunc(v1, v2):
            g.record(v1)
            g.record(v2, plotid=1)

        yd = yaml.load(open(name).read())

        start = yd['start']
        end = yd['end']
        step = yd['step']
        mean_tol = yd['mean_tol']
        std = yd['std']
        n = (end - start) / step + 1
        #        nn = 30
        #
        #        py = self.laser_manager.pyrometer
        #        tc = self.laser_manager.get_device('temperature_monitor')

        with open(p, 'w') as wfile:
            writer = csv.writer(wfile)
            st = time.time()
            for ti in linspace(start, end, n):
                if self._cancel:
                    break
                args = self._equilibrate_temp(ti, gfunc, st, mean_tol, std)
                if args:
                    self.info('{} equilibrated'.format(ti))
                    py_t, tc_t = args
                    writer.writerow((ti, py_t, tc_t))
                else:
                    break

        self.laser_manager.set_laser_temperature(0)
        if record:
            self.laser_manager.stage_manager.stop_recording()
        self._executing = False
Ejemplo n.º 6
0
    def _execute_scan(self):
        name = os.path.join(paths.scripts_dir, '{}_scan.yaml'.format(self.name))

        import csv

        d = os.path.join(paths.data_dir, 'diode_scans')
        p, _cnt = unique_path(d, 'scan', extension='csv')
        st = None

        py = self.laser_manager.pyrometer
        tc = self.laser_manager.get_device('temperature_monitor')
        yd = yaml.load(open(name).read())

        power = yd['power']
        duration = yd['duration']
        power_on = yd['power_on']
        power_off = yd['power_off']
        period = yd['period']
        if 'temp' in yd:
            temp = yd['temp']
        else:
            temp = None

        g = StreamStackedGraph()
        g.new_plot(scan_delay=1, )
        g.new_series(x=[], y=[])
        g.new_plot(scan_delay=1, )
        g.new_series(x=[], y=[], plotid=1)

        open_view(g)
        self.laser_manager.stage_manager.start_recording()
        time.sleep(1)

        def gfunc(v1, v2):
            g.record(v1)
            g.record(v2, plotid=1)

        pi = 0
        with open(p, 'w') as wfile:
            writer = csv.writer(wfile)
            t = 0
            ti = 0
            while ti <= duration:
                if self._cancel:
                    break
                # print ti, power_off, pi, ti >= power_off, (ti >= power_off and pi)
                if ti == power_on:
                    # turn on set laser to power
                    if temp:
                        self.laser_manager.set_laser_temperature(temp)
                        pi = temp
                    else:
                        pi = power
                        self.laser_manager.set_laser_power(power)
                elif ti >= power_off and pi:
                    print 'setting power off'
                    if temp:
                        self.laser_manager.set_laser_temperature(0)
                    else:
                        self.laser_manager.set_laser_power(0)
                    pi = 0

                if st is None:
                    st = time.time()

                t = time.time() - st

                py_t = py.read_temperature(verbose=False)
                tc_t = tc.read_temperature(verbose=False)
                gfunc(py_t, tc_t)

                writer.writerow((ti, pi, t, py_t, tc_t))
                ti += 1

                time.sleep(period)

        if temp:
            self.laser_manager.set_laser_temperature(0)
        else:
            self.laser_manager.set_laser_power(0)
        self.laser_manager.stage_manager.stop_recording()
        self._executing = False
Ejemplo n.º 7
0
    def _execute_calibration(self):
        name = os.path.join(paths.scripts_dir, '{}_calibration_scan.yaml'.format(self.name))

        import csv
        d = os.path.join(paths.data_dir, 'diode_scans')
        p, _cnt = unique_path(d, 'calibration', extension='csv')
#        st = None
#
#        py = self.laser_manager.pyrometer
#        tc = self.laser_manager.get_device('temperature_monitor')

        g = StreamStackedGraph()
        g.clear()

        g.new_plot(scan_delay=1)
        g.new_series(x=[], y=[])
        g.new_plot(scan_delay=1)
        g.new_series(x=[], y=[], plotid=1)

        self.laser_manager.open_view(g)
        record = False
        if record:
            self.laser_manager.stage_manager.start_recording()
            time.sleep(1)
#        def gfunc(t, v1, v2):
#            g.add_datum((t, v1))
#            g.add_datum((t, v2), plotid=1)

        def gfunc(v1, v2):
            g.record(v1)
            g.record(v2, plotid=1)
        yd = yaml.load(open(name).read())

        start = yd['start']
        end = yd['end']
        step = yd['step']
        mean_tol = yd['mean_tol']
        std = yd['std']
        n = (end - start) / step + 1
#        nn = 30
#
#        py = self.laser_manager.pyrometer
#        tc = self.laser_manager.get_device('temperature_monitor')

        with open(p, 'w') as wfile:
            writer = csv.writer(wfile)
            st = time.time()
            for ti in linspace(start, end, n):
                if self._cancel:
                    break
                args = self._equilibrate_temp(ti, gfunc, st, mean_tol, std)
                if args:
                    self.info('{} equilibrated'.format(ti))
                    py_t, tc_t = args
                    writer.writerow((ti, py_t, tc_t))
                else:
                    break

        self.laser_manager.set_laser_temperature(0)
        if record:
            self.laser_manager.stage_manager.stop_recording()
        self._executing = False
Ejemplo n.º 8
0
    def _execute_scan(self):
        name = os.path.join(paths.scripts_dir, '{}_scan.yaml'.format(self.name))

        import csv
        d = os.path.join(paths.data_dir, 'diode_scans')
        p, _cnt = unique_path(d, 'scan', extension='csv')
        st = None

        py = self.laser_manager.pyrometer
        tc = self.laser_manager.get_device('temperature_monitor')
        yd = yaml.load(open(name).read())

        power = yd['power']
        duration = yd['duration']
        power_on = yd['power_on']
        power_off = yd['power_off']
        period = yd['period']
        if yd.has_key('temp'):
            temp = yd['temp']
        else:
            temp = None

        g = StreamStackedGraph()
        g.new_plot(scan_delay=1,)
        g.new_series(x=[], y=[])
        g.new_plot(scan_delay=1,)
        g.new_series(x=[], y=[], plotid=1)

        self.laser_manager.open_view(g)
        self.laser_manager.stage_manager.start_recording()
        time.sleep(1)
        def gfunc(v1, v2):
            g.record(v1)
            g.record(v2, plotid=1)

        pi = 0
        with open(p, 'w') as wfile:
            writer = csv.writer(wfile)
            t = 0
            ti = 0
            while ti <= duration:
                if self._cancel:
                    break
#                print ti, power_off, pi, ti >= power_off, (ti >= power_off and pi)
                if ti == power_on:
                    # turn on set laser to power
                    if temp:
                        self.laser_manager.set_laser_temperature(temp)
                        pi = temp
                    else:
                        pi = power
                        self.laser_manager.set_laser_power(power)
                elif ti >= power_off and pi:
                    print 'setting power off'
                    if temp:
                        self.laser_manager.set_laser_temperature(0)
                    else:
                        self.laser_manager.set_laser_power(0)
                    pi = 0

                if st is None:
                    st = time.time()

                t = time.time() - st

                py_t = py.read_temperature(verbose=False)
                tc_t = tc.read_temperature(verbose=False)
                gfunc(py_t, tc_t)

                writer.writerow((ti, pi, t, py_t, tc_t))
                ti += 1

                time.sleep(period)

        if temp:
            self.laser_manager.set_laser_temperature(0)
        else:
            self.laser_manager.set_laser_power(0)
        self.laser_manager.stage_manager.stop_recording()
        self._executing = False
class MeltingPointCalibrator(Loggable, ExecuteMixin):
    graph = Instance(StreamStackedGraph)
    setpoint = Float(enter_set=True, auto_set=False)
    record_data_manager = None
    detector = 'L2(CDD)'

    def setup(self):
        self.record_data_manager = CSVDataManager()
        self.record_data_manager.new_frame(directory=paths.device_scan_dir)
        self.graph = StreamStackedGraph()
        self.graph.new_plot()
        self.graph.new_series()
        self.graph.new_plot()
        self.graph.new_series(plotid=1)

        dl = 1.8*600
        self.graph.set_data_limits(dl)
        self.graph.set_scan_widths(600)

    def _do_execute(self):
        self.setup()
        self.laser.enable_laser()
        period = 1
        st = time.time()
        while self.executing:
            self._iter(time.time() - st)
            time.sleep(period)

        self.laser.disable_laser()
        self.record_data_manager.close_file()

    # private
    def _setpoint_changed(self, new):
        self.laser.extract(new)

    def _iter(self, t):
        intensity = self.spectrometer_manager.get_intensity(self.detector)
        temperature = self.laser.get_pyrometer_temperature()

        self._record(t, intensity, temperature)
        self._graph(t, intensity, temperature)

    def _graph(self, t, intensity, temperature):
        self.graph.record(intensity, x=t, plotid=0, track_x=True, track_y=True)
        self.graph.record(temperature, x=t, plotid=1, track_x=True, track_y=True)

    def _record(self, t, intensity, temperature):
        self.record_data_manager.write_to_frame((t, intensity, temperature))

    def traits_view(self):
        tgrp = HGroup(UItem('execute', editor=ButtonEditor(label_value='execute_label')), UItem('setpoint'))
        ggrp = VGroup(UItem('graph', style='custom'))

        v = View(VGroup(tgrp, ggrp), resizable=True, title='Melting Point Calibration')
        return v
Ejemplo n.º 10
0
    def _execute_lumen_degas(self, controller, pattern):
        from pychron.core.pid import PID
        from pychron.core.ui.gui import invoke_in_main_thread
        from pychron.lasers.pattern.mv_viewer import MVViewer
        from pychron.graph.stream_graph import StreamStackedGraph
        from pychron.mv.mv_image import MVImage

        lm = self.laser_manager
        sm = lm.stage_manager

        g = StreamStackedGraph()

        img = MVImage()

        img.setup_images(2, sm.get_frame_size())

        mvviewer = MVViewer(graph=g, image=img)
        mvviewer.edit_traits()
        # g.edit_traits()

        g.new_plot(xtitle='Time', ytitle='Lumens')
        g.new_series()

        g.new_plot(xtitle='Time', ytitle='Error')
        g.new_series(plotid=1)

        g.new_plot(xtitle='Time', ytitle='Power')
        g.new_series(plotid=2)

        duration = pattern.duration
        lumens = pattern.lumens
        dt = pattern.period
        st = time.time()

        pid = PID()

        def update(c, e, o, cs, ss):
            g.record(c, plotid=0)
            g.record(e, plotid=1)
            g.record(o, plotid=2)

            img.set_image(cs, 0)
            img.set_image(ss, 1)

        while self._alive:

            if duration and time.time() - st > duration:
                break

            with PeriodCTX(dt):
                csrc, src, cl = sm.get_brightness()

                err = lumens - cl
                out = pid.get_value(err, dt)
                lm.set_laser_power(out)
                invoke_in_main_thread(update, (cl, err, out, csrc, src))
Ejemplo n.º 11
0
    def _execute_lumen_degas(self, controller, pattern):
        from pychron.core.pid import PID
        from pychron.core.ui.gui import invoke_in_main_thread
        from pychron.lasers.pattern.mv_viewer import MVViewer
        from pychron.graph.stream_graph import StreamStackedGraph
        from pychron.mv.mv_image import MVImage

        lm = self.laser_manager
        sm = lm.stage_manager

        g = StreamStackedGraph()

        img = MVImage()

        img.setup_images(2, sm.get_frame_size())

        mvviewer = MVViewer(graph=g, image=img)
        mvviewer.edit_traits()
        # g.edit_traits()

        g.new_plot(xtitle='Time', ytitle='Lumens')
        g.new_series()

        g.new_plot(xtitle='Time', ytitle='Error')
        g.new_series(plotid=1)

        g.new_plot(xtitle='Time', ytitle='Power')
        g.new_series(plotid=2)

        duration = pattern.duration
        lumens = pattern.lumens
        dt = pattern.period
        st = time.time()

        pid = PID()

        def update(c, e, o, cs, ss):
            g.record(c, plotid=0)
            g.record(e, plotid=1)
            g.record(o, plotid=2)

            img.set_image(cs, 0)
            img.set_image(ss, 1)

        while self._alive:

            if duration and time.time() - st > duration:
                break

            with PeriodCTX(dt):
                csrc, src, cl = sm.get_brightness()

                err = lumens - cl
                out = pid.get_value(err, dt)
                lm.set_laser_power(out)
                invoke_in_main_thread(update, (cl, err, out, csrc, src))