将bam文件分成两个bam文件,属于相同pe的两条reads分到一个bam文件中

#include <stdio.h>
#include <stdlib.h>
#include<time.h>
#include "htslib/sam.h"

#define bam_is_read1(b) (((b)->core.flag&BAM_FREAD1) != 0)

typedef struct Link{//用于存储qname信息
	char *qname;
	int tie;
	struct Link *next;
}Link,*LinkList;

int main(int argc,char **argv){
	samFile *in = sam_open(argv[1], "r");
	bam_hdr_t *header;
	bam1_t *aln = bam_init1();
	header = sam_hdr_read(in);	
	htsFile *outR1 = hts_open(argv[2], "wb");
    htsFile *outR2 = hts_open(argv[3], "wb");
    if (sam_hdr_write(outR1, header) < 0) {
        fprintf(stderr, "Error writing output.\n");
        exit(-1);
    }
    if (sam_hdr_write(outR2, header) < 0) {
        fprintf(stderr, "Error writing output.\n");
        exit(-1);
    }	
	Link *head = (Link *)malloc(sizeof(Link));	
    head->next = NULL; 
    Link *temp = head;
    Link *e = head;
    char *name;  
    srand((unsigned int)time(NULL));//time函数返回的时间戳作为随机数生成器的初始值
    while(sam_read1(in, header, aln) >= 0){
    	
    	Link *t = head;
    	int sign = 0;
		name = bam_get_qname(aln);
    	while(t->next != NULL){//查询是否已经录入相同qname的read 
    		if(strcmp(name,t->next->qname) == 0){
    			if(t->next->tie == 1){
    				int a=sam_write1(outR1, header, aln);//写入数据
    				sign = 1;
					break;	
				}else{
					int a=sam_write1(outR2, header, aln);
					sign = 1;
					break;
				}
			}
			else{
	    		t = t->next;
			} 	
		}
		if(sign == 0){//将新出现的qname录入 
			Link *b = (Link *)malloc(sizeof(Link));	
			b->qname =(char *)malloc(sizeof(char)*1000);
	    	b->qname = strcpy(b->qname,bam_get_qname(aln));		 	
			int i = rand()%10;//生成随机数 
    	    if(i%2!=0){//写入其中一个bam文件
    	    	int a=sam_write1(outR1, header, aln);
				b->tie = 1;	
			}
		    else{
		    	int a=sam_write1(outR2, header, aln);
		    	b->tie = 0;
	    	}
	    	b->next = NULL;
	    	temp->next = b;
	    	temp = temp->next;	
		}
	}
	
/*	int n = 0;//统计录入的qname数量 
	while(e->next != NULL){ 
		n++;
		e = e->next;
	}
	printf("%d\n",n);
*/
	sam_close(in);
	sam_close(outR1);
	sam_close(outR2);
	
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值