コード例 #1
0
ファイル: submap.c プロジェクト: hammer/maq
static bit64_t maq_submap_core(gzFile fpin, gzFile fpout, const submap_opt_t *so)
{
	maqmap_t *mm;
	maqmap1_t m1;
	bit64_t n = 0;
	mm = maqmap_read_header(fpin);
	mm->n_mapped_reads = 0;
	maqmap_write_header(fpout, mm);
	while (gzread(fpin, &m1, sizeof(maqmap1_t))) {
		int is_keep = 1;
		if (m1.map_qual < so->min_mapQ || (m1.info1&0xf) > so->max_mm) is_keep = 0;
		if (so->is_pair && (m1.flag&PAIRFLAG_PAIRED) == 0) is_keep = 0;
		if (m1.info2 > so->max_sum_err) is_keep = 0;
		if (is_keep) {
			gzwrite(fpout, &m1, sizeof(maqmap1_t));
			++n;
		}
	}
	maq_delete_maqmap(mm);
	return n;
}
コード例 #2
0
ファイル: maq2sam.c プロジェクト: B-UMMI/INNUca
void maq2tam_core(gzFile fp, const char *rg)
{
    maqmap_t *mm;
    maqmap1_t mm1, *m1;
    int ret;
    m1 = &mm1;
    mm = maqmap_read_header(fp);
    while ((ret = gzread(fp, m1, sizeof(maqmap1_t))) == sizeof(maqmap1_t)) {
        int j, flag = 0, se_mapq = m1->seq[MAX_READLEN-1];
        if (m1->flag) flag |= 1;
        if ((m1->flag&PAIRFLAG_PAIRED) || ((m1->flag&PAIRFLAG_SW) && m1->flag != 192)) flag |= 2;
        if (m1->flag == 192) flag |= 4;
        if (m1->flag == 64) flag |= 8;
        if (m1->pos&1) flag |= 0x10;
        if ((flag&1) && m1->dist != 0) {
            int c;
            if (m1->dist > 0) {
                if (m1->flag&(PAIRFLAG_FF|PAIRFLAG_RF)) c = 0;
                else if (m1->flag&(PAIRFLAG_FR|PAIRFLAG_RR)) c = 1;
                else c = m1->pos&1;
            } else {
                if (m1->flag&(PAIRFLAG_FF|PAIRFLAG_FR)) c = 0;
                else if (m1->flag&(PAIRFLAG_RF|PAIRFLAG_RR)) c = 1;
                else c = m1->pos&1;
            }
            if (c) flag |= 0x20;
        }
        if (m1->flag) {
            int l = strlen(m1->name);
            if (m1->name[l-2] == '/') {
                flag |= (m1->name[l-1] == '1')? 0x40 : 0x80;
                m1->name[l-2] = '\0';
            }
        }
        printf("%s\t%d\t", m1->name, flag);
        printf("%s\t%d\t", mm->ref_name[m1->seqid], (m1->pos>>1)+1);
        if (m1->flag == 130) {
            int c = (int8_t)m1->seq[MAX_READLEN-1];
            printf("%d\t", m1->alt_qual);
            if (c == 0) printf("%dM\t", m1->size);
            else {
                if (c > 0) printf("%dM%dI%dM\t", m1->map_qual, c, m1->size - m1->map_qual - c);
                else printf("%dM%dD%dM\t", m1->map_qual, -c, m1->size - m1->map_qual);
            }
            se_mapq = 0; // zero SE mapQ for reads aligned by SW
        } else {
            if (flag&4) printf("0\t*\t");
            else printf("%d\t%dM\t", m1->map_qual, m1->size);
        }
        printf("*\t0\t%d\t", m1->dist);
        for (j = 0; j != m1->size; ++j) {
            if (m1->seq[j] == 0) putchar('N');
            else putchar("ACGT"[m1->seq[j]>>6&3]);
        }
        putchar('\t');
        for (j = 0; j != m1->size; ++j)
            putchar((m1->seq[j]&0x3f) + 33);
        putchar('\t');
        if (rg) printf("RG:Z:%s\t", rg);
        if (flag&4) { // unmapped
            printf("MF:i:%d\n", m1->flag);
        } else {
            printf("MF:i:%d\t", m1->flag);
            if (m1->flag) printf("AM:i:%d\tSM:i:%d\t", m1->alt_qual, se_mapq);
            printf("NM:i:%d\tUQ:i:%d\tH0:i:%d\tH1:i:%d\n", m1->info1&0xf, m1->info2, m1->c[0], m1->c[1]);
        }
    }
    if (ret > 0)
        fprintf(stderr, "Truncated! Continue anyway.\n");
    maq_delete_maqmap(mm);
}