async def METHOD_NAME(
    api: OT3API,
    center: Point,
    action: str,
    axis: Axis,
    trials: int,
    max_error_pick_up: float,
    max_error_drop: float,
    step: float,
    drop_offset: float,
    force: float,
) -> List[float]:
    ui.print_title(f"{action.upper()}-{axis.name.upper()}")
    check_pick_up = action == "pick-up"
    check_drop = action == "drop"
    max_error = max_error_pick_up if check_pick_up else max_error_drop
    if axis == Axis.X:
        step_pnt = Point(x=step)
    else:
        step_pnt = Point(y=step)
    good_offsets = []
    for direction in [-1.0, 1.0]:
        offset = Point()
        while abs(offset.x) <= max_error and abs(offset.y) <= max_error:
            ui.print_header(
                f"{action.upper()}: X={round(offset.x, 2)}, Y={round(offset.y, 2)}"
            )
            result = False
            for t in range(trials):
                print(f"trial {t + 1}/{trials}")
                _get_ready("about to use gripper", api.is_simulator)
                picked_up = await _pick_up(
                    api=api,
                    center=center,
                    offset=offset if check_pick_up else Point(),
                    force=force,
                    check=check_pick_up,
                )
                if not picked_up:
                    dropped_off = False
                    await api.hold_jaw_width(UNGRIP_WIDTH)
                else:
                    if check_pick_up and axis == Axis.Y:
                        # if pick-up is off along X, we don't want to re-center for drop
                        offset_for_this_drop = Point()
                    else:
                        offset_for_this_drop = offset
                    dropped_off = await _drop(
                        api=api,
                        center=center,
                        offset=offset_for_this_drop + Point(z=drop_offset),
                        check=check_drop,
                    )
                result = picked_up if check_pick_up else dropped_off
                if not result:
                    await api.hold_jaw_width(UNGRIP_WIDTH)
                    await api.home([Axis.Z_G])
                    break
                elif t + 1 == trials:
                    good_offsets.append(offset.x if axis == Axis.X else offset.y)
            if not result and not ui.get_user_answer("test remaining offsets"):
                break
            offset += step_pnt * direction
    print(good_offsets)
    return good_offsets