gsrap 0.8.2__py3-none-any.whl → 0.8.3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -75,6 +75,7 @@ def main():
75
75
  parsedb_parser.add_argument("-z", "--initialize", metavar='', type=str, default='-', help="Initialize the universe on the provided medium. By default, the first medium in --media is used. Use 'none' to avoid initialization.")
76
76
  parsedb_parser.add_argument("--precursors", action='store_true', help="Verify biosynthesis of biomass precursors and show blocked ones.")
77
77
  parsedb_parser.add_argument("--biosynth", action='store_true', help="Check biosynthesis of all metabolites and detect dead-ends.")
78
+ parsedb_parser.add_argument("-t", "--taxon", metavar='', type=str, default='-', help="High-level taxon of interest. If provided, it must follow the syntax '{level}:{name}', where {level} is 'kingdom' or 'phylum'.")
78
79
  parsedb_parser.add_argument("-e", "--eggnog", nargs='+', metavar='', type=str, default='-', help="Path to the optional eggnog-mapper annotation table(s).")
79
80
  parsedb_parser.add_argument("-k", "--keggorg", metavar='', type=str, default='-', help="A single KEGG Organism code. If provided, it takes precedence over --eggnog.")
80
81
  parsedb_parser.add_argument("--goodbefore", metavar='', type=str, default='-', help="Syntax is {pure_mid}-{rid1}-{rid2}. From top to bottom, build the universe until reaction {rid1}, transport {rid2} and metabolite {pure_mid} are reached.")
gsrap/__init__.py CHANGED
@@ -75,6 +75,7 @@ def main():
75
75
  parsedb_parser.add_argument("-z", "--initialize", metavar='', type=str, default='-', help="Initialize the universe on the provided medium. By default, the first medium in --media is used. Use 'none' to avoid initialization.")
76
76
  parsedb_parser.add_argument("--precursors", action='store_true', help="Verify biosynthesis of biomass precursors and show blocked ones.")
77
77
  parsedb_parser.add_argument("--biosynth", action='store_true', help="Check biosynthesis of all metabolites and detect dead-ends.")
78
+ parsedb_parser.add_argument("-t", "--taxon", metavar='', type=str, default='-', help="High-level taxon of interest. If provided, it must follow the syntax '{level}:{name}', where {level} is 'kingdom' or 'phylum'.")
78
79
  parsedb_parser.add_argument("-e", "--eggnog", nargs='+', metavar='', type=str, default='-', help="Path to the optional eggnog-mapper annotation table(s).")
79
80
  parsedb_parser.add_argument("-k", "--keggorg", metavar='', type=str, default='-', help="A single KEGG Organism code. If provided, it takes precedence over --eggnog.")
80
81
  parsedb_parser.add_argument("--goodbefore", metavar='', type=str, default='-', help="Syntax is {pure_mid}-{rid1}-{rid2}. From top to bottom, build the universe until reaction {rid1}, transport {rid2} and metabolite {pure_mid} are reached.")
@@ -243,7 +243,38 @@ def format_expansion(logger, eggnog):
243
243
 
244
244
 
245
245
 
246
+ def check_taxon(logger, taxon, idcollection_dict):
247
+
248
+
249
+ # verify presence of needed assets
250
+ if 'ko_to_taxa' not in idcollection_dict.keys():
251
+ logger.error(f"Asset 'ko_to_taxa' not found in 'gsrap.maps'. Please update 'gsrap.maps' with 'gsrap getmaps'.")
252
+ return 1
253
+
254
+
255
+ # extract level and name
256
+ try: level, name = taxon.split(':')
257
+ except:
258
+ logger.error(f"Provided --taxon is not well formatted: '{taxon}'.")
259
+ return 1
260
+
261
+
262
+ # compute available levels and check
263
+ avail_levels = set(['kingdom', 'phylum'])
264
+ if level not in avail_levels:
265
+ logger.error(f"Provided level is not acceptable: '{level}' (see --taxon). Acceptable levels are {avail_levels}.")
266
+ return 1
267
+
268
+
269
+ # compute available taxa at input level
270
+ avail_taxa_at_level = set()
271
+ ko_to_taxa = idcollection_dict['ko_to_taxa']
272
+ for ko in ko_to_taxa.keys():
273
+ for taxon_name in ko_to_taxa[ko][level]:
274
+ avail_taxa_at_level.add(taxon_name)
275
+ if name not in avail_taxa_at_level:
276
+ logger.error(f"Provided taxon name is not acceptable: '{name}' (see --taxon). Acceptable taxon names for level '{level}' are {avail_taxa_at_level}.")
277
+ return 1
246
278
 
