Mercurial > repos > nick > duplex
comparison seqtools.py @ 4:af383638de66 draft
planemo upload commit 022984f323d3da44f70b3bf79c684cfd8dda3f61-dirty
| author | nick |
|---|---|
| date | Mon, 23 Nov 2015 18:44:23 -0500 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 3:13bcc2f459b0 | 4:af383638de66 |
|---|---|
| 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, 'seqtoolsc.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 |
