geney 1.3.74__py2.py3-none-any.whl → 1.3.76__py2.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.
geney/Gene.py CHANGED
@@ -90,7 +90,9 @@ class Gene:
90
90
  # Find gene data files in the configured organism MRNA path
91
91
  gene_files = list((config[organism]['MRNA_PATH'] / 'protein_coding').glob(f'*_{gene_name}.pkl'))
92
92
  if not gene_files:
93
- raise FileNotFoundError(f"No files available for gene '{gene_name}'.")
93
+ print(f"No files available for gene '{gene_name}'.")
94
+ return None
95
+ # raise FileNotFoundError(f"No files available for gene '{gene_name}'.")
94
96
 
95
97
  # Load gene data from the first matching file
96
98
  data = unload_pickle(gene_files[0])
@@ -148,7 +150,8 @@ class Gene:
148
150
  return None #Transcript()
149
151
 
150
152
  if tid not in self.transcripts:
151
- raise AttributeError(f"Transcript '{tid}' not found in gene '{self.gene_name}'.")
153
+ return None
154
+ # raise AttributeError(f"Transcript '{tid}' not found in gene '{self.gene_name}'.")
152
155
 
153
156
  return Transcript(self.transcripts[tid], organism=self.organism)
154
157
 
geney/oncosplice.py CHANGED
@@ -1,6 +1,7 @@
1
1
  from Bio import pairwise2
2
2
  import re
3
3
  import hashlib
4
+ from datetime import datetime
4
5
  from tqdm import tqdm
5
6
  import pandas as pd
6
7
  import numpy as np
@@ -282,6 +283,17 @@ def summarize_missplicing_event(pes, pir, es, ne, ir):
282
283
  else:
283
284
  return '-'
284
285
 
286
+ def missense_effect(r, v):
287
+ if len(r.protein) != len(v.protein) or len(r.orf) != len(v.orf):
288
+ return '', ''
289
+
290
+ for i, (x, y) in enumerate(zip(r.protein, v.protein)):
291
+ if x != y:
292
+ aa_change = f'{x}>{y}'
293
+ p = i*3
294
+ codon_change = f'{r.orf.seq[p:p+3]}>{v.orf.seq[p:p+3]}'
295
+ return aa_change, codon_change
296
+ return '', ''
285
297
 
286
298
  # Annotating
287
299
  def OncospliceAnnotator(reference_transcript, variant_transcript, mut, ref_attributes=[], var_attributes=[]):
