Files
biopython/Tests/test_KGML_graphics.py
Martin Thoma d2e7b6baa5 Remove executable flags and shebang (#2826)
Remove executable flags and hashbangs from tests; make run_tests.py executable
2020-05-26 13:09:54 +01:00

198 lines
7.8 KiB
Python

#
# Copyright 2013, 2014 by Leighton Pritchard. All rights reserved.
# This code is part of the Biopython distribution and governed by its
# license. Please see the LICENSE file that should have been included
# as part of this package.
"""Tests for general functionality of the KGML modules."""
# Builtins
import os
import unittest
# Biopython
from Bio.Graphics.ColorSpiral import ColorSpiral
# Do we have ReportLab? Raise error if not present.
from Bio import MissingExternalDependencyError
try:
# Not actually using these imports directly:
from reportlab.pdfgen.canvas import Canvas
from reportlab.lib.pagesizes import A4
from reportlab.lib.colors import HexColor
except ImportError:
raise MissingExternalDependencyError(
"Install reportlab if you want to use Bio.Graphics."
) from None
try:
c = HexColor("#8080F780")
except TypeError:
# Known to fail under ReportLab 2.6 with:
# unsupported operand type(s) for &: 'int' and 'float'
# ReportLab 2.7+ also offers hasAlpha=True rather than alpha=True
raise MissingExternalDependencyError(
"Install at least reportlab 2.7 for transparency support."
) from None
# Do we have PIL?
try:
from PIL import Image
except ImportError:
raise MissingExternalDependencyError(
"Install Pillow or its predecessor PIL (Python Imaging Library) "
"if you want to use bitmaps from KGML."
) from None
# Biopython Bio.KEGG.KGML
from Bio.KEGG.KGML.KGML_parser import read
from Bio.Graphics.KGML_vis import KGMLCanvas
# The PathwayData class is also imported by the online test module in
# test_KGML_graphics_online.py
class PathwayData:
"""Convenience structure for testing pathway data."""
def __init__(self, name, element_counts, show_pathway_image=False):
"""Initialize."""
self.infilename = os.path.join("KEGG", "ko%s.xml" % name)
self.outfilename = os.path.join("KEGG", "ko%s.kgml" % name)
self.element_counts = element_counts
self.pathway_image = os.path.join("KEGG", "map%s.png" % name)
self.show_pathway_image = show_pathway_image
self.output_stem = "Graphics/map%s" % name
class KGMLPathwayTest(unittest.TestCase):
"""Import XML file and write KGML.
Import the ko01100 metabolic map from a local .xml KGML file,
and write valid KGML output for each.
"""
def setUp(self):
# Does our output directory exist? If not, create it
if not os.path.isdir("KEGG"):
os.mkdir("KEGG")
# Define some data to work with as a list of tuples:
# (infilename, outfilename, (entry_count, ortholog_count,
# compound_count, map_counts), pathway_image,
# show_image_map)
self.data = [
PathwayData("01100", (3628, 1726, 1746, 149)),
PathwayData("03070", (81, 72, 8, 1), True),
]
# A list of KO IDs that we're going to use to modify pathway
# appearance. These are KO IDs for reactions that take part in ko00020,
# the TCA cycle
# Turn black code style off
# fmt: off
self.ko_ids = {
"ko:K00239", "ko:K00240", "ko:K00241", "ko:K00242", "ko:K00244",
"ko:K00245", "ko:K00246", "ko:K00247", "ko:K00174", "ko:K00175",
"ko:K00177", "ko:K00176", "ko:K00382", "ko:K00164", "ko:K00164",
"ko:K00658", "ko:K01902", "ko:K01903", "ko:K01899", "ko:K01900",
"ko:K01899", "ko:K01900", "ko:K00031", "ko:K00030", "ko:K00031",
"ko:K01648", "ko:K00234", "ko:K00235", "ko:K00236", "ko:K00237",
"ko:K01676", "ko:K01677", "ko:K01678", "ko:K01679", "ko:K01681",
"ko:K01682", "ko:K01681", "ko:K01682", "ko:K01647", "ko:K00025",
"ko:K00026", "ko:K00024", "ko:K01958", "ko:K01959", "ko:K01960",
"ko:K00163", "ko:K00161", "ko:K00162", "ko:K00163", "ko:K00161",
"ko:K00162", "ko:K00382", "ko:K00627", "ko:K00169", "ko:K00170",
"ko:K00172", "ko:K00171", "ko:K01643", "ko:K01644", "ko:K01646",
"ko:K01610", "ko:K01596"
}
# Turn black code style on
# fmt: on
def test_render_KGML_basic(self):
"""Basic rendering of KGML: write to PDF without modification."""
# We test rendering of the original KEGG KGML using only local
# files.
for p in self.data:
with open(p.infilename) as f:
pathway = read(f)
pathway.image = p.pathway_image
kgml_map = KGMLCanvas(pathway)
kgml_map.import_imagemap = p.show_pathway_image
kgml_map.draw(p.output_stem + "_original.pdf")
def test_render_KGML_modify(self):
"""Rendering of KGML to PDF, with modification."""
# We test rendering of the original KGML for KO01100,
# modifying line width for the lipid pathway
p = self.data
with open(p[0].infilename) as f:
pathway = read(f)
mod_rs = [
e
for e in pathway.orthologs
if len(set(e.name.split()).intersection(self.ko_ids))
]
for r in mod_rs:
for g in r.graphics:
g.width = 10
kgml_map = KGMLCanvas(pathway)
kgml_map.draw(p[0].output_stem + "_widths.pdf")
# We test rendering of the original KGML for KO3070,
# modifying the reaction colours for each ortholog entry
with open(p[1].infilename) as f:
pathway = read(f)
orthologs = list(pathway.orthologs)
# Use Biopython's ColorSpiral to generate colours
cs = ColorSpiral(a=2, b=0.2, v_init=0.85, v_final=0.5, jitter=0.03)
colors = cs.get_colors(len(orthologs))
for o, c in zip(orthologs, colors):
for g in o.graphics:
g.bgcolor = c
kgml_map = KGMLCanvas(pathway)
pathway.image = p[1].pathway_image
kgml_map.import_imagemap = p[1].show_pathway_image
kgml_map.draw(p[1].output_stem + "_colors.pdf")
def test_render_KGML_transparency(self):
"""Rendering of KGML to PDF, with color alpha channel."""
# We test rendering of the original KGML for KO01100,
# modifying alpha channel for the lipid pathway
p = self.data
with open(p[0].infilename) as f:
pathway = read(f)
mod_rs = [
e
for e in pathway.orthologs
if len(set(e.name.split()).intersection(self.ko_ids))
]
for r in mod_rs:
for g in r.graphics:
# Modify hex colour directly by appending alpha channel
# to hex string
g.fgcolor = g.fgcolor + "77"
g.width = 20
kgml_map = KGMLCanvas(pathway)
kgml_map.draw(p[0].output_stem + "_transparency.pdf")
# We test rendering of the original KGML for KO3070,
# modifying the alpha channel for each ortholog entry
with open(p[1].infilename) as f:
pathway = read(f)
orthologs = list(pathway.orthologs)
# Use Biopython's ColorSpiral to generate colours
cs = ColorSpiral(a=2, b=0.2, v_init=0.85, v_final=0.5, jitter=0.03)
colors = cs.get_colors(len(orthologs))
for o, c in zip(orthologs, colors):
# Modify color tuples to add alpha channel
c = c + (0.5,)
for g in o.graphics:
g.bgcolor = c
kgml_map = KGMLCanvas(pathway)
pathway.image = p[1].pathway_image
kgml_map.import_imagemap = p[1].show_pathway_image
kgml_map.draw(p[1].output_stem + "_transparency.pdf")
if __name__ == "__main__":
runner = unittest.TextTestRunner(verbosity=2)
unittest.main(testRunner=runner)