def onStarted(self): try: from photonacq.instruments.spectra_pro_2500i import SpectraPro2500i from photonacq.instruments.srs_sr830 import SR830 from photonacq.instruments.thorlabs_fw102c import FW102C except (OSError, ImportError): print "Couldn't load device drivers. Simulating..." from photonacq.instruments.spectra_pro_2500i_sim import SpectraPro2500i from photonacq.instruments.srs_sr830_sim import SR830 from photonacq.instruments.thorlabs_fw102c_sim import FW102C self._spectrometer = SpectraPro2500i() self.spectrometerConnected.emit() self.gratingsConfig = GratingsConfig() self._filterwheel = FW102C(port=4) self.filtersConfig = FiltersConfig() self._lockin = SR830() self.lockinConnected.emit() # Connect signals to slots self.scan_finished.connect(self._log_scan) self.scan_aborted.connect(self._log_scan) # Send out the initilized signal self.initialized.emit()
class Acquirer(QObject): def __init__(self): log.debug("__init__") super(Acquirer, self).__init__() self._spectrometer = None self._lockin = None self.want_abort = False self.is_running = False # Signals spectrometerConnected = Signal() lockinConnected = Signal() @Slot() def onStarted(self): try: from photonacq.instruments.spectra_pro_2500i import SpectraPro2500i from photonacq.instruments.srs_sr830 import SR830 from photonacq.instruments.thorlabs_fw102c import FW102C except (OSError, ImportError): print "Couldn't load device drivers. Simulating..." from photonacq.instruments.spectra_pro_2500i_sim import SpectraPro2500i from photonacq.instruments.srs_sr830_sim import SR830 from photonacq.instruments.thorlabs_fw102c_sim import FW102C self._spectrometer = SpectraPro2500i() self.spectrometerConnected.emit() self.gratingsConfig = GratingsConfig() self._filterwheel = FW102C(port=4) self.filtersConfig = FiltersConfig() self._lockin = SR830() self.lockinConnected.emit() # Connect signals to slots self.scan_finished.connect(self._log_scan) self.scan_aborted.connect(self._log_scan) # Send out the initilized signal self.initialized.emit() # Signals initialized = Signal() at_wavelength = Signal(float) goto_started = Signal() goto_done = Signal() scan_started = Signal() scan_aborted = Signal(object) scan_finished = Signal(object) new_data = Signal(object) # Private methods def _goto(self, nm): #TODO: cache the current grating and filter? so we don't always # have to ask the spectrometer? First, time how long it takes. # If it's negligable, don't worry about it. current_grating = self._spectrometer.get_grating() target_grating = self.gratingsConfig.getGrating(nm) if current_grating != target_grating: self._spectrometer.set_grating(target_grating) current_filter = self._filterwheel.get_filter() target_filter = self.filtersConfig.getFilter(nm) if current_filter != target_filter: self._filterwheel.set_filter(target_filter) self._spectrometer.goto(nm) self.at_wavelength.emit(self._spectrometer.get_wavelength()) def delay(self, req): tlabel = req.config['Time Constant'] i = self._lockin.time_constant_labels.index(tlabel) tfloat = self._lockin.time_constant_seconds[i] dm = req.config['Delay Multiplier'] if dm: return tfloat*float(dm) else: return tfloat*5 # default multiplier of 5 # Slots @Slot(float) def goto(self, nm): self.goto_started.emit() self._goto(nm) self.goto_done.emit() @Slot(object) def scan(self, req): self.want_abort = False self.is_running = True self.scan_started.emit() scan = ScanResult(req.config, req.metadata) # Process start, stop and step start = req.start stop = req.stop step = req.step if start < stop: step = abs(step) stop += 1E-5 else: step = -abs(step) stop -= 1E-5 delay = self.delay(req) # Start taking data for nm in np.arange(start, stop, step): QCoreApplication.processEvents() if self.want_abort: # abort and emit scan_aborted with data taken so far self.scan_aborted.emit(scan) self.is_running = False break self._goto(nm) QThread.usleep(delay*1e6) R, theta = self._lockin.get_outputs() if req.sysres is not None: try: sysresrem = R/req.sysres(nm) except ValueError: sysresrem = np.nan scan.addData(nm, R, theta, sysresrem) else: scan.addData(nm, R, theta) self.new_data.emit(scan) else: # Didn't abort, so emit scan_finished self.scan_finished.emit(scan) self.is_running = False @Slot() def abort(self): log.debug('abort()') self.want_abort = True @Slot(object) def _log_scan(self, scan): if scan.metadata['Scan Type'] == 'System Response': log_dir = r'system_response_logs' else: log_dir = r'scan_logs' log_dir = os.path.expanduser(log_dir) log_dir = os.path.expandvars(log_dir) # if the log_dir doesn't exist, try to create it if not os.path.isdir(log_dir): log.debug('Creating directory: %s'%log_dir) os.makedirs(os.path.abspath(log_dir)) fpath = os.path.join(log_dir,scan.timestamp+'.json') log.debug('Logging scan to %s'%fpath) with open(fpath, 'w') as fobj: fobj.write(scan.toJSON()) log.debug('Done logging scan.') # Instrument interface functions @Slot() def timeConstantsList(self): return self._lockin.time_constant_labels @Slot(int) def setTimeConstantIndex(self, i): self._lockin.set_time_constant_index(i)