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
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
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
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))
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
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
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
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