Skip to content
Snippets Groups Projects
extract_from_platybrowser.py 4.08 KiB
Newer Older
import argparse
import os
import pandas as pd
from scripts.export.extract_subvolume import make_cutout, get_res_level, parse_coordinate, name_to_path
def get_bounding_box(tag, lower, upper, table_name, table_id):

    # validate the inputs
    have_coordinates = lower and upper
    have_table = table_name and table_id is not None

    assert have_coordinates != have_table, "Need one of coordinates or table"
    if have_coordinates:
        print("Converting coordinates from physical coordinates %s:%s" % (lower,
                                                                          upper))
        bb_start = parse_coordinate(lower)
        bb_stop = parse_coordinate(upper)
        print("to pixel coordinates %s:%s" % (str(bb_start),
                                              str(bb_stop)))
    else:
        name = os.path.splitext(os.path.split(name_to_path(table_name))[1])[0]
        table_path = os.path.join('data', tag, 'tables', name, 'base.csv')
        assert os.path.exists(table_path), "Could not find table for %s at %s" % (table_name,
                                                                                  table_path)
        table = pd.read_csv(table_path, sep='\t')
        sub_table = table.loc[table['label_id'] == table_id]
        assert sub_table.shape[0] == 1
        for row in sub_table.itertuples(index=False):
            bb_start = [row.bb_min_x, row.bb_min_y, row.bb_min_z]
            bb_stop = [row.bb_max_x, row.bb_max_y, row.bb_max_z]
        print("Read bounding box from table %s for id %i:" % (table_name, table_id))
        print(bb_start, ":", bb_stop)
    return bb_start, bb_stop


# TODO
# - expose out_format as argument
# - saving multiple names in one go currently only works for h5 and n5, fix this!
if __name__ == '__main__':
    levels = get_res_level()
    res_string = " ".join("%i: %s" % (lev, res) for lev, res in enumerate(levels))
    scale_help = ("The resolution level for the cutout."
                  "The levels range from 0 to 6 with resolutions in micrometer: "
                  "%s" % res_string)

    parser = argparse.ArgumentParser("Make a cutout from the platynereis EM data-set.")
    # Mandatory arguments: which tag and scale
    parser.add_argument("tag", type=str, help="Version tag of the data to extract from")
    parser.add_argument("scale_level", type=int, help=scale_help)

    # Optional: data names
    parser.add_argument("--names", type=str, nargs='+', default=['raw'],
                        help=("Names of the data to be extracted.\
                              Choose from 'raw', 'cells', 'nuclei', 'chromatin', 'cilia'"))

    # Optional: select bounding box from platy browser coordinates
    parser.add_argument("--lower_corner", type=str, default='',
                        help="Lower corner of the bounding box to cut out",)
    parser.add_argument("--upper_corner", type=str, default='',
                        help="Upper corner of the bounding box to cut out")

    # Optional: Select bounding box from table and id
    parser.add_argument('--table_name', type=str, default='',
                        help="Table from where to read the bounding box, can be from the same option as names")
    parser.add_argument('--table_id', type=int, default=None,
                        help="Id for bounding box")

    # Optional: select where to save the data
    parser.add_argument("--save_file", type=str, help="Where to save the cutout.",
                        default='')
    args = parser.parse_args()

    # 1.) validate the tag
    tag = args.tag
    folder = os.path.join('data', tag)
    assert os.path.exists(folder), "Invalid tag %s" % tag

    # 2.) figure out the bounding box
    lower = args.lower_corner
    upper = args.upper_corner
    table_name = args.table_name
    table_id = args.table_id
    bb_start, bb_stop = get_bounding_box(tag, lower, upper, table_name, table_id)

    # 3.) extract data for all names
    names = args.names
    save_file = args.save_file
    scale = args.scale_level
    for name in names:
        print("Extracting data for %s" % name)
        make_cutout(tag, name, scale, bb_start, bb_stop, save_file)