Ejemplo n.º 1
0
def batch(recon_root, proc_recon_root, csv_path):
    """
    Script to automatically generate crops, scled images and compressed files
    :param recon_list:
    :param mount:
    :return:
    """

    with open(csv_path, 'r') as fh:
        recon_list = [row[0] for row in csv.reader(fh)]

    app = AppData()
    auto = Autofill(None)
    update = FakeUpdate()

    for recon_id in recon_list:

        stage = get_stage(recon_id)
        proc_recon_path = join(proc_recon_root, recon_id)
        cropped_dir = join(proc_recon_path, 'cropped')

        if not isdir(cropped_dir):
            mkdir(cropped_dir)

        scaled_dir = join(proc_recon_path, 'scaled_stacks')
        metadata_dir = join(proc_recon_path, 'Metadata')

        recon_id = get_input_id(join(metadata_dir, 'config4user.log'))
        recon_path = join(recon_root, recon_id)

        # Performing cropping if directory does not exist or is empty
        if len(listdir(cropped_dir)) == 0:

            fake_config = lambda: None
            fake_config.meta_path = metadata_dir
            fake_config.value = 0

            cropper = Crop(recon_path,
                           cropped_dir,
                           update.emit,
                           fake_config,
                           fake_config,
                           app,
                           def_crop=None,
                           repeat_crop=None)
            img_list = cropper.run(auto=True)

        else:
            img_list = app.getfilelist(cropped_dir)

        # Get recon log and pixel size
        log_paths = [f for f in listdir(cropped_dir) if f.endswith("_rec.log")]
        if len(log_paths) < 1:
            print('Cannot find log in cropped directory')
            continue
        log = join(cropped_dir, log_paths[0])

        with open(log, 'rb') as log_file:
            original_pixel_size = float(auto.get_pixel(stage, log_file))

        # Scaling
        if not isdir(scaled_dir):
            mkdir(scaled_dir)

        for scale in SCALING[stage]:

            scale_by_int = False
            if type(scale) is int:
                sf = scale
                new_pixel_size = original_pixel_size * float(scale)
                scale_by_int = True

            else:
                sf = float(scale) / float(original_pixel_size)
                new_pixel_size = sf * original_pixel_size

            out_name = join(
                scaled_dir, '{}_scaled_{:.4f}_pixel_{:.2f}.{}'.format(
                    recon_id, sf, new_pixel_size, ext))

            if scaled_stack_exists(scaled_dir, sf, new_pixel_size):
                continue

            resample(img_list, sf, out_name, scale_by_int, update)

        # Compression
        bz2_file = join(proc_recon_path,
                        'IMPC_cropped_{}.nrrd'.format(recon_id))
        if not isfile(bz2_file + '.bz2'):

            print "Generating missing bz2 file for '{}'".format(recon_id)
            try:
                bz2_nnrd(img_list, bz2_file, 'Compressing cropped recon',
                         update)
            except IOError as e:
                print(
                    'Failed to write the compressed bzp2 file. Network issues?\n{}'
                    .format(e))