247
-
248
-
249
-
279
+
280
+ return 0
@@ -148,7 +148,7 @@ def write_excel_model(model, filepath, nofigs, memote_results_dict, df_E, df_B,
148
148
  else: df_T.append(row_dict)
149
149
 
150
150
  for g in model.genes:
151
- row_dict = {'gid': g.id, 'involved_in': '; '.join([r.id for r in g.reactions])}
151
+ row_dict = {'gid': g.id, 'name': g.name, 'involved_in': '; '.join([r.id for r in g.reactions])}
152
152
 
153
153
  for db in g.annotation.keys():
154
154
  annots = g.annotation[db]
@@ -171,7 +171,7 @@ def write_excel_model(model, filepath, nofigs, memote_results_dict, df_E, df_B,
171
171
  df_R = df_R[df_R_first_cols + sorted([c for c in df_R.columns if c not in df_R_first_cols])]
172
172
  df_T = df_T[df_R_first_cols + sorted([c for c in df_T.columns if c not in df_R_first_cols])]
173
173
  df_A = df_A[df_R_first_cols + sorted([c for c in df_A.columns if c not in df_R_first_cols])]
174
- df_G_first_cols = ['gid', 'involved_in']
174
+ df_G_first_cols = ['gid', 'name', 'involved_in']
175
175
  df_G = df_G[df_G_first_cols + sorted([c for c in df_G.columns if c not in df_G_first_cols])]
176
176
 
177
177
 
@@ -243,7 +243,38 @@ def format_expansion(logger, eggnog):
243
243
 
244
244
 
245
245
 
246
+ def check_taxon(logger, taxon, idcollection_dict):
247
+
248
+
249
+ # verify presence of needed assets
250
+ if 'ko_to_taxa' not in idcollection_dict.keys():
251
+ logger.error(f"Asset 'ko_to_taxa' not found in 'gsrap.maps'. Please update 'gsrap.maps' with 'gsrap getmaps'.")
252
+ return 1
253
+
254
+
255
+ # extract level and name
256
+ try: level, name = taxon.split(':')
257
+ except:
258
+ logger.error(f"Provided --taxon is not well formatted: '{taxon}'.")
259
+ return 1
260
+
261
+
262
+ # compute available levels and check
263
+ avail_levels = set(['kingdom', 'phylum'])
264
+ if level not in avail_levels:
265
+ logger.error(f"Provided level is not acceptable: '{level}' (see --taxon). Acceptable levels are {avail_levels}.")
266
+ return 1
267
+
268
+
269
+ # compute available taxa at input level
270
+ avail_taxa_at_level = set()
271
+ ko_to_taxa = idcollection_dict['ko_to_taxa']
272
+ for ko in ko_to_taxa.keys():
273
+ for taxon_name in ko_to_taxa[ko][level]:
274
+ avail_taxa_at_level.add(taxon_name)
275
+ if name not in avail_taxa_at_level:
276
+ logger.error(f"Provided taxon name is not acceptable: '{name}' (see --taxon). Acceptable taxon names for level '{level}' are {avail_taxa_at_level}.")
277
+ return 1
246
278
 
247
-
248
-
249
-
279
+
280
+ return 0
gsrap/commons/excelhub.py CHANGED
@@ -148,7 +148,7 @@ def write_excel_model(model, filepath, nofigs, memote_results_dict, df_E, df_B,
148
148
  else: df_T.append(row_dict)
149
149
 
150
150
  for g in model.genes:
151
- row_dict = {'gid': g.id, 'involved_in': '; '.join([r.id for r in g.reactions])}
151
+ row_dict = {'gid': g.id, 'name': g.name, 'involved_in': '; '.join([r.id for r in g.reactions])}
152
152
 
153
153
  for db in g.annotation.keys():
154
154
  annots = g.annotation[db]
@@ -171,7 +171,7 @@ def write_excel_model(model, filepath, nofigs, memote_results_dict, df_E, df_B,
171
171
  df_R = df_R[df_R_first_cols + sorted([c for c in df_R.columns if c not in df_R_first_cols])]
172
172
  df_T = df_T[df_R_first_cols + sorted([c for c in df_T.columns if c not in df_R_first_cols])]
173
173
  df_A = df_A[df_R_first_cols + sorted([c for c in df_A.columns if c not in df_R_first_cols])]
174
- df_G_first_cols = ['gid', 'involved_in']
174
+ df_G_first_cols = ['gid', 'name', 'involved_in']
175
175
  df_G = df_G[df_G_first_cols + sorted([c for c in df_G.columns if c not in df_G_first_cols])]
176
176
 
177
177
 
@@ -4,6 +4,7 @@ import pickle
4
4
 
5
5
 
6
6
  from .kdown import download_raw_txtfiles
7
+ from .kdown import create_dict_keggorg
7
8
  from .kdown import create_dict_ko
8
9
  from .kdown import create_dict_c
9
10
  from .kdown import create_dict_r
@@ -20,13 +21,19 @@ def do_kdown(logger, outdir, usecache, keeptmp):
20
21
  logger.info(f"Respectfully retrieving metabolic information from KEGG. Raw data are being saved into '{outdir}/kdown/'. Be patient, could take a couple of days...")
21
22
  os.makedirs(f'{outdir}/kdown/', exist_ok=True)
22
23
 
24
+
23
25
  response = download_raw_txtfiles(logger, outdir, usecache)
24
26
  if type(response) == int: return 1
25
27
  else: RELEASE_kegg = response
26
28
 
29
+
27
30
 
28
31
  logger.info("Parsing downloaded KEGG information...")
29
-
32
+
33
+ response = create_dict_keggorg(logger, outdir)
34
+ if type(response) == int: return 1
35
+ else: dict_keggorg = response
36
+
30
37
  response = create_dict_ko(logger, outdir)
31
38
  if type(response) == int: return 1
32
39
  else: dict_ko = response
@@ -49,7 +56,7 @@ def do_kdown(logger, outdir, usecache, keeptmp):
49
56
 
50
57
 
51
58
  # create 'idcollection_dict' and 'summary_dict' dictionaries
52
- idcollection_dict = create_idcollection_dict(dict_ko, dict_c, dict_r, dict_map, dict_md)
59
+ idcollection_dict = create_idcollection_dict(dict_keggorg, dict_ko, dict_c, dict_r, dict_map, dict_md)
53
60
  summary_dict = create_summary_dict(dict_c, dict_r, dict_map, dict_md)
54
61
 
55
62
 
@@ -57,7 +64,6 @@ def do_kdown(logger, outdir, usecache, keeptmp):
57
64
 
58
65
 
59
66
 
60
-
61
67
  def main(args, logger):
62
68
 
63
69
 
@@ -67,7 +73,7 @@ def main(args, logger):
67
73
  os.makedirs(f'{args.outdir}/', exist_ok=True)
68
74
 
69
75
 
70
- # KEGG
76
+ # KEGG download
71
77
  response = do_kdown(logger, args.outdir, args.usecache, args.keeptmp)
72
78
  if type(response) == int: return 1
73
79
  else: RELEASE_kegg, idcollection_dict, summary_dict = response[0], response[1], response[2]
@@ -76,7 +82,9 @@ def main(args, logger):
76
82
  # create 'gsrap.maps':
77
83
  with open(f'{args.outdir}/gsrap.maps', 'wb') as wb_handler:
78
84
  pickle.dump({
79
- 'RELEASE_kegg': RELEASE_kegg, 'idcollection_dict': idcollection_dict, 'summary_dict': summary_dict,
85
+ 'RELEASE_kegg': RELEASE_kegg,
86
+ 'idcollection_dict': idcollection_dict,
87
+ 'summary_dict': summary_dict,
80
88
  }, wb_handler)
81
89
  logger.info(f"'{args.outdir}/gsrap.maps' created!")
82
90
 
@@ -87,4 +95,5 @@ def main(args, logger):
87
95
  logger.info(f"Temporary raw files deleted!")
88
96
 
89
97
 
98
+
90
99
  return 0
@@ -34,6 +34,7 @@ def download_raw_txtfiles(logger, outdir, usecache):
34
34
  'orthology',
35
35
  'module',
36
36
  'pathway',
37
+ 'organism',
37
38
  ]
38
39
  for db in databases:
39
40
  time.sleep(0.5)
@@ -45,8 +46,9 @@ def download_raw_txtfiles(logger, outdir, usecache):
45
46
 
46
47
  # mix the items to download to be respectful/compliant
47
48
  items_to_download = []
48
-
49
49
  for db in databases:
50
+ if db == 'organism':
51
+ continue # here we just need the list
50
52
  with open(f"{outdir}/kdown/{db}.txt", 'r') as file:
51
53
  res_string = file.read()
52
54
  rows = res_string.split('\n')
@@ -54,7 +56,6 @@ def download_raw_txtfiles(logger, outdir, usecache):
54
56
  item_id = row.split('\t', 1)[0]
55
57
  if item_id == '': continue
56
58
  items_to_download.append({'db': db, 'id': item_id})
57
-
58
59
  random.shuffle(items_to_download)
59
60
 
60
61
 
@@ -79,6 +80,51 @@ def download_raw_txtfiles(logger, outdir, usecache):
79
80
 
80
81
 
81
82
 
83
+ def create_dict_keggorg(logger, outdir):
84
+
85
+ organisms_raw = open(f'{outdir}/kdown/organism.txt', 'r').read()
86
+
87
+ # create a dataframe listing all organisms in KEGG;
88
+ # columns are [tnumber, name, domain, kingdom, phylum, classification]
89
+ df = [] # list fo dicts
90
+ for line in organisms_raw.strip().split("\n"):
91
+ fields = line.split("\t")
92
+ if len(fields) == 4:
93
+ tnumber, keggorg, name, classification = fields
94
+ levels = classification.split(";")
95
+ domain = levels[0]
96
+ kingdom = levels[1]
97
+ phylum = levels[2]
98
+ df.append({
99
+ 'tnumber':tnumber,
100
+ 'keggorg': keggorg,
101
+ 'name': name,
102
+ 'domain': domain,
103
+ 'kingdom': kingdom,
104
+ 'phylum': phylum,
105
+ 'classification': classification
106
+ })
107
+ else:
108
+ # never verified during tests!
109
+ logger.warning(f'Strange number of fields found in this line of "organism.txt": """{line}""".')
110
+ df = pnd.DataFrame.from_records(df)
111
+ df = df.set_index('keggorg', drop=True, verify_integrity=True)
112
+
113
+
114
+ # convert dataframe to dict
115
+ dict_keggorg = {}
116
+ for keggorg, row in df.iterrows():
117
+ dict_keggorg[keggorg] = {
118
+ 'kingdom': row['kingdom'],
119
+ 'phylum': row['phylum'],
120
+ #'name': row['name'], # not strictly needed. Commented to save disk space.
121
+ }
122
+
123
+ if logger != None: logger.info(f'Number of unique items (org): {len(dict_keggorg.keys())}.')
124
+ return dict_keggorg
125
+
126
+
127
+
82
128
  def create_dict_ko(logger, outdir):
83
129
 
84
130
  dict_ko = {} # main output
@@ -98,6 +144,7 @@ def create_dict_ko(logger, outdir):
98
144
  'ecs': set(),
99
145
  'cogs': set(),
100
146
  'gos': set(),
147
+ 'keggorgs': set(),
101
148
  }
102
149
  else:
103
150
  logger.error(f"{ko_id} already included!")
@@ -175,7 +222,13 @@ def create_dict_ko(logger, outdir):
175
222
  gos = content[len('GO: '):].strip().split(' ')
176
223
  for go in gos:
177
224
  dict_ko[ko_id]['gos'].add(go)
178
-
225
+
226
+
227
+ # parse the organism-specific genes
228
+ if curr_header == 'GENES ':
229
+ keggorg = content.split(': ',1)[0]
230
+ dict_ko[ko_id]['keggorgs'].add(keggorg.lower()) # organism.txt has IDs in lowercase
231
+
179
232
 
180
233
  # parse the reactions
181
234
  if curr_header == 'REACTION ':
@@ -547,7 +600,7 @@ def create_dict_md(logger, outdir):
547
600
 
548
601
 
549
602
 
550
- def create_idcollection_dict(dict_ko, dict_c, dict_r, dict_map, dict_md):
603
+ def create_idcollection_dict(dict_keggorg, dict_ko, dict_c, dict_r, dict_map, dict_md):
551
604
 
552
605
  idcollection_dict = {}
553
606
 
@@ -620,6 +673,24 @@ def create_idcollection_dict(dict_ko, dict_c, dict_r, dict_map, dict_md):
620
673
  for go in dict_ko[ko_id]['gos']:
621
674
  idcollection_dict['ko_to_gos'][ko_id].add(go)
622
675
 
676
+
677
+ # creation of 'ko_to_keggorgs' skipped as it takes too much disk space. Replaced with 'ko_to_taxa'.
678
+ idcollection_dict['ko_to_taxa'] = {}
679
+ missing_keggorgs = set()
680
+ for ko_id in dict_ko.keys():
681
+ idcollection_dict['ko_to_taxa'][ko_id] = {'kingdom': set(), 'phylum': set()}
682
+ for keggorg in dict_ko[ko_id]['keggorgs']:
683
+ try:
684
+ kingdom = dict_keggorg[keggorg]['kingdom']
685
+ phylum = dict_keggorg[keggorg]['phylum']
686
+ except:
687
+ if keggorg not in missing_keggorgs:
688
+ missing_keggorgs.add(keggorg)
689
+ #print(f"Organism '{keggorg}' appears in 'orthology/' but not in 'organism.txt'.")
690
+ continue
691
+ idcollection_dict['ko_to_taxa'][ko_id]['kingdom'].add(kingdom)
692
+ idcollection_dict['ko_to_taxa'][ko_id]['phylum'].add(phylum)
693
+
623
694
 
624
695
  idcollection_dict['map_to_name'] = {}
625
696
  for map_id in dict_map.keys():
gsrap/getmaps/getmaps.py CHANGED
@@ -4,6 +4,7 @@ import pickle
4
4
 
5
5
 
6
6
  from .kdown import download_raw_txtfiles
7
+ from .kdown import create_dict_keggorg
7
8
  from .kdown import create_dict_ko
8
9
  from .kdown import create_dict_c
9
10
  from .kdown import create_dict_r
@@ -20,13 +21,19 @@ def do_kdown(logger, outdir, usecache, keeptmp):
20
21
  logger.info(f"Respectfully retrieving metabolic information from KEGG. Raw data are being saved into '{outdir}/kdown/'. Be patient, could take a couple of days...")
21
22
  os.makedirs(f'{outdir}/kdown/', exist_ok=True)
22
23
 
24
+
23
25
  response = download_raw_txtfiles(logger, outdir, usecache)
24
26
  if type(response) == int: return 1
25
27
  else: RELEASE_kegg = response
26
28
 
29
+
27
30
 
28
31
  logger.info("Parsing downloaded KEGG information...")
29
-
32
+
33
+ response = create_dict_keggorg(logger, outdir)
34
+ if type(response) == int: return 1
35
+ else: dict_keggorg = response
36
+
30
37
  response = create_dict_ko(logger, outdir)
31
38
  if type(response) == int: return 1
32
39
  else: dict_ko = response
@@ -49,7 +56,7 @@ def do_kdown(logger, outdir, usecache, keeptmp):
49
56
 
50
57
 
51
58
  # create 'idcollection_dict' and 'summary_dict' dictionaries
52
- idcollection_dict = create_idcollection_dict(dict_ko, dict_c, dict_r, dict_map, dict_md)
59
+ idcollection_dict = create_idcollection_dict(dict_keggorg, dict_ko, dict_c, dict_r, dict_map, dict_md)
53
60
  summary_dict = create_summary_dict(dict_c, dict_r, dict_map, dict_md)
54
61
 
55
62
 
@@ -57,7 +64,6 @@ def do_kdown(logger, outdir, usecache, keeptmp):
57
64
 
58
65
 
59
66
 
60
-
61
67
  def main(args, logger):
62
68
 
63
69
 
@@ -67,7 +73,7 @@ def main(args, logger):
67
73
  os.makedirs(f'{args.outdir}/', exist_ok=True)
68
74
 
69
75
 
70
- # KEGG
76
+ # KEGG download
71
77
  response = do_kdown(logger, args.outdir, args.usecache, args.keeptmp)
72
78
  if type(response) == int: return 1
73
79
  else: RELEASE_kegg, idcollection_dict, summary_dict = response[0], response[1], response[2]
@@ -76,7 +82,9 @@ def main(args, logger):
76
82
  # create 'gsrap.maps':
77
83
  with open(f'{args.outdir}/gsrap.maps', 'wb') as wb_handler:
78
84
  pickle.dump({
79
- 'RELEASE_kegg': RELEASE_kegg, 'idcollection_dict': idcollection_dict, 'summary_dict': summary_dict,
85
+ 'RELEASE_kegg': RELEASE_kegg,
86
+ 'idcollection_dict': idcollection_dict,
87
+ 'summary_dict': summary_dict,
80
88
  }, wb_handler)
81
89
  logger.info(f"'{args.outdir}/gsrap.maps' created!")
82
90
 
@@ -87,4 +95,5 @@ def main(args, logger):
87
95
  logger.info(f"Temporary raw files deleted!")
88
96
 
89
97
 
98
+
90
99
  return 0
gsrap/getmaps/kdown.py CHANGED
@@ -34,6 +34,7 @@ def download_raw_txtfiles(logger, outdir, usecache):
34
34
  'orthology',
35
35
  'module',
36
36
  'pathway',
37
+ 'organism',
37
38
  ]
38
39
  for db in databases:
39
40
  time.sleep(0.5)
@@ -45,8 +46,9 @@ def download_raw_txtfiles(logger, outdir, usecache):
45
46
 
46
47
  # mix the items to download to be respectful/compliant
47
48
  items_to_download = []
48
-
49
49
  for db in databases:
50
+ if db == 'organism':
51
+ continue # here we just need the list
50
52
  with open(f"{outdir}/kdown/{db}.txt", 'r') as file:
51
53
  res_string = file.read()
52
54
  rows = res_string.split('\n')
@@ -54,7 +56,6 @@ def download_raw_txtfiles(logger, outdir, usecache):
54
56
  item_id = row.split('\t', 1)[0]
55
57
  if item_id == '': continue
56
58
  items_to_download.append({'db': db, 'id': item_id})
57
-
58
59
  random.shuffle(items_to_download)
59
60
 
60
61
 
@@ -79,6 +80,51 @@ def download_raw_txtfiles(logger, outdir, usecache):
79
80
 
80
81
 
81
82
 
83
+ def create_dict_keggorg(logger, outdir):
84
+
85
+ organisms_raw = open(f'{outdir}/kdown/organism.txt', 'r').read()
86
+
87
+ # create a dataframe listing all organisms in KEGG;
88
+ # columns are [tnumber, name, domain, kingdom, phylum, classification]
89
+ df = [] # list fo dicts
90
+ for line in organisms_raw.strip().split("\n"):
91
+ fields = line.split("\t")
92
+ if len(fields) == 4:
93
+ tnumber, keggorg, name, classification = fields
94
+ levels = classification.split(";")
95
+ domain = levels[0]
96
+ kingdom = levels[1]
97
+ phylum = levels[2]
98
+ df.append({
99
+ 'tnumber':tnumber,
100
+ 'keggorg': keggorg,
101
+ 'name': name,
102
+ 'domain': domain,
103
+ 'kingdom': kingdom,
104
+ 'phylum': phylum,
105
+ 'classification': classification
106
+ })
107
+ else:
108
+ # never verified during tests!
109
+ logger.warning(f'Strange number of fields found in this line of "organism.txt": """{line}""".')
110
+ df = pnd.DataFrame.from_records(df)
111
+ df = df.set_index('keggorg', drop=True, verify_integrity=True)
112
+
113
+
114
+ # convert dataframe to dict
115
+ dict_keggorg = {}
116
+ for keggorg, row in df.iterrows():
117
+ dict_keggorg[keggorg] = {
118
+ 'kingdom': row['kingdom'],
119
+ 'phylum': row['phylum'],
120
+ #'name': row['name'], # not strictly needed. Commented to save disk space.
121
+ }
122
+
123
+ if logger != None: logger.info(f'Number of unique items (org): {len(dict_keggorg.keys())}.')
124
+ return dict_keggorg
125
+
126
+
127
+
82
128
  def create_dict_ko(logger, outdir):
83
129
 
84
130
  dict_ko = {} # main output
@@ -98,6 +144,7 @@ def create_dict_ko(logger, outdir):
98
144
  'ecs': set(),
99
145
  'cogs': set(),
100
146
  'gos': set(),
147
+ 'keggorgs': set(),
101
148
  }
