staden-lg/src/newted/opp.c

129 lines
2.9 KiB
C

/*
Title: opp.c
File: opp.c
Purpose: code for complementing sequences
Last update: Tue Jan 15 1991
15.01.90 SD Taken from seqIOEdit.c
*/
/* ---- Imports ---- */
#include "opp.h"
#include "seq.h"
/* ---- Globals ---- */
char opp[256]; /* complement of any given base */
/* ---- Exports ---- */
void oppInitialize()
{ int i;
for (i = 0; i<256; i++) opp[i]='-';
/* RMD 31/12/90 'N' -> '-' above.
removed 'N' and 'n' entries below and added reciprocal
'K' and 'N' entries as for full Staden table */
opp['A'] = 'T';
opp['G'] = 'C';
opp['T'] = 'A';
opp['C'] = 'G';
opp['a'] = 't';
opp['g'] = 'c';
opp['t'] = 'a';
opp['c'] = 'g';
opp['D'] = 'H';
opp['H'] = 'D';
opp['V'] = 'B';
opp['B'] = 'V';
opp['K'] = 'N';
opp['N'] = 'K';
opp['L'] = 'M';
opp['M'] = 'L';
opp['5'] = '6';
opp['6'] = '5';
opp['R'] = 'Y';
opp['Y'] = 'R';
opp['7'] = '7';
opp['8'] = '8';
}
void complement_seq(Seq seq)
/*
** Complement and reverse bases and traces
*/
{
int2 temp_int2;
TRACE *temp_TRACEptr;
char temp_char;
int temp_int;
int i;
/* swap */
#define swap(A,B,I) ( (I)=(A), (A)=(B), (B)=(I) )
/* complement and reverse traces */
if (seq->mode == BasesAndTraces) {
/* swap traces A<->T and C<->G */
swap(seq->traceA,seq->traceT,temp_TRACEptr);
swap(seq->traceC,seq->traceG,temp_TRACEptr);
/* reverse points in traces */
for (i=0;i<seq->NPoints/2;i++) {
swap(seq->traceA[i],seq->traceA[seq->NPoints-i-1],temp_int2);
swap(seq->traceC[i],seq->traceC[seq->NPoints-i-1],temp_int2);
swap(seq->traceG[i],seq->traceG[seq->NPoints-i-1],temp_int2);
swap(seq->traceT[i],seq->traceT[seq->NPoints-i-1],temp_int2);
}
}
/* complement the sequence */
/* handle edited base */
for (i=0;i<seq->NedBases;i++) {
if (seq->edits[i]<0) {
int k = (-seq->edits[i]);
seq->edBase[k] = opp[seq->edBase[k]];
seq->edBasePos[k] = seq->NPoints - seq->edBasePos[k] - 1;
} else {
int k = seq->edits[i];
seq->edits[i] = seq->NorigBases-k-1;
/*
* skip complement and mod of base position until later
* because not every orig base is necessarily represented in the
* edits array
*/
}
}
/* handle original bases */
for (i=0;i<seq->NorigBases;i++) {
seq->base[i] = opp[seq->base[i]];
seq->basePos[i] = seq->NPoints - seq->basePos[i] - 1;
}
/* reverse sequence */
/* edits */
for (i=0;i<seq->NedBases/2;i++) {
swap(seq->edits[i],seq->edits[seq->NedBases-i-1],temp_int2);
}
/* orig bases */
for (i=0;i<seq->NorigBases/2;i++) {
swap(seq->base[i],seq->base[seq->NorigBases-i-1],temp_char);
swap(seq->basePos[i],seq->basePos[seq->NorigBases-i-1],temp_int2);
}
/* swap cutoffs */
swap(seq->leftCutoff,seq->rightCutoff,temp_int);
/* move caret ??? */
/* toggle strand */
seq->bottom = !seq->bottom;
}