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.