def plot_example(missed, acknowledged):
    sensor_miss = import_sensorfile(missed)
    sensor_ack = import_sensorfile(acknowledged)

    # Window data
    mag_miss = window_data(process_input(sensor_miss))
    mag_ack = window_data(process_input(sensor_ack))

    # Window data
    mag_miss = window_data(process_input(sensor_miss))
    mag_ack = window_data(process_input(sensor_ack))

    # Filter setup
    kernel = 15

    # apply filter
    mag_miss_filter = sci.medfilt(mag_miss, kernel)
    mag_ack_filter = sci.medfilt(mag_ack, kernel)

    # calibrate data
    mag_miss_cal = mf.calibrate_median(mag_miss)
    mag_miss_cal_filter = mf.calibrate_median(mag_miss_filter)

    mag_ack_cal = mf.calibrate_median(mag_ack)
    mag_ack_cal_filter = mf.calibrate_median(mag_ack_filter)

    # PLOT
    sns.set_style("white")
    current_palette = sns.color_palette('muted')
    sns.set_palette(current_palette)

    plt.figure(0)

    # Plot RAW missed and acknowledged reminders
    ax1 = plt.subplot2grid((2, 1), (0, 0))
    plt.ylim([-1.5, 1.5])
    plt.ylabel('Acceleration (g)')
    plt.plot(mag_miss_cal, label='Recording 1')
    plt.legend(loc='lower left')

    ax2 = plt.subplot2grid((2, 1), (1, 0))
    # Plot Missed Reminder RAW
    plt.ylim([-1.5, 1.5])
    plt.ylabel('Acceleration (g)')
    plt.xlabel('t (ms)')
    plt.plot(mag_ack_cal, linestyle='-', label='Recording 2')
    plt.legend(loc='lower left')

    # CALC AND SAVE STATS
    stats_one = sp.calc_stats_for_data_stream_as_dictionary(mag_miss_cal)
    stats_two = sp.calc_stats_for_data_stream_as_dictionary(mag_ack_cal)

    data = [stats_one, stats_two]
    write_to_csv(data, 'example_waves')

    plt.show()
def plot_singlewave(file):
    sensor = import_sensorfile(file)
    sensor_processed = process_input(sensor)
    timestamps = []
    [timestamps.append(str(item[0])) for item in sensor]

    sensor_processed_calibrated = mf.calibrate_median(sensor_processed)
    sensor_filtered = mf.medfilt(sensor_processed_calibrated, 3)

    plt.plot(sensor_filtered, linewidth='0.8')
    plt.xlim([0, 12000])
    plt.ylim([-5, 5])
    plt.ylabel('Acceleration (g)')
    plt.xlabel('Time (ms)')
    # plt.xticks(sensor_filtered, timestamps, rotation='vertical')
    plt.show()
