Source code for synbiopython.genbabel.gensbolconv.GenSBOLconv

# pylint: disable=C0103,E0401
Synbiopython (c) Global BioFoundry Alliance 2020

Synbiopython is licensed under the MIT License.

This module provides code to work with SBOL validator

Use sample sbol file from github (can also be obtained from iBioSim)

Reference: (Chapter 17 Graphics)

    pip install biopython reportlab

The URI prefix is required for FASTA and GenBank conversion,
and optional for SBOL 1 conversion

import os
import requests
from Bio import SeqIO
from Bio.Graphics import GenomeDiagram
from reportlab.lib import colors
from reportlab.lib.units import cm

[docs]class GenSBOLconv: """Class to convert standard files (SBOL1, SBOL2, GenBank, Fasta, GFF3)."""
[docs] @staticmethod def export_plasmidmap(gbfile, filename=None): """ Export Linear and Circular Plasmid Map for the imported GenBank file. :param gbfile: a genbank file in .gb format or the path the file if not in the same folder. :type gbfile: str :param filename: the filenames/path to the filenames for the linear and circular plasmids in tuple :type filename: tuple, optional :return: the version from the genbank file :rtype: str """ record =, "genbank") gd_diagram = GenomeDiagram.Diagram( gd_track_for_features = gd_diagram.new_track(1, name="Annotated Features") gd_feature_set = gd_track_for_features.new_set() for feature in record.features: if feature.type == "primer" or (feature.type == "misc_feature"): continue # if (feature.type != "CDS"): # # Exclude this feature # continue if len(gd_feature_set) % 2 == 0: color = colors.lightblue else: color = gd_feature_set.add_feature( feature, sigil="ARROW", color=color, label_size=12, label_angle=0, label=True, ) # Draw Linear map from genbank gd_diagram.draw( format="linear", orientation="landscape", pagesize="A4", fragments=4, start=0, end=len(record), ) if filename is None: linfile = "plasmid_linear.png" circfile = "plasmid_circular.png" else: linfile = filename[0] circfile = filename[1] gd_diagram.write(linfile, "PNG") # Draw circular map from genbank gd_diagram.draw( format="circular", circular=True, pagesize=(25 * cm, 20 * cm), # pagesize=(35 * cm, 30 * cm), start=0, end=len(record), circle_core=0.5, ) # gd_diagram.write("plasmid_circular.pdf", "PDF") gd_diagram.write(circfile, "PNG") return
[docs] @staticmethod def access_sbolvalidator(input_file, Output, uri_Prefix=""): """Code to invoke the SBOL Validator server over the internet. :param input_file: input filename or filepath :type input_file: str :param Output: the type of Output file :type Output: str, ('GenBank', 'FASTA', 'GFF3', 'SBOL1', 'SBOL2') :param uri_Prefix: '' as default, URI Prefix is required for FASTA and GenBank input conversion :type uri_Prefix: str, optional :return: POST request response from webpage :rtype: object """ file = open(input_file).read() request = { "options": { "language": Output, "test_equality": False, "check_uri_compliance": False, "check_completeness": False, "check_best_practices": False, "fail_on_first_error": False, "provide_detailed_stack_trace": False, "subset_uri": "", "uri_prefix": uri_Prefix, "version": "", "insert_type": False, "main_file_name": "main file", "diff_file_name": "comparison file", }, "return_file": True, "main_file": file, } # send POST request to the specified url (Response [200] means ok) response = "", json=request ) return response
[docs] @staticmethod def get_outputfile_extension(Filetype): """Get the output file extension based on the requested output language. :param Filetype: the type of Output file :type Output: str, ('GenBank', 'FASTA', 'GFF3', 'SBOL1', 'SBOL2') :return: the specific file extension :rtype: str """ switcher = { "GenBank": ".gb", "FASTA": ".fasta", "GFF3": ".gff", "SBOL1": ".sbol", "SBOL2": ".sbol", } return switcher.get(Filetype, "unknown filetype")
[docs] def export_outputfile(self, input_filename, Response, Output, outputfile=None): """Export the converted output file. :param input_filename: input filename or filepath :type input_filename: str :param Response: response from POST request to sbolvalidator web page :type Response: object :param Output: the type of Output file :type Output: str, ('GenBank', 'FASTA', 'GFF3', 'SBOL1', 'SBOL2') :param outputfile: provide specific outputfilename or filepath :type outputfile: str, optional """ filename_w_ext = os.path.basename(input_filename) filename, _ = os.path.splitext(filename_w_ext) if Response.json()["valid"]: # export the result from json into the specific output file format if outputfile is None: output_filename = filename + self.get_outputfile_extension(Output) else: output_filename = outputfile print("Output file: ", output_filename) with open(output_filename, "w", newline="\n") as f: f.write(Response.json()["result"]) else: print("Error message: ", Response.json()["errors"])
[docs] def run_sbolvalidator(self, Input_file, Output, uri_Prefix="", **kwargs): """Wrapper function for the SBOL Validator. :param Input_file: input file or path to input file :type Input_file: str, filename or filepath :param Output: the type of Output file :type Output: str, ('GenBank', 'FASTA', 'GFF3', 'SBOL1', 'SBOL2') :param uri_Prefix: '' as default, URI Prefix is required for FASTA and GenBank input conversion :type uri_Prefix: str, optional :return: the validity of the Response, and export output file. :rtype: str, "valid: True" if the conversion is done properly :Keyword Arguments: * *outputfile*: specify outputfile """ Response = self.access_sbolvalidator(Input_file, Output, uri_Prefix) output_filename = None for key, value in kwargs.items(): if "outputfile" in key: output_filename = value self.export_outputfile(Input_file, Response, Output, outputfile=output_filename) return "valid: " + str(Response.json()["valid"])