diff --git a/qtl/annotation.py b/qtl/annotation.py index 4f06e25..64285ce 100644 --- a/qtl/annotation.py +++ b/qtl/annotation.py @@ -1,8 +1,10 @@ import numpy as np import pandas as pd import os -import tempfile import subprocess +import sys +import tempfile +import tqdm import matplotlib.pyplot as plt import matplotlib.patches as patches import matplotlib.path as mpath @@ -494,6 +496,7 @@ def __init__(self, varin, verbose=True): else: opener = open(gtfpath, 'r') + print("Loading genes from GTF ...", file = sys.stderr) with opener as gtf: for row in gtf: if row[0] == '#': @@ -585,9 +588,9 @@ def __init__(self, varin, verbose=True): pass if len(self.genes) % 1000 == 0 and verbose: - print(f'\rGenes parsed: {len(self.genes)}', end='') + print(f'\rGenes parsed: {len(self.genes)}', end='', file = sys.stderr) if verbose: - print(f'\rGenes parsed: {len(self.genes)}') + print(f'\rGenes parsed: {len(self.genes)}', file = sys.stderr) self.gene_ids = np.array(self.gene_ids) self.gene_names = np.array(self.gene_names) @@ -610,6 +613,15 @@ def __init__(self, varin, verbose=True): self.chr_index = dict([(chrs[i], [sidx[i],eidx[i]]) for i in range(len(chrs))]) self.chr_genes = dict([(chrs[i], self.genes[sidx[i]:eidx[i]+1]) for i in range(len(chrs))]) + # dataframe of all genes + columns = ["name", "chr", "start_pos", "end_pos", "tss", "transcripts", "strand", "type"] + self.gene_df = pd.DataFrame(index = self.gene_ids, columns = columns) + print("Making gene dataframe ...", file = sys.stderr) + for g in tqdm.tqdm(self.genes): + self.gene_df.loc[g.id, :] = pd.Series( + { x : getattr(g, x) for x in columns } + ) + # interval trees with gene starts/ends for each chr self.gene_interval_trees = defaultdict() for g in self.genes: diff --git a/setup.py b/setup.py index 3a4ee2c..c510eef 100644 --- a/setup.py +++ b/setup.py @@ -27,6 +27,7 @@ 'seaborn', 'pyBigWig', 'bx-python', + 'tqdm', ], classifiers = [ "Programming Language :: Python :: 3",