def process_triaxial(file_path, window_start_time, window_end_time):
    with open(file_path) as csv_sensorfile:

        # dictionary to hold features
        features = {}

        sensorfile = csv.reader(csv_sensorfile, delimiter=',', quotechar='|')
        sensor_rows = []

        for row in sensorfile:
            # the correct format has 4 elements (avoids header and footer rows)
            if len(row) == 4:
                try:
                    timestamp = int(row[0])
                    x = float(row[1])
                    y = float(row[2])
                    z = float(row[3])
                    sensor_rows.append([timestamp, x, y, z])
                except ValueError:
                    continue

        # if no data exists generate empty stats
        # otherwise calculate stats
        if not sensor_rows:
            features = produce_empty_triaxial_sensor_dict(features)
        else:
            # convert basic python lists to numPy arrays using slices
            sensor_rows = np.array(sensor_rows)
            # convert to list for sorting algorithm
            timestamps = sensor_rows[:, 0].tolist()

            # calculate window indexes
            window_indexes = calculate_window_indexes(timestamps, window_start_time, window_end_time)
            window_start_index = window_indexes[0]
            window_end_index = window_indexes[1]
            # validate window indexes
            window_indexes_valid = window_index_conditions_valid(window_start_index, window_end_index)

            # if valid, window the data, and calculate stats
            if window_indexes_valid:
                # make slices of data using indexes
                x_win = sensor_rows[window_start_index:window_end_index, 1]
                y_win = sensor_rows[window_start_index:window_end_index, 2]
                z_win = sensor_rows[window_start_index:window_end_index, 3]
                svm_win = get_magnitude(x_win, y_win, z_win)

                # Pass through a median filter first using kernel of 21
                kernel = 15  # must be an odd number
                x_median_filter = mf.medfilt(x_win, kernel)
                y_median_filter = mf.medfilt(y_win, kernel)
                z_median_filter = mf.medfilt(z_win, kernel)
                svm_median_filter = mf.medfilt(svm_win, kernel)

                # Calibrate filtered SVM using min & median values
                svm_median_filter_calibrated_min = mf.calibrate_minimum(svm_median_filter)
                svm_median_filter_calibrated_med = mf.calibrate_median(svm_median_filter)

                # calculate stats
                stats_x = calc_stats_for_data_stream_as_dictionary(x_win)
                stats_y = calc_stats_for_data_stream_as_dictionary(y_win)
                stats_z = calc_stats_for_data_stream_as_dictionary(z_win)
                stats_svm = calc_stats_for_data_stream_as_dictionary(svm_win)
                stats_x_median_filter = calc_stats_for_data_stream_as_dictionary(x_median_filter)
                stats_y_median_filter = calc_stats_for_data_stream_as_dictionary(y_median_filter)
                stats_z_median_filter = calc_stats_for_data_stream_as_dictionary(z_median_filter)
                stats_svm_median_filter = calc_stats_for_data_stream_as_dictionary(svm_median_filter)
                stats_svm_median_filter_calibrated_min = calc_stats_for_data_stream_as_dictionary(
                        svm_median_filter_calibrated_min)
                stats_svm_median_filter_calibrated_med = calc_stats_for_data_stream_as_dictionary(
                        svm_median_filter_calibrated_med)

                features.update({'x': stats_x,
                                 'y': stats_y,
                                 'z': stats_z,
                                 'svm': stats_svm,
                                 'x_median_filter': stats_x_median_filter,
                                 'y_median_filter': stats_y_median_filter,
                                 'z_median_filter': stats_z_median_filter,
                                 'svm_median_filter': stats_svm_median_filter,
                                 'svm_median_filter_calibrated_min': stats_svm_median_filter_calibrated_min,
                                 'svm_median_filter_calibrated_med': stats_svm_median_filter_calibrated_med
                                 })
            else:
                features = produce_empty_triaxial_sensor_dict(features)

        return features
def process_triaxial(file_path, window_start_time, window_end_time):
    with open(file_path) as csv_sensorfile:

        # dictionary to hold features
        features = {}

        sensorfile = csv.reader(csv_sensorfile, delimiter=',', quotechar='|')
        sensor_rows = []

        for row in sensorfile:
            # the correct format has 4 elements (avoids header and footer rows)
            if len(row) == 4:
                try:
                    timestamp = int(row[0])
                    x = float(row[1])
                    y = float(row[2])
                    z = float(row[3])
                    sensor_rows.append([timestamp, x, y, z])
                except ValueError:
                    continue

        # if no data exists generate empty stats
        # otherwise calculate stats
        if not sensor_rows:
            features = produce_empty_triaxial_sensor_dict(features)
        else:
            # convert basic python lists to numPy arrays using slices
            sensor_rows = np.array(sensor_rows)
            # convert to list for sorting algorithm
            timestamps = sensor_rows[:, 0].tolist()

            # calculate window indexes
            window_indexes = calculate_window_indexes(timestamps,
                                                      window_start_time,
                                                      window_end_time)
            window_start_index = window_indexes[0]
            window_end_index = window_indexes[1]
            # validate window indexes
            window_indexes_valid = window_index_conditions_valid(
                window_start_index, window_end_index)

            # if valid, window the data, and calculate stats
            if window_indexes_valid:
                # make slices of data using indexes
                x_win = sensor_rows[window_start_index:window_end_index, 1]
                y_win = sensor_rows[window_start_index:window_end_index, 2]
                z_win = sensor_rows[window_start_index:window_end_index, 3]
                svm_win = get_magnitude(x_win, y_win, z_win)

                # Pass through a median filter first using kernel of 21
                kernel = 15  # must be an odd number
                x_median_filter = mf.medfilt(x_win, kernel)
                y_median_filter = mf.medfilt(y_win, kernel)
                z_median_filter = mf.medfilt(z_win, kernel)
                svm_median_filter = mf.medfilt(svm_win, kernel)

                # Calibrate filtered SVM using min & median values
                svm_median_filter_calibrated_min = mf.calibrate_minimum(
                    svm_median_filter)
                svm_median_filter_calibrated_med = mf.calibrate_median(
                    svm_median_filter)

                # calculate stats
                stats_x = calc_stats_for_data_stream_as_dictionary(x_win)
                stats_y = calc_stats_for_data_stream_as_dictionary(y_win)
                stats_z = calc_stats_for_data_stream_as_dictionary(z_win)
                stats_svm = calc_stats_for_data_stream_as_dictionary(svm_win)
                stats_x_median_filter = calc_stats_for_data_stream_as_dictionary(
                    x_median_filter)
                stats_y_median_filter = calc_stats_for_data_stream_as_dictionary(
                    y_median_filter)
                stats_z_median_filter = calc_stats_for_data_stream_as_dictionary(
                    z_median_filter)
                stats_svm_median_filter = calc_stats_for_data_stream_as_dictionary(
                    svm_median_filter)
                stats_svm_median_filter_calibrated_min = calc_stats_for_data_stream_as_dictionary(
                    svm_median_filter_calibrated_min)
                stats_svm_median_filter_calibrated_med = calc_stats_for_data_stream_as_dictionary(
                    svm_median_filter_calibrated_med)

                features.update({
                    'x':
                    stats_x,
                    'y':
                    stats_y,
                    'z':
                    stats_z,
                    'svm':
                    stats_svm,
                    'x_median_filter':
                    stats_x_median_filter,
                    'y_median_filter':
                    stats_y_median_filter,
                    'z_median_filter':
                    stats_z_median_filter,
                    'svm_median_filter':
                    stats_svm_median_filter,
                    'svm_median_filter_calibrated_min':
                    stats_svm_median_filter_calibrated_min,
                    'svm_median_filter_calibrated_med':
                    stats_svm_median_filter_calibrated_med
                })
            else:
                features = produce_empty_triaxial_sensor_dict(features)

        return features
