Mercurial > repos > rv43 > tomo
diff workflow/link_to_galaxy.py @ 69:fba792d5f83b draft
planemo upload for repository https://github.com/rolfverberg/galaxytools commit ab9f412c362a4ab986d00e21d5185cfcf82485c1
author | rv43 |
---|---|
date | Fri, 10 Mar 2023 16:02:04 +0000 |
parents | |
children | 1cf15b61cd83 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/workflow/link_to_galaxy.py Fri Mar 10 16:02:04 2023 +0000 @@ -0,0 +1,116 @@ +#!/usr/bin/env python3 + +import logging +logger = logging.getLogger(__name__) + +from bioblend.galaxy import GalaxyInstance +from nexusformat.nexus import * +from os import path +from yaml import safe_load + +from .models import import_scanparser, TomoWorkflow + +def get_folder_id(gi, path): + library_id = None + folder_id = None + folder_names = path[1:] if len(path) > 1 else [] + new_folders = folder_names + libs = gi.libraries.get_libraries(name=path[0]) + if libs: + for lib in libs: + library_id = lib['id'] + folders = gi.libraries.get_folders(library_id, folder_id=None, name=None) + for i, folder in enumerate(folders): + fid = folder['id'] + details = gi.libraries.show_folder(library_id, fid) + library_path = details['library_path'] + if library_path == folder_names: + return (library_id, fid, []) + elif len(library_path) < len(folder_names): + if library_path == folder_names[:len(library_path)]: + nf = folder_names[len(library_path):] + if len(nf) < len(new_folders): + folder_id = fid + new_folders = nf + return (library_id, folder_id, new_folders) + +def link_to_galaxy(filename:str, galaxy=None, user=None, password=None, api_key=None) -> None: + # Read input file + extension = path.splitext(filename)[1] + if extension == '.yml' or extension == '.yaml': + with open(filename, 'r') as f: + data = safe_load(f) + elif extension == '.nxs': + with NXFile(filename, mode='r') as nxfile: + data = nxfile.readfile() + else: + raise ValueError(f'Invalid filename extension ({extension})') + if isinstance(data, dict): + # Create Nexus format object from input dictionary + wf = TomoWorkflow(**data) + if len(wf.sample_maps) > 1: + raise ValueError(f'Multiple sample maps not yet implemented') + nxroot = NXroot() + for sample_map in wf.sample_maps: + import_scanparser(sample_map.station) + sample_map.construct_nxentry(nxroot, include_raw_data=False) + nxentry = nxroot[nxroot.attrs['default']] + elif isinstance(data, NXroot): + nxentry = data[data.attrs['default']] + else: + raise ValueError(f'Invalid input file data ({data})') + + # Get a Galaxy instance + if user is not None and password is not None : + gi = GalaxyInstance(url=galaxy, email=user, password=password) + elif api_key is not None: + gi = GalaxyInstance(url=galaxy, key=api_key) + else: + exit('Please specify either a valid Galaxy username/password or an API key.') + + cycle = nxentry.instrument.source.attrs['cycle'] + btr = nxentry.instrument.source.attrs['btr'] + sample = nxentry.sample.name + + # Create a Galaxy work library/folder + # Combine the cycle, BTR and sample name as the base library name + lib_path = [p.strip() for p in f'{cycle}/{btr}/{sample}'.split('/')] + (library_id, folder_id, folder_names) = get_folder_id(gi, lib_path) + if not library_id: + library = gi.libraries.create_library(lib_path[0], description=None, synopsis=None) + library_id = library['id'] +# if user: +# gi.libraries.set_library_permissions(library_id, access_ids=user, +# manage_ids=user, modify_ids=user) + logger.info(f'Created Library:\n{library}') + if len(folder_names): + folder = gi.libraries.create_folder(library_id, folder_names[0], description=None, + base_folder_id=folder_id)[0] + folder_id = folder['id'] + logger.info(f'Created Folder:\n{folder}') + folder_names.pop(0) + while len(folder_names): + folder = gi.folders.create_folder(folder['id'], folder_names[0], + description=None) + folder_id = folder['id'] + logger.info(f'Created Folder:\n{folder}') + folder_names.pop(0) + + # Create a sym link for the Nexus file + dataset = gi.libraries.upload_from_galaxy_filesystem(library_id, path.abspath(filename), + folder_id=folder_id, file_type='auto', dbkey='?', link_data_only='link_to_files', + roles='', preserve_dirs=False, tag_using_filenames=False, tags=None)[0] + + # Make a history for the data + history_name = f'tomo {btr} {sample}' + history = gi.histories.create_history(name=history_name) + logger.info(f'Created history:\n{history}') + history_id = history['id'] + gi.histories.copy_dataset(history_id, dataset['id'], source='library') + +# TODO add option to either +# get a URL to share the history +# or to share with specific users +# This might require using: +# https://bioblend.readthedocs.io/en/latest/api_docs/galaxy/docs.html#using-bioblend-for-raw-api-calls +