diff --git a/dstat_interface/dstat_comm.py b/dstat_interface/dstat_comm.py
index 56e0baa7125b6dc490798c942a462ddf4de82f73..2441081ca3a12e1116360714e8fa5ae608067490 100644
--- a/dstat_interface/dstat_comm.py
+++ b/dstat_interface/dstat_comm.py
@@ -608,24 +608,35 @@ class PDExp(Chronoamp):
self.xmin = 0
self.xmax = self.parameters['time']
- self.commands += "E"
- self.commands[2] += "R"
- self.commands[2] += "1"
- self.commands[2] += " "
+ if self.parameters['shutter']:
+ if self.parameters['sync']:
+ self.commands.append("EZ")
+ self.commands[-1] += str(self.parameters['sync_freq'])
+ self.commands[-1] += " "
+ else:
+ self.commands.append("E2")
+
+ self.commands.append("ER1 ")
if self.parameters['voltage'] == 0: # Special case where V=0
- self.commands[2] += "65535"
+ self.commands[-1] += "65535"
else:
- self.commands[2] += str(int(
+ self.commands[-1] += str(int(
65535-(self.parameters['voltage']*(65536./3000))))
- self.commands[2] += " "
- self.commands[2] += str(self.parameters['time'])
- self.commands[2] += " "
+ self.commands[-1] += " "
+ self.commands[-1] += str(self.parameters['time'])
+ self.commands[-1] += " "
if self.parameters['interlock']:
- self.commands[2] += "1"
+ self.commands[-1] += "1"
else:
- self.commands[2] += "0"
- self.commands[2] += " "
+ self.commands[-1] += "0"
+ self.commands[-1] += " "
+
+ if self.parameters['shutter']:
+ if self.parameters['sync']:
+ self.commands.append("Ez")
+ else:
+ self.commands.append("E1")
class PotExp(Experiment):
"""Potentiometry experiment"""
diff --git a/dstat_interface/interface/dstatinterface.glade b/dstat_interface/interface/dstatinterface.glade
index 8f2f2726ef8b78133edb4bbbd3629fc2f649add5..0368e00ce699ee8357ca286ee9c5669e47938a36 100644
--- a/dstat_interface/interface/dstatinterface.glade
+++ b/dstat_interface/interface/dstatinterface.glade
@@ -1008,6 +1008,7 @@ Thanks to Christian Fobel for help with Dropbot Plugin
False
diff --git a/dstat_interface/main.py b/dstat_interface/main.py
index 8822a4db8259731e15aaeaf8308a4cdc7046f16e..cf6f806d2fb8d276b34ecf55b43354243eeb9c00 100755
--- a/dstat_interface/main.py
+++ b/dstat_interface/main.py
@@ -77,6 +77,8 @@ class Main(object):
self.message_context_id = self.statusbar.get_context_id("message")
self.plotwindow = self.builder.get_object('plotbox')
+ self.ft_window = self.builder.get_object('ft_box')
+ self.period_window = self.builder.get_object('period_box')
self.exp_window = exp_window.Experiments(self.builder)
@@ -86,6 +88,8 @@ class Main(object):
self.autosavename = self.builder.get_object('autosavename')
self.plot = plot.plotbox(self.plotwindow)
+ self.ft_plot = plot.ft_box(self.ft_window)
+
#fill adc_pot_box
self.adc_pot_box = self.builder.get_object('gain_adc_box')
@@ -363,6 +367,8 @@ class Main(object):
""" Starts experiment """
self.plot.clearall()
self.plot.changetype(self.current_exp)
+ self.ft_plot.clearall()
+ self.ft_plot.changetype(self.current_exp)
comm.serial_instance.proc_pipe_p.send(self.current_exp)
@@ -404,6 +410,16 @@ class Main(object):
parameters['adc_rate'] = srate_model.get_value(
self.adc_pot.srate_combobox.get_active_iter(), 2) # third column
+
+ srate = srate_model.get_value(
+ self.adc_pot.srate_combobox.get_active_iter(), 1)
+
+ if srate.endswith("kHz"):
+ sample_rate = float(srate.rstrip(" kHz"))*1000
+ else:
+ sample_rate = float(srate.rstrip(" Hz"))
+
+ parameters['adc_rate_hz'] = sample_rate
parameters['adc_pga'] = pga_model.get_value(
self.adc_pot.pga_combobox.get_active_iter(), 2)
@@ -638,6 +654,11 @@ class Main(object):
if (parameters['time'] > 65535):
raise InputError(parameters['clean_s'],
"Time must fit in 16-bit counter.")
+ if (parameters['sync'] and parameters['shutter']):
+ if (parameters['sync_freq'] > 30 or
+ parameters['sync_freq'] <= 0):
+ raise InputError(parameters['sync_freq'],
+ "Frequency must be between 0 and 30 Hz.")
self.current_exp = comm.PDExp(parameters)
@@ -713,10 +734,10 @@ class Main(object):
try:
if comm.serial_instance.data_pipe_p.poll():
incoming = comm.serial_instance.data_pipe_p.recv()
- if isinstance(incoming, basestring): # Test if incoming is str
- self.experiment_done()
- self.on_serial_disconnect_clicked()
- return False
+ # if isinstance(incoming, basestring): # Test if incoming is str
+ # self.experiment_done()
+ # self.on_serial_disconnect_clicked()
+ # return False
self.line, data = incoming
if self.line > self.lastdataline:
@@ -729,6 +750,8 @@ class Main(object):
if len(data) > 2:
self.current_exp.data_extra[2*self.line+i].append(
data[i+2])
+ if comm.serial_instance.data_pipe_p.poll():
+ self.experiment_running_data()
return True
return True
@@ -799,6 +822,10 @@ class Main(object):
gobject.source_remove(self.experiment_proc[0])
gobject.source_remove(self.plot_proc) # stop automatic plot update
self.experiment_running_plot() # make sure all data updated on plot
+
+ if self.current_exp.parameters['sync']:
+ self.ft_plot.updateline(self.current_exp, 0)
+ self.ft_plot.redraw()
self.databuffer.set_text("")
self.databuffer.place_cursor(self.databuffer.get_start_iter())
diff --git a/dstat_interface/plot.py b/dstat_interface/plot.py
index 4002efc36fb30dbd480711a1f62b0a2886b83085..8b286fa497b9017587138632ef0998388fec7ea8 100644
--- a/dstat_interface/plot.py
+++ b/dstat_interface/plot.py
@@ -31,6 +31,27 @@ from matplotlib.backends.backend_gtkagg \
import FigureCanvasGTKAgg as FigureCanvas
from matplotlib.backends.backend_gtkagg \
import NavigationToolbar2GTKAgg as NavigationToolbar
+
+from numpy import sin, linspace, pi, mean
+from scipy import fft, arange
+from scipy.signal import blackman
+
+def plotSpectrum(y,Fs):
+ """
+ Plots a Single-Sided Amplitude Spectrum of y(t)
+ """
+ y = y-mean(y)
+ n = len(y) # length of the signal
+ k = arange(n)
+ T = n/Fs
+ frq = k/T # two sides frequency range
+ frq = frq[range(n/2)] # one side frequency range
+ W = blackman(n)
+ Y = fft(y*W)/n # fft computing and normalization
+ Y = abs(Y[range(n/2)])
+
+
+ return (frq, Y)
class plotbox(object):
"""Contains main data plot and associated methods."""
@@ -104,4 +125,21 @@ class plotbox(object):
self.figure.canvas.draw()
return True
+
+class ft_box(plotbox):
+ def updateline(self, Experiment, line_number):
+ x, y = plotSpectrum(Experiment.data[1+line_number*2], Experiment.parameters['adc_rate_hz'])
+ self.lines[line_number].set_ydata(y)
+ self.lines[line_number].set_xdata(x)
+
+ def changetype(self, Experiment):
+ """Change plot type. Set axis labels and x bounds to those stored
+ in the Experiment instance.
+ """
+ self.axe1.set_xlabel("Freq (Hz)")
+ self.axe1.set_ylabel("|Y| (A/Hz)")
+ self.axe1.set_xlim(0, Experiment.parameters['adc_rate_hz']/2)
+
+ self.figure.canvas.draw()
+