-
Notifications
You must be signed in to change notification settings - Fork 0
/
core.py
140 lines (121 loc) · 4.97 KB
/
core.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
""" wc_onto
:Author: Jonathan Karr <karr@mssm.edu>
:Date: 2019-03-26
:Copyright: 2019, Karr Lab
:License: MIT
"""
import io
import os
import pkg_resources
import pronto
import pronto.utils.warnings
import requests
import urllib
import warnings
import wc_onto.config.core
config = wc_onto.config.core.get_config()['wc_onto']
BIO_PORTAL_API_KEY = config['bioportal']['key']
if 0 == len(BIO_PORTAL_API_KEY):
raise ValueError(f"BIO_PORTAL_API_KEY not initialized")
DEPENDENT_ONTOLOGIES = {
'BFO': {
'url': 'http://purl.obolibrary.org/obo/bfo.owl',
'format': 'owl',
},
'BRO': {
'url': 'http://data.bioontology.org/ontologies/BRO/submissions/14/download',
'params': {
'headers': {'Authorization': 'apikey token=' + BIO_PORTAL_API_KEY},
},
'format': 'owl'
},
'COMODI': {
'url': 'https://comodi.bio.informatik.uni-rostock.de/latest/comodi.owl',
'format': 'owl',
},
'FOAF': {
'url': 'http://data.bioontology.org/ontologies/FOAF/download?download_format=rdf',
'params': {
'headers': {'Authorization': 'apikey token=' + BIO_PORTAL_API_KEY},
},
'format': 'rdf',
},
'IAO': {
'url': 'http://purl.obolibrary.org/obo/iao.owl',
'format': 'owl',
},
'KISAO': {
'url': 'http://purl.obolibrary.org/obo/kisao.owl',
'format': 'owl',
},
'MATR': {
'url': 'http://data.bioontology.org/ontologies/MATR/submissions/1/download?download_format=rdf',
'params': {
'headers': {'Authorization': 'apikey token=' + BIO_PORTAL_API_KEY},
},
'format': 'rdf',
},
'SBO': {
'url': 'http://purl.obolibrary.org/obo/sbo.owl',
'format': 'owl',
},
'SEPIO': {
'url': 'http://purl.obolibrary.org/obo/sepio.owl',
'format': 'owl',
},
}
DEPENDENT_ONTOLOGIES_DIR = config['cache_dir']
def get_dependent_ontologies(ontologies=DEPENDENT_ONTOLOGIES, dir=DEPENDENT_ONTOLOGIES_DIR):
""" Download dependent ontologies
Args:
ontologies (:obj:`dict`, optional): dictionary that maps ids of ontologies to information about where to obtain them
dir (:obj:`str`, optional): directory to save ontology
"""
if not os.path.isdir(dir):
os.makedirs(dir)
for id, source in ontologies.items():
get_ontology(id, source, dir=dir)
def get_ontology(id, source, dir=DEPENDENT_ONTOLOGIES_DIR):
""" Download ontology to disk
Args:
id (:obj:`str`): id of ontology
source (:obj:`dict`): information about source (URL, format) of ontology
dir (:obj:`str`, optional): directory to save ontology
"""
path = os.path.join(dir, id + '.' + source['format'])
if os.path.isfile(path):
return
session = requests.Session()
parsed_url = urllib.parse.urlparse(source['url'])
session.mount(parsed_url.scheme + '://' + parsed_url.netloc, requests.adapters.HTTPAdapter(max_retries=5))
params = source.get('params', {})
try:
response = session.get(source['url'], **params)
except requests.exceptions.ConnectionError:
raise Exception('Unable to download dependent ontology {}'.format(id), UserWarning)
if response.status_code >= 200 and response.status_code < 300:
with open(path, 'wb') as file:
file.write(response.content)
else:
raise Exception('Unable to download dependent ontology {}: {}: {}'.format(id, response.status_code, response.reason), UserWarning)
get_dependent_ontologies()
with warnings.catch_warnings():
warnings.filterwarnings('ignore', message=r'unknown element in `owl:Class`', category=pronto.utils.warnings.SyntaxWarning)
warnings.filterwarnings('ignore', message=r'unknown element in `owl:ObjectProperty`', category=pronto.utils.warnings.SyntaxWarning)
warnings.filterwarnings('ignore', message=r'`owl:disjointWith` element without', category=pronto.utils.warnings.SyntaxWarning)
warnings.filterwarnings('ignore', message=r'cannot process plain `owl:AnnotationProperty`',
category=pronto.utils.warnings.NotImplementedWarning)
warnings.filterwarnings('ignore', message=r'.*? no `xsd:datatype`', category=pronto.utils.warnings.SyntaxWarning)
warnings.filterwarnings('ignore', message=r'several names found', category=pronto.utils.warnings.SyntaxWarning)
warnings.filterwarnings('ignore', message=r"unknown axiom property: 'http:\/\/www\.w3\.org\/2000\/01\/rdf-schema#",
category=pronto.utils.warnings.SyntaxWarning)
warnings.filterwarnings('ignore', message=r'unsound encoding', category=UnicodeWarning)
filename = pkg_resources.resource_filename(
'wc_onto', os.path.join('onto.obo'))
cleaned_file = io.BytesIO()
with open(filename, 'rb') as file:
for line in file:
cleaned_file.write(line.replace(b'\r', b'\n'))
cleaned_file.seek(0)
onto = pronto.Ontology(cleaned_file)
# :obj:`pronto.Ontology`: whole-cell modeling ontology