102
149
  else:
103
150
  logger.error(f"{ko_id} already included!")
@@ -175,7 +222,13 @@ def create_dict_ko(logger, outdir):
175
222
  gos = content[len('GO: '):].strip().split(' ')
176
223
  for go in gos:
177
224
  dict_ko[ko_id]['gos'].add(go)
178
-
225
+
226
+
227
+ # parse the organism-specific genes
228
+ if curr_header == 'GENES ':
229
+ keggorg = content.split(': ',1)[0]
230
+ dict_ko[ko_id]['keggorgs'].add(keggorg.lower()) # organism.txt has IDs in lowercase
231
+
179
232
 
180
233
  # parse the reactions
181
234
  if curr_header == 'REACTION ':
@@ -547,7 +600,7 @@ def create_dict_md(logger, outdir):
547
600
 
548
601
 
549
602
 
550
- def create_idcollection_dict(dict_ko, dict_c, dict_r, dict_map, dict_md):
603
+ def create_idcollection_dict(dict_keggorg, dict_ko, dict_c, dict_r, dict_map, dict_md):
551
604
 
552
605
  idcollection_dict = {}
553
606
 
@@ -620,6 +673,24 @@ def create_idcollection_dict(dict_ko, dict_c, dict_r, dict_map, dict_md):
620
673
  for go in dict_ko[ko_id]['gos']:
