How to get GO IDs up both the ‘is a’ and ‘part of’ relationships

  1. Download Ontologies, if necessary

  2. Choose a set of GO IDs to print

  3. GO colors for plotting

  4. Traverse up or down the GO DAG with no, all, or some optional relationships(a): * 4a) No optional relationships, like part_of and regulates * 4b) All relationships * 4c) Relationship: part_of * 4d) Relationship: regulates * 4e) Relationship: positively_regulates * 4f) Relationship: negatively_regulates

a) The is_a relationships will always be traversed to find the children or parents of a GO term

Plots with and without relationships

Arrows denote the relationships, is_a (solid black arrows) and part_of (dashed orange arrows), in the plots below:

With no optional relationships

With the optional part_of relationship

is_a

part_of

Notice that the text in the GO term box is different if you are plotting using optional relationships. The bottom GO term text is:

  • Left plot: GO:0043231 L3 D3 d0

  • Right plot: GO:0043231 D3 R4 d0

L (Level) is the minimum distance from root term, cellular_component, to the bottom term
D (Depth), is the maximum distance from root term, cellular_component, to the bottom term using only is_a relationships
R (Depth using optional relationships), is the maximum distance from root term, cellular_component, to the bottom term using both is_a and optional relationships

In this example D (Depth) from the root to the bottom term is 3 (light blue lines).

And R (Depth using optional relationships) from the root to the bottom is 4 (dark purple lines) because it traverses the part_of relationships

depth explained

1. Download Ontologies, if necessary

Load all relationships into a GODag object.
Specific relationships, like part_of or regulates, will be chosen using GoSubDag.

from goatools.base import get_godag
godag = get_godag("go-basic.obo", optional_attrs={'relationship'})

