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
+ 27
19
@@ -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,7 +65,7 @@ def plot_indicators(event, params, refined_gps=None, threshold=None):
linestyle='--',
linewidth=2,
)
if params['THRESHOLD'] > 0:
if y_ind[0] < threshold:
xyoffset = (8, 10)
valign = 'bottom'
else:
@@ -159,6 +159,7 @@ def find_transition(channel, segment, std_threshold, minimum=None):
returns `threshold`, `refined_gps` tuple
"""
threshold = None
refined_gps = None
buf = data.fetch(channel, segment)[0]
@@ -170,31 +171,38 @@ 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")
# add a threshold to be diplayed on graphs if refinement failed
if threshold is None:
threshold = lower_threshold
return threshold, refined_gps
@@ -234,7 +242,7 @@ def refine_time(event):
logging.info("plotting indicators...")
plot_indicators(
event,
params,
params['CHANNEL'],
refined_gps=refined_gps,
threshold=threshold,
)
Loading