mirror of
https://github.com/galaxyproject/galaxy.git
synced 2026-10-28 02:58:18 +08:00
Merge pull request #11957 from jj-umn/hexrd_datatypes
Add datatypes for Structural Materials Hexrd application
This commit is contained in:
@@ -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"/>
|
||||
|
||||
@@ -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.
Reference in New Issue
Block a user