annotate tools/filter_by_fasta_ids.py @ 0:463ebeccb854 draft

Uploaded
author galaxyp
date Fri, 26 Sep 2014 14:23:16 -0400
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
1 #!/usr/bin/env python
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
2 """ A script to build specific fasta databases """
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
3 from __future__ import print_function
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
4 import sys
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
5 import logging
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
6
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
7 #===================================== Iterator ===============================
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
8 class Sequence:
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
9 ''' Holds protein sequence information '''
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
10 def __init__(self):
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
11 self.header = ""
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
12 self.sequence_parts = []
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
13
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
14 def get_sequence(self):
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
15 return "".join([line.rstrip().replace('\n','').replace('\r','') for line in self.sequence_parts])
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
16
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
17 class FASTAReader:
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
18 """
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
19 FASTA db iterator. Returns a single FASTA sequence object.
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
20 """
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
21 def __init__(self, fasta_name):
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
22 self.fasta_file = open(fasta_name)
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
23 self.next_line = self.fasta_file.readline()
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
24
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
25 def __iter__(self):
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
26 return self
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
27
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
28 def __next__(self):
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
29 ''' Iteration '''
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
30 #while True:
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
31 # line = self.fasta_file.readline()
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
32 # if not line:
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
33 # raise StopIteration
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
34 # if line[0] == '>':
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
35 # break
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
36 next_line = self.next_line
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
37 if not next_line:
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
38 raise StopIteration
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
39
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
40 seq = Sequence()
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
41 seq.header = next_line.rstrip().replace('\n','').replace('\r','')
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
42
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
43 next_line = self.fasta_file.readline()
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
44 while next_line and next_line[0] != '>':
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
45 #tail = self.fasta_file.tell()
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
46 #line = self.fasta_file.readline()
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
47 #if not line:
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
48 # break
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
49 #if line[0] == '>':
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
50 # self.fasta_file.seek(tail)
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
51 # break
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
52 seq.sequence_parts.append(next_line)
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
53 next_line = self.fasta_file.readline()
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
54 self.next_line = next_line
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
55 return seq
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
56
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
57 # Python 2/3 compat
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
58 next = __next__
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
59 #==============================================================================
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
60
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
61 def target_match(target, search_entry):
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
62 ''' Matches '''
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
63 search_entry = search_entry.upper()
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
64 for atarget in target:
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
65 if search_entry.find(atarget) > -1:
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
66 return atarget
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
67 return None
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
68
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
69
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
70 def main():
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
71 ''' the main function'''
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
72 logging.basicConfig(filename='filter_fasta_log',
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
73 level=logging.INFO,
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
74 format='%(asctime)s :: %(levelname)s :: %(message)s',)
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
75
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
76 used_sequences = set()
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
77 work_summary = {'wanted': 0, 'found':0, 'duplicates':0}
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
78 targets = []
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
79
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
80 f_target = open(sys.argv[1])
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
81 for line in f_target.readlines():
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
82 targets.append(">%s" % line.strip().upper())
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
83 f_target.close()
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
84
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
85 logging.info('Read target file and am now looking for %d %s', len(targets), 'sequences.')
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
86
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
87 work_summary['wanted'] = len(targets)
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
88 homd_db = FASTAReader(sys.argv[2])
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
89
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
90 i = 0
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
91 output = open(sys.argv[3], "w")
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
92 try:
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
93 for entry in homd_db:
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
94 target_matched_results = target_match(targets, entry.header)
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
95 if target_matched_results:
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
96 work_summary['found'] += 1
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
97 targets.remove(target_matched_results)
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
98 sequence = entry.get_sequence()
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
99 if sequence in used_sequences:
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
100 work_summary['duplicates'] += 1
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
101 else:
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
102 used_sequences.add(sequence)
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
103 print(entry.header, file=output)
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
104 print(sequence, file=output)
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
105 finally:
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
106 output.close()
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
107
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
108 logging.info('Completed filtering')
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
109 for parm, count in work_summary.items():
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
110 logging.info('%s ==> %d', parm, count)
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
111
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
112 if __name__ == "__main__":
463ebeccb854 Uploaded
galaxyp
parents:
diff changeset
113 main()