annotate tools/genome_diversity/genome_diversity.py @ 1:cdcb0ce84a1b

Uploaded
author xuebing
date Fri, 09 Mar 2012 19:45:15 -0500
parents 9071e359b9a3
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
1 #!/usr/bin/env python2.5
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
2
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
3 import sys
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
4 import cdblib
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
5
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
6 def _openfile( filename=None, mode='r' ):
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
7 try:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
8 fh = open( filename, mode )
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
9 except IOError, err:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
10 raise RuntimeError( "can't open file: %s\n" % str( err ) )
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
11 return fh
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
12
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
13 def get_filename_from_loc( species=None, filename=None ):
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
14 fh = _openfile( filename )
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
15 for line in fh:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
16 if line and not line.startswith( '#' ):
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
17 line = line.rstrip( '\r\n' )
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
18 if line:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
19 elems = line.split( '\t' )
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
20 if len( elems ) >= 2 and elems[0] == species:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
21 return elems[1]
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
22 return None
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
23
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
24
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
25 class SnpFile( object ):
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
26 def __init__( self, filename=None, seq_col=1, pos_col=2, ref_seq_col=7, ref_pos_col=8 ):
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
27 self.filename = filename
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
28 self.fh = _openfile( filename )
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
29 self.seq_col = seq_col
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
30 self.pos_col = pos_col
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
31 self.ref_seq_col = ref_seq_col
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
32 self.ref_pos_col = ref_pos_col
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
33 self.elems = None
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
34 self.line = None
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
35 self.comments = []
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
36
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
37 def next( self ):
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
38 while self.fh:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
39 try:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
40 self.line = self.fh.next()
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
41 except StopIteration:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
42 self.line = None
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
43 self.elems = None
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
44 return None
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
45 if self.line:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
46 self.line = self.line.rstrip( '\r\n' )
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
47 if self.line:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
48 if self.line.startswith( '#' ):
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
49 self.comments.append( self.line )
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
50 else:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
51 self.elems = self.line.split( '\t' )
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
52 return 1
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
53
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
54 def get_seq_pos( self ):
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
55 if self.elems:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
56 return self.elems[ self.seq_col - 1 ], self.elems[ self.pos_col - 1 ]
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
57 else:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
58 return None, None
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
59
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
60 def get_ref_seq_pos( self ):
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
61 if self.elems:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
62 return self.elems[ self.ref_seq_seq - 1 ], self.elems[ self.ref_pos_col - 1 ]
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
63 else:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
64 return None, None
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
65
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
66
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
67 class IndexedFile( object ):
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
68
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
69 def __init__( self, data_file=None, index_file=None ):
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
70 self.data_file = data_file
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
71 self.index_file = index_file
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
72 self.data_fh = _openfile( data_file )
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
73 self.index_fh = _openfile( index_file )
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
74 self._reader = cdblib.Reader( self.index_fh.read(), hash )
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
75
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
76 def get_indexed_line( self, key=None ):
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
77 line = None
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
78 if key in self._reader:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
79 offset = self._reader.getint( key )
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
80 self.data_fh.seek( offset )
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
81 try:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
82 line = self.data_fh.next()
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
83 except StopIteration:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
84 raise RuntimeError( 'index file out of sync for %s' % key )
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
85 return line
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
86
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
87 class PrimersFile( IndexedFile ):
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
88 def get_primer_header( self, sequence=None, position=None ):
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
89 key = "%s %s" % ( str( sequence ), str( position ) )
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
90 header = self.get_indexed_line( key )
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
91 if header:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
92 if header.startswith( '>' ):
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
93 elems = header.split()
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
94 if len( elems ) < 3:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
95 raise RuntimeError( 'short primers header for %s' % key )
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
96 if sequence != elems[1] or str( position ) != elems[2]:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
97 raise RuntimeError( 'primers index for %s finds %s %s' % ( key, elems[1], elems[2] ) )
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
98 else:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
99 raise RuntimeError( 'primers index out of sync for %s' % key )
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
100 return header
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
101
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
102 def get_entry( self, sequence=None, position=None ):
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
103 entry = self.get_primer_header( sequence, position )
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
104 if entry:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
105 while self.data_fh:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
106 try:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
107 line = self.data_fh.next()
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
108 except StopIteration:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
109 break
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
110 if line.startswith( '>' ):
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
111 break
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
112 entry += line
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
113 return entry
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
114
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
115 def get_enzymes( self, sequence=None, position=None ):
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
116 entry = self.get_primer_header( sequence, position )
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
117 enzyme_list = []
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
118 if entry:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
119 try:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
120 line = self.data_fh.next()
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
121 except StopIteration:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
122 raise RuntimeError( 'primers entry for %s %s is truncated' % ( str( sequence ), str( position ) ) )
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
123 if line.startswith( '>' ):
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
124 raise RuntimeError( 'primers entry for %s %s is truncated' % ( str( sequence ), str( position ) ) )
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
125 line.rstrip( '\r\n' )
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
126 if line:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
127 enzymes = line.split( ',' )
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
128 for enzyme in enzymes:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
129 enzyme = enzyme.strip()
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
130 if enzyme:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
131 enzyme_list.append( enzyme )
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
132 return enzyme_list
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
133
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
134 class SnpcallsFile( IndexedFile ):
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
135 def get_snp_seq( self, sequence=None, position=None ):
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
136 key = "%s %s" % ( str( sequence ), str( position ) )
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
137 line = self.get_indexed_line( key )
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
138 if line:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
139 elems = line.split( '\t' )
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
140 if len (elems) < 3:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
141 raise RuntimeError( 'short snpcalls line for %s' % key )
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
142 if sequence != elems[0] or str( position ) != elems[1]:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
143 raise RuntimeError( 'snpcalls index for %s finds %s %s' % ( key, elems[0], elems[1] ) )
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
144 return elems[2]
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
145 else:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
146 return None
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
147
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
148 def get_flanking_dna( self, sequence=None, position=None, format='fasta' ):
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
149 if format != 'fasta' and format != 'primer3':
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
150 raise RuntimeError( 'invalid format for flanking dna: %s' % str( format ) )
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
151 seq = self.get_snp_seq( sequence, position )
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
152 if seq:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
153 p = seq.find('[')
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
154 if p == -1:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
155 raise RuntimeError( 'snpcalls entry for %s %s missing left bracket: %s' % ( str( sequence ), str( position ), seq ) )
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
156 q = seq.find(']', p + 1)
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
157 if q == -1:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
158 raise RuntimeError( 'snpcalls entry for %s %s missing right bracket: %s' % ( str( sequence ), str( position ), seq ) )
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
159 q += 1
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
160
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
161 if format == 'fasta':
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
162 flanking_seq = '> '
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
163 else:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
164 flanking_seq = 'SEQUENCE_ID='
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
165
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
166 flanking_seq += "%s %s %s %s\n" % ( str( sequence ), str( position ), seq[p+1], seq[p+3] )
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
167
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
168 if format == 'primer3':
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
169 flanking_seq += 'SEQUENCE_TEMPLATE='
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
170
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
171 flanking_seq += "%sn%s\n" % ( seq[0:p], seq[q:] )
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
172
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
173 if format == 'primer3':
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
174 flanking_seq += "SEQUENCE_TARGET=%d,11\n=\n" % ( p - 5 )
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
175
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
176 return flanking_seq
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
177 else:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
178 return None
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
179
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
180
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
181
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
182 class LocationFile( object ):
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
183 def __init__(self, filename):
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
184 self.build_map(filename)
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
185
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
186 def build_map(self, filename):
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
187 self.map = {}
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
188 self.open_file(filename)
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
189 for line in self.read_lines():
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
190 elems = line.split('\t', 1)
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
191 if len(elems) == 2:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
192 self.map[ elems[0].strip() ] = elems[1].strip()
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
193 self.close_file()
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
194
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
195 def read_lines(self):
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
196 for line in self.fh:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
197 if not line.startswith('#'):
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
198 line = line.rstrip('\r\n')
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
199 yield line
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
200
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
201 def open_file(self, filename):
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
202 self.filename = filename
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
203 try:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
204 self.fh = open(filename, 'r')
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
205 except IOError, err:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
206 print >> sys.stderr, "Error opening location file '%s': %s" % (filename, str(err))
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
207 sys.exit(1)
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
208
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
209 def close_file(self):
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
210 self.fh.close()
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
211
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
212 def loc_file( self, key ):
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
213 if key in self.map:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
214 return self.map[key]
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
215 else:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
216 print >> sys.stderr, "'%s' does not appear in location file '%s'" % (key, self.filename)
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
217 sys.exit(1)
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
218
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
219 class ChrLens( object ):
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
220 def __init__( self, location_file, species ):
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
221 self.chrlen_loc = LocationFile( location_file )
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
222 self.chrlen_filename = self.chrlen_loc.loc_file( species )
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
223 self.build_map()
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
224
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
225 def build_map(self):
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
226 self.map = {}
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
227 self.open_file(self.chrlen_filename)
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
228 for line in self.read_lines():
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
229 elems = line.split('\t', 1)
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
230 if len(elems) == 2:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
231 chrom = elems[0].strip()
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
232 chrom_len_text = elems[1].strip()
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
233 try:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
234 chrom_len = int( chrom_len_text )
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
235 except ValueError:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
236 print >> sys.stderr, "Bad length '%s' for chromosome '%s' in '%s'" % (chrom_len_text, chrom, self.chrlen_filename)
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
237 self.map[ chrom ] = chrom_len
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
238 self.close_file()
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
239
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
240 def read_lines(self):
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
241 for line in self.fh:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
242 if not line.startswith('#'):
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
243 line = line.rstrip('\r\n')
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
244 yield line
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
245
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
246 def open_file(self, filename):
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
247 self.filename = filename
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
248 try:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
249 self.fh = open(filename, 'r')
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
250 except IOError, err:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
251 print >> sys.stderr, "Error opening chromosome length file '%s': %s" % (filename, str(err))
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
252 sys.exit(1)
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
253
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
254 def close_file(self):
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
255 self.fh.close()
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
256
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
257 def length( self, key ):
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
258 if key in self.map:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
259 return self.map[key]
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
260 else:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
261 return None
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
262
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
263 def __iter__( self ):
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
264 for chrom in self.map:
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
265 yield chrom
9071e359b9a3 Uploaded
xuebing
parents:
diff changeset
266