Files
dev/script/scans/PhaseScan.py
2018-01-19 10:56:53 +01:00

43 lines
1.3 KiB
Python
Executable File

from mathutils import *
from plotutils import *
if is_ui():
start = 0.0
end = 360.0
step = 10.0
plt = plot(None, title="Harmonic Fit")[0]
#Plot setup
plt.clear()
plt.removeMarker(None)
plt.addSeries(LinePlotSeries("data", color = Color.RED))
plt.setLegendVisible(True)
plt.getAxis(plt.AxisId.X).setRange(start, end)
#Creating an averager of the BPM
avg = create_averager(bpm_x, 3, 0.100)
#The scan command
def after(rec, scan):
plt.getSeries(0).appendData(rec.positions[0], rec.values[0].mean)
r = lscan(phase, [avg], start, end, step, latency=0.2, after_read=after)
#Fitting
rf_phase = r.getPositions(0)
energy = [val.mean for val in r.getReadable(0)]
(fit_ampl, fit_freq, fit_phase) = fit_harmonic(energy, rf_phase)
ph_crest = round(-fit_phase / fit_freq, 3)
function = HarmonicOscillator(fit_ampl, fit_freq, fit_phase)
x = frange(min(rf_phase), max(rf_phase), 4.0, True, True)
plot_function(plt, function, "fit", x, show_points=False, color=Color.BLUE)
plt.addMarker(ph_crest, None, "ph_crest="+str(ph_crest), Color.MAGENTA)
#Return values
print "ph_crest = ", ph_crest
phase.write(ph_crest)
phase_offset = round(90.0 - ph_crest, 3)
amplitude_scale = round(fit_ampl / amplitude.read(), 3)
power_scale = round(power.read() / math.pow(fit_ampl,2), 3)
set_return([phase_offset, amplitude_scale,power_scale ])