annotate trips_create_new_organism/create_annotation_sqlite.py @ 0:c5a566609a25 draft

Uploaded
author triasteran
date Fri, 25 Feb 2022 11:24:50 +0000
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
1 # Python3 script which takes in an annotation file(gtf/gff3) and a transcriptomic fasta file
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
2 # and produces an sqlite file which can be uploaded to Trips-Viz
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
3 # All co-ordinates produced are 1 based
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
4 # All start codon positions (including cds_start) should be at the first nucleotide of the codon
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
5 # All stop codon positions (including cds_stop) should be at the last nucleotide of the codon
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
6 import sys
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
7 import re
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
8 import sqlite3
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
9 from intervaltree import Interval, IntervalTree
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
10 import itertools
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
11
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
12
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
13
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
14 #This should be a GTF or GFF3 file
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
15 annotation_file = open(sys.argv[1],"r")
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
16 #This needs to be the transcriptomic fasta file
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
17 fasta_file = open(sys.argv[2],"r")
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
18 #This value will be added used to create UTRs of this length, useful when looking at transcriptomes without annotated UTRs
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
19 pseudo_utr_len = int(sys.argv[3])
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
20 #An example of a transcript_id from the annotation file, e.g ENST000000123456
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
21 user_transcript_id = sys.argv[4]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
22 #An example of a gene name from the annotation file
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
23 user_gene_name = sys.argv[5]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
24 # Set to true if transcript version is included in transcript_id, e.g: ENST000000123456.1
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
25 TRAN_VERSION = True
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
26
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
27
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
28
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
29 delimiters = {"transcripts":{"before":[],"after":[],"annot_types": ["cds","utr"]},
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
30 "genes":{"before":[],"after":['"'],"annot_types": ["lnc_rna"]}}
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
31
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
32 punctuation = [";"," ","-",":","-",".","=","\t"]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
33 #Find delimiters in the annotation and fasta files using the user_transcript_id
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
34 #and user_gene_name examples given by user.
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
35 for line in annotation_file:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
36 if user_transcript_id in line:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
37 tabsplitline = line.split("\t")
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
38 annot_type = tabsplitline[2]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
39 if annot_type not in delimiters["transcripts"]["annot_types"]:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
40 delimiters["transcripts"]["annot_types"].append(annot_type.lower())
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
41 splitline = line.split(user_transcript_id)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
42 before_delimiter = splitline[0]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
43 for item in punctuation:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
44 if item in before_delimiter:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
45 if len(before_delimiter.split(item)[-1]) >= 5:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
46 before_delimiter = before_delimiter.split(item)[-1]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
47 after_delimiter = splitline[1][:2]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
48 if before_delimiter not in delimiters["transcripts"]["before"] and len(before_delimiter) >= 5:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
49 delimiters["transcripts"]["before"].append(before_delimiter)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
50 if after_delimiter not in delimiters["transcripts"]["after"]:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
51 delimiters["transcripts"]["after"].append(after_delimiter)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
52 if user_gene_name in line:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
53 tabsplitline = line.split("\t")
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
54 annot_type = tabsplitline[2]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
55 if annot_type not in delimiters["genes"]["annot_types"]:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
56 delimiters["genes"]["annot_types"].append(annot_type.lower())
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
57 splitline = line.split(user_gene_name)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
58 before_delimiter = splitline[0]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
59 for item in punctuation:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
60 if item in before_delimiter:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
61 if len(before_delimiter.split(item)[-1]) >= 5:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
62 before_delimiter = before_delimiter.split(item)[-1]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
63 after_delimiter = splitline[1][0]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
64 if before_delimiter not in delimiters["genes"]["before"] and len(before_delimiter) >= 5:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
65 delimiters["genes"]["before"].append(before_delimiter)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
66 if after_delimiter not in delimiters["genes"]["after"]:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
67 if after_delimiter in punctuation:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
68 delimiters["genes"]["after"].append(after_delimiter)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
69 for line in fasta_file:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
70 if user_transcript_id in line:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
71 splitline = line.split(user_transcript_id)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
72 before_delimiter = splitline[0]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
73 for item in punctuation:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
74 if item in before_delimiter:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
75 if len(before_delimiter.split(item)[1]) >= 5:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
76 before_delimiter = before_delimiter.split(item)[1]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
77 after_delimiter = splitline[1][0]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
78 if before_delimiter not in delimiters["transcripts"]["before"] and len(before_delimiter) >= 5:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
79 delimiters["transcripts"]["before"].append(before_delimiter)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
80 if after_delimiter not in delimiters["transcripts"]["after"]:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
81 delimiters["transcripts"]["after"].append(after_delimiter)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
82 fasta_file.close()
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
83 annotation_file.close()
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
84
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
85
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
86
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
87
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
88
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
89 if delimiters["transcripts"]["before"] == []:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
90 print ("ERROR: No transcript_id with the name {} could be found in the annotation file".format(user_transcript_id))
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
91 sys.exit()
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
92 if delimiters["genes"]["before"] == []:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
93 print ("ERROR: No gene with the name {} could be found in the annotation file".format(user_gene_name))
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
94 sys.exit()
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
95
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
96 master_dict = {}
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
97 coding_dict = {}
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
98 notinfasta = open("notinfasta.csv","w")
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
99
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
100 #Given a nucleotide sequence returns the positions of all start and stop codons.
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
101 def get_start_stops(transcript_sequence):
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
102 transcript_sequence = transcript_sequence.upper()
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
103 start_codons = ['ATG']
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
104 stop_codons = ['TAA', 'TAG', 'TGA']
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
105 seq_frames = {'starts': [], 'stops': []}
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
106 for codons, positions in ((start_codons, 'starts'),(stop_codons, 'stops')):
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
107 if len(codons) > 1:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
108 pat = re.compile('|'.join(codons))
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
109 else:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
110 pat = re.compile(codons[0])
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
111 for m in re.finditer(pat, transcript_sequence):
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
112 # Increment position by 1, Frame 1 starts at position 1 not 0,
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
113 # if it's a stop codon add another 2 so it points to the last nuc of the codon
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
114 if positions == "starts":
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
115 start = m.start() + 1
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
116 else:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
117 start = m.start() + 3
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
118 seq_frames[positions].append(start)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
119 return seq_frames
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
120
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
121
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
122 #parse fasta to get the nucleotide sequence of transcripts and the positions of start/stop codons.
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
123 fasta_file = open(sys.argv[2],"r")
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
124 read_fasta = fasta_file.read()
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
125 split_fasta = read_fasta.split(">")
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
126 for entry in split_fasta[1:]:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
127 newline_split = entry.split("\n")
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
128 tran = newline_split[0]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
129 for item in delimiters["transcripts"]["after"]:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
130 if item in tran:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
131 tran = tran.split(item)[0]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
132 tran = tran.replace("-","_").replace("(","").replace(")","")
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
133 seq = ("".join(newline_split[1:]))
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
134 if "_PAR_Y" in tran:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
135 tran += "_chrY"
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
136 elif "_PAR_X" in tran:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
137 tran += "_chrX"
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
138 tran = tran.upper()
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
139 starts_stops = get_start_stops(seq)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
140 if tran not in master_dict:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
141 master_dict[tran] = {"utr":[], "cds":[], "exon":[],"start_codon":[],"stop_codon":[],"start_list":starts_stops["starts"],
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
142 "stop_list":starts_stops["stops"],"transcript":[], "strand":"" ,"gene_name":"","chrom":"","seq":seq,"cds_start":"NULL","cds_stop":"NULL",
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
143 "length":len(seq),"principal":0,"version":"NULL"}
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
144
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
145
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
146
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
147
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
148 def to_ranges(iterable):
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
149 tup_list = []
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
150 iterable = sorted(set(iterable))
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
151 for key, group in itertools.groupby(enumerate(iterable),lambda t: t[1] - t[0]):
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
152 group = list(group)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
153 tup_list.append((group[0][1], group[-1][1]))
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
154 return tup_list
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
155
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
156 #parse annotation file to get chromsome, exon location and CDS info for each transcript
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
157 def parse_gtf_file(annotation_file):
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
158 for line in annotation_file:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
159 if line == "\n":
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
160 continue
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
161 if line[0] != '#':
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
162 splitline = (line.replace("\n","")).split("\t")
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
163 chrom = splitline[0]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
164 try:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
165 annot_type = splitline[2].lower()
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
166 except:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
167 print ("ERROR tried to index to second item in splitline: ",splitline, line)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
168 sys.exit()
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
169 #if annot_type not in ["cds", "utr", "exon", "transcript","five_prime_utr", "three_prime_utr","stop_codon","start_codon"]:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
170 # continue
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
171 if annot_type not in delimiters["transcripts"]["annot_types"] and annot_type not in delimiters["genes"]["annot_types"]:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
172 continue
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
173 if annot_type == "five_prime_utr" or annot_type == "three_prime_utr":
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
174 annot_type = "utr"
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
175 strand = splitline[6]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
176 if strand == "+":
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
177 start = int(splitline[3])
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
178 end = int(splitline[4])
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
179 else:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
180 start = int(splitline[3])+1
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
181 end = int(splitline[4])+1
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
182 desc = splitline[8]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
183 tran = desc
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
184 gene = desc
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
185 for item in delimiters["transcripts"]["before"]:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
186 if item in tran:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
187 tran = tran.split(item)[1]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
188 for item in delimiters["transcripts"]["after"]:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
189 if item in tran:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
190 tran = tran.split(item)[0]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
191 if "." in tran and TRAN_VERSION == True:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
192 #print ("raw tran",tran)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
193 tran = tran.split(".")
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
194 version = int(tran[-1].split("_")[0])
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
195 tran = tran[0]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
196 else:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
197 version = "NULL"
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
198 tran = tran.replace("-","_").replace(".","_")
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
199 tran = tran.replace("(","").replace(")","")
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
200 tran = tran.replace(" ","").replace("\t","")
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
201 tran = tran.upper()
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
202 tran = tran.replace("GENE_","").replace("ID_","")
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
203 #print ("tran",tran,version)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
204 #if tran == "ENST00000316448":
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
205 # print ("annot type",annot_type)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
206 # print ("appending exon to tran", start, end,line)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
207
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
208 gene_found = False
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
209
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
210 if annot_type in delimiters["genes"]["annot_types"]:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
211 for item in delimiters["genes"]["before"]:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
212 if item in gene:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
213 gene_found = True
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
214 gene = gene.split(item)[1]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
215 for item in delimiters["genes"]["after"]:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
216 if item in gene:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
217 gene = gene.split(item)[0]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
218 gene = gene.replace("'","''")
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
219 gene = gene.replace("GENE_","")
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
220 gene = gene.replace("ID_","")
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
221 gene = gene.upper()
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
222
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
223 if tran in master_dict:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
224 if annot_type in master_dict[tran]:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
225 master_dict[tran][annot_type].append((start, end))
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
226 master_dict[tran]["strand"] = strand
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
227 master_dict[tran]["chrom"] = chrom
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
228 master_dict[tran]["version"] = version
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
229 if gene_found == True:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
230 master_dict[tran]["gene_name"] = gene
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
231 else:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
232 notinfasta.write("{}\n".format(tran))
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
233
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
234 annotation_file = open(sys.argv[1],"r")
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
235 parse_gtf_file(annotation_file)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
236
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
237
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
238 #remove transcripts that were in fasta file but not in annotation_file
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
239 notinannotation = []
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
240 for tran in master_dict:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
241 if master_dict[tran]["chrom"] == "":
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
242 #print ("tran {} has no chrom :(".format(tran))
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
243 notinannotation.append(tran)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
244 for tran in notinannotation:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
245 del master_dict[tran]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
246
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
247 #Dictionary to store the coding status of a gene, if any transcript of this gene is coding, the value will be True
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
248 coding_genes_dict = {}
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
249 #parse master_dict to calculate length, cds_start/stop and exon junction positions
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
250 for tran in master_dict:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
251 try:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
252 transeq = master_dict[tran]["seq"]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
253 except Exception as e:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
254 print ("not in fasta", tran)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
255 notinfasta.write("{}\n".format(tran))
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
256 continue
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
257 exon_junctions = []
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
258 total_length = len(transeq)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
259 three_len = 1
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
260 five_len = 1
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
261 strand = master_dict[tran]["strand"]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
262 if master_dict[tran]["gene_name"] == "":
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
263 master_dict[tran]["gene_name"] = tran
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
264 gene = master_dict[tran]["gene_name"]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
265 if gene not in coding_genes_dict:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
266 coding_genes_dict[gene] = False
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
267
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
268 if master_dict[tran]["cds"] == []:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
269 tran_type = "noncoding"
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
270 cds_start = 'NULL'
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
271 cds_stop = 'NULL'
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
272 else:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
273 #get utr lengths from annotation
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
274 tran_type = "coding"
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
275 coding_genes_dict[gene] = True
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
276 sorted_exons = sorted(master_dict[tran]["exon"])
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
277 sorted_cds = sorted(master_dict[tran]["cds"])
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
278 min_cds = sorted_cds[0][0]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
279 #Some annotation files do not have utr annotation types, so fix that here if thats the case
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
280 if master_dict[tran]["utr"] == []:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
281 for exon_tup in master_dict[tran]["exon"]:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
282 if exon_tup not in master_dict[tran]["cds"]:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
283 # Now check if this overlaps with any of the CDS exons
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
284 overlap = False
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
285 for cds_tup in master_dict[tran]["cds"]:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
286 if exon_tup[0] == cds_tup[0] and exon_tup[1] != cds_tup[1]:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
287 master_dict[tran]["utr"].append((cds_tup[1],exon_tup[1]))
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
288 overlap = True
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
289 if exon_tup[0] != cds_tup[0] and exon_tup[1] == cds_tup[1]:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
290 master_dict[tran]["utr"].append((exon_tup[0],cds_tup[0]))
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
291 overlap = True
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
292 if overlap == False:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
293 master_dict[tran]["utr"].append(exon_tup)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
294
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
295
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
296 '''
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
297 if tran == "NM_001258497":
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
298 print ("sorted cds",sorted_cds)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
299 print ("min cds",min_cds)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
300 print ("chrom",master_dict[tran]["chrom"])
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
301 print ("sorted exons", sorted_exons)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
302 print ("utr",master_dict[tran]["utr"])
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
303 sys.exit()
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
304 '''
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
305 #if tran == "ENST00000381401":
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
306 # print ("min cds,sorted utr",min_cds,sorted(master_dict[tran]["utr"]))
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
307 for tup in sorted(master_dict[tran]["utr"]):
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
308 #if tran == "ENST00000381401":
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
309 # print ("tup", tup)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
310 if tup[0] < min_cds:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
311 five_len += (tup[1]-tup[0])+1
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
312 #if tran == "ENST00000381401":
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
313 # print ("adding to fivelen")
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
314 elif tup[0] > min_cds:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
315 three_len += (tup[1] - tup[0])+1
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
316 #if tran == "ENST00000381401":
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
317 # print ("adding to three len")
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
318 else:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
319 pass
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
320 if strand == "+":
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
321 if len(sorted_exons) > 1:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
322 sorted_exons[0] = (sorted_exons[0][0]-pseudo_utr_len, sorted_exons[0][1])
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
323 sorted_exons[-1] = (sorted_exons[-1][0], sorted_exons[-1][1]+pseudo_utr_len)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
324 else:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
325 sorted_exons[0] = (sorted_exons[0][0]-pseudo_utr_len, sorted_exons[0][1]+pseudo_utr_len)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
326 master_dict[tran]["exon"] = sorted_exons
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
327 cds_start = (five_len+pseudo_utr_len)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
328 cds_stop = ((total_length - three_len)-pseudo_utr_len)+1
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
329 elif strand == "-":
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
330 if len(sorted_exons) > 1:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
331 sorted_exons[0] = (sorted_exons[0][0]-pseudo_utr_len, sorted_exons[0][1])
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
332 sorted_exons[-1] = (sorted_exons[-1][0], sorted_exons[-1][1]+pseudo_utr_len)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
333 else:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
334 sorted_exons[0] = (sorted_exons[0][0]-pseudo_utr_len, sorted_exons[0][1]+pseudo_utr_len)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
335 master_dict[tran]["exon"] = sorted_exons
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
336 cds_start = (three_len+pseudo_utr_len)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
337 cds_stop = ((total_length - (five_len))-pseudo_utr_len)+1
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
338 #if tran == "ENST00000381401":
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
339 # print ("cds start, cds stop, five_len, three_len",cds_start,cds_stop,five_len,three_len)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
340 # #sys.exit()
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
341 else:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
342 print ("strand is unknown: {}".format(strand))
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
343 sys.exit()
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
344
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
345 #get exon junctions, cds is easy just get end of each tuple except last, same for utr except for if same as cds start/stop
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
346 total_intronic = 0
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
347 try:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
348 if strand == "+":
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
349 tx_start = min(sorted(master_dict[tran]["exon"]))[0]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
350 prev_end = tx_start
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
351 for tup in sorted(master_dict[tran]["exon"])[:-1]:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
352 total_intronic += tup[0]-prev_end
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
353 exon_junctions.append(((tup[1])-tx_start)-total_intronic)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
354 prev_end = tup[1]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
355 elif strand == "-":
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
356 tx_start = max(sorted(master_dict[tran]["exon"]))[-1]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
357 prev_end = tx_start
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
358 for tup in (sorted(master_dict[tran]["exon"])[1:])[::-1]:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
359 total_intronic += (tup[0]+1)-prev_end
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
360 exon_junctions.append(((tup[1])-tx_start)-total_intronic)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
361 prev_end = tup[1]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
362 except:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
363 if strand == "+":
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
364 tx_start = min(sorted(master_dict[tran]["cds"]))[0]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
365 prev_end = tx_start
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
366 for tup in sorted(master_dict[tran]["cds"])[:-1]:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
367 total_intronic += tup[0]-prev_end
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
368 exon_junctions.append(((tup[1])-tx_start)-total_intronic)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
369 prev_end = tup[1]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
370 elif strand == "-":
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
371 tx_start = max(sorted(master_dict[tran]["cds"]))[-1]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
372 prev_end = tx_start
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
373 for tup in (sorted(master_dict[tran]["cds"])[1:])[::-1]:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
374 total_intronic += (tup[0]+1)-prev_end
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
375 exon_junctions.append(((tup[1])-tx_start)-total_intronic)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
376 prev_end = tup[1]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
377 if strand == "+" and cds_start != "NULL":
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
378 master_dict[tran]["cds_start"] = cds_start
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
379 master_dict[tran]["cds_stop"] = cds_stop
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
380 elif strand == "-" and cds_start != "NULL":
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
381 master_dict[tran]["cds_start"] = cds_start
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
382 master_dict[tran]["cds_stop"] = cds_stop
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
383 master_dict[tran]["strand"] = strand
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
384 master_dict[tran]["tran_type"] = tran_type
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
385 master_dict[tran]["exon_junctions"] = exon_junctions
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
386
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
387 longest_tran_dict = {}
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
388 for tran in master_dict:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
389 try:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
390 gene = master_dict[tran]["gene_name"]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
391 except:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
392 continue
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
393 if coding_genes_dict[gene] == True:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
394 if "cds_start" in master_dict[tran]:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
395 if master_dict[tran]["cds_stop"] != "NULL" and master_dict[tran]["cds_start"] != "NULL":
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
396 cds_length = master_dict[tran]["cds_stop"]- master_dict[tran]["cds_start"]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
397 if gene not in longest_tran_dict:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
398 longest_tran_dict[gene] = {"tran":tran,"length":cds_length}
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
399 else:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
400 if cds_length > longest_tran_dict[gene]["length"]:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
401 longest_tran_dict[gene] = {"tran":tran,"length":cds_length}
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
402 if cds_length == longest_tran_dict[gene]["length"]:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
403 if master_dict[tran]["length"] > master_dict[longest_tran_dict[gene]["tran"]]["length"]:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
404 longest_tran_dict[gene] = {"tran":tran,"length":cds_length}
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
405 else:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
406 length = master_dict[tran]["length"]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
407 if gene not in longest_tran_dict:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
408 longest_tran_dict[gene] = {"tran":tran,"length":length}
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
409 elif length > longest_tran_dict[gene]["length"]:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
410 longest_tran_dict[gene] = {"tran":tran,"length":length}
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
411
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
412
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
413
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
414
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
415
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
416 for gene in longest_tran_dict:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
417 longest_tran = longest_tran_dict[gene]["tran"]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
418 master_dict[longest_tran]["principal"] = 1
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
419
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
420 gene_sample = []
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
421 for key in list(master_dict)[:10]:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
422 try:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
423 gene_sample.append(master_dict[key]["gene_name"])
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
424 except:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
425 pass
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
426
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
427 print ("Here is a sample of the transcript ids: {}".format(list(master_dict)[:10]))
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
428 print ("Here is a sample of the gene names: {}".format(gene_sample))
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
429
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
430
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
431 # Takes a transcript, transcriptomic position and a master_dict (see ribopipe scripts) and returns the genomic position, positions should be passed 1 at a time.
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
432 def tran_to_genome(tran, start_pos, end_pos, master_dict):
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
433 pos_list = []
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
434 for i in range(start_pos,end_pos+1):
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
435 pos_list.append(i)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
436 genomic_pos_list = []
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
437 if tran in master_dict:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
438 transcript_info = master_dict[tran]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
439 else:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
440 return ("Null", [])
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
441
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
442 chrom = transcript_info["chrom"]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
443 strand = transcript_info["strand"]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
444 exons = transcript_info["exon"]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
445 #print ("chrom,strand,exons",chrom,strand,exons)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
446 for pos in pos_list:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
447 #print ("pos",pos)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
448 if strand == "+":
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
449 exon_start = 0
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
450 for tup in exons:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
451 #print ("tup",tup)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
452 exon_start = tup[0]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
453 exonlen = tup[1] - tup[0]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
454 if pos > exonlen:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
455 pos = (pos - exonlen)-1
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
456 else:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
457 break
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
458 #print ("appending exon_start-pos", exon_start, pos, exon_start+pos)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
459 genomic_pos_list.append((exon_start+pos)-1)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
460 elif strand == "-":
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
461 exon_start = 0
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
462 for tup in exons[::-1]:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
463 #print ("tup",tup)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
464 exon_start = tup[1]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
465 exonlen = tup[1] - tup[0]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
466 #print ("exonlen",exonlen)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
467 if pos > exonlen:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
468 #print ("pos is greater")
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
469 pos = (pos - exonlen)-1
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
470 #print ("new pos",pos)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
471 else:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
472 break
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
473 #print ("appending exon_start-pos", exon_start, pos, exon_start-pos)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
474 genomic_pos_list.append((exon_start-pos)+1)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
475 return (chrom, genomic_pos_list)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
476
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
477
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
478
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
479
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
480 orf_dict = {"uorf":{},
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
481 "ouorf":{},
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
482 "cds":{},
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
483 "nested":{},
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
484 "odorf":{},
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
485 "dorf":{},
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
486 "minusone":{},
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
487 "readthrough":{},
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
488 "plusone":{},
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
489 "noncoding":{},
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
490 "extension":{},
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
491 "inframe_stop":{}
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
492 }
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
493
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
494 start_codons = ["ATG","GTG","CTG"]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
495 stop_codons = ["TAG","TAA","TGA"]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
496
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
497
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
498 # Keep track of the longest transcript for each noncoding gene, append this to transcript list later
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
499 longest_noncoding = {}
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
500
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
501
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
502 tran_count = 0
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
503 # This section is used to gather all cds regions, convert them to genomic regions and store them in a dictionary to check against later (all transcript contribute to this not just those
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
504 # in the transcript list)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
505 genomic_cds_dict = {}
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
506 tree_dict = {}
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
507 for transcript in master_dict:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
508 #print (transcript, master_dict[transcript]["tran_type"])
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
509 tran_count += 1
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
510 if "seq" not in master_dict[transcript]:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
511 continue
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
512 chrom = master_dict[transcript]["chrom"]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
513 if chrom not in genomic_cds_dict:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
514 genomic_cds_dict[chrom] = []
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
515 if "cds_start" in master_dict[transcript]:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
516 cds_start = master_dict[transcript]["cds_start"]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
517 cds_stop = master_dict[transcript]["cds_stop"]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
518 if cds_start != "NULL":
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
519 cds_pos = []
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
520 for i in range(cds_start, cds_stop+1):
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
521 cds_pos.append(i)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
522
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
523 for tup in master_dict[transcript]["cds"]:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
524 if tup[0] != tup[1]:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
525 if tup not in genomic_cds_dict[chrom]:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
526 genomic_cds_dict[chrom].append(tup)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
527
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
528 print ("genomic cds dict built")
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
529 print (list(genomic_cds_dict))
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
530 for chrom in genomic_cds_dict:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
531 tree_dict[chrom] = IntervalTree.from_tuples(genomic_cds_dict[chrom])
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
532
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
533 #print (list(tree_dict))
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
534
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
535
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
536 connection = sqlite3.connect("{}".format(sys.argv[6]))
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
537 cursor = connection.cursor()
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
538 cursor.execute("CREATE TABLE IF NOT EXISTS transcripts (transcript VARCHAR(50), gene VARCHAR(50), length INT(6), cds_start INT(6), cds_stop INT(6), sequence VARCHAR(50000), strand CHAR(1), stop_list VARCHAR(10000), start_list VARCHAR(10000), exon_junctions VARCHAR(1000), tran_type INT(1), gene_type INT(1), principal INT(1), version INT(2),gc INT(3),five_gc INT(3), cds_gc INT(3), three_gc INT(3), chrom VARCHAR(20));")
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
539 cursor.execute("CREATE TABLE IF NOT EXISTS coding_regions (transcript VARCHAR(50), coding_start INT(6), coding_stop INT(6));")
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
540 cursor.execute("CREATE TABLE IF NOT EXISTS exons (transcript VARCHAR(50), exon_start INT(6), exon_stop INT(6));")
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
541 cursor.execute("CREATE TABLE IF NOT EXISTS uorf (transcript VARCHAR(300), start_codon VARCHAR(10), length INT(6), start INT(6), stop INT(6), sequence VARCHAR(50000), cds_coverage FLOAT(20));")
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
542 cursor.execute("CREATE TABLE IF NOT EXISTS ouorf (transcript VARCHAR(300), start_codon VARCHAR(10), length INT(6), start INT(6), stop INT(6), sequence VARCHAR(50000), cds_coverage FLOAT(20));")
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
543 cursor.execute("CREATE TABLE IF NOT EXISTS cds (transcript VARCHAR(300), start_codon VARCHAR(10), length INT(6), start INT(6), stop INT(6), sequence VARCHAR(50000), cds_coverage FLOAT(20));")
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
544 cursor.execute("CREATE TABLE IF NOT EXISTS nested (transcript VARCHAR(300), start_codon VARCHAR(10), length INT(6), start INT(6), stop INT(6), sequence VARCHAR(50000), cds_coverage FLOAT(20));")
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
545 cursor.execute("CREATE TABLE IF NOT EXISTS odorf (transcript VARCHAR(300), start_codon VARCHAR(10), length INT(6), start INT(6), stop INT(6), sequence VARCHAR(50000), cds_coverage FLOAT(20));")
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
546 cursor.execute("CREATE TABLE IF NOT EXISTS dorf (transcript VARCHAR(300), start_codon VARCHAR(10), length INT(6), start INT(6), stop INT(6), sequence VARCHAR(50000), cds_coverage FLOAT(20));")
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
547 cursor.execute("CREATE TABLE IF NOT EXISTS minusone(transcript VARCHAR(300), start_codon VARCHAR(10), length INT(6), start INT(6), stop INT(6), sequence VARCHAR(50000), cds_coverage FLOAT(20));")
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
548 cursor.execute("CREATE TABLE IF NOT EXISTS readthrough (transcript VARCHAR(300), start_codon VARCHAR(10), length INT(6), start INT(6), stop INT(6), sequence VARCHAR(50000), cds_coverage FLOAT(20));")
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
549 cursor.execute("CREATE TABLE IF NOT EXISTS plusone (transcript VARCHAR(300), start_codon VARCHAR(10), length INT(6), start INT(6), stop INT(6), sequence VARCHAR(50000), cds_coverage FLOAT(20));")
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
550 cursor.execute("CREATE TABLE IF NOT EXISTS noncoding (transcript VARCHAR(300), start_codon VARCHAR(10), length INT(6), start INT(6), stop INT(6), sequence VARCHAR(50000), cds_coverage FLOAT(20));")
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
551 cursor.execute("CREATE TABLE IF NOT EXISTS extension (transcript VARCHAR(300), start_codon VARCHAR(10), length INT(6), start INT(6), stop INT(6), sequence VARCHAR(50000), cds_coverage FLOAT(20));")
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
552 cursor.execute("CREATE TABLE IF NOT EXISTS inframe_stop (transcript VARCHAR(300), start_codon VARCHAR(10), length INT(6), start INT(6), stop INT(6), sequence VARCHAR(50000), cds_coverage FLOAT(20));")
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
553 connection.commit();
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
554
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
555
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
556 print ("Finding ORFs")
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
557 transcript_count = 0
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
558 total_transcripts = len(list(master_dict))
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
559 for transcript in master_dict:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
560 #print ("transcript",transcript)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
561 #if transcript != "ENST00000316448":
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
562 # continue
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
563 transcript_count += 1
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
564 if transcript_count%100 == 0:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
565 print ("Transcripts complete: {}/{}".format(transcript_count,total_transcripts))
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
566 if "seq" not in master_dict[transcript]:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
567 print ("transcript {} has no sequence".format(transcript))
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
568 continue
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
569 seq = master_dict[transcript]["seq"]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
570 cds_start = "NULL"
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
571 cds_stop = "NULL"
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
572 transcript_len = len(seq)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
573 if "cds_start" in master_dict[transcript]:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
574 cds_start = master_dict[transcript]["cds_start"]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
575 cds_stop = master_dict[transcript]["cds_stop"]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
576
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
577 #Find out what regions of this transcript overlap with any other coding regions
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
578 coding_positions = []
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
579 if cds_start != "NULL":
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
580 #If this is a coding transcript don't bother checking the CDS
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
581 for i in range(cds_start,cds_stop):
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
582 coding_positions.append(i)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
583 #check 5' leader
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
584 chrom, pos_list = tran_to_genome(transcript, 0, cds_start, master_dict)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
585 for i in range(0,cds_start):
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
586 genomic_pos = pos_list[i]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
587 overlap = tree_dict[chrom][genomic_pos]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
588 if len(overlap) != 0:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
589 coding_positions.append(i)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
590 #check 3' trailer
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
591 chrom, pos_list = tran_to_genome(transcript, cds_stop, transcript_len, master_dict)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
592 for i in range(cds_stop,transcript_len+1):
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
593 #print ("i",i)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
594 genomic_pos = pos_list[i-cds_stop]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
595 #print ("genomic position",genomic_pos)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
596 overlap = tree_dict[chrom][genomic_pos]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
597 if len(overlap) != 0:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
598 #print ("overlap not empty appending i",overlap)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
599 coding_positions.append(i)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
600 else:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
601 #check entire transcript
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
602 chrom, pos_list = tran_to_genome(transcript, 0, transcript_len, master_dict)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
603 for i in range(0,transcript_len):
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
604 genomic_pos = pos_list[i]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
605 overlap = tree_dict[chrom][genomic_pos]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
606 if len(overlap) != 0:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
607 coding_positions.append(i)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
608 coding_positions_tuple = to_ranges(coding_positions)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
609 coding_dict[transcript] = coding_positions_tuple
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
610 coding_positions = set(coding_positions)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
611 #if this is a coding transcript find the minusone, readhtrough, plusone co-ordinates
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
612 if cds_start != "NULL":
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
613 if pseudo_utr_len != 0:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
614 cds_stop -= 3 # take 3 from stop so we can match it with orf_stop, do it here rather than above in case cds_stop is null
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
615 recoding_dict = {0:"minusone",1:"readthrough",2:"plusone"}
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
616 for addition in recoding_dict:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
617 orftype = recoding_dict[addition]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
618 for i in range(cds_stop+addition,transcript_len,3):
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
619 if seq[i:i+3] in stop_codons:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
620 orf_seq = seq[cds_stop:i+3]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
621 orf_start = cds_stop
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
622 orf_stop = i+2 # +2 so it refers to the end of the stop codon
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
623 start_codon = None
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
624 if orf_seq:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
625 length = len(orf_seq)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
626 orf_pos_list = []
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
627 #determine how many nucleotides in this orf overlap with an annotated coding region
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
628 cds_cov_count = 0.0
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
629 for position in range(orf_start,orf_stop):
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
630 orf_pos_list.append(position)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
631 for pos in range(orf_start, orf_stop+1):
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
632 if pos in coding_positions:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
633 cds_cov_count += 1
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
634 cds_cov = cds_cov_count/length
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
635 cursor.execute("INSERT INTO {} VALUES('{}','{}',{},{},{},'{}',{});".format(orftype, transcript, start_codon, length,orf_start,orf_stop,orf_seq,cds_cov))
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
636 break
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
637 for frame in [0,1,2]:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
638 for i in range(frame,transcript_len,3):
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
639 if seq[i:i+3] in start_codons:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
640 for x in range(i, transcript_len,3):
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
641 if seq[x:x+3] in stop_codons:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
642 orf_seq = seq[i:x+3]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
643 orf_start = i
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
644 orf_stop = x+2 # +2 so it refers to the end of the stop codon
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
645 start_codon = seq[i:i+3]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
646 length = len(orf_seq)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
647 orf_pos_list = []
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
648 #determine how many nucleotides in this orf overlap with an annotated coding region
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
649 cds_cov_count = 0.0
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
650 for pos in range(orf_start, orf_stop+1):
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
651 if pos in coding_positions:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
652 cds_cov_count += 1
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
653 cds_cov = float(cds_cov_count)/float(length)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
654 # Now determine orf type
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
655 if cds_start == "NULL":
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
656 orftype = "noncoding"
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
657 else:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
658 #print ("cds start is not null :{}:".format(cds_start))
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
659 if orf_start == cds_start and orf_stop == cds_stop:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
660 orftype = "cds"
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
661 elif orf_start < cds_start and orf_stop == cds_stop:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
662 orftype = "extension"
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
663 #special case for extensions, we only take from the orf_start to the cds_start, and re-calculate cds coverage
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
664 orf_stop = cds_start
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
665 cds_cov_count = 0.0
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
666 for pos in range(orf_start, orf_stop+1):
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
667 if pos in coding_positions:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
668 cds_cov_count += 1
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
669 cds_cov = float(cds_cov_count)/float(length)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
670 orf_seq = seq[orf_start:cds_start]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
671 length = len(orf_seq)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
672 elif orf_start < cds_start and orf_stop <= cds_start:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
673 orftype = "uorf"
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
674 elif orf_start < cds_start and orf_stop > cds_start:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
675 orftype = "ouorf"
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
676 elif orf_start >= cds_start and orf_start <= cds_stop and orf_stop <= cds_stop:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
677 if orf_stop == cds_stop:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
678 break
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
679 orftype = "nested"
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
680 elif orf_start >= cds_start and orf_start <= cds_stop and orf_stop > cds_stop:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
681 orftype = "odorf"
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
682 elif orf_start > cds_stop and orf_stop > cds_stop:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
683 orftype = "dorf"
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
684 if orf_stop > cds_start and orf_stop < cds_stop:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
685 if (orf_stop+1)%3 == cds_start%3:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
686 orftype = "inframe_stop"
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
687 if transcript not in orf_dict:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
688 orf_dict[orftype][transcript] = []
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
689 cursor.execute("INSERT INTO {} VALUES('{}','{}',{},{},{},'{}',{});".format(orftype, transcript, start_codon, length,orf_start,orf_stop,orf_seq,cds_cov))
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
690 break
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
691 # Used to keep track of the codons at cds_start and cds_stop positions,
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
692 # If there is an issue with the cds co-ordinates the starts and stops counts will
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
693 # be much lower than the other count, start with 1 to prevent division by 0
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
694 nuc_dict = {"stops":{"stops":1,"other":0}, "starts":{"starts":1,"other":0}}
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
695
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
696 def calcgc(seq):
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
697 if seq == "":
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
698 return "NULL"
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
699 g_count = 0
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
700 c_count = 0
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
701 a_count = 0
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
702 t_count = 0
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
703 for char in seq:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
704 if char == "A":
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
705 a_count += 1
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
706 if char == "T":
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
707 t_count += 1
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
708 if char == "G":
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
709 g_count += 1
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
710 if char == "C":
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
711 c_count += 1
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
712 gc = ((g_count+c_count)/float(len(seq)))*100
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
713 return round(gc,2)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
714
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
715
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
716
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
717
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
718 for transcript in master_dict:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
719 #print ("transcripts", transcript)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
720 length = master_dict[transcript]["length"]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
721 cds_start = master_dict[transcript]["cds_start"]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
722 cds_stop = master_dict[transcript]["cds_stop"]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
723 seq = master_dict[transcript]["seq"]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
724 strand = master_dict[transcript]["strand"]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
725 chrom = master_dict[transcript]["chrom"]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
726 gene = master_dict[transcript]["gene_name"]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
727 gc = calcgc(seq)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
728 five_gc = "NULL"
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
729 cds_gc = "NULL"
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
730 three_gc = "NULL"
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
731 if cds_start != "NULL":
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
732 five_gc = calcgc(seq[:cds_start])
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
733 cds_gc = calcgc(seq[cds_start:cds_stop])
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
734 three_gc = calcgc(seq[cds_stop:])
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
735 # check that the nucleotide cds_start points to is the first of the start codon
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
736 # take one becase cds_start is 1 based but python indexing is 0 based
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
737 start_nuc = seq[cds_start-1:cds_start+2]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
738 #print ("start nuc",start_nuc)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
739 if start_nuc == "ATG":
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
740 nuc_dict["starts"]["starts"] += 1
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
741 else:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
742 nuc_dict["starts"]["other"] += 1
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
743 stop_nuc = seq[cds_stop-3:cds_stop]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
744 #print ("stop_nuc",stop_nuc)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
745 if stop_nuc in ["TAG","TAA","TGA"]:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
746 nuc_dict["stops"]["stops"] += 1
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
747 else:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
748 nuc_dict["stops"]["other"] += 1
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
749 tran_type = master_dict[transcript]["tran_type"]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
750 if coding_genes_dict[gene] == True:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
751 gene_type = 1
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
752 else:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
753 gene_type = 0
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
754 #print ("tran type before",tran_type)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
755 if tran_type == "coding":
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
756 tran_type = 1
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
757 else:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
758 tran_type = 0
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
759 #print ("tran type after",tran_type)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
760 start_list = str(master_dict[transcript]["start_list"]).replace(" ","").strip("[]")
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
761 stop_list = str(master_dict[transcript]["stop_list"]).replace(" ","").strip("[]")
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
762 exon_junctions = str(master_dict[transcript]["exon_junctions"]).replace(" ","").strip("[]")
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
763 principal = master_dict[transcript]["principal"]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
764 version = master_dict[transcript]["version"]
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
765 #print (master_dict[transcript])
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
766 #print (tran_type)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
767 #print (gene_type)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
768 #print (principal)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
769 #print (version)
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
770 #print ("INSERT INTO transcripts VALUES('{}','{}',{},{},{},'{}','{}','{}','{}','{}',{},{},{},{});".format(transcript, gene, length, cds_start, cds_stop, seq, strand,stop_list, start_list, exon_junctions, tran_type,gene_type,principal,version))
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
771 cursor.execute("INSERT INTO transcripts VALUES('{}','{}',{},{},{},'{}','{}','{}','{}','{}',{},{},{},{},{},{},{},{},'{}');".format(transcript, gene, length, cds_start, cds_stop, seq, strand,stop_list, start_list, exon_junctions, tran_type,gene_type,principal,version,gc,five_gc,cds_gc,three_gc,chrom))
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
772
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
773 for tup in master_dict[transcript]["exon"]:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
774 cursor.execute("INSERT INTO exons VALUES('{}',{},{});".format(transcript,tup[0],tup[1]))
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
775 if transcript in coding_dict:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
776 for tup in coding_dict[transcript]:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
777 cursor.execute("INSERT INTO coding_regions VALUES('{}',{},{});".format(transcript,tup[0],tup[1]))
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
778
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
779 connection.commit()
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
780 connection.close()
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
781
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
782 if (nuc_dict["starts"]["other"]/nuc_dict["starts"]["starts"]) > 0.05:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
783 print ("Warning: {} transcripts do not have a an AUG at the CDS start position".format(nuc_dict["starts"]["other"]))
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
784 if (nuc_dict["stops"]["other"]/nuc_dict["stops"]["stops"]) > 0.05:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
785 print ("Warning: {} transcripts do not have a an stop codon at the CDS stop position".format(nuc_dict["stops"]["other"]))
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
786 if len(notinannotation) >0:
c5a566609a25 Uploaded
triasteran
parents:
diff changeset
787 print ("Warning: {} transcripts were in the fasta file, but not the annotation file, these will be discarded".format(len(notinannotation)))