Skip to content
Snippets Groups Projects

Draft: WIP Positive/negative standard deviation refinement

Open Camilla Compton requested to merge camilla.compton/locklost:pos_neg_std into master
1 unresolved thread
Files
2
+ 24
26
@@ -9,7 +9,7 @@ from .. import data
##################################################
def plot_indicators(event, params, refined_gps=None, threshold=None):
def plot_indicators(event, channel, refined_gps, threshold):
"""Create graphs showing indicators of refined time.
"""
@@ -18,7 +18,7 @@ def plot_indicators(event, params, refined_gps=None, threshold=None):
channels = [
config.GRD_STATE_N_CHANNEL,
params['CHANNEL'],
channel,
]
window = config.REFINE_PLOT_WINDOWS['WIDE']
segment = Segment(*window).shift(t0)
@@ -43,7 +43,7 @@ def plot_indicators(event, params, refined_gps=None, threshold=None):
# plot indicator
color = 'blue'
label = params['CHANNEL']
label = channel
# filter data based on window
condition = np.logical_and(t0+window[0] <= t_ind, t_ind <= t0+window[1])
idx = np.argwhere(condition)
@@ -52,7 +52,7 @@ def plot_indicators(event, params, refined_gps=None, threshold=None):
ax1.plot(t-t0, y, label=label,
color=color, alpha=0.8, linewidth=2)
ax1.grid(True)
ax1.set_ylabel(params['CHANNEL'])
ax1.set_ylabel(channel)
ax1.yaxis.label.set_color(color)
ax1.set_xlabel('Time [s] since {}'.format(t0))
@@ -65,20 +65,14 @@ def plot_indicators(event, params, refined_gps=None, threshold=None):
linestyle='--',
linewidth=2,
)
if params['THRESHOLD'] > 0:
xyoffset = (8, 10)
valign = 'bottom'
else:
xyoffset = (8, -10)
+6
valign = 'top'
ax1.annotate(
"threshold",
xy=(ax1.get_xlim()[0], threshold),
xycoords='data',
xytext=xyoffset,
xytext=(8, -10),
textcoords='offset points',
horizontalalignment='left',
verticalalignment=valign,
verticalalignment='top',
bbox=dict(
boxstyle="round", fc="w", ec="green", alpha=0.95),
)
@@ -160,6 +154,7 @@ def find_transition(channel, segment, std_threshold, minimum=None):
"""
refined_gps = None
threshold = None
buf = data.fetch(channel, segment)[0]
# calculate mean and std using first 5 seconds of window
@@ -170,27 +165,30 @@ def find_transition(channel, segment, std_threshold, minimum=None):
logging.info("locked mean/stddev: {}/{}".format(lock_mean, lock_stdd))
# lock loss threshold is when moves past % threshold of std
threshold = lock_stdd * std_threshold + lock_mean
if std_threshold > 0:
threshold = min(threshold, max(buf.data))
else:
threshold = max(threshold, min(buf.data))
logging.info("threshold: {}".format(threshold))
upper_threshold = lock_stdd * abs(std_threshold) + lock_mean
lower_threshold = lock_stdd * -abs(std_threshold) + lock_mean
# if the mean is less than the nominal full lock value then abort,
# as this isn't a clean lock
if minimum and lock_mean < minimum:
logging.info("channel mean below minimum, unable to resolve time")
# look for positive and negative threshold crossings, add them to a list,
# then choose the first crossing if one exists
else:
if std_threshold > 0:
inds = np.where(buf.data > threshold)[0]
else:
inds = np.where(buf.data < threshold)[0]
if inds.any():
ind = np.min(inds)
inds_above = np.where(buf.data > upper_threshold)[0]
inds_below = np.where(buf.data < lower_threshold)[0]
thresh_crossing_list = []
if inds_above.any():
thresh_crossing_list.append([np.min(inds_above), upper_threshold])
if inds_below.any():
thresh_crossing_list.append([np.min(inds_below), lower_threshold])
if len(thresh_crossing_list) > 0:
thresh_crossing_list.sort()
ind = thresh_crossing_list[0][0]
threshold = thresh_crossing_list[0][1]
refined_gps = buf.tarray[ind]
logging.info("threshold: {}".format(threshold))
logging.info("refined time: {}".format(refined_gps))
else:
logging.info("no threshold crossings, unable to resolve time")
@@ -234,7 +232,7 @@ def refine_time(event):
logging.info("plotting indicators...")
plot_indicators(
event,
params,
params['CHANNEL'],
refined_gps=refined_gps,
threshold=threshold,
)
Loading