@@ -301,12 +313,15 @@ def OncospliceAnnotator(reference_transcript, variant_transcript, mut, ref_attri
301
313
  report['affected_intron'] = affected_intron
302
314
  report['mutation_distance_from_5'] = distance_from_5
303
315
  report['mutation_distance_from_3'] = distance_from_3
316
+ aa_c, c_c = missense_effect(reference_transcript, variant_transcript)
317
+ report['missense_effect'] = aa_c
318
+ report['codon_change'] = c_c
304
319
  return report
305
320
 
306
321
 
307
- def oncosplice(mut_id, splicing_threshold=0.5, protein_coding=True, cons_required=False, primary_transcript=False,
322
+ def oncosplice(mut_id, splicing_threshold=0.5, protein_coding=True, primary_transcript=False,
308
323
  window_length=13, organism='hg38', splicing_engine=None, splicing_db=None, verbose=False,
309
- tis_engine=None, tis_db=None, target_transcripts=None):
324
+ tis_engine=None, target_transcripts=None):
310
325
 
311
326
  gene = Gene.from_file(mut_id.split(':')[0], organism=organism)
312
327
  reference_gene_proteins = {
@@ -315,7 +330,7 @@ def oncosplice(mut_id, splicing_threshold=0.5, protein_coding=True, cons_require
315
330
 
316
331
  mutations = [MutSeqMat.from_mutid(m) for m in mut_id.split('|')]
317
332
  if gene.rev:
318
- mutations = [m.reverse_complement(inplace=True) for m in mutations[::-1]]
333
+ mutations = [m.reverse_complement() for m in mutations[::-1]]
319
334
 
320
335
  results = []
321
336
  for reference_transcript in tqdm(gene, desc=f'Processing {mut_id}...'):
@@ -341,9 +356,6 @@ def oncosplice(mut_id, splicing_threshold=0.5, protein_coding=True, cons_require
341
356
  mutated_transcript.mutate(mutation, inplace=True)
342
357
 
343
358
  reference_transcript.generate_mature_mrna().generate_protein()
344
- # if ('*' in reference_transcript.protein[:-1]):
345
- # print(f"> Errors in reference transcript {reference_transcript.transcript_id}")
346
- # continue
347
359
 
348
360
  if len(reference_transcript.protein) < window_length:
349
361
  print(f"> Window length issue {reference_transcript.transcript_id}")
@@ -418,15 +430,173 @@ def oncosplice(mut_id, splicing_threshold=0.5, protein_coding=True, cons_require
418
430
  results.append(report)
419
431
 
420
432
  if len(results) == 0:
421
- print("Nothing...")
422
- return None
433
+ # print("Nothing...")
434
+ return pd.DataFrame()
423
435
 
424
436
  return pd.DataFrame(results)[
425
437
  ['mut_id', 'transcript_id', 'isoform_id', 'primary_transcript', 'missplicing', 'full_missplicing',
426
438
  'exon_changes', 'splicing_codes', 'affected_exon', 'affected_intron', 'mutation_distance_from_5',
427
- 'mutation_distance_from_3', 'reference_resemblance', 'oncosplice_score', 'percentile',
439
+ 'mutation_distance_from_3', 'missense_effect', 'codon_change', 'reference_resemblance', 'oncosplice_score', 'percentile',
428
440
  'isoform_prevalence', 'reference_protein', 'variant_protein', 'splicing_engine']]
429
441
 
442
+
443
+ def process_splicing_path(new_boundaries, reference_transcript, mutated_transcript,
444
+ current_mutations, missplicing, mut_id, transcript_id,
445
+ splicing_engine, window_length, start_time):
446
+ """
447
+ Processes a single alternative splicing path and returns an annotation report.
448
+ """
449
+ # Update acceptors and donors
450
+ mutated_transcript.acceptors = new_boundaries['acceptors']
451
+ mutated_transcript.donors = new_boundaries['donors']
452
+ mutated_transcript.generate_mature_mrna().generate_protein()
453
+
454
+ # Align reference and mutated proteins
455
+ alignment = get_logical_alignment(reference_transcript.protein, mutated_transcript.protein)
456
+ deleted, inserted = find_indels_with_mismatches_as_deletions(alignment.seqA, alignment.seqB)
457
+ modified_positions = find_modified_positions(len(reference_transcript.protein), deleted, inserted)
458
+
459
+ # Compute conservation impact
460
+ temp_cons = np.convolve(reference_transcript.cons_vector * modified_positions,
461
+ np.ones(window_length)) / window_length
462
+ affected_cons_scores = max(temp_cons)
463
+
464
+ # Compute percentile of conservation change
465
+ sorted_cons = sorted(reference_transcript.cons_vector)
466
+ percentile = (
467
+ sorted_cons.index(next(x for x in sorted_cons if x >= affected_cons_scores)) / len(sorted_cons)
468
+ )
469
+
470
+ # Generate annotation report
471
+ report = OncospliceAnnotator(reference_transcript, mutated_transcript, current_mutations[0])
472
+ report.update({
473
+ 'mut_id': mut_id,
474
+ 'transcript_id': transcript_id,
475
+ 'splicing_engine': splicing_engine if splicing_engine is not None else 'None',
476
+ 'oncosplice_score': affected_cons_scores,
477
+ 'percentile': percentile,
478
+ 'isoform_id': short_hash_of_list(mutated_transcript.exons),
479
+ 'isoform_prevalence': new_boundaries['path_weight'],
480
+ 'full_missplicing': missplicing.aberrant_splicing,
481
+ 'missplicing': missplicing.max_delta,
482
+ 'execution_time': start_time,
483
+ 'status': 'Success'
484
+ })
485
+ return report
486
+
487
+
488
+ def oncosplice_df(row, splicing_threshold=0.5, window_length=13,
489
+ organism='hg38', splicing_engine='spliceai'):
490
+ """
491
+ Process a given mutation-transcript pair to analyze alternative splicing events
492
+ and their oncogenic potential.
493
+
494
+ Ensures that every `mut_id` and `transcript_id` is included in the output,
495
+ even if processing fails, with an appropriate failure status.
496
+
497
+ Parameters:
498
+ - row (pd.Series): A row from a DataFrame containing `mut_id` and `transcript_id`
499
+ - splicing_threshold (float): The threshold for splicing disruption detection
500
+ - window_length (int): The window size for conservation analysis
501
+ - organism (str): Genome assembly version
502
+ - splicing_engine (str or None): The splicing prediction engine to use
503
+
504
+ Returns:
505
+ - pd.DataFrame: Processed results of the oncosplice analysis
506
+ - Run "pd.concat(applied_function_output.to_list(), ignore_index=True)" to build result dataframe
507
+ """
508
+
509
+ start_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") # Log function start time
510
+ mut_id, transcript_id = row.mut_id, row.transcript_id
511
+
512
+ # Default response template (to ensure all IDs are included)
513
+ base_result = {
514
+ 'mut_id': mut_id,
515
+ 'transcript_id': transcript_id,
516
+ 'status': 'Success', # Will be updated if an issue occurs
517
+ 'execution_time': start_time
518
+ }
519
+
520
+ # Load gene and transcript
521
+ gene = Gene.from_file(mut_id.split(':')[0], organism=organism)
522
+ if gene is None:
523
+ base_result['status'] = 'Gene not found'
524
+ return pd.DataFrame([base_result])
525
+
526
+ mutations = [MutSeqMat.from_mutid(m) for m in mut_id.split('|')]
527
+ reference_transcript = gene.transcript(transcript_id)
528
+
529
+ if reference_transcript is None:
530
+ base_result['status'] = 'Transcript not found'
531
+ return pd.DataFrame([base_result])
532
+
533
+ # Generate the reference transcript
534
+ reference_transcript = (
535
+ reference_transcript.generate_pre_mrna()
536
+ .generate_mature_mrna()
537
+ .generate_protein()
538
+ )
539
+
540
+ # Skip non-protein-coding transcripts
541
+ if reference_transcript.transcript_biotype != 'protein_coding':
542
+ base_result['status'] = 'Non-protein-coding transcript'
543
+ return pd.DataFrame([base_result])
544
+
545
+ # Filter mutations relevant to this transcript
546
+ current_mutations = [m for m in mutations if m in reference_transcript]
547
+ if not current_mutations:
548
+ base_result['status'] = 'No relevant mutations'
549
+ return pd.DataFrame([base_result])
550
+
551
+ # Define mutation center
552
+ center = np.mean([m.indices[0] for m in current_mutations]) // 1
553
+
554
+ # Clone and apply mutations
555
+ mutated_transcript = reference_transcript.clone()
556
+ for mutation in current_mutations:
557
+ mutated_transcript.mutate(mutation, inplace=True)
558
+
559
+ # Adjust window length if necessary
560
+ window_length = min(window_length, len(reference_transcript.protein))
561
+
562
+ # Transform conservation vector
563
+ reference_transcript.cons_vector = transform_conservation_vector(
564
+ reference_transcript.cons_vector, window=window_length
565
+ )
566
+
567
+ # Identify missplicing events
568
+ if splicing_engine is None:
569
+ missplicing = Missplicing()
570
+ else:
571
+ missplicing = find_transcript_missplicing_seqs(
572
+ reference_transcript.pre_mrna.get_context(center, context=7500, padding='N'),
573
+ mutated_transcript.pre_mrna.get_context(center, context=7500, padding='N'),
574
+ reference_transcript.donors, reference_transcript.acceptors,
575
+ threshold=splicing_threshold, engine=splicing_engine
576
+ )
577
+
578
+ # Generate alternative splicing paths
579
+ alternative_splicing_paths = develop_aberrant_splicing(reference_transcript, missplicing)
580
+ results = [
581
+ process_splicing_path(new_boundaries, reference_transcript, mutated_transcript,
582
+ current_mutations, missplicing, mut_id, transcript_id,
583
+ splicing_engine, window_length, start_time)
584
+ for new_boundaries in alternative_splicing_paths
585
+ ]
586
+
587
+ # Return results as DataFrame
588
+ if not results:
589
+ base_result['status'] = 'No alternative splicing detected'
590
+ return pd.DataFrame([base_result])
591
+
592
+ return pd.DataFrame(results)[
593
+ ['mut_id', 'transcript_id', 'isoform_id', 'primary_transcript', 'missplicing', 'full_missplicing',
594
+ 'exon_changes', 'splicing_codes', 'affected_exon', 'affected_intron', 'mutation_distance_from_5',
595
+ 'mutation_distance_from_3', 'missense_effect', 'codon_change', 'oncosplice_score', 'percentile',
596
+ 'isoform_prevalence', 'reference_protein', 'variant_protein', 'splicing_engine', 'execution_time', 'status']
597
+ ]
598
+
599
+
430
600
  #
431
601
  # import asyncio
432
602
  # async def oncosplice_prototype(mut_id, splicing_threshold=0.5, protein_coding=True, primary_transcript=False,
geney/spliceai_utils.py CHANGED
@@ -1,9 +1,6 @@
1
-
2
1
  #### SpliceAI Modules
3
2
  from keras.models import load_model
4
- # from pkg_resources import resource_filename
5
3
  from importlib import resources
6
- # from spliceai.utils import one_hot_encode
7
4
  import numpy as np
8
5
  import tensorflow as tf
9
6
  import sys
@@ -17,18 +14,25 @@ else:
17
14
  # tf.config.threading.set_intra_op_parallelism_threads(1)
18
15
  # tf.config.threading.set_inter_op_parallelism_threads(1)
19
16
 
20
- if sys.platform == 'darwin':
21
- sai_paths = ('models/spliceai{}.h5'.format(x) for x in range(1, 6))
22
- # sai_models = [load_model(resource_filename('spliceai', x)) for x in sai_paths]
23
- sai_models = [load_model(resources.files('spliceai').joinpath(f)) for f in sai_paths]
24
- else:
25
- sai_paths = ['/tamir2/nicolaslynn/home/miniconda3/lib/python3.10/site-packages/spliceai/models/spliceai1.h5',
26
- '/tamir2/nicolaslynn/home/miniconda3/lib/python3.10/site-packages/spliceai/models/spliceai2.h5',
27
- '/tamir2/nicolaslynn/home/miniconda3/lib/python3.10/site-packages/spliceai/models/spliceai3.h5',
28
- '/tamir2/nicolaslynn/home/miniconda3/lib/python3.10/site-packages/spliceai/models/spliceai4.h5',
29
- '/tamir2/nicolaslynn/home/miniconda3/lib/python3.10/site-packages/spliceai/models/spliceai5.h5']
30
-
31
- sai_models = [load_model(f) for f in sai_paths]
17
+ # List the model filenames relative to the spliceai package.
18
+ model_filenames = [f"models/spliceai{i}.h5" for i in range(1, 6)]
19
+
20
+ # Load each model using the package resources.
21
+ sai_models = [load_model(resources.files("spliceai").joinpath(filename))
22
+ for filename in model_filenames]
23
+
24
+ # if sys.platform == 'darwin':
25
+ # sai_paths = ('models/spliceai{}.h5'.format(x) for x in range(1, 6))
26
+ # # sai_models = [load_model(resource_filename('spliceai', x)) for x in sai_paths]
27
+ # sai_models = [load_model(resources.files('spliceai').joinpath(f)) for f in sai_paths]
28
+ # else:
29
+ # sai_paths = ['/tamir2/nicolaslynn/home/miniconda3/lib/python3.10/site-packages/spliceai/models/spliceai1.h5',
30
+ # '/tamir2/nicolaslynn/home/miniconda3/lib/python3.10/site-packages/spliceai/models/spliceai2.h5',
31
+ # '/tamir2/nicolaslynn/home/miniconda3/lib/python3.10/site-packages/spliceai/models/spliceai3.h5',
32
+ # '/tamir2/nicolaslynn/home/miniconda3/lib/python3.10/site-packages/spliceai/models/spliceai4.h5',
33
+ # '/tamir2/nicolaslynn/home/miniconda3/lib/python3.10/site-packages/spliceai/models/spliceai5.h5']
34
+
35
+ # sai_models = [load_model(f) for f in sai_paths]
32
36
 
33
37
 
34
38
  def one_hot_encode(seq):
geney/splicing_utils.py CHANGED
@@ -221,35 +221,34 @@ def find_transcript_splicing(transcript, engine: str = 'spliceai') -> Tuple[Dict
221
221
  return donor_probs, acceptor_probs
222
222
 
223
223
 
224
- def find_transcript_missplicing(mut_id, transcript=None, threshold=0.5, engine='spliceai', organism='hg38', db=None, force_recompute=False):
225
- gene = Gene.from_file(mut_id.split(':')[0], organism=organism)
226
- if transcript not in gene.transcripts:
227
- return np.nan
228
-
229
- reference_transcript = gene.transcript(transcript) if transcript is not None else gene.transcript()
224
+ def missplicing_df(mut_id, **kwargs):
225
+ return find_transcript_missplicing(mut_id, **kwargs).max_delta
230
226
 
231
- if db is not None:
232
- cached_data = db.get_mutation_data(engine, gene.gene_name, mut_id, reference_transcript.transcript_id)
233
- if cached_data and not force_recompute:
234
- return Missplicing(cached_data)
235
227
 
228
+ def find_transcript_missplicing(mut_id, transcript=None, threshold=0.5, engine='spliceai', organism='hg38'):
229
+ gene = Gene.from_file(mut_id.split(':')[0], organism=organism)
230
+ reference_transcript = gene.transcript(transcript) if transcript is not None else gene.transcript()
236
231
  if reference_transcript is None:
237
- return Missplicing({'missed_acceptors': {}, 'missed_donors': {}, 'discovered_acceptors': {}, 'discovered_donors': {}})
232
+ return Missplicing()
233
+ #
234
+ # if db is not None:
235
+ # cached_data = db.get_mutation_data(engine, gene.gene_name, mut_id, reference_transcript.transcript_id)
236
+ # if cached_data and not force_recompute:
237
+ # return Missplicing(cached_data)
238
238
 
239
239
  variant_transcript = reference_transcript.clone()
240
240
  mutations = [MutSeqMat.from_mutid(m) for m in mut_id.split('|')]
241
241
  mutations = [m for m in mutations if m in reference_transcript]
242
242
  if len(mutations) == 0:
243
- return Missplicing({'missed_acceptors': {}, 'missed_donors': {}, 'discovered_acceptors': {}, 'discovered_donors': {}})
243
+ return Missplicing()
244
244
 
245
245
  center = int(np.mean([m.indices[0] for m in mutations]))
246
246
  for mutation in mutations:
247
247
  variant_transcript.mutate(mutation, inplace=True)
248
248
 
249
249
  missplicing = find_transcript_missplicing_seqs(reference_transcript.pre_mrna.get_context(center, 7500, padding='N'), variant_transcript.pre_mrna.get_context(center, 7500, padding='N'), reference_transcript.donors, reference_transcript.acceptors, threshold=threshold, engine=engine)
250
- if db is not None:
251
- db.store_mutation_data(engine, gene.gene_name, mut_id, reference_transcript.transcript_id, missplicing.missplicing)
252
-
250
+ # if db is not None:
251
+ # db.store_mutation_data(engine, gene.gene_name, mut_id, reference_transcript.transcript_id, missplicing.missplicing)
253
252
  return missplicing
254
253
 
255
254
  # from functools import reduce
@@ -656,7 +655,7 @@ def process_pairwise_epistasis_explicit(mid, engine='spliceai'):
656
655
 
657
656
 
658
657
  class Missplicing:
659
- def __init__(self, splicing_dict=None, threshold=0.5):
658
+ def __init__(self, splicing_dict={'missed_acceptors': {}, 'missed_donors': {}, 'discovered_acceptors': {}, 'discovered_donors': {}}, threshold=0.5):
660
659
  """
661
660
  Initialize a Missplicing object.
662
661
 
geney/tcga_utils.py CHANGED
@@ -1,4 +1,3 @@
1
-
2
1
  import pandas as pd
3
2
  import random
4
3
  from pathlib import Path
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: geney
3
- Version: 1.3.74
3
+ Version: 1.3.76
4
4
  Summary: A Python package for gene expression modeling.
5
5
  Home-page: https://github.com/nicolaslynn/geney
6
6
  Author: Nicolas Lynn
@@ -1,5 +1,5 @@
1
1
  geney/Fasta_segment.py,sha256=99HxNGNh_MfdVW6hhtlb1vOn7eSmT7oFoEfHDFMxG8w,11275
2
- geney/Gene.py,sha256=oAdwuguD1qWMTrS158ApW4s3MRcb1ZJlinzVeCZcYwE,6966
2
+ geney/Gene.py,sha256=2eznhavDoO4rktisy3U0uz480OsktppEwH5pxC2qoog,7083
3
3
  geney/SeqMats.py,sha256=9-eJnfU2w3LGc0XvVvFEO_QrBneTkC6xkZKDfTcEw5o,19282
4
4
  geney/Transcript.py,sha256=CpfxYkuCwFILozrtLuiWnlr1mRnMKn4o84HVJislgYs,14499
5
5
  geney/__init__.py,sha256=eBdDl42N6UhcYeZDjOnv199Z88fI5_8Y6xW8447OKXM,755
@@ -11,21 +11,21 @@ geney/graphic_utils.py,sha256=oMsBpB9YeEn96gGpKh4MmtagJffWZbk-xPrIwHvkFhA,11016
11
11
  geney/gtex_utils.py,sha256=asL2lHyU5KsbWpV096vkf1Ka7hSo_RRfZqw7p5nERmE,1919
12
12
  geney/immune_utils.py,sha256=ZRni5ttrhpYBnmNr0d0ZatIbNPYs4nmQuoUO00SpsS4,5271
13
13
  geney/mutation_utils.py,sha256=C_kv2MB_L8LlhX3W2ooXjJ3uDoJ8zX1WeDtZKoBZJkI,1547
14
- geney/oncosplice.py,sha256=Y32tz6DdDVIGdrM4rl9RMC48il5k15VP_Wnmi2nXQ04,24948
14
+ geney/oncosplice.py,sha256=GN2LwACp1mr90UV7dxJJOVw75EfiNk0sU8jFdUgs9AE,32099
15
15
  geney/pangolin_utils.py,sha256=9jdBXlOcRaUdfi-UpUxHA0AkTMZkUF-Lt7HVZ1nEm3s,2973
16
16
  geney/power_utils.py,sha256=MehZFUdkJ2EFUot709yPEDxSkXmH5XevMebX2HD768A,7330
17
17
  geney/seqmat_utils.py,sha256=wzb3PX5it5bpIFQvcxyzlxfhoJTbHHbsjg0rzh05iVs,19753
18
- geney/spliceai_utils.py,sha256=tVY0T6F6l3fNoaktpn7Kq0oH5ZM0ThFYt9nPi_lfakw,3077
19
- geney/splicing_utils.py,sha256=wH_Cfd2Fm52qSbkxB8VmK-zMXfHkkEjVLzD-TN7qZVo,47544
18
+ geney/spliceai_utils.py,sha256=V5DccGjm2GZQINSVxJYPoN8iYQzU4gE9tINy6gmHjOM,3304
19
+ geney/splicing_utils.py,sha256=UkG2YphjLNUYsv3o3RGUTW1ScHbEMOLL2M_7WbgDVME,47466
20
20
  geney/survival_utils.py,sha256=KnAzEviMuXh6SnVXId9PgsFLSbgkduTvYoIthxN7FPA,6886
21
- geney/tcga_utils.py,sha256=D_BNHm-D_K408dlcJm3hzH2c6QNFjQsKvUcOPiQRk7g,17612
21
+ geney/tcga_utils.py,sha256=uJhVnTbTysj0XrEw_YeDKRSLexsqgBLYQdhl7_hnr64,17611
22
22
  geney/tis_utils.py,sha256=la0CZroaKe5RgAyFd4Bf_DqQncklWgAY2823xVst98o,7813
23
23
  geney/utils.py,sha256=KBdwNIywo7INVEQEsuIXauEJobvReE9TXAi5qqXanSI,2775
24
24
  geney/translation_initiation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
25
25
  geney/translation_initiation/tis_utils.py,sha256=AF3siFjuQH-Rs44EV-80zHdbxRMvN4woLFSHroWIETc,4448
26
26
  geney/translation_initiation/resources/kozak_pssm.json,sha256=pcd0Olziutq-6H3mFWDCD9cujQ_AlZO-iiOvBl82hqE,1165
27
27
  geney/translation_initiation/resources/tis_regressor_model.joblib,sha256=IXb4DUDhJ5rBDKcqMk9zE3ECTZZcdj7Jixz3KpoZ7OA,2592025
28
- geney-1.3.74.dist-info/METADATA,sha256=Ay8aCZoysVN3uvYzGFHAWLM5N7evz_WxeR1t3oiM6D4,990
29
- geney-1.3.74.dist-info/WHEEL,sha256=AHX6tWk3qWuce7vKLrj7lnulVHEdWoltgauo8bgCXgU,109
30
- geney-1.3.74.dist-info/top_level.txt,sha256=O-FuNUMb5fn9dhZ-dYCgF0aZtfi1EslMstnzhc5IIVo,6
31
- geney-1.3.74.dist-info/RECORD,,
28
+ geney-1.3.76.dist-info/METADATA,sha256=FTQEOXu8VS4PRf5bQgGSH0oALsisNa_E0TjO-vD54hA,990
29
+ geney-1.3.76.dist-info/WHEEL,sha256=AHX6tWk3qWuce7vKLrj7lnulVHEdWoltgauo8bgCXgU,109
30
+ geney-1.3.76.dist-info/top_level.txt,sha256=O-FuNUMb5fn9dhZ-dYCgF0aZtfi1EslMstnzhc5IIVo,6
31
+ geney-1.3.76.dist-info/RECORD,,
File without changes