4 Commits

Author SHA1 Message Date
40f2972bda Actualiser src/libecoPCR/ecorank.c 2025-06-12 13:35:06 +00:00
7db34d77a4 Actualiser src/libecoPCR/ecotax.c 2025-06-12 13:34:30 +00:00
3503f66520 Update ecopcr.c to comment a debug message 2020-04-27 14:10:30 +02:00
9deb30a8c4 Patch a bug inducing that sequences were considered as circular whatever
the -c option was present or not.
2020-04-27 12:07:28 +02:00
3 changed files with 92 additions and 87 deletions

View File

@ -614,8 +614,10 @@ int main(int argc, char **argv)
length = 0; length = 0;
if (posj > posi) if (posj > posi)
length = posj - posi - o1->patlen - o2->patlen; length = posj - posi - o1->patlen - o2->patlen;
if (posj < posi) else {
length = posj + apatseq->seqlen - posi - o1->patlen - o2->patlen; if (circular > 0)
length = posj + apatseq->seqlen - posi - o1->patlen - o2->patlen;
}
if ((length>0) && // For when primers touch or overlap if ((length>0) && // For when primers touch or overlap
(!lmin || (length >= lmin)) && (!lmin || (length >= lmin)) &&
(!lmax || (length <= lmax))) (!lmax || (length <= lmax)))
@ -648,7 +650,7 @@ int main(int argc, char **argv)
} }
o1cHits = ManberAll(apatseq,o1c,3,begin,length); o1cHits = ManberAll(apatseq,o1c,3,begin,length);
// printf("circular= %d\n",circular);
if (o1cHits) if (o1cHits)
for (i=0; i < o2Hits;i++) for (i=0; i < o2Hits;i++)
{ {
@ -668,8 +670,11 @@ int main(int argc, char **argv)
length = 0; length = 0;
if (posj > posi) if (posj > posi)
length = posj - posi + 1 - o2->patlen - o1->patlen; /* - o1->patlen : deleted by <EC> (prior to the OBITools3) */ length = posj - posi + 1 - o2->patlen - o1->patlen; /* - o1->patlen : deleted by <EC> (prior to the OBITools3) */
if (posj < posi) else {
if (circular > 0)
length = posj + apatseq->seqlen - posi - o1->patlen - o2->patlen; length = posj + apatseq->seqlen - posi - o1->patlen - o2->patlen;
}
if ((length>0) && // For when primers touch or overlap if ((length>0) && // For when primers touch or overlap
(!lmin || (length >= lmin)) && (!lmin || (length >= lmin)) &&
(!lmax || (length <= lmax))) (!lmax || (length <= lmax)))

View File

@ -12,14 +12,14 @@ ecorankidx_t *read_rankidx(const char *filename)
int32_t i; int32_t i;
int32_t rs; int32_t rs;
char *buffer; char *buffer;
f = open_ecorecorddb(filename,&count,1); f = open_ecorecorddb(filename,&count,1);
index = (ecorankidx_t*) ECOMALLOC(sizeof(ecorankidx_t) + sizeof(char*) * (count-1), index = (ecorankidx_t*) ECOMALLOC(sizeof(ecorankidx_t) + sizeof(char*) * (count-1),
"Allocate rank index"); "Allocate rank index");
index->count=count; index->count=count;
for (i=0; i < count; i++) for (i=0; i < count; i++)
{ {
buffer = read_ecorecord(f,&rs); buffer = read_ecorecord(f,&rs);
@ -27,21 +27,18 @@ ecorankidx_t *read_rankidx(const char *filename)
"Allocate rank label"); "Allocate rank label");
strncpy(index->label[i],buffer,rs); strncpy(index->label[i],buffer,rs);
} }
return index; return index;
} }
int32_t rank_index(const char* label,ecorankidx_t* ranks) int32_t rank_index(const char* label,ecorankidx_t* ranks)
{ {
char **rep; char **rep;
fprintf(stderr,"Looking for rank -%s-... ",label);
rep = bsearch(label,ranks->label,ranks->count,sizeof(char*),compareRankLabel); rep = bsearch(label,ranks->label,ranks->count,sizeof(char*),compareRankLabel);
if (rep) if (rep)
return rep-ranks->label; return rep-ranks->label;
else
ECOERROR(ECO_NOTFOUND_ERROR,"Rank label not found");
return -1; return -1;
} }

