Merge pull request #11957 from jj-umn/hexrd_datatypes

Add datatypes for Structural Materials Hexrd application
This commit is contained in:
Dannon
2021-08-29 16:51:08 -07:00
committed by GitHub
5 changed files with 247 additions and 0 deletions
@@ -862,6 +862,12 @@
<datatype extension="ffindex" type="galaxy.datatypes.tabular:Tabular" display_in_upload="true" subclass="true" description_url="https://github.com/soedinglab/ffindex_soedinglab"/>
<datatype extension="ffdata" type="galaxy.datatypes.data:Data" display_in_upload="true" subclass="true" description_url="https://github.com/soedinglab/ffindex_soedinglab"/>
<datatype extension="pretext" type="galaxy.datatypes.binary:Pretext" display_in_upload="true" />
<!-- Structural Materials datatypes -->
<datatype extension="hexrd.materials.h5" type="galaxy.datatypes.binary:HexrdMaterials" display_in_upload="true"/>
<datatype extension="npz" type="galaxy.datatypes.binary:Npz" display_in_upload="true"/>
<datatype extension="hexrd.images.npz" type="galaxy.datatypes.binary:HexrdImagesNpz" display_in_upload="true"/>
<datatype extension="hexrd.eta_ome.npz" type="galaxy.datatypes.binary:HexrdEtaOmeNpz" display_in_upload="true"/>
<!-- End Structural Materials datatypes -->
</registration>
<sniffers>
<!--
@@ -914,7 +920,11 @@
<sniffer type="galaxy.datatypes.binary:Loom"/>
<sniffer type="galaxy.datatypes.binary:Anndata"/>
<sniffer type="galaxy.datatypes.binary:Biom2"/>
<sniffer type="galaxy.datatypes.binary:HexrdMaterials"/>
<sniffer type="galaxy.datatypes.binary:H5"/>
<sniffer type="galaxy.datatypes.binary:HexrdImagesNpz"/>
<sniffer type="galaxy.datatypes.binary:HexrdEtaOmeNpz"/>
<sniffer type="galaxy.datatypes.binary:Npz"/>
<sniffer type="galaxy.datatypes.binary:Bam"/>
<sniffer type="galaxy.datatypes.binary:BamQuerynameSorted"/>
<sniffer type="galaxy.datatypes.binary:BamNative"/>
+237
View File
@@ -17,6 +17,7 @@ from json import dumps
from typing import Optional
import h5py
import numpy as np
import pysam
import pysam.bcftools
from bx.seq.twobit import TWOBIT_MAGIC_NUMBER, TWOBIT_MAGIC_NUMBER_SWAP
@@ -1556,6 +1557,67 @@ class H5MLM(H5):
return "HDF5 Model (%s)" % (nice_size(dataset.get_size()))
class HexrdMaterials(H5):
"""
Class describing a Hexrd Materials file: https://github.com/HEXRD/hexrd
>>> from galaxy.datatypes.sniff import get_test_fname
>>> fname = get_test_fname('hexrd.materials.h5')
>>> HexrdMaterials().sniff(fname)
True
>>> fname = get_test_fname('test.loom')
>>> HexrdMaterials().sniff(fname)
False
"""
file_ext = "hexrd.materials.h5"
edam_format = "format_3590"
MetadataElement(name="materials", desc="materials", default=[], param=metadata.SelectParameter, multiple=True, readonly=True, no_value=None)
MetadataElement(name="SpaceGroupNumber", default={}, param=DictParameter, desc="SpaceGroupNumber", readonly=True, visible=True, no_value={})
MetadataElement(name="LatticeParameters", default={}, param=DictParameter, desc="LatticeParameters", readonly=True, visible=True, no_value={})
def sniff(self, filename):
if super().sniff(filename):
req = {'AtomData', 'Atomtypes', 'CrystalSystem', 'LatticeParameters'}
with h5py.File(filename, 'r') as mat_file:
for k in mat_file.keys():
if isinstance(mat_file[k], h5py._hl.group.Group) and set(mat_file[k].keys()) >= req:
return True
return False
def set_meta(self, dataset, overwrite=True, **kwd):
super().set_meta(dataset, overwrite=overwrite, **kwd)
try:
with h5py.File(dataset.file_name, 'r') as mat_file:
dataset.metadata.materials = list(mat_file.keys())
sgn = dict()
lp = dict()
for m in mat_file.keys():
if 'SpaceGroupNumber' in mat_file[m] and len(mat_file[m]['SpaceGroupNumber']) > 0:
sgn[m] = mat_file[m]['SpaceGroupNumber'][0].item()
if 'LatticeParameters' in mat_file[m]:
lp[m] = mat_file[m]['LatticeParameters'][0:].tolist()
dataset.metadata.SpaceGroupNumber = sgn
dataset.metadata.LatticeParameters = lp
except Exception as e:
log.warning('%s, set_meta Exception: %s', self, e)
def set_peek(self, dataset, is_multi_byte=False):
if not dataset.dataset.purged:
lines = ['Material SpaceGroup Lattice']
if dataset.metadata.materials:
for m in dataset.metadata.materials:
try:
lines.append(f'{m} {dataset.metadata.SpaceGroupNumber[m]} {dataset.metadata.LatticeParameters[m]}')
except Exception:
continue
dataset.peek = '\n'.join(lines)
dataset.blurb = f"Materials: {' '.join(dataset.metadata.materials)}"
else:
dataset.peek = 'file does not exist'
dataset.blurb = 'file purged from disk'
class Scf(Binary):
"""Class describing an scf binary sequence file"""
edam_format = "format_1632"
@@ -3108,6 +3170,181 @@ class JP2(Binary):
return "Binary JPEG 2000 file (%s)" % (nice_size(dataset.get_size()))
class Npz(CompressedArchive):
"""
Class describing an Numpy NPZ file
>>> from galaxy.datatypes.sniff import get_test_fname
>>> fname = get_test_fname('hexrd.images.npz')
>>> Npz().sniff(fname)
True
>>> fname = get_test_fname('interval.interval')
>>> Npz().sniff(fname)
False
"""
file_ext = "npz"
# edam_format = "format_4003"
MetadataElement(name="nfiles", default=0, desc="nfiles", readonly=True, visible=True, no_value=0)
MetadataElement(name="files", default=[], desc="files", readonly=True, visible=True, no_value=[])
def __init__(self, **kwd):
super().__init__(**kwd)
def sniff(self, filename):
try:
npz = np.load(filename)
if isinstance(npz, np.lib.npyio.NpzFile):
for f in npz.files:
if isinstance(npz[f], np.ndarray):
return True
except Exception:
return False
return False
def set_meta(self, dataset, **kwd):
try:
with np.load(dataset.file_name) as npz:
dataset.metadata.nfiles = len(npz.files)
dataset.metadata.files = npz.files
except Exception as e:
log.warning('%s, set_meta Exception: %s', self, e)
def set_peek(self, dataset, is_multi_byte=False):
if not dataset.dataset.purged:
dataset.peek = f"Binary Numpy npz {dataset.metadata.nfiles} files ({nice_size(dataset.get_size())})"
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 Numpy npz file (%s)" % (nice_size(dataset.get_size()))
class HexrdImagesNpz(Npz):
"""
Class describing an HEXRD Images Numpy NPZ file
>>> from galaxy.datatypes.sniff import get_test_fname
>>> fname = get_test_fname('hexrd.images.npz')
>>> HexrdImagesNpz().sniff(fname)
True
>>> fname = get_test_fname('eta_ome.npz')
>>> HexrdImagesNpz().sniff(fname)
False
"""
file_ext = "hexrd.images.npz"
MetadataElement(name="panel_id", default='', desc="Detector Panel ID", param=MetadataParameter, readonly=True, visible=True, optional=True, no_value='')
MetadataElement(name="shape", default=(), desc="shape", param=metadata.ListParameter, readonly=True, visible=True, no_value=())
MetadataElement(name="nframes", default=0, desc="nframes", readonly=True, visible=True, no_value=0)
MetadataElement(name="omegas", desc="has omegas", default="False", visible=False)
def __init__(self, **kwd):
super().__init__(**kwd)
def sniff(self, filename):
if super().sniff(filename):
try:
req_files = {'0_row', '0_col', '0_data', 'shape', 'nframes', 'dtype'}
with np.load(filename) as npz:
return set(npz.files) >= req_files
except Exception as e:
log.warning('%s, sniff Exception: %s', self, e)
return False
return False
def set_meta(self, dataset, **kwd):
super().set_meta(dataset, **kwd)
try:
with np.load(dataset.file_name) as npz:
if 'panel_id' in npz.files:
dataset.metadata.panel_id = str(npz['panel_id'])
if 'omega' in npz.files:
dataset.metadata.omegas = "True"
dataset.metadata.shape = npz['shape'].tolist()
dataset.metadata.nframes = npz['nframes'].tolist()
except Exception as e:
log.warning('%s, set_meta Exception: %s', self, e)
def set_peek(self, dataset, is_multi_byte=False):
if not dataset.dataset.purged:
lines = [f"Binary Hexrd Image npz {dataset.metadata.nfiles} files ({nice_size(dataset.get_size())})",
f"Panel: {dataset.metadata.panel_id} Frames: {dataset.metadata.nframes} Shape: {dataset.metadata.shape}"]
dataset.peek = '\n'.join(lines)
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 Numpy npz file (%s)" % (nice_size(dataset.get_size()))
class HexrdEtaOmeNpz(Npz):
"""
Class describing an HEXRD Eta-Ome Numpy NPZ file
>>> from galaxy.datatypes.sniff import get_test_fname
>>> fname = get_test_fname('hexrd.eta_ome.npz')
>>> HexrdEtaOmeNpz().sniff(fname)
True
>>> fname = get_test_fname('hexrd.images.npz')
>>> HexrdEtaOmeNpz().sniff(fname)
False
"""
file_ext = "hexrd.eta_ome.npz"
MetadataElement(name="HKLs", default=(), desc="HKLs", param=metadata.ListParameter, readonly=True, visible=True, no_value=())
MetadataElement(name="nframes", default=0, desc="nframes", readonly=True, visible=True, no_value=0)
def __init__(self, **kwd):
super().__init__(**kwd)
def sniff(self, filename):
if super().sniff(filename):
try:
req_files = {'dataStore', 'etas', 'etaEdges', 'iHKLList', 'omegas', 'omeEdges', 'planeData_hkls'}
with np.load(filename) as npz:
return set(npz.files) >= req_files
except Exception as e:
log.warning('%s, sniff Exception: %s', self, e)
return False
return False
def set_meta(self, dataset, **kwd):
super().set_meta(dataset, **kwd)
try:
with np.load(dataset.file_name) as npz:
dataset.metadata.HKLs = npz['iHKLList'].tolist()
dataset.metadata.nframes = len(npz['omegas'])
except Exception as e:
log.warning('%s, set_meta Exception: %s', self, e)
def set_peek(self, dataset, is_multi_byte=False):
if not dataset.dataset.purged:
lines = [f"Binary Hexrd Eta-Ome npz {dataset.metadata.nfiles} files ({nice_size(dataset.get_size())})",
f"Eta-Ome HKLs: {dataset.metadata.HKLs} Frames: {dataset.metadata.nframes}"]
dataset.peek = '\n'.join(lines)
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 Numpy npz file (%s)" % (nice_size(dataset.get_size()))
if __name__ == '__main__':
import doctest
doctest.testmod(sys.modules[__name__])
Binary file not shown.
Binary file not shown.
Binary file not shown.