# HG changeset patch # User ufz # Date 1723035259 0 # Node ID 352e9d4eaf7049367d1845e30e9a7c026c03075f planemo upload for repository https://github.com/Helmholtz-UFZ/galaxy-tools/tree/main/tools/omero commit b9d952c8874f75f738ca4121d7e5274a7946035a diff -r 000000000000 -r 352e9d4eaf70 README.md --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/README.md Wed Aug 07 12:54:19 2024 +0000 @@ -0,0 +1,19 @@ +# OMERO import images + +## Set up user credentials on Galaxy to connect to other omero instance + +To enable users to set their credentials for this tool, +make sure the file `config/user_preferences_extra.yml` has the following section: + +``` + omero_account: + description: Your OMERO instance connection credentials + inputs: + - name: username + label: Username + type: text + required: False + - name: password + label: Password + type: password + required: False \ No newline at end of file diff -r 000000000000 -r 352e9d4eaf70 omero_metadata_import.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omero_metadata_import.xml Wed Aug 07 12:54:19 2024 +0000 @@ -0,0 +1,147 @@ + + with ezomero + + 5.18.0 + 0 + + + omero + + + ezomero + pandas + openjdk + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Description +----------- + +Tool to import metadata (Table and K/V pairs) into user defined OMERO.server. +Metadata can be attached to an existing OMERO object (Project, Dataset, Screen, or Image). +Optionally, a new OMERO object can be created before uploading the metadata. +If the object does not exist, a new one will be created. + +**Tabular metadata file example** + +- Table + + +------------+---------------+---------------+ + | image_id | attribute_1 | attribute_2 | + +============+===============+===============+ + | 235 | 0 | 1 | + +------------+---------------+---------------+ + | 564 | 1 | 1 | + +------------+---------------+---------------+ + | 120 | 0 | 1 | + +------------+---------------+---------------+ + +- Key-Value Pairs + + +--------+---------+----------+ + | Key1 | Key2 | Key3 | + +========+=========+==========+ + | Value1 | Value2 | Value3 | + +--------+---------+----------+ + + + 10.1038/nmeth.1896 + + diff -r 000000000000 -r 352e9d4eaf70 omero_metadata_upload.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omero_metadata_upload.py Wed Aug 07 12:54:19 2024 +0000 @@ -0,0 +1,92 @@ +import argparse +from datetime import datetime + +import ezomero as ez +import pandas as pd + + +def metadata_import_ezo(user, pws, host, port, obj_type, did=None, ann_type="table", ann_file=None, an_name=None, + log_file='metadata_import_log.txt'): + def upload_metadata(conn, obj_type, did, data_dict, df, ann_type, an_name): + try: + if ann_type == "KV": + id_map_ann = ez.post_map_annotation(conn, obj_type, object_id=int(did), kv_dict=data_dict, ns=an_name) + ma_dict = ez.get_map_annotation(conn, id_map_ann) + return ma_dict + elif ann_type == "table": + id_tb_ann = ez.post_table(conn, df, object_type=obj_type, object_id=int(did), title=an_name, + headers=True) + tb_dict = ez.get_table(conn, id_tb_ann) + return tb_dict + except Exception as e: + log_error(f"Error uploading metadata for {obj_type} with ID {did}: {str(e)}") + return None + + def log_error(message): + with open(log_file, 'w') as f: + f.write(f"ERROR: {message}\n") + + def log_success(message): + with open(log_file, 'w') as f: + f.write(f"SUCCESS: {message}\n") + + try: + df = pd.read_csv(ann_file, delimiter='\t') + except FileNotFoundError as e: + log_error(f"Annotation file not found: {str(e)}") + return + + if ann_type == "table": + data_dict = df.to_dict(orient='records') + elif ann_type == "KV": + data_dict = {col: df[col].iloc[0] for col in df.columns} + + try: + with ez.connect(user, pws, "", host, port, secure=True) as conn: + if obj_type == "project": + if did is None: + did = ez.post_project(conn, project_name=str(datetime.now())) + result = upload_metadata(conn, "Project", did, data_dict, df, ann_type, an_name) + elif obj_type == "screen": + if did is None: + did = ez.post_screen(conn, screen_name=str(datetime.now())) + result = upload_metadata(conn, "Screen", did, data_dict, df, ann_type, an_name) + elif obj_type == "dataset": + if did is None: + did = ez.post_dataset(conn, dataset_name=str(datetime.now())) + result = upload_metadata(conn, "Dataset", did, data_dict, df, ann_type, an_name) + elif obj_type == "image": + result = upload_metadata(conn, "Image", did, data_dict, df, ann_type, an_name) + else: + raise ValueError("Unsupported object type provided: {}".format(obj_type)) + + if result is not None: + log_success(f"Successfully uploaded metadata for {obj_type} with ID {did}. Result: {result}") + else: + log_error(f"Failed to upload metadata for {obj_type} with ID {did}.") + + conn.close() + + except Exception as e: + log_error(f"Connection error: {str(e)}") + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description='Import metadata into OMERO.') + parser.add_argument('--user', required=True, help='OMERO username') + parser.add_argument('--pws', required=True, help='OMERO password') + parser.add_argument('--host', required=True, help='OMERO host') + parser.add_argument('--port', required=True, type=int, help='OMERO port') + parser.add_argument('--obj_type', required=True, choices=['project', 'screen', 'dataset', 'image'], + help='Type of OMERO object') + parser.add_argument('--did', type=int, help='ID of the object (if it exists)') + parser.add_argument('--ann_type', required=True, choices=['table', 'KV'], help='Annotation type') + parser.add_argument('--ann_file', required=True, help='Path to the annotation file') + parser.add_argument('--an_name', required=True, help='Namespace or title for the annotation') + parser.add_argument('--log_file', default='metadata_import_log.txt', help='Path to the log file') + + args = parser.parse_args() + + metadata_import_ezo(user=args.user, pws=args.pws, host=args.host, port=args.port, + obj_type=args.obj_type, did=args.did, ann_type=args.ann_type, + ann_file=args.ann_file, an_name=args.an_name, log_file=args.log_file) diff -r 000000000000 -r 352e9d4eaf70 test-data/input1.tif Binary file test-data/input1.tif has changed diff -r 000000000000 -r 352e9d4eaf70 test-data/input2.tif Binary file test-data/input2.tif has changed diff -r 000000000000 -r 352e9d4eaf70 test-data/metadata.tsv --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test-data/metadata.tsv Wed Aug 07 12:54:19 2024 +0000 @@ -0,0 +1,2 @@ +Key1 Key2 +Value1 Value2 \ No newline at end of file diff -r 000000000000 -r 352e9d4eaf70 test-data/omero_output.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test-data/omero_output.txt Wed Aug 07 12:54:19 2024 +0000 @@ -0,0 +1,2 @@ +Image:1 +Image:2 diff -r 000000000000 -r 352e9d4eaf70 test-data/output_KV_import.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test-data/output_KV_import.txt Wed Aug 07 12:54:19 2024 +0000 @@ -0,0 +1,1 @@ +SUCCESS: Successfully uploaded metadata for dataset with ID 1. Result: {'Key1': 'Value1', 'Key2': 'Value2'} diff -r 000000000000 -r 352e9d4eaf70 test-data/output_table_import.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test-data/output_table_import.txt Wed Aug 07 12:54:19 2024 +0000 @@ -0,0 +1,2 @@ +SUCCESS: Successfully uploaded metadata for project with ID 1. Result: Key1 Key2 +0 Value1 Value2 diff -r 000000000000 -r 352e9d4eaf70 test-data/output_target_import.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test-data/output_target_import.txt Wed Aug 07 12:54:19 2024 +0000 @@ -0,0 +1,1 @@ +SUCCESS: Successfully uploaded metadata for dataset with ID 1. Result: {'Key1': 'Value1', 'Key2': 'Value2'}