# We are going to use a GO DAG subset for this example
godag = get_godag("../tests/data/i126/viral_gene_silence.obo", optional_attrs={'relationship'})
requests.get(http://purl.obolibrary.org/obo/go/go-basic.obo, stream=True)
  WROTE: go-basic.obo

go-basic.obo: fmt(1.2) rel(2020-12-08) 47,295 GO Terms; optional_attrs(relationship)
  EXISTS: ../tests/data/i126/viral_gene_silence.obo
../tests/data/i126/viral_gene_silence.obo: fmt(1.2) rel(2019-04-17) 79 GO Terms; optional_attrs(relationship)

2. Choose a set of GO IDs to print

This example will use all GO IDs above GO:0060150, viral triggering of virus induced gene silencing

virus_trigger_silence = 'GO:0060150'

3. GO colors

The GO DAG and go-color files for this example are located in: ./tests/data/i126

GO colors are stored in viral_gene_silence.txt as 6-digit hax numbers, like #ffe5b4.
The color file looks like this:

Relationship, part_of, shall be orange (#ffe5b4):
#ffe5b4 GO:0002376 immune system process
#ffe5b4 GO:0050896 response to stimulus
#ffe5b4 GO:0051704 multi-organism process
...
from goatools.cli.gos_get import get_go2color

go2hexcolor = get_go2color('../tests/data/i126/viral_gene_silence.txt')

# For printing GO terms and their color names to the print
hex2color = {
    '#e6fad2': 'green',
    '#ffe5b4': 'orange',
    '#d2d2fa': 'purple',
    '#d2fafa': 'cyan',
    '#fad2fa': 'magenta',
    '#d8dcd6': 'grey',
}
GREY = '#d8dcd6'
GO2COLORNAME = {go: hex2color[rgb] for go, rgb in go2hexcolor.items()}

4. Traversals up the GO DAG

4a. No optional relationships loaded

Do not traverse any optional relationships, like part_of and regulates

from goatools.gosubdag.gosubdag import GoSubDag

gosubdag_r0 = GoSubDag({virus_trigger_silence}, godag)
 GoSubDag:   1 sources in  13 GOs rcnt(True). 0 alt GO IDs
 GoSubDag: namedtuple fields: NS level depth GO alt GO_name dcnt D1 id
 GoSubDag: relationships: set()
# Decide which GO fields to print. Save in prtfmt

# Print one namedtuple
print(next(iter(gosubdag_r0.go2nt.values())))

# Use some namedtuple fields in print of GO terms
PRTFMT = '{NS} {GO} D-{depth:02} {color:7} {dcnt:2} {GO_name}'
NtGo(NS='BP', level=5, depth=8, GO='GO:0060148', alt='', GO_name='positive regulation of posttranscriptional gene silencing', dcnt=1, D1='A', id='GO:0060148')
# Report all ancestors of term, GO:001922 (colored grey)
grey_go = 'GO:0019222'
ancestors = gosubdag_r0.rcntobj.go2ancestors[grey_go]

def prt_goids(goids, gosubdag):
    """Print GO IDs"""
    nts = [gosubdag.go2nt[go] for go in goids]
    for nt_go in sorted(nts, key=lambda nt: [nt.depth, nt.dcnt]):
        color = GO2COLORNAME[nt_go.GO]
        print(PRTFMT.format(color=color, **nt_go._asdict()))

prt_goids(ancestors, gosubdag_r0)
BP GO:0008150 D-00 green   50 biological_process
BP GO:0065007 D-01 green   19 biological regulation
BP GO:0050789 D-02 green   18 regulation of biological process

Plot no optional relationships, just using is_a (runtime script):

Color the term, GO:0019222 regulation of metabolic process, with xkcd’s light grey (#d8dcd6)

$ go_plot.py -o viral_r0.png GO:0060150 GO:0019222#d8dcd6 --obo=viral_gene_silence.obo --go_color_file=viral_gene_silence.txt

Plot no optional relationships, just using is_a (code):

from goatools.gosubdag.plot.gosubdag_plot import GoSubDagPlot

# Color the GO of interest in a copy of the color dictionary
go2col = dict(go2hexcolor)
go2col[grey_go] = GREY

pltobj = GoSubDagPlot(gosubdag_r0, go2color=go2col)
pltobj.plt_dag('viral_r0.png')
    1 usr  13 GOs  WROTE: viral_r0.png

4b. All relationships

Traverse all optional relationships, like part_of and regulates

gosubdag_r1 = GoSubDag({virus_trigger_silence}, godag, relationships=True)

# Report all ancestors of grey term
grey_go = 'GO:0010468'  # regulation of gene expression
ancestors = gosubdag_r1.rcntobj.go2ancestors[grey_go]
prt_goids(ancestors, gosubdag_r1)
 GoSubDag:   1 sources in  51 GOs rcnt(True). 0 alt GO IDs
 GoSubDag: namedtuple fields: NS level depth reldepth GO alt GO_name dcnt D1 childcnt REL REL_short rel id
 GoSubDag: relationships: {'negatively_regulates', 'regulates', 'part_of', 'positively_regulates'}
BP GO:0008150 D-00 green   50 biological_process
BP GO:0008152 D-01 cyan    17 metabolic process
BP GO:0065007 D-01 green   19 biological regulation
BP GO:0071704 D-02 purple  14 organic substance metabolic process
BP GO:0050789 D-02 green   18 regulation of biological process
BP GO:0019222 D-03 green   13 regulation of metabolic process
BP GO:0043170 D-03 cyan    13 macromolecule metabolic process
BP GO:0010467 D-04 cyan    10 gene expression
BP GO:0060255 D-04 green   11 regulation of macromolecule metabolic process

Plot all relationships (runtime script):

$ go_plot.py -o viral_r1.png -r GO:0060150 GO:0010468#d8dcd6 --obo=viral_gene_silence.obo --go_color_file=viral_gene_silence.txt

Plot all relationships (code):

# Color the GO of interest in a copy of the color dictionary
go2col = dict(go2hexcolor)
go2col[grey_go] = GREY

pltobj = GoSubDagPlot(gosubdag_r1, go2color=go2col)
pltobj.plt_dag('viral_r1.png')
    1 usr  51 GOs  WROTE: viral_r1.png

4c. Relationship: part_of

gosubdag_partof = GoSubDag({virus_trigger_silence}, godag, relationships={'part_of',})

# Report all ancestors of grey term
grey_go = 'GO:0010468'  # regulation of gene expression
ancestors = gosubdag_partof.rcntobj.go2ancestors[grey_go]
prt_goids(ancestors, gosubdag_partof)
 GoSubDag:   1 sources in  38 GOs rcnt(True). 0 alt GO IDs
 GoSubDag: namedtuple fields: NS level depth reldepth GO alt GO_name dcnt D1 childcnt REL REL_short rel id
 GoSubDag: relationships: {'part_of'}
BP GO:0008150 D-00 green   50 biological_process
BP GO:0065007 D-01 green   19 biological regulation
BP GO:0050789 D-02 green   18 regulation of biological process
BP GO:0019222 D-03 green   13 regulation of metabolic process
BP GO:0060255 D-04 green   11 regulation of macromolecule metabolic process

Plot part_of relationships (runtime script):

Orange dashed lines represent part_of relationships:

$ go_plot.py -o viral_r_partof.png --relationships=part_of GO:0010468#d8dcd6 GO:0060150 --obo=viral_gene_silence.obo --go_color_file=viral_gene_silence.txt 

Plot part_of relationships (code)

# Color the GO of interest in a copy of the color dictionary
go2col = dict(go2hexcolor)
go2col[grey_go] = GREY

pltobj = GoSubDagPlot(gosubdag_partof, go2color=go2col)
pltobj.plt_dag('viral_r_partof.png')
    1 usr  38 GOs  WROTE: viral_r_partof.png

4d. Relationship: regulates

gosubdag_reg = GoSubDag({virus_trigger_silence}, godag, relationships={'regulates',})

# Report all ancestors of grey term
grey_go = 'GO:0050794'  # regulation of cellular process
ancestors = gosubdag_reg.rcntobj.go2ancestors[grey_go]
prt_goids(ancestors, gosubdag_reg)
 GoSubDag:   1 sources in  26 GOs rcnt(True). 0 alt GO IDs
 GoSubDag: namedtuple fields: NS level depth reldepth GO alt GO_name dcnt D1 childcnt REL REL_short rel id
 GoSubDag: relationships: {'regulates'}
BP GO:0008150 D-00 green   50 biological_process
BP GO:0009987 D-01 magenta  8 cellular process
BP GO:0065007 D-01 green   19 biological regulation
BP GO:0050789 D-02 green   18 regulation of biological process

Plot regulates relationships (runtime script):

Purple dashed lines represent regulates relationships:

$ go_plot.py -o viral_reg.png --relationships=regulates GO:0050794#d8dcd6 GO:0060150 --obo=viral_gene_silence.obo --go_color_file=viral_gene_silence.txt 

Plot regulates relationships (code):

# Color the GO of interest in a copy of the color dictionary
go2col = dict(go2hexcolor)
go2col[grey_go] = GREY

pltobj = GoSubDagPlot(gosubdag_reg, go2color=go2col)
pltobj.plt_dag('viral_reg.png')
    1 usr  26 GOs  WROTE: viral_reg.png

4e. Relationship: positively_regulates

gosubdag_regp = GoSubDag({virus_trigger_silence}, godag, relationships={'positively_regulates',})
 GoSubDag:   1 sources in  22 GOs rcnt(True). 0 alt GO IDs
 GoSubDag: namedtuple fields: NS level depth reldepth GO alt GO_name dcnt D1 childcnt REL REL_short rel id
 GoSubDag: relationships: {'positively_regulates'}
# Report all ancestors of grey term
grey_go = 'GO:0048522'  # positive regulation of cellular process
ancestors = gosubdag_regp.rcntobj.go2ancestors[grey_go]
prt_goids(ancestors, gosubdag_regp)
BP GO:0008150 D-00 green   50 biological_process
BP GO:0009987 D-01 magenta  5 cellular process
BP GO:0065007 D-01 green   19 biological regulation
BP GO:0050789 D-02 green   18 regulation of biological process
BP GO:0048518 D-03 green    3 positive regulation of biological process
BP GO:0050794 D-03 green    5 regulation of cellular process

Plot positively_regulates relationships (runtime script):

Magenta dashed lines represent positively regulates relationships:

$ go_plot.py -o viral_rp.png --relationships=positively_regulates GO:0048522#d8dcd6 GO:0060150 --obo=viral_gene_silence.obo --go_color_file=viral_gene_silence.txt 

Plot positively_regulates relationships (code):

# Color the GO of interest in a copy of the color dictionary
go2col = dict(go2hexcolor)
go2col[grey_go] = GREY

pltobj = GoSubDagPlot(gosubdag_regp, go2color=go2col)
pltobj.plt_dag('viral_rp.png')
    1 usr  22 GOs  WROTE: viral_rp.png

4f. Relationship: negatively_regulates

gosubdag_regn = GoSubDag({virus_trigger_silence}, godag, relationships={'regulates', 'negatively_regulates',})

# Report all ancestors of grey term
grey_go = 'GO:0050794'  # regulation of cellular process
ancestors = gosubdag_regn.rcntobj.go2ancestors[grey_go]
prt_goids(ancestors, gosubdag_regn)
 GoSubDag:   1 sources in  26 GOs rcnt(True). 0 alt GO IDs
 GoSubDag: namedtuple fields: NS level depth reldepth GO alt GO_name dcnt D1 childcnt REL REL_short rel id
 GoSubDag: relationships: {'negatively_regulates', 'regulates'}
BP GO:0008150 D-00 green   50 biological_process
BP GO:0009987 D-01 magenta  8 cellular process
BP GO:0065007 D-01 green   19 biological regulation
BP GO:0050789 D-02 green   18 regulation of biological process

Plot negatively_regulates relationships (runtime script):

Cyan dashed lines represent negatively regulates relationships

NOTE: In this example, the following relationships argument will have no affect because no green GO IDs have the relationship, negatively_regulates:
–relationships=negatively_regulates

To see negatively_regulates, specify both regulates and negatively_regulates:
–relationships=regulates,negatively_regulates

Note that specifying both regulates and negatively_regulates will case the magenta GO IDs to be traversed. The magenta GO IDs are accessed by both the regulates and the positively_regulates relationships.

$ go_plot.py -o viral_rn.png --relationships=regulates,negatively_regulates GO:0050794#d8dcd6 GO:0060150 --obo=viral_gene_silence.obo --go_color_file=viral_gene_silence.txt

Plot negatively_regulates relationships (code):

# Color the GO of interest in a copy of the color dictionary
go2col = dict(go2hexcolor)
go2col[grey_go] = GREY

pltobj = GoSubDagPlot(gosubdag_regn, go2color=go2col)
pltobj.plt_dag('viral_rn.png')
    1 usr  26 GOs  WROTE: viral_rn.png

Copyright (C) 2016-present, DV Klopfenstein et al. All rights reserved