From 73236c72a85da621a32a39bef008f05c61c9a333 Mon Sep 17 00:00:00 2001 From: Celine Mercier Date: Tue, 22 Jan 2019 15:51:43 +0100 Subject: [PATCH] version 0.5: ecoPrimers can now read *.ldx files (local taxa) --- VERSION | 2 +- src/ecoprimer.c | 2 +- src/libecoPCR/ecoPCR.h | 2 +- src/libecoPCR/ecotax.c | 41 +++++++++++++++++++++++++++++++---------- 4 files changed, 34 insertions(+), 13 deletions(-) diff --git a/VERSION b/VERSION index e6adf3f..ea2303b 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.4 \ No newline at end of file +0.5 \ No newline at end of file diff --git a/src/ecoprimer.c b/src/ecoprimer.c index 628e7c4..b5ab37f 100644 --- a/src/ecoprimer.c +++ b/src/ecoprimer.c @@ -20,7 +20,7 @@ #include"libthermo/thermostats.h" -#define VERSION "0.4" +#define VERSION "0.5" /* TR: by default, statistics are made on species level*/ #define DEFAULTTAXONRANK "species" diff --git a/src/libecoPCR/ecoPCR.h b/src/libecoPCR/ecoPCR.h index 237ec32..f2fe663 100644 --- a/src/libecoPCR/ecoPCR.h +++ b/src/libecoPCR/ecoPCR.h @@ -219,7 +219,7 @@ econameidx_t *read_nameidx(const char *filename,ecotaxonomy_t *taxonomy); * @return pointer to a taxonomy index structure */ -ecotxidx_t *read_taxonomyidx(const char *filename); +ecotxidx_t *read_taxonomyidx(const char *filename,const char *filename2); ecotaxonomy_t *read_taxonomy(const char *prefix,int32_t readAlternativeName); diff --git a/src/libecoPCR/ecotax.c b/src/libecoPCR/ecotax.c index a0ade86..95b304e 100644 --- a/src/libecoPCR/ecotax.c +++ b/src/libecoPCR/ecotax.c @@ -10,23 +10,41 @@ static ecotx_t *readnext_ecotaxon(FILE *f,ecotx_t *taxon); * @param pointer to the database (.tdx file) * @return a ecotxidx_t structure */ -ecotxidx_t *read_taxonomyidx(const char *filename) +ecotxidx_t *read_taxonomyidx(const char *filename,const char *filename2) { int32_t count; + int32_t count2; FILE *f; + FILE *f2; ecotxidx_t *index; int32_t i; - f = open_ecorecorddb(filename,&count,1); + f = open_ecorecorddb(filename,&count,1); + f2 = open_ecorecorddb(filename2,&count2,0); - index = (ecotxidx_t*) ECOMALLOC(sizeof(ecotxidx_t) + sizeof(ecotx_t) * (count-1), + + + index = (ecotxidx_t*) ECOMALLOC(sizeof(ecotxidx_t) + sizeof(ecotx_t) * (count+count2-1), "Allocate taxonomy"); - index->count=count; + index->count=count+count2; + + fprintf(stderr,"Reading %d taxa...\n",count); for (i=0; i < count; i++){ readnext_ecotaxon(f,&(index->taxon[i])); - index->taxon[i].parent=index->taxon + (size_t)index->taxon[i].parent; + index->taxon[i].parent=index->taxon + (int32_t)index->taxon[i].parent; } + + if (count2>0) + fprintf(stderr,"Reading %d local taxa...\n",count2); + else + fprintf(stderr,"No local taxon\n"); + + for (i=0; i < count2; i++){ + readnext_ecotaxon(f2,&(index->taxon[count+i])); + index->taxon[count+i].parent=index->taxon + (int32_t)index->taxon[count+i].parent; + } + return index; } @@ -111,33 +129,36 @@ ecotaxonomy_t *read_taxonomy(const char *prefix,int32_t readAlternativeName) { ecotaxonomy_t *tax; char *filename; + char *filename2; int buffsize; tax = ECOMALLOC(sizeof(ecotaxonomy_t), - "Allocate taxonomy structure"); + "Allocate taxonomy structure"); buffsize = strlen(prefix)+10; filename = ECOMALLOC(buffsize, - "Allocate filename"); + "Allocate filename"); + filename2= ECOMALLOC(buffsize, + "Allocate filename"); snprintf(filename,buffsize,"%s.rdx",prefix); tax->ranks = read_rankidx(filename); snprintf(filename,buffsize,"%s.tdx",prefix); + snprintf(filename2,buffsize,"%s.ldx",prefix); - tax->taxons = read_taxonomyidx(filename); + tax->taxons = read_taxonomyidx(filename,filename2); if (readAlternativeName) { - snprintf(filename,buffsize,"%s.ndx",prefix); + snprintf(filename,buffsize,"%s.ndx",prefix); tax->names=read_nameidx(filename,tax); } else tax->names=NULL; return tax; - }