1 /****************************************************************\
2 *                                                                *
3 *  Nucleotide Translation Code                                   *
4 *                                                                *
5 *  Guy St.C. Slater..   mailto:guy@ebi.ac.uk                     *
6 *  Copyright (C) 2000-2009.  All Rights Reserved.                *
7 *                                                                *
8 *  This source code is distributed under the terms of the        *
9 *  GNU General Public License, version 3. See the file COPYING   *
10 *  or http://www.gnu.org/licenses/gpl.txt for details            *
11 *                                                                *
12 *  If you use this code, please keep this notice intact.         *
13 *                                                                *
14 \****************************************************************/
15 
16 #ifndef INCLUDED_TRANSLATE_H
17 #define INCLUDED_TRANSLATE_H
18 
19 #ifdef __cplusplus
20 extern "C" {
21 #endif /* __cplusplus */
22 
23 /**/
24 
25 #include <glib.h>
26 #include "argument.h"
27 
28 typedef struct {
29     gchar *genetic_code;
30 } Translate_ArgumentSet;
31 
32 Translate_ArgumentSet *Translate_ArgumentSet_create(Argument *arg);
33 
34 #define Translate_AA_SET_SIZE          40
35 #define Translate_NT_SET_SIZE       (1<<4)
36 #define Translate_PIMA_SET_SIZE        18
37 #define Translate_ALPHABET_SIZE     (1<<8)
38 #define Translate_TRANSLATION_SIZE   4096
39 
40 typedef struct {
41         guint  ref_count;
42        guchar *nt;
43        guchar *aa;
44        guchar *code;
45        guchar  nt2d[Translate_ALPHABET_SIZE];
46        guchar  aa2d[Translate_ALPHABET_SIZE];
47          gint  aamask[Translate_AA_SET_SIZE];
48        guchar  trans[Translate_TRANSLATION_SIZE];
49     GPtrArray *revtrans[Translate_ALPHABET_SIZE];
50 } Translate;
51 
52 Translate *Translate_create(gboolean use_pima);
53 Translate *Translate_share(Translate *t);
54      void  Translate_destroy(Translate *t);
55      gint  Translate_sequence(Translate *t, gchar *dna,
56                   gint dna_length, gint frame, gchar *aaseq,
57                   guchar *filter);
58 /* Sequence_translate frame is  1, 2, 3 for forward,
59  *                          or -1,-2,-3 for reverse.
60  * Sufficient space for translated sequence must provided in aaseq
61  * Translated seq is NULL terminated.
62  * Length of translated sequence is returned
63  */
64 
65 typedef void (*Translate_reverse_func)(gchar *dna, gint length,
66                                        gpointer user_data);
67 void Translate_reverse(Translate *t, gchar *aaseq, gint length,
68                        Translate_reverse_func trf, gpointer user_data);
69 
70 #define Translate_codon(t, codon)                                     \
71     ((gchar)((t)->aa[(t)->trans[((t)->nt2d[(guchar)(codon)[0]])       \
72                                |((t)->nt2d[(guchar)(codon)[1]]<<4)    \
73                                |((t)->nt2d[(guchar)(codon)[2]]<<8)]]))
74 
75 #define Translate_base(t, a, b, c)                          \
76          ((t)->aa[(t)->trans[((t)->nt2d[(guchar)(a)])       \
77                             |((t)->nt2d[(guchar)(b)]<<4)    \
78                             |((t)->nt2d[(guchar)(c)]<<8)]])
79 
80 /**/
81 
82 #ifdef __cplusplus
83 }
84 #endif /* __cplusplus */
85 
86 #endif /* INCLUDED_TRANSLATE_H */
87 
88