diff --git a/config/datatypes_conf.xml.sample b/config/datatypes_conf.xml.sample index bf49f95419a..529e7f8aa03 100644 --- a/config/datatypes_conf.xml.sample +++ b/config/datatypes_conf.xml.sample @@ -135,6 +135,7 @@ + @@ -503,7 +504,6 @@ - @@ -716,6 +716,7 @@ + diff --git a/lib/galaxy/datatypes/binary.py b/lib/galaxy/datatypes/binary.py index 1d92222668a..073b1c7c472 100644 --- a/lib/galaxy/datatypes/binary.py +++ b/lib/galaxy/datatypes/binary.py @@ -736,6 +736,97 @@ class H5(Binary): return "Binary HDF5 file (%s)" % (nice_size(dataset.get_size())) +class Loom(H5): + """ + Class describing a Loom file: http://loompy.org/ + + >>> from galaxy.datatypes.sniff import get_test_fname + >>> fname = get_test_fname('test.loom') + >>> Loom().sniff(fname) + True + >>> fname = get_test_fname('test.mz5') + >>> Loom().sniff(fname) + False + """ + file_ext = "loom" + edam_format = "format_3590" + + MetadataElement(name="title", default="", desc="title", readonly=True, visible=True, no_value="") + MetadataElement(name="description", default="", desc="description", readonly=True, visible=True, no_value="") + MetadataElement(name="url", default="", desc="url", readonly=True, visible=True, no_value="") + MetadataElement(name="doi", default="", desc="doi", readonly=True, visible=True, no_value="") + MetadataElement(name="loom_spec_version", default="", desc="loom_spec_version", readonly=True, visible=True, no_value="") + MetadataElement(name="creation_date", default=None, desc="creation_date", readonly=True, visible=True, no_value=None) + MetadataElement(name="shape", default=(), desc="shape", param=metadata.ListParameter, readonly=True, visible=True, no_value=()) + MetadataElement(name="layers_count", default=0, desc="layers_count", readonly=True, visible=True, no_value=0) + MetadataElement(name="layers_names", desc="layers_names", default=[], param=metadata.SelectParameter, multiple=True, readonly=True, no_value=None) + MetadataElement(name="row_attrs_count", default=0, desc="row_attrs_count", readonly=True, visible=True, no_value=0) + MetadataElement(name="row_attrs_names", desc="row_attrs_names", default=[], param=metadata.SelectParameter, multiple=True, readonly=True, no_value=None) + MetadataElement(name="col_attrs_count", default=0, desc="col_attrs_count", readonly=True, visible=True, no_value=0) + MetadataElement(name="col_attrs_names", desc="col_attrs_names", default=[], param=metadata.SelectParameter, multiple=True, readonly=True, no_value=None) + MetadataElement(name="col_graphs_count", default=0, desc="col_graphs_count", readonly=True, visible=True, no_value=0) + MetadataElement(name="col_graphs_names", desc="col_graphs_names", default=[], param=metadata.SelectParameter, multiple=True, readonly=True, no_value=None) + MetadataElement(name="row_graphs_count", default=0, desc="row_graphs_count", readonly=True, visible=True, no_value=0) + MetadataElement(name="row_graphs_names", desc="row_graphs_names", default=[], param=metadata.SelectParameter, multiple=True, readonly=True, no_value=None) + + def sniff(self, filename): + if super(Loom, self).sniff(filename): + try: + with h5py.File(filename) as loom_file: + return bool(loom_file.attrs.get('LOOM_SPEC_VERSION', False)) + except Exception: + return False + return False + + def set_peek(self, dataset, is_multi_byte=False): + if not dataset.dataset.purged: + dataset.peek = "Binary Loom file" + dataset.blurb = nice_size(dataset.get_size()) + else: + dataset.peek = 'file does not exist' + dataset.blurb = 'file purged from disk' + + def display_peek(self, dataset): + try: + return dataset.peek + except Exception: + return "Binary Loom file (%s)" % (nice_size(dataset.get_size())) + + def set_meta(self, dataset, overwrite=True, **kwd): + super(Loom, self).set_meta(dataset, overwrite=overwrite, **kwd) + try: + with h5py.File(dataset.file_name) as loom_file: + dataset.metadata.title = loom_file.attrs.get('title', None) + dataset.metadata.description = loom_file.attrs.get('description', None) + dataset.metadata.url = loom_file.attrs.get('url', None) + dataset.metadata.doi = loom_file.attrs.get('doi', None) + dataset.metadata.loom_spec_version = loom_file.attrs.get('LOOM_SPEC_VERSION', None) + dataset.creation_date = loom_file.attrs.get('creation_date', None) + dataset.metadata.shape = tuple(loom_file['matrix'].shape) + + tmp = list(loom_file['layers'].keys()) + dataset.metadata.layers_count = len(tmp) + dataset.metadata.layers_names = tmp + + tmp = list(loom_file['row_attrs'].keys()) + dataset.metadata.row_attrs_count = len(tmp) + dataset.metadata.row_attrs_names = tmp + + tmp = list(loom_file['col_attrs'].keys()) + dataset.metadata.col_attrs_count = len(tmp) + dataset.metadata.col_attrs_names = tmp + + tmp = list(loom_file['col_graphs'].keys()) + dataset.metadata.col_graphs_count = len(tmp) + dataset.metadata.col_graphs_names = tmp + + tmp = list(loom_file['row_graphs'].keys()) + dataset.metadata.row_graphs_count = len(tmp) + dataset.metadata.row_graphs_names = tmp + except Exception as e: + log.warning('%s, set_meta Exception: %s', self, e) + + class GmxBinary(Binary): """ Base class for GROMACS binary files - xtc, trr, cpt diff --git a/lib/galaxy/datatypes/test/test.loom b/lib/galaxy/datatypes/test/test.loom new file mode 100644 index 00000000000..a0e575472c5 Binary files /dev/null and b/lib/galaxy/datatypes/test/test.loom differ