Mercurial > repos > nick > duplex
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 |