comparison gene_identification.py @ 19:c518cf0d4adb draft

Uploaded
author davidvanzessen
date Wed, 01 Apr 2015 05:09:59 -0400
parents b0242cd1da34
children c9f9623f1f76
comparison
equal deleted inserted replaced
18:9dd557f17153 19:c518cf0d4adb
3 import time 3 import time
4 starttime= int(time.time() * 1000) 4 starttime= int(time.time() * 1000)
5 5
6 parser = argparse.ArgumentParser() 6 parser = argparse.ArgumentParser()
7 parser.add_argument("--input", help="The 1_Summary file from an IMGT zip file") 7 parser.add_argument("--input", help="The 1_Summary file from an IMGT zip file")
8 parser.add_argument("--output", help="The annotated summary output file") 8 parser.add_argument("--output", help="The annotated output file to be merged back with the summary file")
9 9
10 args = parser.parse_args() 10 args = parser.parse_args()
11 11
12 infile = args.input 12 infile = args.input
13 #infile = "test_VH-Ca_Cg_25nt/1_Summary_test_VH-Ca_Cg_25nt_241013.txt" 13 #infile = "test_VH-Ca_Cg_25nt/1_Summary_test_VH-Ca_Cg_25nt_241013.txt"
110 if ID not in hits.keys(): #ensure that the dictionairy that keeps track of the hits for every gene exists 110 if ID not in hits.keys(): #ensure that the dictionairy that keeps track of the hits for every gene exists
111 hits[ID] = {"ca_hits": 0, "cg_hits": 0, "cm_hits": 0, "ca1": 0, "ca2": 0, "cg1": 0, "cg2": 0, "cg3": 0, "cg4": 0} 111 hits[ID] = {"ca_hits": 0, "cg_hits": 0, "cm_hits": 0, "ca1": 0, "ca2": 0, "cg1": 0, "cg2": 0, "cg3": 0, "cg4": 0}
112 currentIDHits = hits[ID] 112 currentIDHits = hits[ID]
113 seq = dic[ID] 113 seq = dic[ID]
114 lastindex = 0 114 lastindex = 0
115 start = [0] * len(seq) 115 start_zero = len(searchstrings[key]) #allows the reference sequence to start before search sequence (start_locations of < 0)
116 start = [0] * (len(seq) + start_zero)
116 for i, regexp in enumerate(regularexpressions): #for every regular expression 117 for i, regexp in enumerate(regularexpressions): #for every regular expression
117 relativeStartLocation = lastindex - (chunklength / 2) * i 118 relativeStartLocation = lastindex - (chunklength / 2) * i
118 if relativeStartLocation < 0 or relativeStartLocation >= len(seq): 119 if relativeStartLocation >= len(seq):
119 break 120 break
120 regex, hasVar = regexp 121 regex, hasVar = regexp
121 matches = regex.finditer(seq[lastindex:]) 122 matches = regex.finditer(seq[lastindex:])
122 for match in matches: #for every match with the current regex, only uses the first hit 123 for match in matches: #for every match with the current regex, only uses the first hit
123 lastindex += match.start() 124 lastindex += match.start()
124 start[relativeStartLocation] += 1 125 start[relativeStartLocation + start_zero] += 1
125 if hasVar: #if the regex has a variable nt in it 126 if hasVar: #if the regex has a variable nt in it
126 chunkstart = chunklength / 2 * i #where in the reference does this chunk start 127 chunkstart = chunklength / 2 * i #where in the reference does this chunk start
127 chunkend = chunklength / 2 * i + chunklength #where in the reference does this chunk end 128 chunkend = chunklength / 2 * i + chunklength #where in the reference does this chunk end
128 if key == "ca": #just calculate the variable nt score for 'ca', cheaper 129 if key == "ca": #just calculate the variable nt score for 'ca', cheaper
129 currentIDHits["ca1"] += len([1 for x in ca1 if chunkstart <= x < chunkend and ca1[x] == seq[lastindex + x - chunkstart]]) 130 currentIDHits["ca1"] += len([1 for x in ca1 if chunkstart <= x < chunkend and ca1[x] == seq[lastindex + x - chunkstart]])
138 break #this only breaks when there was a match with the regex, breaking means the 'else:' clause is skipped 139 break #this only breaks when there was a match with the regex, breaking means the 'else:' clause is skipped
139 else: #only runs if there were no hits 140 else: #only runs if there were no hits
140 continue 141 continue
141 #print "found ", regex.pattern , "at", lastindex, "adding one to", (lastindex - chunklength / 2 * i), "to the start array of", ID, "gene", key, "it's now:", start[lastindex - chunklength / 2 * i] 142 #print "found ", regex.pattern , "at", lastindex, "adding one to", (lastindex - chunklength / 2 * i), "to the start array of", ID, "gene", key, "it's now:", start[lastindex - chunklength / 2 * i]
142 currentIDHits[key + "_hits"] += 1 143 currentIDHits[key + "_hits"] += 1
143 start_location[ID + "_" + key] = str([(removeAndReturnMaxIndex(start) + 1) for x in range(5) if len(start) > 0 and max(start) > 1]) 144 start_location[ID + "_" + key] = str([(removeAndReturnMaxIndex(start) + 1 - start_zero) for x in range(5) if len(start) > 0 and max(start) > 1])
144 #start_location[ID + "_" + key] = str(start.index(max(start))) 145 #start_location[ID + "_" + key] = str(start.index(max(start)))
145 146
146 147
147 chunksInCA = len(compiledregex["ca"]) 148 chunksInCA = len(compiledregex["ca"])
148 chunksInCG = len(compiledregex["cg"]) 149 chunksInCG = len(compiledregex["cg"])
159 with open(infile, 'r') as f: #read all sequences into a dictionary as key = ID, value = sequence 160 with open(infile, 'r') as f: #read all sequences into a dictionary as key = ID, value = sequence
160 with open(output, 'w') as o: 161 with open(output, 'w') as o:
161 for line in f: 162 for line in f:
162 total += 1 163 total += 1
163 if first: 164 if first:
164 o.write(line.rstrip() + "\tbest_match\tnt_hit_percentage\tchunk_hit_percentage\tstart_locations\n") 165 o.write("Sequence ID\tbest_match\tnt_hit_percentage\tchunk_hit_percentage\tstart_locations\n")
165 first = False 166 first = False
166 continue 167 continue
167 linesplt = line.split("\t") 168 linesplt = line.split("\t")
168 if linesplt[2] == "No results": 169 if linesplt[2] == "No results":
169 pass 170 pass
170 ID = linesplt[1] 171 ID = linesplt[1]
171 currentIDHits = hits[ID] 172 currentIDHits = hits[ID]
173 print currentIDHits
172 possibleca = float(len(compiledregex["ca"])) 174 possibleca = float(len(compiledregex["ca"]))
173 possiblecg = float(len(compiledregex["cg"])) 175 possiblecg = float(len(compiledregex["cg"]))
174 possiblecm = float(len(compiledregex["cm"])) 176 possiblecm = float(len(compiledregex["cm"]))
175 cahits = currentIDHits["ca_hits"] 177 cahits = currentIDHits["ca_hits"]
176 cghits = currentIDHits["cg_hits"] 178 cghits = currentIDHits["cg_hits"]
177 cmhits = currentIDHits["cm_hits"] 179 cmhits = currentIDHits["cm_hits"]
178 if cahits >= cghits and cahits >= cmhits: #its a ca gene 180 if cahits >= cghits and cahits >= cmhits: #its a ca gene
179 ca1hits = currentIDHits["ca1"] 181 ca1hits = currentIDHits["ca1"]
180 ca2hits = currentIDHits["ca2"] 182 ca2hits = currentIDHits["ca2"]
181 if ca1hits >= ca2hits: 183 if ca1hits >= ca2hits:
182 o.write(line.rstrip() + "\tca1\t" + str(int(ca1hits / varsInCA * 100)) + "\t" + str(int(cahits / possibleca * 100)) + "\t" + start_location[ID + "_ca"] + "\n") 184 o.write(ID + "\tca1\t" + str(int(ca1hits / varsInCA * 100)) + "\t" + str(int(cahits / possibleca * 100)) + "\t" + start_location[ID + "_ca"] + "\n")
183 else: 185 else:
184 o.write(line.rstrip() + "\tca2\t" + str(int(ca2hits / varsInCA * 100)) + "\t" + str(int(cahits / possibleca * 100)) + "\t" + start_location[ID + "_ca"] + "\n") 186 o.write(ID + "\tca2\t" + str(int(ca2hits / varsInCA * 100)) + "\t" + str(int(cahits / possibleca * 100)) + "\t" + start_location[ID + "_ca"] + "\n")
185 elif cghits >= cahits and cghits >= cmhits: #its a cg gene 187 elif cghits >= cahits and cghits >= cmhits: #its a cg gene
186 cg1hits = currentIDHits["cg1"] 188 cg1hits = currentIDHits["cg1"]
187 cg2hits = currentIDHits["cg2"] 189 cg2hits = currentIDHits["cg2"]
188 cg3hits = currentIDHits["cg3"] 190 cg3hits = currentIDHits["cg3"]
189 cg4hits = currentIDHits["cg4"] 191 cg4hits = currentIDHits["cg4"]
190 if cg1hits >= cg2hits and cg1hits >= cg3hits and cg1hits >= cg4hits: #cg1 gene 192 if cg1hits >= cg2hits and cg1hits >= cg3hits and cg1hits >= cg4hits: #cg1 gene
191 o.write(line.rstrip() + "\tcg1\t" + str(int(cg1hits / varsInCG * 100)) + "\t" + str(int(cghits / possiblecg * 100)) + "\t" + start_location[ID + "_cg"] + "\n") 193 o.write(ID + "\tcg1\t" + str(int(cg1hits / varsInCG * 100)) + "\t" + str(int(cghits / possiblecg * 100)) + "\t" + start_location[ID + "_cg"] + "\n")
192 elif cg2hits >= cg1hits and cg2hits >= cg3hits and cg2hits >= cg4hits: #cg2 gene 194 elif cg2hits >= cg1hits and cg2hits >= cg3hits and cg2hits >= cg4hits: #cg2 gene
193 o.write(line.rstrip() + "\tcg2\t" + str(int(cg2hits / varsInCG * 100)) + "\t" + str(int(cghits / possiblecg * 100)) + "\t" + start_location[ID + "_cg"] + "\n") 195 o.write(ID + "\tcg2\t" + str(int(cg2hits / varsInCG * 100)) + "\t" + str(int(cghits / possiblecg * 100)) + "\t" + start_location[ID + "_cg"] + "\n")
194 elif cg3hits >= cg1hits and cg3hits >= cg2hits and cg3hits >= cg4hits: #cg3 gene 196 elif cg3hits >= cg1hits and cg3hits >= cg2hits and cg3hits >= cg4hits: #cg3 gene
195 o.write(line.rstrip() + "\tcg3\t" + str(int(cg3hits / varsInCG * 100)) + "\t" + str(int(cghits / possiblecg * 100)) + "\t" + start_location[ID + "_cg"] + "\n") 197 o.write(ID + "\tcg3\t" + str(int(cg3hits / varsInCG * 100)) + "\t" + str(int(cghits / possiblecg * 100)) + "\t" + start_location[ID + "_cg"] + "\n")
196 else: #cg4 gene 198 else: #cg4 gene
197 o.write(line.rstrip() + "\tcg4\t" + str(int(cg4hits / varsInCG * 100)) + "\t" + str(int(cghits / possiblecg * 100)) + "\t" + start_location[ID + "_cg"] + "\n") 199 o.write(ID + "\tcg4\t" + str(int(cg4hits / varsInCG * 100)) + "\t" + str(int(cghits / possiblecg * 100)) + "\t" + start_location[ID + "_cg"] + "\n")
198 else: #its a cm gene 200 else: #its a cm gene
199 o.write(line.rstrip() + "\tcm\t0\t" + str(int(cmhits / possiblecm * 100)) + "\t" + start_location[ID + "_cg"] + "\n") 201 o.write(ID + "\tcm\t0\t" + str(int(cmhits / possiblecm * 100)) + "\t" + start_location[ID + "_cg"] + "\n")
200 seq_write_count += 1 202 seq_write_count += 1
201 203
202 print "Time: %i" % (int(time.time() * 1000) - starttime) 204 print "Time: %i" % (int(time.time() * 1000) - starttime)
203 205
204 print "Number of sequences written to file:", seq_write_count 206 print "Number of sequences written to file:", seq_write_count