621
674
  idcollection_dict['ko_to_gos'][ko_id].add(go)
622
675
 
676
+
677
+ # creation of 'ko_to_keggorgs' skipped as it takes too much disk space. Replaced with 'ko_to_taxa'.
678
+ idcollection_dict['ko_to_taxa'] = {}
679
+ missing_keggorgs = set()
680
+ for ko_id in dict_ko.keys():
681
+ idcollection_dict['ko_to_taxa'][ko_id] = {'kingdom': set(), 'phylum': set()}
682
+ for keggorg in dict_ko[ko_id]['keggorgs']:
683
+ try:
684
+ kingdom = dict_keggorg[keggorg]['kingdom']
685
+ phylum = dict_keggorg[keggorg]['phylum']
686
+ except:
687
+ if keggorg not in missing_keggorgs:
688
+ missing_keggorgs.add(keggorg)
689
+ #print(f"Organism '{keggorg}' appears in 'orthology/' but not in 'organism.txt'.")
690
+ continue
691
+ idcollection_dict['ko_to_taxa'][ko_id]['kingdom'].add(kingdom)
692
+ idcollection_dict['ko_to_taxa'][ko_id]['phylum'].add(phylum)
693
+
623
694
 
624
695
  idcollection_dict['map_to_name'] = {}
625
696
  for map_id in dict_map.keys():
@@ -27,9 +27,8 @@ def parse_eggnog(model, eggnog, idcollection_dict):
27
27
 
28
28
 
29
29
  # PART 2. get reactions in the organism (even the GPR is not complete)
30
- kr_to_kos = idcollection_dict['kr_to_kos']
31
30
  krs_org = set()
32
- for kr, kos in kr_to_kos.items():
31
+ for kr, kos in idcollection_dict['kr_to_kos'].items():
33
32
  if any([ko in kos_org for ko in kos]):
