int faidx_main(int argc, char *argv[]) { if (argc == 1) { fprintf(stderr, "Usage: faidx <in.fasta> [<reg> [...]]\n"); return 1; } else { if (argc == 2) fai_build(argv[1]); else { int i, j, k, l; char *s; faidx_t *fai; fai = fai_load(argv[1]); if (fai == 0) return 1; for (i = 2; i != argc; ++i) { printf(">%s\n", argv[i]); s = fai_fetch(fai, argv[i], &l); for (j = 0; j < l; j += 60) { for (k = 0; k < 60 && k < l - j; ++k) putchar(s[j + k]); putchar('\n'); } free(s); } fai_destroy(fai); } } return 0; }
int get_unpadded_len(faidx_t *fai, char *ref_name, int padded_len) { char base; char *fai_ref = 0; int fai_ref_len = 0, k; int bases=0, gaps=0; fai_ref = fai_fetch(fai, ref_name, &fai_ref_len); if (fai_ref_len != padded_len) { fprintf(stderr, "[depad] ERROR: FASTA sequence '%s' length %i, expected %i\n", ref_name, fai_ref_len, padded_len); free(fai_ref); return -1; } for (k = 0; k < padded_len; ++k) { //fprintf(stderr, "[depad] checking base %i of %i or %i\n", k+1, ref_len, strlen(fai_ref)); base = fai_ref[k]; if (base == '-' || base == '*') { gaps += 1; } else { int i = seq_nt16_table[(int)base]; if (i == 0 || i==16) { // Equals maps to 0, anything unexpected to 16 fprintf(stderr, "[depad] ERROR: Invalid character %c (ASCII %i) in FASTA sequence '%s'\n", base, (int)base, ref_name); free(fai_ref); return -1; } bases += 1; } } free(fai_ref); assert (padded_len == bases + gaps); return bases; }
int load_unpadded_ref(faidx_t *fai, char *ref_name, int ref_len, kstring_t *seq) { char base; char *fai_ref = 0; int fai_ref_len = 0, k; fai_ref = fai_fetch(fai, ref_name, &fai_ref_len); if (fai_ref_len != ref_len) { fprintf(stderr, "[depad] ERROR: FASTA sequence %s length %i, expected %i\n", ref_name, fai_ref_len, ref_len); free(fai_ref); return -1; } ks_resize(seq, ref_len); seq->l = 0; for (k = 0; k < ref_len; ++k) { base = fai_ref[k]; if (base == '-' || base == '*') { // Map gaps to null to match unpad_seq function seq->s[seq->l++] = 0; } else { int i = seq_nt16_table[(int)base]; if (i == 0 || i==16) { // Equals maps to 0, anything unexpected to 16 fprintf(stderr, "[depad] ERROR: Invalid character %c (ASCII %i) in FASTA sequence %s\n", base, (int)base, ref_name); free(fai_ref); return -1; } seq->s[seq->l++] = i; } } assert(ref_len == seq->l); free(fai_ref); return 0; }
std::string IndexedFastaReader::Subsequence(const char *htslibRegion) const { REQUIRE_FAIDX_LOADED; int len; char* rawSeq = fai_fetch(handle_, htslibRegion, &len); if (rawSeq == nullptr) throw std::runtime_error("could not fetch FASTA sequence"); else { std::string seq(rawSeq); free(rawSeq); return seq; } }
// get referense sequence // NOTE: 1-based positions std::string BasicHaplotypeBuilder::getRefSeq(std::string chr, int lpos, int rpos) { if (!fai) { throw std::string("FAI error."); } std::stringstream ss; ss << chr << ":" << lpos << "-" << rpos; char *ref; int len; ref = fai_fetch(fai, ss.str().c_str(), &len); if (len == 0) { throw std::string("faidx error: len==0"); } std::string res(ref); free(ref); std::transform(res.begin(), res.end(), res.begin(), ::toupper); return res; }
std::string ReadDB::get_read_sequence(const std::string& read_id) const { assert(m_fai != NULL); int length; char* seq; // this call is not threadsafe #pragma omp critical seq = fai_fetch(m_fai, read_id.c_str(), &length); if(seq == NULL) { return ""; } std::string out(seq); free(seq); return out; }
int bam_fillmd(int argc, char *argv[]) { int c, flt_flag, tid = -2, ret, len, is_bam_out, is_uncompressed, max_nm, is_realn, capQ, baq_flag; samFile *fp = NULL, *fpout = NULL; bam_hdr_t *header = NULL; faidx_t *fai = NULL; char *ref = NULL, mode_w[8], *ref_file; bam1_t *b = NULL; sam_global_args ga = SAM_GLOBAL_ARGS_INIT; static const struct option lopts[] = { SAM_OPT_GLOBAL_OPTIONS('-', 0, 0, 0, 0), { NULL, 0, NULL, 0 } }; flt_flag = UPDATE_NM | UPDATE_MD; is_bam_out = is_uncompressed = is_realn = max_nm = capQ = baq_flag = 0; strcpy(mode_w, "w"); while ((c = getopt_long(argc, argv, "EqreuNhbSC:n:Ad", lopts, NULL)) >= 0) { switch (c) { case 'r': is_realn = 1; break; case 'e': flt_flag |= USE_EQUAL; break; case 'd': flt_flag |= DROP_TAG; break; case 'q': flt_flag |= BIN_QUAL; break; case 'h': flt_flag |= HASH_QNM; break; case 'N': flt_flag &= ~(UPDATE_MD|UPDATE_NM); break; case 'b': is_bam_out = 1; break; case 'u': is_uncompressed = is_bam_out = 1; break; case 'S': break; case 'n': max_nm = atoi(optarg); break; case 'C': capQ = atoi(optarg); break; case 'A': baq_flag |= 1; break; case 'E': baq_flag |= 2; break; default: if (parse_sam_global_opt(c, optarg, lopts, &ga) == 0) break; fprintf(stderr, "[bam_fillmd] unrecognized option '-%c'\n\n", c); /* else fall-through */ case '?': return calmd_usage(); } } if (is_bam_out) strcat(mode_w, "b"); else strcat(mode_w, "h"); if (is_uncompressed) strcat(mode_w, "0"); if (optind + (ga.reference == NULL) >= argc) return calmd_usage(); fp = sam_open_format(argv[optind], "r", &ga.in); if (fp == NULL) { print_error_errno("calmd", "Failed to open input file '%s'", argv[optind]); return 1; } header = sam_hdr_read(fp); if (header == NULL || header->n_targets == 0) { fprintf(stderr, "[bam_fillmd] input SAM does not have header. Abort!\n"); goto fail; } fpout = sam_open_format("-", mode_w, &ga.out); if (fpout == NULL) { print_error_errno("calmd", "Failed to open output"); goto fail; } if (sam_hdr_write(fpout, header) < 0) { print_error_errno("calmd", "Failed to write sam header"); goto fail; } ref_file = argc > optind + 1 ? argv[optind+1] : ga.reference; fai = fai_load(ref_file); if (!fai) { print_error_errno("calmd", "Failed to open reference file '%s'", ref_file); goto fail; } b = bam_init1(); if (!b) { fprintf(stderr, "[bam_fillmd] Failed to allocate bam struct\n"); goto fail; } while ((ret = sam_read1(fp, header, b)) >= 0) { if (b->core.tid >= 0) { if (tid != b->core.tid) { free(ref); ref = fai_fetch(fai, header->target_name[b->core.tid], &len); tid = b->core.tid; if (ref == 0) { // FIXME: Should this always be fatal? fprintf(stderr, "[bam_fillmd] fail to find sequence '%s' in the reference.\n", header->target_name[tid]); if (is_realn || capQ > 10) goto fail; // Would otherwise crash } } if (is_realn) sam_prob_realn(b, ref, len, baq_flag); if (capQ > 10) { int q = sam_cap_mapq(b, ref, len, capQ); if (b->core.qual > q) b->core.qual = q; } if (ref) bam_fillmd1_core(b, ref, len, flt_flag, max_nm); } if (sam_write1(fpout, header, b) < 0) { print_error_errno("calmd", "failed to write to output file"); goto fail; } } if (ret < -1) { fprintf(stderr, "[bam_fillmd] Error reading input.\n"); goto fail; } bam_destroy1(b); bam_hdr_destroy(header); free(ref); fai_destroy(fai); sam_close(fp); if (sam_close(fpout) < 0) { fprintf(stderr, "[bam_fillmd] error when closing output file\n"); return 1; } return 0; fail: free(ref); if (b) bam_destroy1(b); if (header) bam_hdr_destroy(header); if (fai) fai_destroy(fai); if (fp) sam_close(fp); if (fpout) sam_close(fpout); return 1; }
static int dindel_fetch_func(bam1_t *b, void *data) { data_t_dindel *tmp = (data_t_dindel*)data; bam1_core_t *c = &b->core; int rlen; uint8_t *to_delete; /* don't change reads failing default mask: BAM_FUNMAP | BAM_FSECONDARY | BAM_FQCFAIL | BAM_FDUP */ if (c->flag & BAM_DEF_MASK) { /* fprintf(stderr, "skipping read: %s at pos %d\n", bam1_qname(b), c->pos); */ bam_write1(tmp->out, b); return 0; } /* get the reference sequence and compute homopolymer array */ if (tmp->tid != c->tid) { /*fprintf(stderr, "fetching reference sequence %s\n", tmp->in->header->target_name[c->tid]); */ char *ref = fai_fetch(tmp->fai, tmp->in->header->target_name[c->tid], &rlen); strtoupper(ref);/* safeguard */ int rlen = strlen(ref); tmp->tid = c->tid; if (tmp->hpcount) free(tmp->hpcount); tmp->hpcount = (int*)malloc(rlen*sizeof(int)); find_homopolymers(ref, tmp->hpcount, rlen); free(ref); tmp->rlen = rlen; /* fprintf(stderr, "fetched reference sequence\n");*/ } /* parse the cigar string */ uint32_t *cigar = bam1_cigar(b); uint8_t indelq[c->l_qseq+1]; /* fprintf(stderr, "l_qseq:%d\n", c->l_qseq); */ int i; int x = c->pos; /* coordinate on reference */ int y = 0; /* coordinate on query */ for (i = 0; i < c->n_cigar; ++i) { int j, oplen = cigar[i]>>4, op = cigar[i]&0xf; if (op == BAM_CMATCH || op == BAM_CEQUAL || op == BAM_CDIFF) { for (j = 0; j < oplen; j++) { /*fprintf(stderr, "query:%d, ref:%d, count:%d\n", y, x, tmp->hpcount[x+1]); */ /* FIXME clang complains: The left operand of '>' is a garbage value */ indelq[y] = (x > tmp->rlen-2) ? DINDELQ[0] : (tmp->hpcount[x+1]>18 ? DINDELQ[0] : DINDELQ[tmp->hpcount[x+1]]); x++; y++; } } else if (op == BAM_CHARD_CLIP) { /* do nothing */ } else if (op == BAM_CDEL) { x += oplen; } else if (op == BAM_CINS || op == BAM_CSOFT_CLIP) { for (j = 0; j < oplen; j++) { /* fprintf(stderr, "query:%d, ref:%d\n", y, x); */ indelq[y] = DINDELQ[0]; y++; } } else { LOG_FATAL("unknown op %d for read %s\n", op, bam1_qname(b));/* FIXME skip? seen this somewhere else properly handled */ exit(1); } } indelq[y] = '\0'; to_delete = bam_aux_get(b, BI_TAG); if (to_delete) { bam_aux_del(b, to_delete); } bam_aux_append(b, BI_TAG, 'Z', c->l_qseq+1, indelq); to_delete = bam_aux_get(b, BD_TAG); if (to_delete) { bam_aux_del(b, to_delete); } bam_aux_append(b, BD_TAG, 'Z', c->l_qseq+1, indelq); bam_write1(tmp->out, b); return 0; }
int main(int argc , char *argv[]) { FILE *fin , *fout ; vcf_info vcf ; faidx_t *fai ; char buffer[32]; char *s = malloc(1024*sizeof(char)); if( argc != 4 ){ fprintf(stderr,"sv2vcf [ref.fa] [input] [output] \n"); return 1 ; } fai = fai_load(argv[1]); if(!fai){ fprintf(stderr,"can't open the file:%s.fai\n",argv[1]); return 1; } fin = fopen(argv[2],"r"); if(!fin){ fprintf(stderr,"can't open the file:%s\n", argv[2]); return 1 ; } fout = fopen(argv[3],"w"); if(!fout){ fprintf(stderr,"can't open the file:%s\n", argv[3]); return 1 ; } fprintf(fout,"#CHROM\tPOS\tID\tREF\tALT\tQUAL\tFILT\tINFO\n"); while(!feof(fin)){ char *tmp ; int len ; fscanf(fin,"%s\t",buffer); if(!strcmp(buffer,"TRSdL")){ fscanf(fin,"%s\t",buffer); fscanf(fin,"%d\t%d\n",&vcf.pos[0],&vcf.pos[1]); int k ; for( k = 0 ; k < 2 ; k++){ sprintf(s,"%s:%d-%d",buffer,vcf.pos[k],vcf.pos[k]); tmp = fai_fetch(fai,s,&len); vcf.mut[k] = *tmp ; free(tmp); } fprintf(fout,"%s\t%d\tbnd_V\t%c\t[%s:%d[%c\t6\tPASS\tSVTYPE=BND;MATEID=bnd_W;EVENT=PRO\n",buffer,vcf.pos[0],vcf.mut[0],buffer,vcf.pos[1],vcf.mut[0]); fprintf(fout,"%s\t%d\tbnd_W\t%c\t[%s:%d[%c\t6\tPASS\tSVTYPE=BND;MATEID=bnd_V;EVENT=PRO\n",buffer,vcf.pos[1],vcf.mut[1],buffer,vcf.pos[0],vcf.mut[1]); }else if(!strcmp(buffer,"TRSdR")){ fscanf(fin,"%s\t",buffer); fscanf(fin,"%d\t%d\n",&vcf.pos[0],&vcf.pos[1]); int k ; for( k = 0 ; k < 2 ; k++){ sprintf(s,"%s:%d-%d",buffer,vcf.pos[k],vcf.pos[k]); tmp = fai_fetch(fai,s,&len); vcf.mut[k] = *tmp ; free(tmp); } fprintf(fout,"%s\t%d\tbnd_V\t%c\t%s:%d]%c]\t6\tPASS\tSVTYPE=BND;MATEID=bnd_W;EVENT=PRO\n",buffer,vcf.pos[0],vcf.mut[0],buffer,vcf.pos[1],vcf.mut[0]); fprintf(fout,"%s\t%d\tbnd_W\t%c\t%s:%d]%c]\t6\tPASS\tSVTYPE=BND;MATEID=bnd_V;EVENT=PRO\n",buffer,vcf.pos[1],vcf.mut[1],buffer,vcf.pos[0],vcf.mut[1]); }else if((tmp = strstr(buffer,"TandemCNV"))){ tmp = tmp + 9 ; vcf.type = atoi(tmp); fscanf(fin,"%s\t",buffer); if(vcf.type == 1 ) { fscanf(fin,"%*[^\n]\n"); continue ; } fscanf(fin,"%d\t%d\n",&vcf.pos[0],&vcf.pos[1]); int k ; for( k = 0 ; k < 2 ; k++){ sprintf(s,"%s:%d-%d",buffer,vcf.pos[k],vcf.pos[k]); tmp = fai_fetch(fai,s,&len); vcf.mut[k] = *tmp ; free(tmp); } if(vcf.type == 2){ fprintf(fout,"%s\t%d\tbnd_V\t%c\t%c]%s:%d]\t6\tPASS\tSVTYPE=BND;MATEID=bnd_W;EVENT=PRO\n",buffer,vcf.pos[1],vcf.mut[1],vcf.mut[1],buffer,vcf.pos[1]); fprintf(fout,"%s\t%d\tbnd_W\t%c\t%c]%s:%d]\t6\tPASS\tSVTYPE=BND;MATEID=bnd_V;EVENT=PRO\n",buffer,vcf.pos[1],vcf.mut[1],vcf.mut[1],buffer,vcf.pos[1]); }else { fprintf(fout,"%s\t%d\tbnd_V\t%c\t[%s:%d[%c\t6\tPASS\tSVTYPE=BND;MATEID=bnd_W;EVENT=PRO\n",buffer,vcf.pos[0],vcf.mut[0],buffer,vcf.pos[0],vcf.mut[0]); fprintf(fout,"%s\t%d\tbnd_W\t%c\t[%s:%d[%c\t6\tPASS\tSVTYPE=BND;MATEID=bnd_V;EVENT=PRO\n",buffer,vcf.pos[0],vcf.mut[0],buffer,vcf.pos[0],vcf.mut[0]); } }else if((tmp = strstr( buffer,"CNV"))){ tmp = tmp + 3; vcf.type = atoi(tmp); fscanf(fin,"%s\t",buffer); fscanf(fin,"%d\t%d\t%d\n",&vcf.pos[0],&vcf.pos[1],&vcf.pos[2]); if( vcf.type == 1 ){ sprintf(s,"%s:%d-%d",buffer,vcf.pos[0],vcf.pos[0]); tmp = fai_fetch(fai,s,&len); vcf.mut[0] = *tmp ; free(tmp); sprintf(s,"%s:%d-%d",buffer,vcf.pos[2],vcf.pos[2]); tmp = fai_fetch(fai,s,&len); vcf.mut[2] = *tmp ; free(tmp); sprintf(s,"%s:%d-%d",buffer,vcf.pos[1],vcf.pos[1]); tmp = fai_fetch(fai,s,&len); vcf.mut[1] = *tmp ; free(tmp); sprintf(s,"%s:%d-%d",buffer,vcf.pos[2]+1,vcf.pos[2]+1); tmp = fai_fetch(fai,s,&len); vcf.mut[3] = *tmp ; free(tmp); fprintf(fout,"%s\t%d\tbnd_V\t%c\t]%s:%d]%c\t6\tPASS\tSVTYPE=BND;MATEID=bnd_W;EVENT=PRO\n",buffer,vcf.pos[0],vcf.mut[0],buffer,vcf.pos[2],vcf.mut[0]); fprintf(fout,"%s\t%d\tbnd_W\t%c\t%c[%s:%d[\t6\tPASS\tSVTYPE=BND;MATEID=bnd_V;EVENT=PRO\n",buffer,vcf.pos[2],vcf.mut[2],vcf.mut[2],buffer,vcf.pos[0]); fprintf(fout,"%s\t%d\tbnd_U\t%c\t%c[%s:%d[\t6\tPASS\tSVTYPE=BND;MATEID=bnd_X;EVENT=PRO\n",buffer,vcf.pos[1],vcf.mut[1],vcf.mut[1],buffer,vcf.pos[2]+1); fprintf(fout,"%s\t%d\tbnd_X\t%c\t]%s:%d]%c\t6\tPASS\tSVTYPE=BND;MATEID=bnd_U;EVENT=PRO\n",buffer,vcf.pos[2]+1,vcf.mut[3],buffer,vcf.pos[1],vcf.mut[3]); }else if( vcf.type == 2 ){ sprintf(s,"%s:%d-%d",buffer,vcf.pos[0],vcf.pos[0]); tmp = fai_fetch(fai,s,&len); vcf.mut[0] = *tmp ; free(tmp); sprintf(s,"%s:%d-%d",buffer,vcf.pos[2]+1,vcf.pos[2]+1); tmp = fai_fetch(fai,s,&len); vcf.mut[3] = *tmp ; free(tmp); sprintf(s,"%s:%d-%d",buffer,vcf.pos[1],vcf.pos[1]); tmp = fai_fetch(fai,s,&len); vcf.mut[1] = *tmp ; free(tmp); sprintf(s,"%s:%d-%d",buffer,vcf.pos[2],vcf.pos[2]); tmp = fai_fetch(fai,s,&len); vcf.mut[2] = *tmp ; free(tmp); fprintf(fout,"%s\t%d\tbnd_V\t%c\t[%s:%d[%c\t6\tPASS\tSVTYPE=BND;MATEID=bnd_W;EVENT=PRO\n",buffer,vcf.pos[0],vcf.mut[0],buffer,vcf.pos[2]+1,vcf.mut[0]); fprintf(fout,"%s\t%d\tbnd_W\t%c\t[%s:%d[%c\t6\tPASS\tSVTYPE=BND;MATEID=bnd_U;EVENT=PRO\n",buffer,vcf.pos[2]+1,vcf.mut[3],buffer,vcf.pos[0],vcf.mut[3]); fprintf(fout,"%s\t%d\tbnd_U\t%c\t%c]%s:%d]\t6\tPASS\tSVTYPE=BND;MATEID=bnd_X;EVENT=PRO\n",buffer,vcf.pos[1],vcf.mut[1],vcf.mut[1],buffer,vcf.pos[2]); fprintf(fout,"%s\t%d\tbnd_X\t%c\t%c]%s:%d]\t6\tPASS\tSVTYPE=BND;MATEID=bnd_U;EVENT=PRO\n",buffer,vcf.pos[2],vcf.mut[2],vcf.mut[2],buffer,vcf.pos[1]); }else if(vcf.type == 3){ sprintf(s,"%s:%d-%d",buffer,vcf.pos[0],vcf.pos[0]); tmp = fai_fetch(fai,s,&len); vcf.mut[0] = *tmp ; free(tmp); sprintf(s,"%s:%d-%d",buffer,vcf.pos[1],vcf.pos[1]); tmp = fai_fetch(fai,s,&len); vcf.mut[1] = *tmp ; free(tmp); sprintf(s,"%s:%d-%d",buffer,vcf.pos[0]+1,vcf.pos[0]+1); tmp = fai_fetch(fai,s,&len); vcf.mut[2] = *tmp ; free(tmp); sprintf(s,"%s:%d-%d",buffer,vcf.pos[2],vcf.pos[2]); tmp = fai_fetch(fai,s,&len); vcf.mut[3] = *tmp ; free(tmp); fprintf(fout,"%s\t%d\tbnd_V\t%c\t%c[%s:%d[\t6\tPASS\tSVTYPE=BND;MATEID=bnd_W;EVENT=PRO\n",buffer,vcf.pos[0],vcf.mut[0],vcf.mut[0],buffer,vcf.pos[1]); fprintf(fout,"%s\t%d\tbnd_W\t%c\t]%s:%d]%c\t6\tPASS\tSVTYPE=BND;MATEID=bnd_V;EVENT=PRO\n",buffer,vcf.pos[1],vcf.mut[1],buffer,vcf.pos[0],vcf.mut[1]); fprintf(fout,"%s\t%d\tbnd_U\t%c\t]%s:%d]%c\t6\tPASS\tSVTYPE=BND;MATEID=bnd_X;EVENT=PRO\n",buffer,vcf.pos[0]+1,vcf.mut[2],buffer,vcf.pos[2],vcf.mut[2]); fprintf(fout,"%s\t%d\tbnd_X\t%c\t%c[%s:%d[\t6\tPASS\tSVTYPE=BND;MATEID=bnd_W;EVENT=PRO\n",buffer,vcf.pos[2],vcf.mut[3],vcf.mut[3],buffer,vcf.pos[0]+1); }else if(vcf.type == 4){ sprintf(s,"%s:%d-%d",buffer,vcf.pos[0],vcf.pos[0]); tmp = fai_fetch(fai,s,&len); vcf.mut[0] = *tmp ; free(tmp); sprintf(s,"%s:%d-%d",buffer,vcf.pos[1],vcf.pos[1]); tmp = fai_fetch(fai,s,&len); vcf.mut[1] = *tmp ; free(tmp); sprintf(s,"%s:%d-%d",buffer,vcf.pos[0]+1,vcf.pos[0]+1); tmp = fai_fetch(fai,s,&len); vcf.mut[2] = *tmp ; free(tmp); sprintf(s,"%s:%d-%d",buffer,vcf.pos[2],vcf.pos[2]); tmp = fai_fetch(fai,s,&len); vcf.mut[3] = *tmp ; free(tmp); fprintf(fout,"%s\t%d\tbnd_V\t%c\t%c]%s:%d]\t6\tPASS\tSVTYPE=BND;MATEID=bnd_W;EVENT=PRO\n",buffer,vcf.pos[0],vcf.mut[0],vcf.mut[0],buffer,vcf.pos[2]); fprintf(fout,"%s\t%d\tbnd_W\t%c\t%c]%s:%d]\t6\tPASS\tSVTYPE=BND;MATEID=bnd_V;EVENT=PRO\n",buffer,vcf.pos[2],vcf.mut[3],vcf.mut[3],buffer,vcf.pos[0]); fprintf(fout,"%s\t%d\tbnd_U\t%c\t[%s:%d[%c\t6\tPASS\tSVTYPE=BND;MATEID=bnd_X;EVENT=PRO\n",buffer,vcf.pos[0]+1,vcf.mut[2],buffer,vcf.pos[1],vcf.mut[2]); fprintf(fout,"%s\t%d\tbnd_X\t%c\t[%s:%d[%c\t6\tPASS\tSVTYPE=BND;MATEID=bnd_U;EVENT=PRO\n",buffer,vcf.pos[1],vcf.mut[3],buffer,vcf.pos[0]+1,vcf.mut[3]); } }else if((tmp =strstr(buffer,"TRS"))){ tmp = tmp + 3; vcf.type = atoi(tmp); fscanf(fin,"%s\t",buffer); if( vcf.type == 2 || vcf.type == 3 ){ fscanf(fin,"%d\t%d\t%d\t%d\n",&vcf.pos[1],&vcf.pos[2],&vcf.pos[5],&vcf.pos[6]); vcf.pos[0] = vcf.pos[1] - 1 ; vcf.pos[3] = vcf.pos[2] + 1 ; vcf.pos[4] = vcf.pos[5] - 1 ; vcf.pos[7] = vcf.pos[6] + 1 ; int k = 0 ; for( k = 0 ; k < 8 ; k++){ sprintf(s,"%s:%d-%d",buffer,vcf.pos[k],vcf.pos[k]); tmp = fai_fetch(fai,s,&len); vcf.mut[k] = *tmp ; free(tmp); } if(vcf.type == 2 ){ fprintf(fout,"%s\t%d\tbnd_V\t%c\t%c]%s:%d]\t6\tPASS\tSVTYPE=BND;MATEID=bnd_W;EVENT=PRO\n",buffer,vcf.pos[0],vcf.mut[0],vcf.mut[0],buffer,vcf.pos[6]); fprintf(fout,"%s\t%d\tbnd_W\t%c\t%c]%s:%d]\t6\tPASS\tSVTYPE=BND;MATEID=bnd_V;EVENT=PRO\n",buffer,vcf.pos[6],vcf.mut[6],vcf.mut[6],buffer,vcf.pos[0]); fprintf(fout,"%s\t%d\tbnd_U\t%c\t[%s:%d[%c\t6\tPASS\tSVTYPE=BND;MATEID=bnd_X;EVENT=PRO\n",buffer,vcf.pos[3],vcf.mut[3],buffer,vcf.pos[5],vcf.mut[3]); fprintf(fout,"%s\t%d\tbnd_X\t%c\t[%s:%d[%c\t6\tPASS\tSVTYPE=BND;MATEID=bnd_U;EVENT=PRO\n",buffer,vcf.pos[5],vcf.mut[5],buffer,vcf.pos[3],vcf.mut[5]); fprintf(fout,"%s\t%d\tbnd_E\t%c\t]%s:%d]%c\t6\tPASS\tSVTYPE=BND;MATEID=bnd_D;EVENT=PRO\n",buffer,vcf.pos[1],vcf.mut[1],buffer,vcf.pos[4],vcf.mut[1]); fprintf(fout,"%s\t%d\tbnd_D\t%c\t%c[%s:%d[\t6\tPASS\tSVTYPE=BND;MATEID=bnd_E;EVENT=PRO\n",buffer,vcf.pos[4],vcf.mut[4],vcf.mut[4],buffer,vcf.pos[1]); fprintf(fout,"%s\t%d\tbnd_Z\t%c\t%c[%s:%d[\t6\tPASS\tSVTYPE=BND;MATEID=bnd_H;EVENT=PRO\n",buffer,vcf.pos[2],vcf.mut[2],vcf.mut[2],buffer,vcf.pos[7]); fprintf(fout,"%s\t%d\tbnd_H\t%c\t]%s:%d]%c\t6\tPASS\tSVTYPE=BND;MATEID=bnd_Z;EVENT=PRO\n",buffer,vcf.pos[7],vcf.mut[7],buffer,vcf.pos[2],vcf.mut[7]); }else { fprintf(fout,"%s\t%d\tbnd_V\t%c\t%c[%s:%d[\t6\tPASS\tSVTYPE=BND;MATEID=bnd_W;EVENT=PRO\n",buffer,vcf.pos[0],vcf.mut[0],vcf.mut[0],buffer,vcf.pos[5]); fprintf(fout,"%s\t%d\tbnd_W\t%c\t]%s:%d]%c\t6\tPASS\tSVTYPE=BND;MATEID=bnd_V;EVENT=PRO\n",buffer,vcf.pos[5],vcf.mut[5],buffer,vcf.pos[0],vcf.mut[5]); fprintf(fout,"%s\t%d\tbnd_U\t%c\t]%s:%d]%c\t6\tPASS\tSVTYPE=BND;MATEID=bnd_X;EVENT=PRO\n",buffer,vcf.pos[3],vcf.mut[3],buffer,vcf.pos[6],vcf.mut[3]); fprintf(fout,"%s\t%d\tbnd_X\t%c\t%c[%s:%d[\t6\tPASS\tSVTYPE=BND;MATEID=bnd_U;EVENT=PRO\n",buffer,vcf.pos[6],vcf.mut[6],vcf.mut[6],buffer,vcf.pos[3]); fprintf(fout,"%s\t%d\tbnd_E\t%c\t%c]%s:%d]\t6\tPASS\tSVTYPE=BND;MATEID=bnd_D;EVENT=PRO\n",buffer,vcf.pos[2],vcf.mut[2],vcf.mut[2],buffer,vcf.pos[4]); fprintf(fout,"%s\t%d\tbnd_D\t%c\t%c]%s:%d]\t6\tPASS\tSVTYPE=BND;MATEID=bnd_E;EVENT=PRO\n",buffer,vcf.pos[4],vcf.mut[4],vcf.mut[4],buffer,vcf.pos[2]); fprintf(fout,"%s\t%d\tbnd_Z\t%c\t[%s:%d[%c\t6\tPASS\tSVTYPE=BND;MATEID=bnd_H;EVENT=PRO\n",buffer,vcf.pos[1],vcf.mut[1],buffer,vcf.pos[7],vcf.mut[1]); fprintf(fout,"%s\t%d\tbnd_H\t%c\t[%s:%d[%c\t6\tPASS\tSVTYPE=BND;MATEID=bnd_Z;EVENT=PRO\n",buffer,vcf.pos[7],vcf.mut[7],buffer,vcf.pos[1],vcf.mut[7]); } }else if(vcf.type == 1){ fscanf(fin,"%d\t%d\n",&vcf.pos[1],&vcf.pos[2]); vcf.pos[0] = vcf.pos[1] - 1 ; vcf.pos[3] = vcf.pos[2] + 1 ; int k ; for( k = 0 ; k < 4 ; k++){ sprintf(s,"%s:%d-%d",buffer,vcf.pos[k],vcf.pos[k]); tmp = fai_fetch(fai,s,&len); vcf.mut[k] = *tmp ; free(tmp); } fprintf(fout,"%s\t%d\tbnd_V\t%c\t%c[%s:%d[\t6\tPASS\tSVTYPE=BND;MATEID=bnd_W;EVENT=PRO\n",buffer,vcf.pos[0],vcf.mut[0],vcf.mut[0],buffer,vcf.pos[2]); fprintf(fout,"%s\t%d\tbnd_W\t%c\t]%s:%d]%c\t6\tPASS\tSVTYPE=BND;MATEID=bnd_W;EVENT=PRO\n",buffer,vcf.pos[2],vcf.mut[2],buffer,vcf.pos[0],vcf.mut[2]); fprintf(fout,"%s\t%d\tbnd_U\t%c\t]%s:%d]%c\t6\tPASS\tSVTYPE=BND;MATEID=bnd_X;EVENT=PRO\n",buffer,vcf.pos[1],vcf.mut[1],buffer,vcf.pos[3],vcf.mut[1]); fprintf(fout,"%s\t%d\tbnd_X\t%c\t%c[%s:%d[\t6\tPASS\tSVTYPE=BND;MATEID=bnd_W;EVENT=PRO\n",buffer,vcf.pos[3],vcf.mut[3],vcf.mut[3],buffer,vcf.pos[1]); }else{ fscanf(fin,"%*[^\n]\n"); } }else{ fscanf(fin,"%*[^\n]\n"); } } free(s); fclose(fin); fclose(fout); return 0; }