forked from M-Labs/artiq
Make arguments attributes, integrate with AutoContext
This makes them accessible to future "data analysis" methods.
This commit is contained in:
parent
2ad063c377
commit
06914bbaa3
|
@ -26,7 +26,8 @@ class NoDefault:
|
||||||
|
|
||||||
|
|
||||||
class Parameter(_AttributeKind):
|
class Parameter(_AttributeKind):
|
||||||
"""Represents a parameter for ``AutoContext`` to process.
|
"""Represents a parameter (from the database) for ``AutoContext``
|
||||||
|
to process.
|
||||||
|
|
||||||
:param default: Default value of the parameter to be used if not found
|
:param default: Default value of the parameter to be used if not found
|
||||||
in the database.
|
in the database.
|
||||||
|
@ -39,6 +40,18 @@ class Parameter(_AttributeKind):
|
||||||
self.write_db = write_db
|
self.write_db = write_db
|
||||||
|
|
||||||
|
|
||||||
|
class Argument(_AttributeKind):
|
||||||
|
"""Represents an argument (specifiable at instance creation) for
|
||||||
|
``AutoContext`` to process.
|
||||||
|
|
||||||
|
:param default: Default value of the argument to be used if not specified
|
||||||
|
at instance creation.
|
||||||
|
|
||||||
|
"""
|
||||||
|
def __init__(self, default=NoDefault, write_db=False):
|
||||||
|
self.default = default
|
||||||
|
|
||||||
|
|
||||||
class AutoContext:
|
class AutoContext:
|
||||||
"""Base class to automate device and parameter discovery.
|
"""Base class to automate device and parameter discovery.
|
||||||
|
|
||||||
|
@ -112,22 +125,33 @@ class AutoContext:
|
||||||
p = getattr(self, k)
|
p = getattr(self, k)
|
||||||
if isinstance(p, Parameter) and p.write_db:
|
if isinstance(p, Parameter) and p.write_db:
|
||||||
self.mvs.register_parameter_wb(self, k)
|
self.mvs.register_parameter_wb(self, k)
|
||||||
|
if (not hasattr(self, k)
|
||||||
|
or not isinstance(getattr(self, k), _AttributeKind)):
|
||||||
|
raise ValueError(
|
||||||
|
"Got unexpected keyword argument: '{}'".format(k))
|
||||||
setattr(self, k, v)
|
setattr(self, k, v)
|
||||||
|
|
||||||
for k in dir(self):
|
for k in dir(self):
|
||||||
v = getattr(self, k)
|
v = getattr(self, k)
|
||||||
if isinstance(v, _AttributeKind):
|
if isinstance(v, _AttributeKind):
|
||||||
if self.mvs is None:
|
if isinstance(v, Argument):
|
||||||
if (isinstance(v, Parameter)
|
# never goes through MVS
|
||||||
and v.default is not NoDefault):
|
if v.default is NoDefault:
|
||||||
value = v.default
|
raise AttributeError(
|
||||||
else:
|
"No value specified for argument '{}'".format(k))
|
||||||
raise AttributeError("Attribute '{}' not specified"
|
value = v.default
|
||||||
" and no MVS present".format(k))
|
|
||||||
else:
|
else:
|
||||||
value = self.mvs.get_missing_value(k, v, self)
|
if self.mvs is None:
|
||||||
if isinstance(v, Parameter) and v.write_db:
|
if (isinstance(v, Parameter)
|
||||||
self.mvs.register_parameter_wb(self, k)
|
and v.default is not NoDefault):
|
||||||
|
value = v.default
|
||||||
|
else:
|
||||||
|
raise AttributeError("Attribute '{}' not specified"
|
||||||
|
" and no MVS present".format(k))
|
||||||
|
else:
|
||||||
|
value = self.mvs.get_missing_value(k, v, self)
|
||||||
|
if isinstance(v, Parameter) and v.write_db:
|
||||||
|
self.mvs.register_parameter_wb(self, k)
|
||||||
setattr(self, k, value)
|
setattr(self, k, value)
|
||||||
|
|
||||||
self.build()
|
self.build()
|
||||||
|
|
|
@ -21,8 +21,8 @@ def run(dps, file, unit, arguments):
|
||||||
unit = units[0]
|
unit = units[0]
|
||||||
else:
|
else:
|
||||||
unit = getattr(module, unit)
|
unit = getattr(module, unit)
|
||||||
unit_inst = unit(dps)
|
unit_inst = unit(dps, **arguments)
|
||||||
unit_inst.run(**arguments)
|
unit_inst.run()
|
||||||
|
|
||||||
|
|
||||||
def get_object():
|
def get_object():
|
||||||
|
|
|
@ -6,6 +6,9 @@ class PhotonHistogram(AutoContext):
|
||||||
bdd = Device("dds")
|
bdd = Device("dds")
|
||||||
pmt = Device("ttl_in")
|
pmt = Device("ttl_in")
|
||||||
|
|
||||||
|
nbins = Argument(100)
|
||||||
|
repeats = Argument(100)
|
||||||
|
|
||||||
@kernel
|
@kernel
|
||||||
def cool_detect(self):
|
def cool_detect(self):
|
||||||
with parallel:
|
with parallel:
|
||||||
|
@ -20,13 +23,13 @@ class PhotonHistogram(AutoContext):
|
||||||
return self.pmt.count()
|
return self.pmt.count()
|
||||||
|
|
||||||
@kernel
|
@kernel
|
||||||
def run(self, nbins=100, repeats=100):
|
def run(self):
|
||||||
hist = [0 for _ in range (nbins)]
|
hist = [0 for _ in range(self.nbins)]
|
||||||
|
|
||||||
for i in range(repeats):
|
for i in range(self.repeats):
|
||||||
n = self.cool_detect()
|
n = self.cool_detect()
|
||||||
if n >= nbins:
|
if n >= self.nbins:
|
||||||
n = nbins - 1
|
n = self.nbins - 1
|
||||||
hist[n] += 1
|
hist[n] += 1
|
||||||
|
|
||||||
print(hist)
|
print(hist)
|
||||||
|
|
|
@ -19,6 +19,9 @@ class Transport(AutoContext):
|
||||||
wait_at_stop = Parameter(100*us)
|
wait_at_stop = Parameter(100*us)
|
||||||
speed = Parameter(1.5)
|
speed = Parameter(1.5)
|
||||||
|
|
||||||
|
repeats = Argument(100)
|
||||||
|
nbins = Argument(100)
|
||||||
|
|
||||||
def prepare(self, stop):
|
def prepare(self, stop):
|
||||||
t = transport_data["t"][:stop]*self.speed
|
t = transport_data["t"][:stop]*self.speed
|
||||||
u = transport_data["u"][:stop]
|
u = transport_data["u"][:stop]
|
||||||
|
@ -91,27 +94,27 @@ class Transport(AutoContext):
|
||||||
return self.detect()
|
return self.detect()
|
||||||
|
|
||||||
@kernel
|
@kernel
|
||||||
def repeat(self, repeats, nbins):
|
def repeat(self):
|
||||||
self.histogram = [0 for _ in range(nbins)]
|
self.histogram = [0 for _ in range(self.nbins)]
|
||||||
|
|
||||||
for i in range(repeats):
|
for i in range(self.repeats):
|
||||||
n = self.one()
|
n = self.one()
|
||||||
if n >= nbins:
|
if n >= self.nbins:
|
||||||
n = nbins - 1
|
n = self.nbins - 1
|
||||||
self.histogram[n] += 1
|
self.histogram[n] += 1
|
||||||
|
|
||||||
def scan(self, repeats, nbins, stops):
|
def scan(self, stops):
|
||||||
for s in stops:
|
for s in stops:
|
||||||
self.histogram = []
|
self.histogram = []
|
||||||
# non-kernel, calculate waveforms, build frames
|
# non-kernel, calculate waveforms, build frames
|
||||||
# could also be rpc'ed from repeat()
|
# could also be rpc'ed from repeat()
|
||||||
self.prepare(s)
|
self.prepare(s)
|
||||||
# kernel part
|
# kernel part
|
||||||
self.repeat(repeats, nbins)
|
self.repeat()
|
||||||
# live update 2d plot with current self.histogram
|
# live update 2d plot with current self.histogram
|
||||||
# broadcast(s, self.histogram)
|
# broadcast(s, self.histogram)
|
||||||
|
|
||||||
def run(self, repeats=100, nbins=100):
|
def run(self):
|
||||||
# scan transport endpoint
|
# scan transport endpoint
|
||||||
stops = range(10, len(transport_data["t"]), 10)
|
stops = range(10, len(transport_data["t"]), 10)
|
||||||
self.scan(repeats, nbins, stops)
|
self.scan(stops)
|
||||||
|
|
|
@ -92,8 +92,8 @@ def main():
|
||||||
print("Failed to parse run arguments")
|
print("Failed to parse run arguments")
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
unit_inst = unit(dps)
|
unit_inst = unit(dps, **arguments)
|
||||||
unit_inst.run(**arguments)
|
unit_inst.run()
|
||||||
|
|
||||||
if dps.parameter_wb:
|
if dps.parameter_wb:
|
||||||
print("Modified parameters:")
|
print("Modified parameters:")
|
||||||
|
|
Loading…
Reference in New Issue