Mercurial > repos > clustalomega > clustalomega
diff clustalomega/clustal-omega-1.0.2/src/squid/revcomp.c @ 1:bc707542e5de
Uploaded
author | clustalomega |
---|---|
date | Thu, 21 Jul 2011 13:35:08 -0400 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-1.0.2/src/squid/revcomp.c Thu Jul 21 13:35:08 2011 -0400 @@ -0,0 +1,87 @@ +/***************************************************************** + * SQUID - a library of functions for biological sequence analysis + * Copyright (C) 1992-2002 Washington University School of Medicine + * + * This source code is freely distributed under the terms of the + * GNU General Public License. See the files COPYRIGHT and LICENSE + * for details. + *****************************************************************/ + +/* revcomp.c + * + * Reverse complement of a IUPAC character string + * RCS $Id: revcomp.c 217 2011-03-19 10:27:10Z andreas $ (Original squid RCS Id: revcomp.c,v 1.5 2002/06/25 20:06:06 eddy Exp) + */ + +#include <stdio.h> +#include <string.h> +#include <ctype.h> +#include "squid.h" + +/* Function: revcomp() + * + * Purpose: Reverse complement seq; store in comp. + * Can revcomp "in place" (revcomp(seq, seq)). + * + * Args: comp - destination for reverse complement of seq + * seq - sequence to reverse complement + * + * Returns: NULL on failure; or a (useless) pointer to comp. + */ +char * +revcomp(char *comp, char *seq) +{ + char *s; + char c; + + if (comp == NULL) return NULL; + if (seq == NULL) return NULL; + + StrReverse(comp, seq); + for (s = comp; *s != '\0'; s++) + { + c = *s; + c = sre_toupper(c); + switch (c) { + case 'A': c = 'T'; break; + case 'C': c = 'G'; break; + case 'G': c = 'C'; break; + case 'T': c = 'A'; break; + case 'U': c = 'A'; break; + case 'R': c = 'Y'; break; + case 'Y': c = 'R'; break; + case 'M': c = 'K'; break; + case 'K': c = 'M'; break; + case 'S': c = 'S'; break; + case 'W': c = 'W'; break; + case 'H': c = 'D'; break; + case 'D': c = 'H'; break; + case 'B': c = 'V'; break; + case 'V': c = 'B'; break; + default: break; /* anything else? leave it; it's prob a gap or an X */ + } + if (islower((int) *s)) c = (char) sre_tolower((int) c); + *s = c; + } + return comp; +} + +#ifdef REVCOMP_TESTDRIVER +/* gcc -g -DREVCOMP_TESTDRIVER revcomp.c sre_string.c shuffle.c sre_math.c sre_ctype.c sqerror.c -lm +*/ +int +main(void) +{ + float p[4] = {0.25, 0.25, 0.25, 0.25}; + char *alphabet = "ACGT"; + int len = 10; + char *seq; + + seq = RandomSequence(alphabet, p, 4, len); + printf("%s\n", seq); + revcomp(seq, seq); + printf("%s\n", seq); + free(seq); + exit(0); +} +#endif