from __future__ import absolute_import
import os
from .validate import ValidationError
from .base import HubComponent
from . import constants
[docs]
class Genome(HubComponent):
[docs]
def __init__(self, genome, trackdb=None, genome_file_obj=None, **kwargs):
"""
Represents a 2-line genome stanza within a "genomes.txt" file.
The file itself is represented by a :class:`GenomesFile` object.
Parameters
----------
genome : str
One of the UCSC-supported assembly names (e.g., "hg38")
trackdb : TrackDb object
If not None, this object will be attached as the child track db
genome_file : GenomesFile object
If not None, this object will be attached as the parent GenomesFile
"""
HubComponent.__init__(self)
self.genome = genome
self.trackdb = None
if trackdb is not None:
self.add_trackdb(trackdb)
if genome_file_obj:
self.add_parent(genome_file_obj)
self._orig_kwargs = kwargs
self.track_field_order = []
self.track_field_order.extend(constants.track_fields["genome"])
self.add_params(**kwargs)
@property
def genome_file_obj(self):
try:
return self.parent
except AttributeError:
return None
def add_trackdb(self, trackdb):
self.children = []
self.add_child(trackdb)
self.trackdb = self.children[0]
[docs]
def add_params(self, **kw):
"""
Add [possibly many] parameters to the Genome.
Parameters will be checked against known UCSC parameters and their
supported formats.
"""
for k, v in kw.items():
if k not in self.track_field_order:
raise ParameterError(
'"{0}" is not a valid parameter for {1} with '
"tracktype {2}".format(k, self.__class__.__name__, self.tracktype)
)
constants.param_dict[k].validate(v)
self._orig_kwargs.update(kw)
self.kwargs = self._orig_kwargs.copy()
[docs]
def remove_params(self, *args):
"""
Remove [possibly many] parameters from the Genome.
E.g.,
remove_params('color', 'visibility')
"""
for a in args:
self._orig_kwargs.pop(a)
self.kwargs = self._orig_kwargs.copy()
def __str__(self):
try:
self.validate()
except ValidationError:
return "Unconfigured <Genome> object"
s = []
s.append("genome %s" % self.genome)
s.append(
"trackDb %s"
% os.path.relpath(
self.trackdb.filename, os.path.dirname(self.genome_file_obj.filename)
)
)
for name in self.track_field_order:
value = self.kwargs.pop(name, None)
if value is not None:
if constants.param_dict[name].validate(value):
s.append("%s %s" % (name, value))
self.kwargs = self._orig_kwargs.copy()
return "\n".join(s) + "\n"
[docs]
def validate(self):
if len(self.children) == 0:
raise ValidationError("No TrackDb objects provided")
if self.trackdb is None:
raise ValidationError("No TrackDb objects provided")
def _render(self, staging="staging"):
"""
No file is created from a Genome object -- only from its parent
GenomesFile object.
"""
pass