コード例 #1
0
ファイル: faidx.c プロジェクト: Griffan/FASTQuick
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;
}
コード例 #2
0
ファイル: padding.c プロジェクト: dozy/samtools
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;
}
コード例 #3
0
ファイル: padding.c プロジェクト: dozy/samtools
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;
}
コード例 #4
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;
    }
}
コード例 #5
0
// 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;
}
コード例 #6
0
ファイル: nanopolish_read_db.cpp プロジェクト: jts/nanopolish
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;   
}
コード例 #7
0
ファイル: bam_md.c プロジェクト: pd3/samtools
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;
}
コード例 #8
0
ファイル: lofreq_indelqual.c プロジェクト: CSB5/lofreq
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;
}
コード例 #9
0
ファイル: sv2vcf.c プロジェクト: yinlonghui/casindel
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;
}