def plot_kernal_length_experiment(missed, acknowledged):
    sensor_miss = import_sensorfile(missed)
    sensor_ack = import_sensorfile(acknowledged)

    # Window data
    mag_miss = window_data(process_input(sensor_miss))
    mag_ack = window_data(process_input(sensor_ack))

    # Filter setup

    difference = []
    stats_output = []
    for num in range(3, 63):
        # check if odd
        if num % 2 != 0:
            kernel = num

            # apply filter
            mag_miss_filter = sci.medfilt(mag_miss, kernel)
            mag_ack_filter = sci.medfilt(mag_ack, kernel)

            # calibrate data
            mag_miss_cal = mf.calibrate_median(mag_miss)
            mag_miss_cal_filter = mf.calibrate_median(mag_miss_filter)

            mag_ack_cal = mf.calibrate_median(mag_ack)
            mag_ack_cal_filter = mf.calibrate_median(mag_ack_filter)

            # STATS
            # Calculate the stats for raw and windowed for each
            stats_miss = sp.calc_stats_for_data_stream_as_dictionary(mag_miss_cal)
            stats_miss_filter = sp.calc_stats_for_data_stream_as_dictionary(mag_miss_cal_filter)

            stats_ack = sp.calc_stats_for_data_stream_as_dictionary(mag_ack_cal)
            stats_ack_filter = sp.calc_stats_for_data_stream_as_dictionary(mag_ack_cal_filter)
            stats_data = [stats_miss, stats_miss_filter, stats_ack, stats_ack_filter]

            [data.pop("med", None) for data in stats_data]

            print('Stats Missed:' + str(stats_miss))
            print('Stats Acknowledged: ' + str(stats_ack))
            print('Stats Missed Filtered: ' + str(stats_miss_filter))
            print('Stats Acknowledged Filtered:' + str(stats_ack_filter))

            # Calculate the percentage difference between the values
            dif_stats_raw = calculate_difference(stats_miss, stats_ack)
            dif_stats_filtered = calculate_difference(stats_miss_filter, stats_ack_filter)

            print('Difference in RAW as percentage:' + str(dif_stats_raw))
            print('Difference in FILTERED as percentage:' + str(dif_stats_filtered))

            dif_stats_raw_overall = calcualate_meanfordictionary(dif_stats_raw)
            dif_stats_filtered_overall = calcualate_meanfordictionary(dif_stats_filtered)

            print('Avg. Difference RAW:  ' + str(dif_stats_raw_overall))
            print('Avg. Difference Filtered:  ' + str(dif_stats_filtered_overall))

            difference.append((kernel, dif_stats_filtered_overall))

            if kernel == 15:
                stats_output.append(stats_miss)
                stats_output.append(stats_ack)
                stats_output.append(stats_miss_filter)
                stats_output.append(stats_ack_filter)
                stats_output.append(dif_stats_raw)
                stats_output.append(dif_stats_filtered)
                write_to_csv(stats_output)

    x_val = [x[0] for x in difference]
    y_val = [x[1] for x in difference]
    xticks = [str(x) for x in x_val]

    base_val = [54] * 63

    plt.xticks(x_val, xticks)
    plt.xlabel('Window Length (k)')
    plt.ylabel('Percentage Difference (%)')
    plt.ylim([40, 140])
    plt.plot(x_val, y_val, label='Median Filter')

    plt.plot(base_val, linestyle='--', label='Baseline (Unfiltered)')
    plt.legend(loc='lower right')

    plt.show()
