aakash0017's picture
Upload folder using huggingface_hub
b7731cd
# Copyright 2003-2008 by Leighton Pritchard. All rights reserved.
#
# This file is part of the Biopython distribution and governed by your
# choice of the "Biopython License Agreement" or the "BSD 3-Clause License".
# Please see the LICENSE file that should have been included as part of this
# package.
#
# Contact: Leighton Pritchard, The James Hutton Institute,
# Invergowrie, Dundee, Scotland, DD2 5DA, UK
# [email protected]
################################################################################
"""Track module.
Provides:
- Track - Container for a single track on the diagram, containing
FeatureSet and GraphSet objects
For drawing capabilities, this module uses reportlab to draw and write
the diagram: http://www.reportlab.com
"""
from reportlab.lib import colors
# GenomeDiagram imports
from ._FeatureSet import FeatureSet
from ._GraphSet import GraphSet
_grey = colors.Color(0.6, 0.6, 0.6)
class Track:
"""Track.
Attributes:
- height Int describing the relative height to other trackscale_fontsizes
in the diagram
- name String describing the track
- hide Boolean, 0 if the track is not to be drawn
- start, end Integers (or None) specifying start/end to draw just
a partial track.
- greytrack Boolean, 1 if a grey background to the track is to be
drawn
- greytrack_labels Int describing how many track-identifying labels
should be placed on the track at regular intervals
- greytrack_font String describing the font to use for the greytrack
labels
- greytrack_fontsize Int describing the font size to display the
labels on the grey track
- greytrack_font_rotation Int describing the angle through which to
rotate the grey track labels (Linear only)
- greytrack_font_color colors.Color describing the color to draw
the grey track labels
- scale Boolean, 1 if a scale is to be drawn on the track
- scale_format String, defaults to None, when scale values are written
as numerals. Setting this to 'SInt' invokes SI
unit-like multiples, such as Mbp, Kbp and so on.
- scale_color colors.Color to draw the elements of the scale
- scale_font String describing the font to use for the scale labels
- scale_fontsize Int describing the size of the scale label font
- scale_fontangle Int describing the angle at which to draw the scale
labels (linear only)
- scale_ticks Boolean, 1 if ticks should be drawn at all on the
scale
- scale_largeticks Float (0->1) describing the height of large
scale ticks relative to the track height.
- scale_smallticks Float (0->1) describing the height of large
scale ticks relative to the track height.
- scale_largetick_interval Int, describing the number of bases that
should separate large ticks
- scale_smalltick_interval Int, describing the number of bases that
should separate small ticks
- scale_largetick_labels Boolean describing whether position labels
should be written over large ticks
- scale_smalltick_labels Boolean describing whether position labels
should be written over small ticks
- axis_labels Boolean describing whether the value labels should
be placed on the Y axes
"""
def __init__(
self,
name=None,
height=1,
hide=0,
greytrack=0,
greytrack_labels=5,
greytrack_fontsize=8,
greytrack_font="Helvetica",
greytrack_font_rotation=0,
greytrack_font_color=_grey,
scale=1,
scale_format=None,
scale_color=colors.black,
scale_font="Helvetica",
scale_fontsize=6,
scale_fontangle=45,
scale_largeticks=0.5,
scale_ticks=1,
scale_smallticks=0.3,
scale_largetick_interval=1e6,
scale_smalltick_interval=1e4,
scale_largetick_labels=1,
scale_smalltick_labels=0,
axis_labels=1,
start=None,
end=None,
greytrack_font_colour=None,
scale_colour=None,
):
"""Initialize.
Arguments:
- height Int describing the relative height to other tracks in the
diagram
- name String describing the track
- hide Boolean, 0 if the track is not to be drawn
- greytrack Boolean, 1 if a grey background to the track is to be
drawn
- greytrack_labels Int describing how many track-identifying labels
should be placed on the track at regular intervals
- greytrack_font String describing the font to use for the greytrack
labels
- greytrack_fontsize Int describing the font size to display the
labels on the grey track
- greytrack_font_rotation Int describing the angle through which to
rotate the grey track labels (Linear only)
- greytrack_font_color colors.Color describing the color to draw
the grey track labels (overridden by backwards compatible argument
with UK spelling, colour).
- scale Boolean, 1 if a scale is to be drawn on the track
- scale_color colors.Color to draw the elements of the scale
(overridden by backwards compatible argument with UK
spelling, colour).
- scale_font String describing the font to use for the scale labels
- scale_fontsize Int describing the size of the scale label font
- scale_fontangle Int describing the angle at which to draw the scale
labels (linear only)
- scale_ticks Boolean, 1 if ticks should be drawn at all on the
scale
- scale_largeticks Float (0->1) describing the height of large
scale ticks relative to the track height.
- scale_smallticks Float (0->1) describing the height of large
scale ticks relative to the track height.
- scale_largetick_interval Int, describing the number of bases that
should separate large ticks
- scale_smalltick_interval Int, describing the number of bases that
should separate small ticks
- scale_largetick_labels Boolean describing whether position labels
should be written over large ticks
- scale_smalltick_labels Boolean describing whether position labels
should be written over small ticks
- name String to help identify the track
- height Relative height to draw the track
- axis_labels Boolean describing whether the value labels should
be placed on the Y axes
"""
# Let the UK spelling (colour) override the USA spelling (color)
if greytrack_font_colour is not None:
greytrack_font_color = greytrack_font_colour
if scale_colour is not None:
scale_color = scale_colour
self._next_id = 0 # This will count sets as they are added to the track
self._sets = {} # Holds sets, keyed by unique ID
# Assign attribute values from instantiation
self.height = height
if name is not None:
self.name = str(name)
else:
self.name = "Track"
self.hide = hide
self.start = start
self.end = end
# Attributes for the grey track background and labels
self.greytrack = greytrack
self.greytrack_labels = greytrack_labels
self.greytrack_fontsize = greytrack_fontsize
self.greytrack_font = greytrack_font
self.greytrack_font_rotation = greytrack_font_rotation
self.greytrack_fontcolor = greytrack_font_color
# Attributes for the track scale
self.scale = scale
self.scale_format = scale_format
self.scale_color = scale_color
self.scale_font = scale_font
self.scale_fontsize = scale_fontsize
self.scale_fontangle = scale_fontangle
self.scale_ticks = scale_ticks
self.scale_largeticks = scale_largeticks
self.scale_smallticks = scale_smallticks
self.scale_largetick_interval = scale_largetick_interval
self.scale_smalltick_interval = scale_smalltick_interval
self.scale_largetick_labels = scale_largetick_labels
self.scale_smalltick_labels = scale_smalltick_labels
self.axis_labels = axis_labels
def add_set(self, set):
"""Add a preexisting FeatureSet or GraphSet object to the track."""
set.id = self._next_id # Assign unique id to set
set.parent = self # Make set's parent this track
self._sets[self._next_id] = set # Add set, keyed by unique id
self._next_id += 1 # Increment unique set ids
def new_set(self, type="feature", **args):
"""Create a new FeatureSet or GraphSet object.
Create a new FeatureSet or GraphSet object, add it to the
track, and return for user manipulation
"""
type_dict = {"feature": FeatureSet, "graph": GraphSet}
set = type_dict[type]()
for key in args:
setattr(set, key, args[key])
set.id = self._next_id # Assign unique id to set
set.parent = self # Make set's parent this track
self._sets[self._next_id] = set # Add set, keyed by unique id
self._next_id += 1 # Increment unique set ids
return set
def del_set(self, set_id):
"""Remove the set with the passed id from the track."""
del self._sets[set_id]
def get_sets(self):
"""Return the sets contained in this track."""
return list(self._sets.values())
def get_ids(self):
"""Return the ids of all sets contained in this track."""
return list(self._sets.keys())
def range(self):
"""Return the lowest and highest base (or mark) numbers as a tuple."""
lows, highs = [], [] # Holds set of low and high values from sets
if self.start is not None:
lows.append(self.start)
if self.end is not None:
highs.append(self.end)
for set in self._sets.values():
low, high = set.range() # Get each set range
lows.append(low)
highs.append(high)
if lows:
low = min(lows)
else:
low = None
if highs:
high = max(highs)
else:
high = None
return low, high # Return lowest and highest values
def to_string(self, verbose=0):
"""Return a formatted string with information about the track.
Arguments:
- verbose - Boolean indicating whether a short or complete
account of the track is required
"""
if not verbose: # Return the short description
return f"{self}" # Use __str__ method instead
else: # Return the long description
outstr = [f"\n<{self.__class__}: {self.name}>"]
outstr.append("%d sets" % len(self._sets))
for key in self._sets:
outstr.append(f"set: {self._sets[key]}")
return "\n".join(outstr)
def __getitem__(self, key):
"""Return the set with the passed id."""
return self._sets[key]
def __str__(self):
"""Return a formatted string with information about the Track."""
outstr = [f"\n<{self.__class__}: {self.name}>"]
outstr.append("%d sets" % len(self._sets))
return "\n".join(outstr)