view omero_get_value.py @ 7:ec96412e9027 draft default tip

planemo upload for repository https://github.com/Helmholtz-UFZ/galaxy-tools/tree/main/tools/omero commit 6f47dff3775455a8c45d39a3863a2306cd942443
author ufz
date Tue, 08 Apr 2025 15:13:05 +0000
parents d0c0f3c95368
children
line wrap: on
line source

import argparse
import csv
import json
import os
import sys

import ezomero as ez
import pandas as pd


def get_object_ezo(user, pws, host, port, obj_type, ids, out_dir):
    # Function to write tabular file from the ezomero output
    def write_values_to_tsv(data, header):
        with open("output.tsv", 'w', newline='') as f:
            writer = csv.writer(f, delimiter='\t')
            writer.writerow([header])  # Write the header
            for item in data:
                writer.writerow([item])  # Write each value

    # Function to write tabular file from a dictionary ezomero output
    def write_dict_to_tsv(data, headers):
        with open("output.tsv", 'w', newline='') as f:
            writer = csv.writer(f, delimiter='\t')
            writer.writerow(headers)  # Write the headers
            for key, value in data.items():
                writer.writerow([key, value])  # Write each key-value pair

    # Function to write tabular file from list of list ezomero output
    def write_table_to_tsv(data, id):
        with open(f"./output/ID_{id}_table.tsv", 'w') as f:
            for row in data:
                f.write('\t'.join([str(val) for val in row]) + '\n')

    with ez.connect(user, pws, "", host, port, secure=True) as conn:
        if obj_type == "Annotation":
            ma_dict = {}
            for maid in ids:
                current_ma_dict = ez.get_map_annotation(conn, maid)
                ma_dict = {**ma_dict, **current_ma_dict}
                print(ma_dict)
            write_dict_to_tsv(ma_dict, ["Annotation ID", "Annotation Value"])
        elif obj_type == "Tag":
            tags = []
            for tag_id in ids:
                tags.append(ez.get_tag(conn, tag_id))
            # Sort the tags for consistency:
            tags.sort
            write_values_to_tsv(tags, "Tags")
        elif obj_type == "Table":
            for id in ids:
                table = ez.get_table(conn, id)
                print(table)
                write_table_to_tsv(table, id)
        elif obj_type == ("Attachment"):
            for id in ids:
                attch_path = ez.get_file_annotation(conn, id, folder_path='./output/')
                base_name = os.path.basename(attch_path)
                df = pd.read_csv(attch_path, sep='\t')
                df.to_csv(f"./output/ID_{id}_{base_name}", sep='\t', index=False)
                os.remove(attch_path)
        else:
            sys.exit(f"Unsupported object type: {filter}")


# Argument parsing
if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="Fetch and save data as TSV based on object type.")
    parser.add_argument("--credential-file", dest="credential_file", type=str,
                        required=True, help="Credential file (JSON file with username and password for OMERO)")
    parser.add_argument('--host', required=True,
                        help="Host server address.")
    parser.add_argument('--port', required=True, type=int,
                        help='OMERO port')
    parser.add_argument('--obj_type', required=True,
                        help="Type of object to fetch: Annotation, Table or Tag.")
    group = parser.add_mutually_exclusive_group()
    group.add_argument('--ids', nargs='+', type=int,
                       help="IDs of the OMERO objects.")
    group.add_argument('--ids_path',
                       help="File with IDs of the OMERO objects (one per line).")
    parser.add_argument('--out_dir', required=True,
                        help="Output path.")
    args = parser.parse_args()

    if args.ids_path:
        args.ids = []
        with open(args.ids_path, 'r') as f:
            for line in f:
                try:
                    args.ids.append(int(line))
                except ValueError:
                    print(f"{line.strip()} is not a valid ID.")
        if len(args.ids) == 0:
            raise ValueError("Cound not find a single ID in the file.")

    with open(args.credential_file, 'r') as f:
        crds = json.load(f)

    # Call the main function to get the object and save it as a TSV
    get_object_ezo(user=crds['username'], pws=crds['password'], host=args.host,
                   port=args.port,
                   obj_type=args.obj_type,
                   ids=args.ids,
                   out_dir=args.out_dir)