-
Notifications
You must be signed in to change notification settings - Fork 0
/
caf.py
executable file
·80 lines (58 loc) · 2 KB
/
caf.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
import fastn
import utils
class Error (Exception): pass
def file_reader(fname):
f = utils.open_file_read(fname)
c = Caf()
while c.get_next_from_file(f):
yield c
utils.close(f)
class Caf:
def __init__(self):
self.id = None
self.seq = None
self.insert_min = None
self.insert_max = None
self.ligation = None
self.clone = None
self.clip_start = None
self.clip_end = None
def __eq__(self, other):
if type(other) is type(self):
return self.__dict__ == other.__dict__
return False
def get_next_from_file(self, f):
line = f.readline()
if not line:
return None
while line == '\n':
line = f.readline()
if not line.startswith('DNA : '):
raise Error("Error reading caf file. Expected line starting with 'DNA : ...'")
self.id = line.rstrip().split()[2]
line = f.readline()
seq = []
while line != '\n':
seq.append(line.rstrip())
line = f.readline()
self.seq = fastn.Fasta(self.id, ''.join(seq))
line = f.readline()
if not line.startswith('BaseQuality : '):
raise Error("Error reading caf file. Expected line starting with 'BaseQuality : ...'")
quals = [int(x) for x in f.readline().rstrip().split()]
self.seq = self.seq.to_Fastq(quals)
line = f.readline()
assert line == '\n'
line = f.readline()
while line not in ['', '\n']:
a = line.rstrip().split()
if a[0] == 'Insert_size':
self.insert_min, self.insert_max = int(a[1]), int(a[2])
elif a[0] == 'Ligation_no':
self.ligation = a[1]
elif a[0] == 'Clone':
self.clone = a[1]
elif a[0] == 'Clipping' and a[1] == 'QUAL':
self.clip_start, self.clip_end = int(a[2]), int(a[3])
line = f.readline()
return True