Spaces:
No application file
No application file
DrVai-Rag-Testing
/
myenv
/lib
/python3.10
/site-packages
/Bio
/Graphics
/GenomeDiagram
/_FeatureSet.py
# 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] | |
################################################################################ | |
# | |
# Thanks to Peter Cock for the impetus to write the get_features() code to | |
# subselect Features. | |
# | |
################################################################################ | |
"""FeatureSet module. | |
Provides: | |
- FeatureSet - container for Feature objects | |
For drawing capabilities, this module uses reportlab to draw and write | |
the diagram: http://www.reportlab.com | |
""" | |
# GenomeDiagram | |
from ._Feature import Feature | |
# Builtins | |
import re | |
class FeatureSet: | |
"""FeatureSet object.""" | |
def __init__(self, set_id=None, name=None, parent=None): | |
"""Create the object. | |
Arguments: | |
- set_id: Unique id for the set | |
- name: String identifying the feature set | |
""" | |
self.parent = parent | |
self.id = id # Unique id for the set | |
self.next_id = 0 # counter for unique feature ids | |
self.features = {} # Holds features, keyed by ID | |
self.name = name # String describing the set | |
def add_feature(self, feature, **kwargs): | |
"""Add a new feature. | |
Arguments: | |
- feature: Bio.SeqFeature object | |
- kwargs: Keyword arguments for Feature. Named attributes | |
of the Feature | |
Add a Bio.SeqFeature object to the diagram (will be stored | |
internally in a Feature wrapper). | |
""" | |
id = self.next_id # get id number | |
f = Feature(self, id, feature) | |
self.features[id] = f # add feature | |
for key in kwargs: | |
if key == "colour" or key == "color": | |
# Deal with "colour" as a special case by also mapping to color. | |
# If Feature.py used a python property we wouldn't need to call | |
# set_color explicitly. However, this is important to make sure | |
# every color gets mapped to a colors object - for example color | |
# numbers, or strings (may not matter for PDF, but does for PNG). | |
self.features[id].set_color(kwargs[key]) | |
continue | |
setattr(self.features[id], key, kwargs[key]) | |
self.next_id += 1 # increment next id | |
return f | |
def del_feature(self, feature_id): | |
"""Delete a feature. | |
Arguments: | |
- feature_id: Unique id of the feature to delete | |
Remove a feature from the set, indicated by its id. | |
""" | |
del self.features[feature_id] | |
def set_all_features(self, attr, value): | |
"""Set an attribute of all the features. | |
Arguments: | |
- attr: An attribute of the Feature class | |
- value: The value to set that attribute to | |
Set the passed attribute of all features in the set to the | |
passed value. | |
""" | |
for feature in self.features.values(): | |
if hasattr(feature, attr): | |
# If the feature has the attribute, set it to the passed value | |
setattr(feature, attr, value) | |
# For backwards compatibility, we support both colour and color. | |
# As a quick hack, make "colour" set both "colour" and "color". | |
# if attr=="colour": | |
# self.set_all_feature("color",value) | |
def get_features(self, attribute=None, value=None, comparator=None): | |
"""Retrieve features. | |
Arguments: | |
- attribute: String, attribute of a Feature object | |
- value: The value desired of the attribute | |
- comparator: String, how to compare the Feature attribute to the | |
passed value | |
If no attribute or value is given, return a list of all features in the | |
feature set. If both an attribute and value are given, then depending | |
on the comparator, then a list of all features in the FeatureSet | |
matching (or not) the passed value will be returned. Allowed comparators | |
are: 'startswith', 'not', 'like'. | |
The user is expected to make a responsible decision about which feature | |
attributes to use with which passed values and comparator settings. | |
""" | |
# If no attribute or value specified, return all features | |
if attribute is None or value is None: | |
return list(self.features.values()) | |
# If no comparator is specified, return all features where the attribute | |
# value matches that passed | |
if comparator is None: | |
return [ | |
feature | |
for feature in self.features.values() | |
if getattr(feature, attribute) == value | |
] | |
# If the comparator is 'not', return all features where the attribute | |
# value does not match that passed | |
elif comparator == "not": | |
return [ | |
feature | |
for feature in self.features.values() | |
if getattr(feature, attribute) != value | |
] | |
# If the comparator is 'startswith', return all features where the attribute | |
# value does not match that passed | |
elif comparator == "startswith": | |
return [ | |
feature | |
for feature in self.features.values() | |
if getattr(feature, attribute).startswith(value) | |
] | |
# If the comparator is 'like', use a regular expression search to identify | |
# features | |
elif comparator == "like": | |
return [ | |
feature | |
for feature in self.features.values() | |
if re.search(value, getattr(feature, attribute)) | |
] | |
# As a final option, just return an empty list | |
return [] | |
def get_ids(self): | |
"""Return a list of all ids for the feature set.""" | |
return list(self.features.keys()) | |
def range(self): | |
"""Return the lowest and highest base (or mark) numbers as a tuple.""" | |
lows, highs = [], [] | |
for feature in self.features.values(): | |
for start, end in feature.locations: | |
lows.append(start) | |
highs.append(end) | |
if len(lows) != 0 and len(highs) != 0: # Default in case there is | |
return (min(lows), max(highs)) # nothing in the set | |
return 0, 0 | |
def to_string(self, verbose=0): | |
"""Return a formatted string with information about the set. | |
Arguments: | |
- verbose: Boolean indicating whether a short (default) or | |
complete account of the set is required | |
""" | |
if not verbose: # Short account only required | |
return f"{self}" | |
else: # Long account desired | |
outstr = [f"\n<{self.__class__}: {self.name}>"] | |
outstr.append("%d features" % len(self.features)) | |
for key in self.features: | |
outstr.append(f"feature: {self.features[key]}") | |
return "\n".join(outstr) | |
def __len__(self): | |
"""Return the number of features in the set.""" | |
return len(self.features) | |
def __getitem__(self, key): | |
"""Return a feature, keyed by id.""" | |
return self.features[key] | |
def __str__(self): | |
"""Return a formatted string with information about the feature set.""" | |
outstr = [ | |
"\n<%s: %s %d features>" % (self.__class__, self.name, len(self.features)) | |
] | |
return "\n".join(outstr) | |