View File

@ -5,10 +5,10 @@
static ecotx_t *readnext_ecotaxon(FILE *f,ecotx_t *taxon); static ecotx_t *readnext_ecotaxon(FILE *f,ecotx_t *taxon);
/** /**
* Open the taxonomy database * Open the taxonomy database
* @param pointer to the database (.tdx file) * @param pointer to the database (.tdx file)
* @return a ecotxidx_t structure * @return a ecotxidx_t structure
*/ */
ecotxidx_t *read_taxonomyidx(const char *filename,const char *filename2) ecotxidx_t *read_taxonomyidx(const char *filename,const char *filename2)
{ {
@ -18,22 +18,22 @@ ecotxidx_t *read_taxonomyidx(const char *filename,const char *filename2)
FILE *f2; FILE *f2;
ecotxidx_t *index; ecotxidx_t *index;
int32_t i; int32_t i;
f = open_ecorecorddb(filename,&count,1); f = open_ecorecorddb(filename,&count,1);
f2 = open_ecorecorddb(filename2,&count2,0); f2 = open_ecorecorddb(filename2,&count2,0);
index = (ecotxidx_t*) ECOMALLOC(sizeof(ecotxidx_t) + sizeof(ecotx_t) * (count+count2-1), index = (ecotxidx_t*) ECOMALLOC(sizeof(ecotxidx_t) + sizeof(ecotx_t) * (count+count2-1),
"Allocate taxonomy"); "Allocate taxonomy");
index->count=count+count2; index->count=count+count2;
fprintf(stderr,"Reading %d taxa...\n",count); fprintf(stderr,"Reading %d taxa...\n",count);
for (i=0; i < count; i++){ for (i=0; i < count; i++){
readnext_ecotaxon(f,&(index->taxon[i])); readnext_ecotaxon(f,&(index->taxon[i]));
index->taxon[i].parent=index->taxon + (int32_t)index->taxon[i].parent; index->taxon[i].parent=index->taxon + (int32_t)index->taxon[i].parent;
} }
if (count2>0) if (count2>0)
fprintf(stderr,"Reading %d local taxa...\n",count2); fprintf(stderr,"Reading %d local taxa...\n",count2);
@ -52,18 +52,18 @@ ecotxidx_t *read_taxonomyidx(const char *filename,const char *filename2)
int32_t delete_taxonomy(ecotxidx_t *index) int32_t delete_taxonomy(ecotxidx_t *index)
{ {
int32_t i; int32_t i;
if (index) if (index)
{ {
for (i=0; i< index->count; i++) for (i=0; i< index->count; i++)
if (index->taxon[i].name) if (index->taxon[i].name)
ECOFREE(index->taxon[i].name,"Free scientific name"); ECOFREE(index->taxon[i].name,"Free scientific name");
ECOFREE(index,"Free Taxonomy"); ECOFREE(index,"Free Taxonomy");
return 0; return 0;
} }
return 1; return 1;
} }
@ -75,32 +75,32 @@ int32_t delete_taxon(ecotx_t *taxon)
{ {
if (taxon->name) if (taxon->name)
ECOFREE(taxon->name,"Free scientific name"); ECOFREE(taxon->name,"Free scientific name");
ECOFREE(taxon,"Free Taxon"); ECOFREE(taxon,"Free Taxon");
return 0; return 0;
} }
return 1; return 1;
} }
/** /**
* Read the database for a given taxon a save the data * Read the database for a given taxon a save the data
* into the taxon structure(if any found) * into the taxon structure(if any found)
* @param *f pointer to FILE type returned by fopen * @param *f pointer to FILE type returned by fopen
* @param *taxon pointer to the structure * @param *taxon pointer to the structure
* *
* @return a ecotx_t structure if any taxon found else NULL * @return a ecotx_t structure if any taxon found else NULL
*/ */
ecotx_t *readnext_ecotaxon(FILE *f,ecotx_t *taxon) ecotx_t *readnext_ecotaxon(FILE *f,ecotx_t *taxon)
{ {
ecotxformat_t *raw; ecotxformat_t *raw;
int32_t rs; int32_t rs;
raw = read_ecorecord(f,&rs); raw = read_ecorecord(f,&rs);
if (!raw) if (!raw)
return NULL; return NULL;
@ -109,18 +109,18 @@ ecotx_t *readnext_ecotaxon(FILE *f,ecotx_t *taxon)
raw->namelength = swap_int32_t(raw->namelength); raw->namelength = swap_int32_t(raw->namelength);
raw->parent = swap_int32_t(raw->parent); raw->parent = swap_int32_t(raw->parent);
raw->rank = swap_int32_t(raw->rank); raw->rank = swap_int32_t(raw->rank);
raw->taxid = swap_int32_t(raw->taxid); raw->taxid = swap_int32_t(raw->taxid);
} }
taxon->parent = (ecotx_t*)raw->parent; taxon->parent = (ecotx_t*)raw->parent;
taxon->taxid = raw->taxid; taxon->taxid = raw->taxid;
taxon->rank = raw->rank; taxon->rank = raw->rank;
taxon->name = ECOMALLOC((raw->namelength+1) * sizeof(char), taxon->name = ECOMALLOC((raw->namelength+1) * sizeof(char),
"Allocate taxon scientific name"); "Allocate taxon scientific name");
strncpy(taxon->name,raw->name,raw->namelength); strncpy(taxon->name,raw->name,raw->namelength);
return taxon; return taxon;
} }
@ -131,26 +131,26 @@ ecotaxonomy_t *read_taxonomy(const char *prefix,int32_t readAlternativeName)
char *filename; char *filename;
char *filename2; char *filename2;
int buffsize; int buffsize;
tax = ECOMALLOC(sizeof(ecotaxonomy_t), tax = ECOMALLOC(sizeof(ecotaxonomy_t),
"Allocate taxonomy structure"); "Allocate taxonomy structure");
buffsize = strlen(prefix)+10; buffsize = strlen(prefix)+10;
filename = ECOMALLOC(buffsize, filename = ECOMALLOC(buffsize,
"Allocate filename"); "Allocate filename");
filename2= ECOMALLOC(buffsize, filename2= ECOMALLOC(buffsize,
"Allocate filename"); "Allocate filename");
snprintf(filename,buffsize,"%s.rdx",prefix); snprintf(filename,buffsize,"%s.rdx",prefix);
tax->ranks = read_rankidx(filename); tax->ranks = read_rankidx(filename);
snprintf(filename,buffsize,"%s.tdx",prefix); snprintf(filename,buffsize,"%s.tdx",prefix);
snprintf(filename2,buffsize,"%s.ldx",prefix); snprintf(filename2,buffsize,"%s.ldx",prefix);
tax->taxons = read_taxonomyidx(filename,filename2); tax->taxons = read_taxonomyidx(filename,filename2);
if (readAlternativeName) if (readAlternativeName)
{ {
snprintf(filename,buffsize,"%s.ndx",prefix); snprintf(filename,buffsize,"%s.ndx",prefix);
@ -159,7 +159,7 @@ ecotaxonomy_t *read_taxonomy(const char *prefix,int32_t readAlternativeName)
else else
tax->names=NULL; tax->names=NULL;
return tax; return tax;
} }
@ -170,15 +170,15 @@ int32_t delete_ecotaxonomy(ecotaxonomy_t *taxonomy)
{ {
if (taxonomy->ranks) if (taxonomy->ranks)
ECOFREE(taxonomy->ranks,"Free rank index"); ECOFREE(taxonomy->ranks,"Free rank index");
if (taxonomy->taxons) if (taxonomy->taxons)
ECOFREE(taxonomy->taxons,"Free taxon index"); ECOFREE(taxonomy->taxons,"Free taxon index");
ECOFREE(taxonomy,"Free taxonomy structure"); ECOFREE(taxonomy,"Free taxonomy structure");
return 0; return 0;
} }
return 1; return 1;
} }
@ -187,17 +187,17 @@ ecotx_t *eco_findtaxonatrank(ecotx_t *taxon,
{ {
ecotx_t *current_taxon; ecotx_t *current_taxon;
ecotx_t *next_taxon; ecotx_t *next_taxon;
current_taxon = taxon; current_taxon = taxon;
next_taxon = current_taxon->parent; next_taxon = current_taxon->parent;
while ((current_taxon!=next_taxon) && // I' am the root node while ((current_taxon!=next_taxon) && // I' am the root node
(current_taxon->rank!=rankidx)) (current_taxon->rank!=rankidx))
{ {
current_taxon = next_taxon; current_taxon = next_taxon;
next_taxon = current_taxon->parent; next_taxon = current_taxon->parent;
} }
if (current_taxon->rank==rankidx) if (current_taxon->rank==rankidx)
return current_taxon; return current_taxon;
else else
@ -207,19 +207,19 @@ ecotx_t *eco_findtaxonatrank(ecotx_t *taxon,
/** /**
* Get back information concerning a taxon from a taxonomic id * Get back information concerning a taxon from a taxonomic id
* @param *taxonomy the taxonomy database * @param *taxonomy the taxonomy database
* @param taxid the taxonomic id * @param taxid the taxonomic id
* *
* @result a ecotx_t structure containing the taxonimic information * @result a ecotx_t structure containing the taxonimic information
**/ **/
ecotx_t *eco_findtaxonbytaxid(ecotaxonomy_t *taxonomy, ecotx_t *eco_findtaxonbytaxid(ecotaxonomy_t *taxonomy,
int32_t taxid) int32_t taxid)
{ {
ecotx_t *current_taxon; ecotx_t *current_taxon;
int32_t taxoncount; int32_t taxoncount;
int32_t i; int32_t i;
taxoncount=taxonomy->taxons->count; taxoncount=taxonomy->taxons->count;
for (current_taxon=taxonomy->taxons->taxon, for (current_taxon=taxonomy->taxons->taxon,
i=0; i=0;
i < taxoncount; i < taxoncount;
@ -229,30 +229,30 @@ ecotx_t *eco_findtaxonbytaxid(ecotaxonomy_t *taxonomy,
return current_taxon; return current_taxon;
} }
} }
return (ecotx_t*)NULL; return (ecotx_t*)NULL;
} }
/** /**
* Find out if taxon is son of other taxon (identified by its taxid) * Find out if taxon is son of other taxon (identified by its taxid)
* @param *taxon son taxon * @param *taxon son taxon
* @param parent_taxid taxonomic id of the other taxon * @param parent_taxid taxonomic id of the other taxon
* *
* @return 1 is the other taxid math a parent taxid, else 0 * @return 1 is the other taxid math a parent taxid, else 0
**/ **/
int eco_isundertaxon(ecotx_t *taxon, int eco_isundertaxon(ecotx_t *taxon,
int other_taxid) int other_taxid)
{ {
ecotx_t *next_parent; ecotx_t *next_parent;
next_parent = taxon->parent; next_parent = taxon->parent;
while ( (other_taxid != next_parent->taxid) && while ( (other_taxid != next_parent->taxid) &&
(strcmp(next_parent->name, "root")) ) (strcmp(next_parent->name, "root")) )
{ {
next_parent = next_parent->parent; next_parent = next_parent->parent;
} }
if (other_taxid == next_parent->taxid) if (other_taxid == next_parent->taxid)
return 1; return 1;
else else
@ -264,16 +264,16 @@ ecotx_t *eco_getspecies(ecotx_t *taxon,
{ {
static ecotaxonomy_t *tax=NULL; static ecotaxonomy_t *tax=NULL;
static int32_t rankindex=-1; static int32_t rankindex=-1;
if (taxonomy && tax!=taxonomy) if (taxonomy && tax!=taxonomy)
{ {
rankindex = rank_index("species",taxonomy->ranks); rankindex = rank_index("species",taxonomy->ranks);
tax=taxonomy; tax=taxonomy;
} }
if (!tax || rankindex < 0) if (!tax || rankindex < 0)
ECOERROR(ECO_ASSERT_ERROR,"No taxonomy defined"); ECOERROR(ECO_ASSERT_ERROR,"No taxonomy defined");
return eco_findtaxonatrank(taxon,rankindex); return eco_findtaxonatrank(taxon,rankindex);
} }
@ -282,16 +282,16 @@ ecotx_t *eco_getgenus(ecotx_t *taxon,
{ {
static ecotaxonomy_t *tax=NULL; static ecotaxonomy_t *tax=NULL;
static int32_t rankindex=-1; static int32_t rankindex=-1;
if (taxonomy && tax!=taxonomy) if (taxonomy && tax!=taxonomy)
{ {
rankindex = rank_index("genus",taxonomy->ranks); rankindex = rank_index("genus",taxonomy->ranks);
tax=taxonomy; tax=taxonomy;
} }
if (!tax || rankindex < 0) if (!tax || rankindex < 0)
ECOERROR(ECO_ASSERT_ERROR,"No taxonomy defined"); ECOERROR(ECO_ASSERT_ERROR,"No taxonomy defined");
return eco_findtaxonatrank(taxon,rankindex); return eco_findtaxonatrank(taxon,rankindex);
} }
@ -301,16 +301,16 @@ ecotx_t *eco_getfamily(ecotx_t *taxon,
{ {
static ecotaxonomy_t *tax=NULL; static ecotaxonomy_t *tax=NULL;
static int32_t rankindex=-1; static int32_t rankindex=-1;
if (taxonomy && tax!=taxonomy) if (taxonomy && tax!=taxonomy)
{ {
rankindex = rank_index("family",taxonomy->ranks); rankindex = rank_index("family",taxonomy->ranks);
tax=taxonomy; tax=taxonomy;
} }
if (!tax || rankindex < 0) if (!tax || rankindex < 0)
ECOERROR(ECO_ASSERT_ERROR,"No taxonomy defined"); ECOERROR(ECO_ASSERT_ERROR,"No taxonomy defined");
return eco_findtaxonatrank(taxon,rankindex); return eco_findtaxonatrank(taxon,rankindex);
} }
@ -319,16 +319,16 @@ ecotx_t *eco_getkingdom(ecotx_t *taxon,
{ {
static ecotaxonomy_t *tax=NULL; static ecotaxonomy_t *tax=NULL;
static int32_t rankindex=-1; static int32_t rankindex=-1;
if (taxonomy && tax!=taxonomy) if (taxonomy && tax!=taxonomy)
{ {
rankindex = rank_index("kingdom",taxonomy->ranks); rankindex = rank_index("kingdom",taxonomy->ranks);
tax=taxonomy; tax=taxonomy;
} }
if (!tax || rankindex < 0) if (!tax || rankindex < 0)
ECOERROR(ECO_ASSERT_ERROR,"No taxonomy defined"); ECOERROR(ECO_ASSERT_ERROR,"No taxonomy defined");
return eco_findtaxonatrank(taxon,rankindex); return eco_findtaxonatrank(taxon,rankindex);
} }
@ -337,15 +337,18 @@ ecotx_t *eco_getsuperkingdom(ecotx_t *taxon,
{ {
static ecotaxonomy_t *tax=NULL; static ecotaxonomy_t *tax=NULL;
static int32_t rankindex=-1; static int32_t rankindex=-1;
if (taxonomy && tax!=taxonomy) if (taxonomy && tax!=taxonomy)
{ {
rankindex = rank_index("superkingdom",taxonomy->ranks); rankindex = rank_index("superkingdom",taxonomy->ranks);
if (rankindex < 0) {
rankindex = rank_index("domain",taxonomy->ranks);
}
tax=taxonomy; tax=taxonomy;
} }
if (!tax || rankindex < 0) if (!tax || rankindex < 0)
ECOERROR(ECO_ASSERT_ERROR,"No taxonomy defined"); ECOERROR(ECO_ASSERT_ERROR,"No taxonomy defined");
return eco_findtaxonatrank(taxon,rankindex); return eco_findtaxonatrank(taxon,rankindex);
} }