Exemple #1
0
    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()
Exemple #2
0
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)