comparison seqtools.py @ 18:e4d75f9efb90 draft

planemo upload commit b'4303231da9e48b2719b4429a29b72421d24310f4\n'-dirty
author nick
date Thu, 02 Feb 2017 18:44:31 -0500
parents
children
comparison
equal deleted inserted replaced
17:836fa4fe9494 18:e4d75f9efb90
1 import os
2 import ctypes
3
4 script_dir = os.path.dirname(os.path.realpath(__file__))
5 seqtools = ctypes.cdll.LoadLibrary(os.path.join(script_dir, 'libseqtools.so'))
6 seqtools.get_revcomp.restype = ctypes.c_char_p
7 seqtools.transfer_gaps.restype = ctypes.c_char_p
8
9
10 def get_revcomp(seq):
11 return seqtools.get_revcomp(seq)
12
13
14 def get_diffs_frac_simple(consensus, family):
15 c_consensus = ctypes.c_char_p(consensus)
16 c_family = (ctypes.c_char_p * len(family))()
17 for i, seq in enumerate(family):
18 c_family[i] = ctypes.c_char_p(seq)
19 seqtools.get_diffs_frac_simple.restype = ctypes.POINTER(ctypes.c_double * len(c_family))
20 diffs = seqtools.get_diffs_frac_simple(c_consensus, c_family, len(c_family))
21 return diffs.contents
22
23
24 def get_diffs_frac_binned(consensus, family, bins):
25 seq_len = None
26 c_consensus = ctypes.c_char_p(consensus)
27 c_family = (ctypes.c_char_p * len(family))()
28 for i, seq in enumerate(family):
29 if seq_len:
30 if seq_len != len(seq):
31 return None
32 else:
33 seq_len = len(seq)
34 c_family[i] = ctypes.c_char_p(seq)
35 double_array_pointer = ctypes.POINTER(ctypes.c_double * bins)
36 seqtools.get_diffs_frac_binned.restype = ctypes.POINTER(double_array_pointer * len(c_family))
37 diffs_binned_c = seqtools.get_diffs_frac_binned(c_consensus, c_family, len(c_family), seq_len, bins)
38 diffs_binned = []
39 for diffs_c in diffs_binned_c.contents:
40 diffs_binned.append(diffs_c.contents)
41 return diffs_binned
42
43
44 def transfer_gaps(aligned, seq, gap_char_in='-', gap_char_out='-'):
45 gap_char_in_c = ctypes.c_char(gap_char_in)
46 gap_char_out_c = ctypes.c_char(gap_char_out)
47 return seqtools.transfer_gaps(aligned, seq, gap_char_in_c, gap_char_out_c)
48
49
50 def transfer_gaps_multi(seqs, aligned, gap_char_in='-', gap_char_out='-'):
51 gap_char_in_c = ctypes.c_char(gap_char_in)
52 gap_char_out_c = ctypes.c_char(gap_char_out)
53 n_seqs = len(seqs)
54 assert n_seqs == len(aligned), 'Error: Unequal number of gapped and ungapped sequences.'
55 seqs_c = (ctypes.c_char_p * n_seqs)()
56 for i, seq in enumerate(seqs):
57 seqs_c[i] = ctypes.c_char_p(seq)
58 aligned_c = (ctypes.c_char_p * n_seqs)()
59 for i, seq in enumerate(aligned):
60 aligned_c[i] = ctypes.c_char_p(seq)
61 seqtools.transfer_gaps_multi.restype = ctypes.POINTER(ctypes.c_char_p * n_seqs)
62 output_c = seqtools.transfer_gaps_multi(n_seqs, aligned_c, seqs_c, gap_char_in_c, gap_char_out_c)
63 output = []
64 for seq in output_c.contents:
65 output.append(seq)
66 return output