ion_string_t* sff_read_get_read_quality_values(sff_read_t* rd, int left_clip, int right_clip) { ion_string_t *quality; // account for NULL termination int quality_length = (right_clip - left_clip) + 1; // inititalize the quality array quality = ion_string_init(quality_length+1); if (!quality) { fprintf(stderr, "Out of memory! For read quality array!\n"); exit(1); } // copy the relative substring int start = left_clip; int stop = right_clip; int i, j = 0; for (i = start; i < stop; i++) { quality->s[j] = rd->quality->s[i]; j++; } return quality; }
sff_read_t * sff_read_read(FILE *fp, sff_header_t *gh, sff_read_header_t *rh) { sff_read_t *r = NULL; uint32_t i, n = 0; r = sff_read_init(); r->flowgram = ion_malloc(sizeof(uint16_t)*gh->flow_length, __func__, "r->flowgram"); r->flow_index = ion_malloc(sizeof(uint8_t)*rh->n_bases, __func__, "r->flow_index"); r->bases = ion_string_init(rh->n_bases+1); r->quality = ion_string_init(rh->n_bases+1); if(gh->flow_length != fread(r->flowgram, sizeof(uint16_t), gh->flow_length, fp) || rh->n_bases != fread(r->flow_index, sizeof(uint8_t), rh->n_bases, fp) || rh->n_bases != fread(r->bases->s, sizeof(char), rh->n_bases, fp) || rh->n_bases != fread(r->quality->s, sizeof(char), rh->n_bases, fp)) { // truncated file, error ion_error(__func__, "fread", Exit, ReadFileError); } n += sizeof(uint16_t)*gh->flow_length + 3*sizeof(uint8_t)*rh->n_bases; // set length and null-terminators r->bases->l = rh->n_bases; r->quality->l = rh->n_bases; r->bases->s[r->bases->l]='\0'; r->quality->s[r->quality->l]='\0'; // convert flowgram to host order for(i=0;i<gh->flow_length;i++) { r->flowgram[i] = ntohs(r->flowgram[i]); } n += ion_read_padding(fp, n); #ifdef ION_SFF_DEBUG sff_read_print(stderr, r, gh, rh); #endif return r; }
sff_read_header_t * sff_read_header_read(FILE *fp) { sff_read_header_t *rh = NULL; uint32_t n = 0; rh = sff_read_header_init(); if(1 != fread(&rh->rheader_length, sizeof(uint16_t), 1, fp) || 1 != fread(&rh->name_length, sizeof(uint16_t), 1, fp) || 1 != fread(&rh->n_bases, sizeof(uint32_t), 1, fp) || 1 != fread(&rh->clip_qual_left, sizeof(uint16_t), 1, fp) || 1 != fread(&rh->clip_qual_right, sizeof(uint16_t), 1, fp) || 1 != fread(&rh->clip_adapter_left, sizeof(uint16_t), 1, fp) || 1 != fread(&rh->clip_adapter_right, sizeof(uint16_t), 1, fp)) { free(rh); return NULL; } n += sizeof(uint32_t) + 6*sizeof(uint16_t); // convert values from big-endian sff_read_header_ntoh(rh); rh->name = ion_string_init(rh->name_length+1); if(rh->name_length != fread(rh->name->s, sizeof(char), rh->name_length, fp)) { // truncated file, error ion_error(__func__, "fread", Exit, ReadFileError); } n += sizeof(char)*rh->name_length; // set read name length and null-terminator rh->name->l = rh->name_length; rh->name->s[rh->name->l]='\0'; n += ion_read_padding(fp, n); #ifdef ION_SFF_DEBUG sff_read_header_print(stderr, rh); #endif if(rh->rheader_length != n) { ion_error(__func__, "SFF read header length did not match", Exit, ReadFileError); } return rh; }
ion_string_t* sff_read_get_read_bases(sff_read_t* rd, int left_clip, int right_clip) { ion_string_t *bases; // account for NULL termination int bases_length = (right_clip - left_clip) + 1; bases = ion_string_init(bases_length);//MJ?+1 // copy the relative substring int start = left_clip; int stop = right_clip; int i, j = 0; for (i = start; i < stop; i++) { *(bases->s + j) = *(rd->bases->s + i); j++; } return bases; }