def draw_average_heat_map_rel(image, coordinates_array, click_settings, time_stamps_array, upper, lower):
    """
    a function to draw a heatmap based on the
    :param upper:
    :param lower:
    :param image:
    :param coordinates_array:
    :param click_settings:
    :param time_stamps_array:
    :return:
    """

    click_settings.add_grad_radius_to_shape()

    max_width = image.shape[1]
    max_height = image.shape[0]

    heat_values_array = []

    for idx in range(len(coordinates_array)):

        heat_values = []
        for i in range(max_width * max_height):
            heat_values.append(0.0)

        coordinates = coordinates_array[idx]
        time_stamps = utils.get_element_or_none(time_stamps_array, idx)
        min_idx = 0
        max_idx = len(coordinates)

        if click_settings.use_rectangle:
            for i in range(min_idx, max_idx):
                time = get_time(i, time_stamps)
                fill_for_rectangle(heat_values, coordinates[i][0], coordinates[i][1], click_settings, max_width,
                                   max_height,
                                   time)
        elif click_settings.use_circle:
            for i in range(min_idx, max_idx):
                time = get_time(i, time_stamps)
                fill_for_circle(heat_values, coordinates[i][0], coordinates[i][1], click_settings, max_width,
                                max_height,
                                time)
        elif click_settings.use_ellipse:
            for i in range(min_idx, max_idx):
                time = get_time(i, time_stamps)
                fill_for_ellipse(heat_values, coordinates[i][0], coordinates[i][1], click_settings, max_width,
                                 max_height,
                                 time)

        heat_values_array.append(heat_values)

    final_heat = []
    for i in range(max_width * max_height):
        final_heat.append(0.0)

    for heat_values in heat_values_array:
        for i in range(max_width * max_height):
            final_heat[i] += heat_values[i]


    normalize_heat(final_heat)
    final_heat = [(lower <= heat <= upper) * heat for heat in final_heat]

    draw_heat(image, final_heat)

    click_settings.reset_grad_radius_to_shape()

    return final_heat
def draw_average_heat_map_abs(image, coordinates_array, click_settings, time_stamps_array, upper, lower):
    """
    a function to draw a heatmap based on the
    :param upper:
    :param lower:
    :param image:
    :param coordinates_array:
    :param click_settings:
    :param time_stamps_array:
    :return:
    """

    click_settings.add_grad_radius_to_shape()

    max_width = image.shape[1]
    max_height = image.shape[0]

    heat_values = []
    for i in range(max_width * max_height):
        heat_values.append(0.0)

    for idx in range(len(coordinates_array)):
        coordinates = coordinates_array[idx]
        time_stamps = utils.get_element_or_none(time_stamps_array, idx)
        min_idx = 0
        max_idx = len(coordinates)

        if click_settings.use_rectangle:
            for i in range(min_idx, max_idx):
                time = get_time(i, time_stamps)
                fill_for_rectangle(heat_values, coordinates[i][0], coordinates[i][1], click_settings, max_width,
                                   max_height,
                                   time)
        elif click_settings.use_circle:
            for i in range(min_idx, max_idx):
                time = get_time(i, time_stamps)
                fill_for_circle(heat_values, coordinates[i][0], coordinates[i][1], click_settings, max_width,
                                max_height,
                                time)
        elif click_settings.use_ellipse:
            for i in range(min_idx, max_idx):
                time = get_time(i, time_stamps)
                fill_for_ellipse(heat_values, coordinates[i][0], coordinates[i][1], click_settings, max_width,
                                 max_height,
                                 time)

    heat_values = np.array(heat_values)
    max = np.unique(np.sort(heat_values.flatten()))[-1]
    low = max * lower
    high = max * upper
    heat_values[heat_values < low] = 0.0
    heat_values[heat_values > high] = 0.0

    heat_values = heat_values.tolist()

    normalize_heat(heat_values)
    draw_heat(image, heat_values)

    click_settings.reset_grad_radius_to_shape()

    return heat_values