]> git.donarmstrong.com Git - samtools.git/blobdiff - misc/maq2sam.c
works
[samtools.git] / misc / maq2sam.c
index e30aa925784198aab70132184a2dddb6f2e7705d..2bfbe2a3b328e276b52f1a443dbc6500d81122e8 100644 (file)
@@ -5,6 +5,8 @@
 #include <stdlib.h>
 #include <assert.h>
 
+#define PACKAGE_VERSION "r439"
+
 //#define MAQ_LONGREADS
 
 #ifdef MAQ_LONGREADS
@@ -84,7 +86,7 @@ maqmap_t *maqmap_read_header(gzFile fp)
        return mm;
 }
 
-void maq2tam_core(gzFile fp)
+void maq2tam_core(gzFile fp, const char *rg)
 {
        maqmap_t *mm;
        maqmap1_t mm1, *m1;
@@ -92,7 +94,7 @@ void maq2tam_core(gzFile fp)
        m1 = &mm1;
        mm = maqmap_read_header(fp);
        while ((ret = gzread(fp, m1, sizeof(maqmap1_t))) == sizeof(maqmap1_t)) {
-               int j, flag = 0;
+               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;
@@ -109,9 +111,9 @@ void maq2tam_core(gzFile fp)
                                else if (m1->flag&(PAIRFLAG_RF|PAIRFLAG_RR)) c = 1;
                                else c = m1->pos&1;
                        }
-                       flag |= c;
+                       if (c) flag |= 0x20;
                }
-               if (flag) {
+               if (m1->flag) {
                        int l = strlen(m1->name);
                        if (m1->name[l-2] == '/') {
                                flag |= (m1->name[l-1] == '1')? 0x40 : 0x80;
@@ -128,6 +130,7 @@ void maq2tam_core(gzFile fp)
                                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);
@@ -141,11 +144,12 @@ void maq2tam_core(gzFile fp)
                for (j = 0; j != m1->size; ++j)
                        putchar((m1->seq[j]&0x3f) + 33);
                putchar('\t');
-               if (flag&4) {
+               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("Aq:i:%d\t", m1->alt_qual);
+                       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]);
                }
        }
@@ -158,11 +162,12 @@ int main(int argc, char *argv[])
 {
        gzFile fp;
        if (argc == 1) {
-               fprintf(stderr, "Usage: maq2tam <in.map>\n");
+               fprintf(stderr, "Version: %s\n", PACKAGE_VERSION);
+               fprintf(stderr, "Usage: maq2sam <in.map> [<readGroup>]\n");
                return 1;
        }
        fp = strcmp(argv[1], "-")? gzopen(argv[1], "r") : gzdopen(fileno(stdin), "r");
-       maq2tam_core(fp);
+       maq2tam_core(fp, argc > 2? argv[2] : 0);
        gzclose(fp);
        return 0;
 }