Accessing the scan inside a scan model

The scan experiment that created a scan model can always be accessed via the attribute self._scan inside the scan model (once the _initialize() method of the scan class has executed). This can be particularly useful in attributes defined as properties via @property. Checks can then be performed on attributes of the scan class inside @property methods in the scan model to dynamically determine the appropriate value for a particular configuration.

For example, the fit function to use for fitting could be set via a GUI argument using this method:

from artiq.experiment import *
from scan_framework import *


class MyModel(ScanModel):
    namespace = "my_namespace"

    @property
    fit_function(self):
        if self._scan.fit_function == 'Sin':
            return fitting.Sine
        if self._scan.fit_function == 'RabiSpectrum':
            return fitting.RabiSpectrum

    ...


class MyScan(Scan1D, EnvExperiment):

    def build(self):
        super().build()
        self.scan_arguments()
        self.setattr_argument('fit_function', EnumerationValue([
            'Sin',
            'RabiSpectrum',
        ]))

    ...

Alternatively, the same can be accomplished by simply setting the scan model’s fit_function attribute directly in the scan based off the fit_function argument. The ability to access the scan instance via self._scan within a scan model may be necessary or more convenient, however, in other circumstances.