tmap_index_t* tmap_index_init(const char *fn_fasta, key_t shm_key, int32_t mm) { tmap_index_t *index = NULL; index = tmap_calloc(1, sizeof(tmap_index_t), "index"); index->shm_key = shm_key; index->mm = mm; // get the reference information // primary 65380; sa_intv: 32 // seq_len = 97004 //n_sa = 3032, sa 67973 .. 18446744073709551615 if (1 == index->mm) { tmap_progress_print("Retrieving reference data from memory map"); index->refseq = tmap_refseq_mm_read(fn_fasta); index->bwt = tmap_bwt_mm_read(fn_fasta); index->sa = tmap_sa_mm_read(fn_fasta); tmap_progress_print2("Reference data retrieved from memory map"); } else if(0 == index->shm_key) { tmap_progress_print("reading in reference data"); index->refseq = tmap_refseq_read(fn_fasta); index->bwt = tmap_bwt_read(fn_fasta); index->sa = tmap_sa_read(fn_fasta); tmap_progress_print2("reference data read in"); } else { tmap_progress_print("retrieving reference data from shared memory"); index->shm = tmap_shm_init(index->shm_key, 0, 0); if(NULL == (index->refseq = tmap_refseq_shm_unpack(tmap_shm_get_buffer(index->shm, TMAP_SHM_LISTING_REFSEQ)))) { tmap_error("the packed reference sequence was not found in shared memory", Exit, SharedMemoryListing); } if(NULL == (index->bwt = tmap_bwt_shm_unpack(tmap_shm_get_buffer(index->shm, TMAP_SHM_LISTING_BWT)))) { tmap_error("the BWT string was not found in shared memory", Exit, SharedMemoryListing); } if(NULL == (index->sa = tmap_sa_shm_unpack(tmap_shm_get_buffer(index->shm, TMAP_SHM_LISTING_SA)))) { tmap_error("the SA was not found in shared memory", Exit, SharedMemoryListing); } tmap_progress_print2("reference data retrieved from shared memory"); } if((index->refseq->len << 1) != index->bwt->seq_len) { tmap_error("refseq and bwt lengths do not match", Exit, OutOfRange); } if((index->refseq->len << 1) != index->sa->seq_len) { tmap_error("refseq and sa lengths do not match", Exit, OutOfRange); } return index; }
tmap_index_t* tmap_index_init(const char *fn_fasta, key_t shm_key) { tmap_index_t *index = NULL; index = tmap_calloc(1, sizeof(tmap_index_t), "index"); index->shm_key = shm_key; // get the reference information if(0 == index->shm_key) { tmap_progress_print("reading in reference data"); index->refseq = tmap_refseq_read(fn_fasta); index->bwt = tmap_bwt_read(fn_fasta); index->sa = tmap_sa_read(fn_fasta); tmap_progress_print2("reference data read in"); } else { tmap_progress_print("retrieving reference data from shared memory"); index->shm = tmap_shm_init(index->shm_key, 0, 0); if(NULL == (index->refseq = tmap_refseq_shm_unpack(tmap_shm_get_buffer(index->shm, TMAP_SHM_LISTING_REFSEQ)))) { tmap_error("the packed reference sequence was not found in shared memory", Exit, SharedMemoryListing); } if(NULL == (index->bwt = tmap_bwt_shm_unpack(tmap_shm_get_buffer(index->shm, TMAP_SHM_LISTING_BWT)))) { tmap_error("the BWT string was not found in shared memory", Exit, SharedMemoryListing); } if(NULL == (index->sa = tmap_sa_shm_unpack(tmap_shm_get_buffer(index->shm, TMAP_SHM_LISTING_SA)))) { tmap_error("the SA was not found in shared memory", Exit, SharedMemoryListing); } tmap_progress_print2("reference data retrieved from shared memory"); } if((index->refseq->len << 1) != index->bwt->seq_len) { tmap_error("refseq and bwt lengths do not match", Exit, OutOfRange); } if((index->refseq->len << 1) != index->sa->seq_len) { tmap_error("refseq and sa lengths do not match", Exit, OutOfRange); } return index; }
void tmap_sa_bwt2sa(const char *fn_fasta, uint32_t intv) { int64_t isa, s; // S(isa) = sa uint64_t i; tmap_bwt_t *bwt = NULL; tmap_sa_t *sa = NULL; tmap_progress_print("constructing the SA from the BWT string"); bwt = tmap_bwt_read(fn_fasta); sa = tmap_calloc(1, sizeof(tmap_sa_t), "sa"); sa->primary = bwt->primary; sa->sa_intv = intv; sa->seq_len = bwt->seq_len; sa->n_sa = (bwt->seq_len + intv) / intv; // calculate SA value sa->sa = tmap_calloc(sa->n_sa, sizeof(tmap_bwt_int_t), "sa->sa"); isa = 0; s = bwt->seq_len; for(i = 0; i < bwt->seq_len; ++i) { if(isa % intv == 0) sa->sa[isa/intv] = s; --s; isa = tmap_bwt_invPsi(bwt, isa); } if(isa % intv == 0) sa->sa[isa/intv] = s; sa->sa[0] = (tmap_bwt_int_t)-1; // before this line, bwt->sa[0] = bwt->seq_len tmap_sa_write(fn_fasta, sa); tmap_bwt_destroy(bwt); tmap_sa_destroy(sa); sa=NULL; bwt=NULL; tmap_progress_print2("constructed the SA from the BWT string"); }