34
33
  krs_org.add(kr)
35
34
 
@@ -49,9 +48,34 @@ def parse_keggorg(keggorg, outdir, idcollection_dict):
49
48
 
50
49
 
51
50
  # PART 2. get reactions in the organism (even the GPR is not complete)
52
- kr_to_kos = idcollection_dict['kr_to_kos']
53
51
  krs_org = set()
54
- for kr, kos in kr_to_kos.items():
52
+ for kr, kos in idcollection_dict['kr_to_kos'].items():
53
+ if any([ko in kos_org for ko in kos]):
54
+ krs_org.add(kr)
55
+
56
+
57
+ return krs_org
58
+
59
+
60
+
61
+ def parse_taxon(taxon, idcollection_dict):
62
+
63
+
64
+ # formatting of --taxon was already verified at startup.
65
+ # also the presence of 'ko_to_taxa' in idcollection_dict was veryfied at startup.
66
+ level, name = taxon.split(':')
67
+
68
+
69
+ # PART 1. get KO codes available
70
+ kos_org = set()
71
+ for ko in idcollection_dict['ko_to_taxa'].keys():
72
+ if name in idcollection_dict['ko_to_taxa'][ko][level]:
73
+ kos_org.add(ko)
74
+
75
+
76
+ # PART 2. get reactions in the organism (even the GPR is not complete)
77
+ krs_org = set()
78
+ for kr, kos in idcollection_dict['kr_to_kos'].items():
55
79
  if any([ko in kos_org for ko in kos]):
56
80
  krs_org.add(kr)
57
81
 
@@ -60,7 +84,7 @@ def parse_keggorg(keggorg, outdir, idcollection_dict):
60
84
 
61
85
 
62
86
 
63
- def check_completeness(logger, model, progress, module, focus, eggnog, keggorg, idcollection_dict, summary_dict, outdir):
87
+ def check_completeness(logger, model, progress, module, focus, taxon, eggnog, keggorg, idcollection_dict, summary_dict, outdir):
64
88
  # check KEGG annotations in the universe model to get '%' of completeness per pathway/module.
65
89
 
66
90
 
