frappy_psi: Added support for changing the observation frequency & number of scans. Further, added an automatic dashboard load on file setup, and a template dashboard for the Scout device.
This commit is contained in:
@@ -68,7 +68,7 @@ class ProgrammedSequence(fc.Readable):
|
||||
imags=fc.ArrayOf(fc.FloatRange(), maxlen=4096), # imag values
|
||||
t =fc.ArrayOf(fc.FloatRange(), maxlen=4096)), # times (starting from zero)
|
||||
default={ 'reals': [], 'imags': [], 't': [] })
|
||||
status = fc.Parameter(datatype=frappy.datatypes.StatusType(fc.Readable, "DISABLED", 'PREPARED', 'BUSY'))
|
||||
status = fc.Parameter(datatype=frappy.datatypes.StatusType(fc.Readable, "DISABLED", 'PREPARED', 'BUSY'), default=('IDLE', 'ok - uncompiled'))
|
||||
pollinterval = fc.Parameter(default=1)
|
||||
|
||||
# basic
|
||||
@@ -90,14 +90,21 @@ class ProgrammedSequence(fc.Readable):
|
||||
pre_acquisition_time = fc.Parameter('pre_acquisition_time', fc.FloatRange(unit='u'), readonly=False, group='sequence_editor', default=1)
|
||||
post_acquisition_time = fc.Parameter('post_acquisition_time', fc.FloatRange(unit='m'), readonly=False, group='sequence_editor', default=500)
|
||||
acq_phase_cycle = fc.Parameter('acq_phase_cycle', fc.StringType(), readonly=False, group='sequence_editor', default='')
|
||||
num_scans = fc.Parameter('num_scans', fc.IntRange(), readonly=False, group='sequence_editor', default=16)
|
||||
obs_freq = fc.Parameter('obs_freq', fc.FloatRange(unit='MHz'), readonly=False, group='sequence_editor', default=213.16)
|
||||
|
||||
inited = False
|
||||
|
||||
### SETUP
|
||||
def tnmr(self):
|
||||
if not(self.inited):
|
||||
self.ntnmr = te.TNMR()
|
||||
self.inited = True
|
||||
try:
|
||||
self.ntnmr = te.TNMR()
|
||||
self.inited = True
|
||||
except Exception as e:
|
||||
print(str(e), repr(e))
|
||||
self.ntnmr = None
|
||||
self.inited = False
|
||||
return self.ntnmr
|
||||
|
||||
def initialReads(self):
|
||||
@@ -134,6 +141,14 @@ class ProgrammedSequence(fc.Readable):
|
||||
threading.Thread(target=lambda s=self: s.__compile_and_run()).start()
|
||||
else:
|
||||
self.__compile_and_run()
|
||||
|
||||
@fc.Command(description="Kill")
|
||||
def kill(self):
|
||||
try:
|
||||
self.tnmr().get_instance().Abort
|
||||
self.status = ('IDLE', 'ok - killed')
|
||||
except:
|
||||
pass
|
||||
|
||||
### READ/WRITE
|
||||
|
||||
@@ -183,6 +198,24 @@ class ProgrammedSequence(fc.Readable):
|
||||
self.status = ('IDLE', 'ok - uncompiled')
|
||||
return self.read_acq_phase_cycle()
|
||||
|
||||
def read_num_scans(self):
|
||||
return self.tnmr().get_nmrparameter('Scans 1D')
|
||||
|
||||
def write_num_scans(self, t):
|
||||
if(self.status[0] != 'BUSY'):
|
||||
self.tnmr().set_nmrparameter('Scans 1D', t)
|
||||
self.status = ('IDLE', 'ok - uncompiled')
|
||||
return self.read_num_scans()
|
||||
|
||||
def read_obs_freq(self):
|
||||
return self.tnmr().get_nmrparameter('Observe Freq.')
|
||||
|
||||
def write_obs_freq(self, t):
|
||||
if(self.status[0] != 'BUSY'):
|
||||
self.tnmr().set_nmrparameter('Observe Freq.', t)
|
||||
self.status = ('IDLE', 'ok - uncompiled')
|
||||
return self.read_obs_freq()
|
||||
|
||||
### PRIVATE (Utility)
|
||||
def __compile_sequence(self):
|
||||
if(self.status[0] != 'BUSY'):
|
||||
@@ -209,9 +242,17 @@ class ProgrammedSequence(fc.Readable):
|
||||
seq_gen.save_sequence(filename, seq)
|
||||
seq_gen.save_sequence_cfg(filename, seq)
|
||||
|
||||
dashboard_params = { 'Observe Freq.': self.read_obs_freq(),
|
||||
'Scans 1D': self.read_num_scans(),
|
||||
}
|
||||
|
||||
# then, load the thing into TNMR
|
||||
self.tnmr().load_sequence(filename)
|
||||
|
||||
# load some parameters back to TNMR
|
||||
for key, val in dashboard_params.items():
|
||||
self.tnmr().set_nmrparameter(key, val)
|
||||
|
||||
# finally, let ourselves know we're ready
|
||||
self.status = ('PREPARED', 'compiled')
|
||||
|
||||
@@ -227,22 +268,9 @@ class ProgrammedSequence(fc.Readable):
|
||||
self.status = ('PREPARED', 'compiled')
|
||||
|
||||
def __compile_and_run(self, thread=True, recurse=True):
|
||||
pythoncom.CoInitialize()
|
||||
try:
|
||||
self.__compile_sequence()
|
||||
self.__zero_go()
|
||||
except AttributeError as e:
|
||||
print(f'Attribute error on compile and run.{" Resetting the COM interface and retrying..." if recurse else " Resetting did not fix this problem!"}')
|
||||
self.status = ('IDLE', 'ok - uncompiled')
|
||||
self.tnmr().reset_NTNMR_instance()
|
||||
self.__compile_and_run(thread, recurse=False)
|
||||
except Exception as e:
|
||||
print('Failed to compile and run!')
|
||||
print(str(e))
|
||||
print(repr(e))
|
||||
self.status = ('IDLE', 'ok - uncompiled')
|
||||
if(thread):
|
||||
pythoncom.CoUninitialize()
|
||||
self.tnmr().reset_NTNMR_instance()
|
||||
self.__compile_sequence()
|
||||
self.__zero_go()
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user