def plot_against(missed, acknowledged):
    sensor_miss = import_sensorfile(missed)
    sensor_ack = import_sensorfile(acknowledged)

    # Window data
    mag_miss = window_data(process_input(sensor_miss))
    mag_ack = window_data(process_input(sensor_ack))

    # Filter setup
    kernel = 15

    # apply filter
    mag_miss_filter = sci.medfilt(mag_miss, kernel)
    mag_ack_filter = sci.medfilt(mag_ack, kernel)

    # calibrate data
    mag_miss_cal = mf.calibrate_median(mag_miss)
    mag_miss_cal_filter = mf.calibrate_median(mag_miss_filter)

    mag_ack_cal = mf.calibrate_median(mag_ack)
    mag_ack_cal_filter = mf.calibrate_median(mag_ack_filter)

    # PLOT
    ylimit_top = [-5, 10]
    ylimits_filtered = [-4, 4]
    ylimits_filtered_bottom = [-1.5, 1.5]

    sns.set_style("darkgrid")
    current_palette = sns.color_palette('muted')
    sns.set_palette(current_palette)

    plt.figure(0)
    # Plot RAW missed and acknowledged reminders
    ax1 = plt.subplot2grid((4, 2), (0, 0), colspan=2)
    plt.ylim(ylimit_top)
    raw_miss = plt.plot(mag_miss_cal, label='Missed  (Unfiltered)')
    raw_ack = plt.plot(mag_ack_cal, label='Acknowledged (Unfiltered)')
    plt.legend(loc='upper left')

    ax2 = plt.subplot2grid((4, 2), (1, 0))
    # Plot Missed Reminder RAW
    plt.ylim(ylimits_filtered)
    plt.plot(mag_miss_cal, linestyle='-', label='Unfiltered')
    plt.legend(loc='lower left')

    ax3 = plt.subplot2grid((4, 2), (1, 1))
    # Plot Acknow Reminder RAW
    plt.ylim(ylimits_filtered)
    plt.plot(mag_ack_cal, linestyle='-', label='Unfiltered')
    plt.legend(loc='lower left')

    ax4 = plt.subplot2grid((4, 2), (2, 0))
    # Plot Missed Reminder Filter
    plt.ylim(ylimits_filtered)
    plt.plot(mag_miss_cal, linestyle=':', label='Unfiltered')
    plt.plot(mag_miss_cal_filter, linestyle='-', label='Median Filter (k=' + str(kernel) + ')')
    plt.legend(loc='lower left')

    ax5 = plt.subplot2grid((4, 2), (2, 1))
    # Plot Acknow Reminder Filter
    plt.ylim(ylimits_filtered)
    plt.plot(mag_ack_cal, linestyle=':', label='Unfiltered')
    plt.plot(mag_ack_cal_filter, linestyle='-', label='Median Filter (k=' + str(kernel) + ')')
    plt.legend(loc='lower left')

    ax6 = plt.subplot2grid((4, 2), (3, 0), colspan=2)
    plt.ylim(ylimits_filtered_bottom)
    plt.style.use('grayscale')
    plt.plot(mag_miss_cal_filter, label='Missed (Filtered)')
    plt.plot(mag_ack_cal_filter, label='Acknowledged (Filtered)')
    plt.legend(loc='lower left')
    plt.suptitle("Applying Filters to Signals")
    plt.show()