@@ -69,6 +93,9 @@ def check_completeness(logger, model, progress, module, focus, eggnog, keggorg,
69
93
  if keggorg != '-': # keggorg has precedence
70
94
  kr_uni = parse_keggorg(keggorg, outdir, idcollection_dict)
71
95
  kr_uni_label = f"organism code '{keggorg}'"
96
+ elif taxon != '-':
97
+ kr_uni = parse_taxon(taxon, idcollection_dict)
98
+ kr_uni_label = f"taxon '{taxon}'"
72
99
  elif eggnog != '-':
73
100
  for eggfile in eggnog:
74
101
  eggset = parse_eggnog(model, eggfile, idcollection_dict)
@@ -17,6 +17,7 @@ from ..commons import show_contributions
17
17
  from ..commons import adjust_biomass_precursors
18
18
  from ..commons import count_undrawn_rids
19
19
  from ..commons import format_expansion
20
+ from ..commons import check_taxon
20
21
  from ..commons import download_keggorg
21
22
  from ..commons import initialize_model
22
23
  from ..commons import get_memote_results_dict
@@ -46,6 +47,7 @@ from .cycles import verify_egc_all
46
47
  def main(args, logger):
47
48
 
48
49
 
50
+ ###### FORMAT ARGS NOT REQUIRING RESOURCES
49
51
  # adjust out folder path
50
52
  while args.outdir.endswith('/'):
51
53
  args.outdir = args.outdir[:-1]
@@ -77,17 +79,8 @@ def main(args, logger):
77
79
  if args.onlyauthor == '-': args.onlyauthor = None
78
80
 
79
81
 
80
- # format the --eggnog param
81
- args.eggnog = format_expansion(logger, args.eggnog) # now 'args.eggnog' could still be '-'
82
-
83
- # get the kegg organism if requested
84
- if args.keggorg != '-':
85
- response = download_keggorg(logger, args.keggorg, args.outdir)
86
- if response == 1: return 1
87
-
88
-
89
-
90
82
 
83
+ ###### LOAD LOCAL RESOURCES
91
84
  # check and extract the required 'gsrap.maps' file
92
85
  if os.path.exists(f'{args.inmaps}') == False:
93
86
  logger.error(f"File 'gsrap.maps' not found at {args.inmaps}.")
@@ -108,9 +101,27 @@ def main(args, logger):
108
101
  kegg_compound_to_others = pickle.load(handle)
109
102
  with resources.path("gsrap.assets", f"kegg_reaction_to_others.pickle") as asset_path:
110
103
  with open(asset_path, 'rb') as handle:
111
- kegg_reaction_to_others = pickle.load(handle)
104
+ kegg_reaction_to_others = pickle.load(handle)
105
+
106
+
107
+
108
+ ###### FORMAT/CHECK FOCUSING ARGS
109
+ # format the --eggnog param
110
+ args.eggnog = format_expansion(logger, args.eggnog) # now 'args.eggnog' could still be '-'
111
+
112
+ # check the --taxon param
113
+ if args.taxon != '-':
114
+ response = check_taxon(logger, args.taxon, idcollection_dict)
115
+ if response == 1: return 1
116
+
117
+ # get the kegg organism if requested
118
+ if args.keggorg != '-':
119
+ response = download_keggorg(logger, args.keggorg, args.outdir)
120
+ if response == 1: return 1
121
+
112
122
 
113
123
 
124
+ # DOWNLOAD ONLINE RESOURCES
114
125
  # get dbuni and dbexp:
115
126
  logger.info("Downloading gsrap database...")
116
127
  response = get_databases(logger)
@@ -166,7 +177,7 @@ def main(args, logger):
166
177
 
167
178
  ###### CHECKS 1
168
179
  # check universe completness
169
- df_C = check_completeness(logger, universe, args.progress, args.module, args.focus, args.eggnog, args.keggorg, idcollection_dict, summary_dict, args.outdir)
180
+ df_C = check_completeness(logger, universe, args.progress, args.module, args.focus, args.taxon, args.eggnog, args.keggorg, idcollection_dict, summary_dict, args.outdir)
170
181
  if type(df_C)==int: return 1
171
182
 
172
183
 
@@ -27,9 +27,8 @@ def parse_eggnog(model, eggnog, idcollection_dict):
27
27
 
28
28
 
29
29
  # PART 2. get reactions in the organism (even the GPR is not complete)
30
- kr_to_kos = idcollection_dict['kr_to_kos']
31
30
  krs_org = set()
32
- for kr, kos in kr_to_kos.items():
31
+ for kr, kos in idcollection_dict['kr_to_kos'].items():
33
32
  if any([ko in kos_org for ko in kos]):
34
33
  krs_org.add(kr)
35
34
 
@@ -49,9 +48,34 @@ def parse_keggorg(keggorg, outdir, idcollection_dict):
49
48
 
50
49
 
51
50
  # PART 2. get reactions in the organism (even the GPR is not complete)
52
- kr_to_kos = idcollection_dict['kr_to_kos']
53
51
  krs_org = set()
54
- for kr, kos in kr_to_kos.items():
52
+ for kr, kos in idcollection_dict['kr_to_kos'].items():
53
+ if any([ko in kos_org for ko in kos]):
54
+ krs_org.add(kr)
55
+
56
+
57
+ return krs_org
58
+
59
+
60
+
61
+ def parse_taxon(taxon, idcollection_dict):
62
+
63
+
64
+ # formatting of --taxon was already verified at startup.
65
+ # also the presence of 'ko_to_taxa' in idcollection_dict was veryfied at startup.
66
+ level, name = taxon.split(':')
67
+
68
+
69
+ # PART 1. get KO codes available
70
+ kos_org = set()
71
+ for ko in idcollection_dict['ko_to_taxa'].keys():
72
+ if name in idcollection_dict['ko_to_taxa'][ko][level]:
73
+ kos_org.add(ko)
74
+
75
+
76
+ # PART 2. get reactions in the organism (even the GPR is not complete)
77
+ krs_org = set()
78
+ for kr, kos in idcollection_dict['kr_to_kos'].items():
55
79
  if any([ko in kos_org for ko in kos]):
56
80
  krs_org.add(kr)
57
81
 
@@ -60,7 +84,7 @@ def parse_keggorg(keggorg, outdir, idcollection_dict):
60
84
 
61
85
 
62
86
 
63
- def check_completeness(logger, model, progress, module, focus, eggnog, keggorg, idcollection_dict, summary_dict, outdir):
87
+ def check_completeness(logger, model, progress, module, focus, taxon, eggnog, keggorg, idcollection_dict, summary_dict, outdir):
64
88
  # check KEGG annotations in the universe model to get '%' of completeness per pathway/module.
65
89
 
66
90
 
@@ -69,6 +93,9 @@ def check_completeness(logger, model, progress, module, focus, eggnog, keggorg,
69
93
  if keggorg != '-': # keggorg has precedence
70
94
  kr_uni = parse_keggorg(keggorg, outdir, idcollection_dict)
71
95
  kr_uni_label = f"organism code '{keggorg}'"
96
+ elif taxon != '-':
97
+ kr_uni = parse_taxon(taxon, idcollection_dict)
98
+ kr_uni_label = f"taxon '{taxon}'"
72
99
  elif eggnog != '-':
73
100
  for eggfile in eggnog:
74
101
  eggset = parse_eggnog(model, eggfile, idcollection_dict)
gsrap/parsedb/parsedb.py CHANGED
@@ -17,6 +17,7 @@ from ..commons import show_contributions
17
17
  from ..commons import adjust_biomass_precursors
18
18
  from ..commons import count_undrawn_rids
19
19
  from ..commons import format_expansion
20
+ from ..commons import check_taxon
20
21
  from ..commons import download_keggorg
21
22
  from ..commons import initialize_model
22
23
  from ..commons import get_memote_results_dict
@@ -46,6 +47,7 @@ from .cycles import verify_egc_all
46
47
  def main(args, logger):
47
48
 
48
49
 
50
+ ###### FORMAT ARGS NOT REQUIRING RESOURCES
49
51
  # adjust out folder path
50
52
  while args.outdir.endswith('/'):
51
53
  args.outdir = args.outdir[:-1]
@@ -77,17 +79,8 @@ def main(args, logger):
77
79
  if args.onlyauthor == '-': args.onlyauthor = None
78
80
 
79
81
 
80
- # format the --eggnog param
81
- args.eggnog = format_expansion(logger, args.eggnog) # now 'args.eggnog' could still be '-'
82
-
83
- # get the kegg organism if requested
84
- if args.keggorg != '-':
85
- response = download_keggorg(logger, args.keggorg, args.outdir)
86
- if response == 1: return 1
87
-
88
-
89
-
90
82
 
83
+ ###### LOAD LOCAL RESOURCES
91
84
  # check and extract the required 'gsrap.maps' file
92
85
  if os.path.exists(f'{args.inmaps}') == False:
93
86
  logger.error(f"File 'gsrap.maps' not found at {args.inmaps}.")
@@ -108,9 +101,27 @@ def main(args, logger):
108
101
  kegg_compound_to_others = pickle.load(handle)
109
102
  with resources.path("gsrap.assets", f"kegg_reaction_to_others.pickle") as asset_path:
110
103
  with open(asset_path, 'rb') as handle:
111
- kegg_reaction_to_others = pickle.load(handle)
104
+ kegg_reaction_to_others = pickle.load(handle)
105
+
106
+
107
+
108
+ ###### FORMAT/CHECK FOCUSING ARGS
109
+ # format the --eggnog param
110
+ args.eggnog = format_expansion(logger, args.eggnog) # now 'args.eggnog' could still be '-'
111
+
112
+ # check the --taxon param
113
+ if args.taxon != '-':
114
+ response = check_taxon(logger, args.taxon, idcollection_dict)
115
+ if response == 1: return 1
116
+
117
+ # get the kegg organism if requested
118
+ if args.keggorg != '-':
119
+ response = download_keggorg(logger, args.keggorg, args.outdir)
120
+ if response == 1: return 1
121
+
112
122
 
113
123
 
124
+ # DOWNLOAD ONLINE RESOURCES
114
125
  # get dbuni and dbexp:
115
126
  logger.info("Downloading gsrap database...")
116
127
  response = get_databases(logger)
@@ -166,7 +177,7 @@ def main(args, logger):
166
177
 
167
178
  ###### CHECKS 1
168
179
  # check universe completness
169
- df_C = check_completeness(logger, universe, args.progress, args.module, args.focus, args.eggnog, args.keggorg, idcollection_dict, summary_dict, args.outdir)
180
+ df_C = check_completeness(logger, universe, args.progress, args.module, args.focus, args.taxon, args.eggnog, args.keggorg, idcollection_dict, summary_dict, args.outdir)
170
181
  if type(df_C)==int: return 1
171
182
 
172
183
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: gsrap
3
- Version: 0.8.2
3
+ Version: 0.8.3
4
4
  Summary:
5
5
  License: GNU General Public License v3.0
6
6
  Author: Gioele Lazzari
@@ -1,5 +1,5 @@
1
- gsrap/.ipynb_checkpoints/__init__-checkpoint.py,sha256=o4xMVuraz_Qnf6ZOtxcYjNl-a7-zlRuZsP-GEw8lP4I,15240
2
- gsrap/__init__.py,sha256=o4xMVuraz_Qnf6ZOtxcYjNl-a7-zlRuZsP-GEw8lP4I,15240
1
+ gsrap/.ipynb_checkpoints/__init__-checkpoint.py,sha256=Epw4X8B1O9kWnfC9v-X4jvDXE4X-G0XlRfkMdtNvMq0,15459
2
+ gsrap/__init__.py,sha256=Epw4X8B1O9kWnfC9v-X4jvDXE4X-G0XlRfkMdtNvMq0,15459
3
3
  gsrap/assets/.ipynb_checkpoints/PM1-checkpoint.csv,sha256=0qjaMVG_t9aFxbHbxON6ecmEUnWPwN9nhmxc61QFeCU,8761
4
4
  gsrap/assets/.ipynb_checkpoints/PM2A-checkpoint.csv,sha256=rjYTdwe8lpRS552BYiUP3J71juG2ywVdR5Sux6fjZTY,8816
5
5
  gsrap/assets/.ipynb_checkpoints/PM3B-checkpoint.csv,sha256=42IGX_2O5bRYSiHoMuVKT-T-bzVj0cSRZBvGOrbnQMA,8130
@@ -14,9 +14,9 @@ gsrap/assets/kegg_reaction_to_others.pickle,sha256=AGW8CGN5hKeXZoYn3JRF4Xu832WyN
14
14
  gsrap/commons/.ipynb_checkpoints/__init__-checkpoint.py,sha256=9lrb0sBFSWEgV_e5FYzSgjTbam8b959rW_8VuxQHt1M,268
15
15
  gsrap/commons/.ipynb_checkpoints/biomass-checkpoint.py,sha256=4u7WBaUgo42tBoXDU1D0VUjICatb44e0jfswZrBeHYs,17987
16
16
  gsrap/commons/.ipynb_checkpoints/coeffs-checkpoint.py,sha256=qI3_GuqHkeA2KbK9pYdkqJaFwYemAVZJGLRR4QtHt6w,19182
17
- gsrap/commons/.ipynb_checkpoints/downloads-checkpoint.py,sha256=e-7ffMD4R07MWEgXyGcwjhScbWnG7A3L100YWbpNMk0,8461
17
+ gsrap/commons/.ipynb_checkpoints/downloads-checkpoint.py,sha256=VnIFC6Y8QZ4oPyi04J_rtC2imzk5yOe0i5SpTP3MA6M,9713
18
18
  gsrap/commons/.ipynb_checkpoints/escherutils-checkpoint.py,sha256=_y0TgM0-Im0RT8W8z5rr4vlnGK55iRFds6DlDsjGD-8,1151
19
- gsrap/commons/.ipynb_checkpoints/excelhub-checkpoint.py,sha256=1KemKQ5oWziFlrT3__70-AKjXwdsqwEzVswEOSbNBDs,11433
19
+ gsrap/commons/.ipynb_checkpoints/excelhub-checkpoint.py,sha256=_LtaWripY_D99f14Yk-3v9VIov2cUGzJ53AXgmNFpUk,11457
20
20
  gsrap/commons/.ipynb_checkpoints/figures-checkpoint.py,sha256=IRHSQXrCi4SQoISEfNB0rDhvUzbjcgsPi9zUSefsRto,4316
21
21
  gsrap/commons/.ipynb_checkpoints/fluxbal-checkpoint.py,sha256=jgC3-vI9Tbjvqohh2mJwFra4rl_pbUzHWrSa_QAxVO4,1262
22
22
  gsrap/commons/.ipynb_checkpoints/keggutils-checkpoint.py,sha256=M2nhHRiNH_xObHSxOIdt7ix59MrPdl9q3HNICC8X36M,4514
@@ -28,9 +28,9 @@ gsrap/commons/.ipynb_checkpoints/sbmlutils-checkpoint.py,sha256=gkY02qbGXrbYStn2
28
28
  gsrap/commons/__init__.py,sha256=9lrb0sBFSWEgV_e5FYzSgjTbam8b959rW_8VuxQHt1M,268
29
29
  gsrap/commons/biomass.py,sha256=4u7WBaUgo42tBoXDU1D0VUjICatb44e0jfswZrBeHYs,17987
30
30
  gsrap/commons/coeffs.py,sha256=qI3_GuqHkeA2KbK9pYdkqJaFwYemAVZJGLRR4QtHt6w,19182
31
- gsrap/commons/downloads.py,sha256=e-7ffMD4R07MWEgXyGcwjhScbWnG7A3L100YWbpNMk0,8461
31
+ gsrap/commons/downloads.py,sha256=VnIFC6Y8QZ4oPyi04J_rtC2imzk5yOe0i5SpTP3MA6M,9713
32
32
  gsrap/commons/escherutils.py,sha256=_y0TgM0-Im0RT8W8z5rr4vlnGK55iRFds6DlDsjGD-8,1151
33
- gsrap/commons/excelhub.py,sha256=1KemKQ5oWziFlrT3__70-AKjXwdsqwEzVswEOSbNBDs,11433
33
+ gsrap/commons/excelhub.py,sha256=_LtaWripY_D99f14Yk-3v9VIov2cUGzJ53AXgmNFpUk,11457
34
34
  gsrap/commons/figures.py,sha256=IRHSQXrCi4SQoISEfNB0rDhvUzbjcgsPi9zUSefsRto,4316
35
35
  gsrap/commons/fluxbal.py,sha256=jgC3-vI9Tbjvqohh2mJwFra4rl_pbUzHWrSa_QAxVO4,1262
36
36
  gsrap/commons/keggutils.py,sha256=M2nhHRiNH_xObHSxOIdt7ix59MrPdl9q3HNICC8X36M,4514
@@ -40,11 +40,11 @@ gsrap/commons/memoteutils.py,sha256=rulJFSVX4I-XGi4uHXloL0eGIkC5zhpuJYWJn9zCDbY,
40
40
  gsrap/commons/metrics.py,sha256=gvqF2c0e31m5qQWQ11JF4-eMqxtuONy_7lUiC7uaXX4,3291
41
41
  gsrap/commons/sbmlutils.py,sha256=gkY02qbGXrbYStn2F8J0KM0fmqati2Nbvi128EF7coI,365
42
42
  gsrap/getmaps/.ipynb_checkpoints/__init__-checkpoint.py,sha256=L4gLwk1vgnPlQuIP-FPnvy9uXnmGVQ4Rvjv3uyciDfk,92
43
- gsrap/getmaps/.ipynb_checkpoints/getmaps-checkpoint.py,sha256=BFAbBZFp-yaT35XO38YFHRqQr4mSAfRH6unOrPenQus,2703
44
- gsrap/getmaps/.ipynb_checkpoints/kdown-checkpoint.py,sha256=mv5wqP4DX9KhB1IIWx6cLrc-MjQdF5Nz-Gii8QSO_6I,24498
43
+ gsrap/getmaps/.ipynb_checkpoints/getmaps-checkpoint.py,sha256=5Odf2PS1PmPZqQyKoLPYHYgNvYsp6IxrTy5HEQ5LNEM,2943
44
+ gsrap/getmaps/.ipynb_checkpoints/kdown-checkpoint.py,sha256=OZGeGdnXMLzxvitwMTWKYZyL4dq3T8ZqbT4HVC3F3lI,27452
45
45
  gsrap/getmaps/__init__.py,sha256=L4gLwk1vgnPlQuIP-FPnvy9uXnmGVQ4Rvjv3uyciDfk,92
46
- gsrap/getmaps/getmaps.py,sha256=BFAbBZFp-yaT35XO38YFHRqQr4mSAfRH6unOrPenQus,2703
47
- gsrap/getmaps/kdown.py,sha256=mv5wqP4DX9KhB1IIWx6cLrc-MjQdF5Nz-Gii8QSO_6I,24498
46
+ gsrap/getmaps/getmaps.py,sha256=5Odf2PS1PmPZqQyKoLPYHYgNvYsp6IxrTy5HEQ5LNEM,2943
47
+ gsrap/getmaps/kdown.py,sha256=OZGeGdnXMLzxvitwMTWKYZyL4dq3T8ZqbT4HVC3F3lI,27452
48
48
  gsrap/mkmodel/.ipynb_checkpoints/__init__-checkpoint.py,sha256=PNze-26HMOwfdJ92KiXpr--VV1ftVfo3CAxBZgeokp8,92
49
49
  gsrap/mkmodel/.ipynb_checkpoints/biologcuration-checkpoint.py,sha256=Nn7z-js-mzzeO23kVM2L7sJ5PNle7AkCUeBcEAYjlFU,15378
50
50
  gsrap/mkmodel/.ipynb_checkpoints/gapfill-checkpoint.py,sha256=BPZw4sszlBhAYfHnV0pA7EpG0b2ePwS6kUfFt0Ww-ss,5159
@@ -61,19 +61,19 @@ gsrap/mkmodel/polishing.py,sha256=R1UdFPxN8N27Iu0jsYW2N_1BkWEbBHaMYW6NkCYZK_k,32
61
61
  gsrap/mkmodel/pruner.py,sha256=FAZid-0H6j66wR2dVKRAaMaDREVt1edflmZXbX7blXg,9836
62
62
  gsrap/parsedb/.ipynb_checkpoints/__init__-checkpoint.py,sha256=1k2K1gz4lIdXAwHEdJ0OhdkPu83woGv0Z4TpT1kGrTk,97
63
63
  gsrap/parsedb/.ipynb_checkpoints/annotation-checkpoint.py,sha256=Y02_zXJj_tS1GyBdfuLBy9YJjMgx3mjX6tqr1KhQ-9Q,4810
64
- gsrap/parsedb/.ipynb_checkpoints/completeness-checkpoint.py,sha256=yhFiEslK1qmMCk_GWZ7UZtX02FUqLU39UafG5886WsY,12016
64
+ gsrap/parsedb/.ipynb_checkpoints/completeness-checkpoint.py,sha256=Op7VwmmwHmt1nhcl_0ISAejtLz-F9IkmnTrcJvO0BGc,12829
65
65
  gsrap/parsedb/.ipynb_checkpoints/cycles-checkpoint.py,sha256=HJ58LcHQseQ1eploysfXd5Y8Rip8n62qhje4pmL22VM,4761
66
66
  gsrap/parsedb/.ipynb_checkpoints/introduce-checkpoint.py,sha256=UuwGWGB2saG9VDMoboumeRBWhHOO68bs5_1r2RSkyVo,17145
67
67
  gsrap/parsedb/.ipynb_checkpoints/manual-checkpoint.py,sha256=qMKYshVftSGCRAjHC87E6n9-6kAiffFFCgHOUbqlyC0,3625
68
- gsrap/parsedb/.ipynb_checkpoints/parsedb-checkpoint.py,sha256=fTZlQvjV_wyRIxWJbW5TCVvydn0-CsYknsx9FYspdu8,8127
68
+ gsrap/parsedb/.ipynb_checkpoints/parsedb-checkpoint.py,sha256=8mQgUTMOLpoeHK_X28s5jaW8adltKZ40nn_0uxmIXz8,8515
69
69
  gsrap/parsedb/.ipynb_checkpoints/repeating-checkpoint.py,sha256=WwPOzlZgsZWmJ-rvhFg21iOJ6gajgKFc2vCIHh6weBg,6103
70
70
  gsrap/parsedb/__init__.py,sha256=1k2K1gz4lIdXAwHEdJ0OhdkPu83woGv0Z4TpT1kGrTk,97
71
71
  gsrap/parsedb/annotation.py,sha256=Y02_zXJj_tS1GyBdfuLBy9YJjMgx3mjX6tqr1KhQ-9Q,4810
72
- gsrap/parsedb/completeness.py,sha256=yhFiEslK1qmMCk_GWZ7UZtX02FUqLU39UafG5886WsY,12016
72
+ gsrap/parsedb/completeness.py,sha256=Op7VwmmwHmt1nhcl_0ISAejtLz-F9IkmnTrcJvO0BGc,12829
73
73
  gsrap/parsedb/cycles.py,sha256=HJ58LcHQseQ1eploysfXd5Y8Rip8n62qhje4pmL22VM,4761
74
74
  gsrap/parsedb/introduce.py,sha256=UuwGWGB2saG9VDMoboumeRBWhHOO68bs5_1r2RSkyVo,17145
75
75
  gsrap/parsedb/manual.py,sha256=qMKYshVftSGCRAjHC87E6n9-6kAiffFFCgHOUbqlyC0,3625
76
- gsrap/parsedb/parsedb.py,sha256=fTZlQvjV_wyRIxWJbW5TCVvydn0-CsYknsx9FYspdu8,8127
76
+ gsrap/parsedb/parsedb.py,sha256=8mQgUTMOLpoeHK_X28s5jaW8adltKZ40nn_0uxmIXz8,8515
77
77
  gsrap/parsedb/repeating.py,sha256=WwPOzlZgsZWmJ-rvhFg21iOJ6gajgKFc2vCIHh6weBg,6103
78
78
  gsrap/runsims/.ipynb_checkpoints/__init__-checkpoint.py,sha256=6E6E1gWgH0V7ls4Omx4mxxC85gMJ_27YqhjugJzlZtY,97
79
79
  gsrap/runsims/.ipynb_checkpoints/biosynth-checkpoint.py,sha256=fUlHUo4CfB4rGX9Dth87B1p5E5sz7i6spR7ZoqDDGaI,2836
@@ -93,8 +93,8 @@ gsrap/runsims/precursors.py,sha256=1RNt_Rxs0L1lolDmYh4_CiZgiwHfU5B_AcomJO6vJ28,2
93
93
  gsrap/runsims/runsims.py,sha256=2FC5Gs8oSYyZTjHF3A7aXB_O6myVfcn3bCxQfLJlZTk,2842
94
94
  gsrap/runsims/simplegrowth.py,sha256=tCQHTMUqum1YwlBKRTNaQoag2co_yQlCaKmISOARAlE,2353
95
95
  gsrap/runsims/singleomission.py,sha256=jMuKAi0pINP8Jlrm-yI-tX7D110VzttR3YfTSnDRe4I,2847
96
- gsrap-0.8.2.dist-info/LICENSE.txt,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
97
- gsrap-0.8.2.dist-info/METADATA,sha256=CEZpXejZ1b_KWKhxPbSXKGdW01ZU_nkKFqzfafDXXGE,898
98
- gsrap-0.8.2.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
99
- gsrap-0.8.2.dist-info/entry_points.txt,sha256=S9MY0DjfnbKGlZbp5bV7W6dNFy3APoEV84u9x6MV1eI,36
100
- gsrap-0.8.2.dist-info/RECORD,,
96
+ gsrap-0.8.3.dist-info/LICENSE.txt,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
97
+ gsrap-0.8.3.dist-info/METADATA,sha256=JADff6H-Y_SWY5PtR9qzEhmabesB6A5dLa-V0GTKqgc,898
98
+ gsrap-0.8.3.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
99
+ gsrap-0.8.3.dist-info/entry_points.txt,sha256=S9MY0DjfnbKGlZbp5bV7W6dNFy3APoEV84u9x6MV1eI,36
100
+ gsrap-0.8.3.dist-info/RECORD,,
File without changes