git-svn-id: https://www.grenoble.prabi.fr/svn/LECASofts/ecoPrimers/trunk@180 60f365c0-8329-0410-b2a4-ec073aeeaa1d
203 lines
4.6 KiB
C
203 lines
4.6 KiB
C
#include "../libapat/libstki.h"
|
|
#include "../libapat/apat.h"
|
|
|
|
#include "ecoPCR.h"
|
|
|
|
#include <string.h>
|
|
|
|
static void EncodeSequence(SeqPtr seq);
|
|
static void UpperSequence(char *seq);
|
|
|
|
/* -------------------------------------------- */
|
|
/* uppercase sequence */
|
|
/* -------------------------------------------- */
|
|
|
|
#define IS_LOWER(c) (((c) >= 'a') && ((c) <= 'z'))
|
|
#define TO_UPPER(c) ((c) - 'a' + 'A')
|
|
|
|
void UpperSequence(char *seq)
|
|
{
|
|
char *cseq;
|
|
|
|
for (cseq = seq ; *cseq ; cseq++)
|
|
if (IS_LOWER(*cseq))
|
|
*cseq = TO_UPPER(*cseq);
|
|
}
|
|
|
|
#undef IS_LOWER
|
|
#undef TO_UPPER
|
|
|
|
|
|
|
|
|
|
/* -------------------------------------------- */
|
|
/* encode sequence */
|
|
/* IS_UPPER is slightly faster than isupper */
|
|
/* -------------------------------------------- */
|
|
|
|
#define IS_UPPER(c) (((c) >= 'A') && ((c) <= 'Z'))
|
|
|
|
|
|
|
|
void EncodeSequence(SeqPtr seq)
|
|
{
|
|
int i;
|
|
UInt8 *data;
|
|
char *cseq;
|
|
|
|
data = seq->data;
|
|
cseq = seq->cseq;
|
|
|
|
while (*cseq) {
|
|
|
|
*data = (IS_UPPER(*cseq) ? *cseq - 'A' : 0x0);
|
|
data++;
|
|
cseq++;
|
|
}
|
|
|
|
for (i=0,cseq=seq->cseq;i < seq->circular; i++,cseq++,data++)
|
|
*data = (IS_UPPER(*cseq) ? *cseq - 'A' : 0x0);
|
|
|
|
for (i = 0 ; i < MAX_PATTERN ; i++)
|
|
seq->hitpos[i]->top = seq->hiterr[i]->top = 0;
|
|
|
|
}
|
|
|
|
#undef IS_UPPER
|
|
|
|
|
|
SeqPtr ecoseq2apatseq(ecoseq_t *in,SeqPtr out,int32_t circular)
|
|
{
|
|
int i;
|
|
|
|
if (!out)
|
|
{
|
|
out = ECOMALLOC(sizeof(Seq),
|
|
"Error in Allocation of a new Seq structure");
|
|
|
|
for (i = 0 ; i < MAX_PATTERN ; i++)
|
|
{
|
|
|
|
if (! (out->hitpos[i] = NewStacki(kMinStackiSize)))
|
|
ECOERROR(ECO_MEM_ERROR,"Error in hit stack Allocation");
|
|
|
|
if (! (out->hiterr[i] = NewStacki(kMinStackiSize)))
|
|
ECOERROR(ECO_MEM_ERROR,"Error in error stack Allocation");
|
|
}
|
|
}
|
|
|
|
|
|
out->name = in->AC;
|
|
out->seqsiz = out->seqlen = in->SQ_length;
|
|
out->circular = circular;
|
|
|
|
if (!out->data)
|
|
{
|
|
out->data = ECOMALLOC((out->seqlen+circular) *sizeof(UInt8),
|
|
"Error in Allocation of a new Seq data member");
|
|
out->datsiz= out->seqlen+circular;
|
|
}
|
|
else if ((out->seqlen +circular) >= out->datsiz)
|
|
{
|
|
out->data = ECOREALLOC(out->data,(out->seqlen+circular),
|
|
"Error during Seq data buffer realloc");
|
|
out->datsiz= out->seqlen+circular;
|
|
}
|
|
|
|
out->cseq = in->SQ;
|
|
|
|
EncodeSequence(out);
|
|
|
|
return out;
|
|
}
|
|
|
|
int32_t delete_apatseq(SeqPtr pseq)
|
|
{
|
|
int i;
|
|
|
|
if (pseq) {
|
|
|
|
if (pseq->data)
|
|
ECOFREE(pseq->data,"Freeing sequence data buffer");
|
|
|
|
for (i = 0 ; i < MAX_PATTERN ; i++) {
|
|
if (pseq->hitpos[i]) FreeStacki(pseq->hitpos[i]);
|
|
if (pseq->hiterr[i]) FreeStacki(pseq->hiterr[i]);
|
|
}
|
|
|
|
ECOFREE(pseq,"Freeing apat sequence structure");
|
|
|
|
return 0;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
/*
|
|
|
|
PatternPtr buildPattern(const char *pat, int32_t error_max)
|
|
{
|
|
PatternPtr pattern;
|
|
int32_t patlen;
|
|
|
|
pattern = ECOMALLOC(sizeof(Pattern),
|
|
"Error in pattern allocation");
|
|
|
|
pattern->ok = Vrai;
|
|
pattern->hasIndel= Faux;
|
|
pattern->maxerr = error_max;
|
|
patlen = strlen(pat);
|
|
|
|
pattern->cpat = ECOMALLOC(sizeof(char)*patlen+1,
|
|
"Error in sequence pattern allocation");
|
|
|
|
strncpy(pattern->cpat,pat,patlen);
|
|
pattern->cpat[patlen]=0;
|
|
UpperSequence(pattern->cpat);
|
|
|
|
if (!CheckPattern(pattern))
|
|
ECOERROR(ECO_ASSERT_ERROR,"Error in pattern checking");
|
|
|
|
if (! EncodePattern(pattern, dna))
|
|
ECOERROR(ECO_ASSERT_ERROR,"Error in pattern encoding");
|
|
|
|
if (! CreateS(pattern, ALPHA_LEN))
|
|
ECOERROR(ECO_ASSERT_ERROR,"Error in pattern compiling");
|
|
|
|
return pattern;
|
|
|
|
}
|
|
|
|
PatternPtr complementPattern(PatternPtr pat)
|
|
{
|
|
PatternPtr pattern;
|
|
|
|
pattern = ECOMALLOC(sizeof(Pattern),
|
|
"Error in pattern allocation");
|
|
|
|
pattern->ok = Vrai;
|
|
pattern->hasIndel= pat->hasIndel;
|
|
pattern->maxerr = pat->maxerr;
|
|
pattern->patlen = pat->patlen;
|
|
|
|
pattern->cpat = ECOMALLOC(sizeof(char)*(strlen(pat->cpat)+1),
|
|
"Error in sequence pattern allocation");
|
|
|
|
strcpy(pattern->cpat,pat->cpat);
|
|
|
|
ecoComplementPattern(pattern->cpat);
|
|
|
|
if (!CheckPattern(pattern))
|
|
ECOERROR(ECO_ASSERT_ERROR,"Error in pattern checking");
|
|
|
|
if (! EncodePattern(pattern, dna))
|
|
ECOERROR(ECO_ASSERT_ERROR,"Error in pattern encoding");
|
|
|
|
if (! CreateS(pattern, ALPHA_LEN))
|
|
ECOERROR(ECO_ASSERT_ERROR,"Error in pattern compiling");
|
|
|
|
return pattern;
|
|
|
|
}
|
|
*/
|