bool canR = (samread(sam_in, b) >= 0);
if (!canR) return -1;
- if (b->core.flag & 0x0001) { fprintf(stderr, "Find a paired end read in the file!\n"); exit(-1); }
- //(b->core.flag & 0x0100) && && !(b->core.flag & 0x0004)
+ general_assert(!(b->core.flag & 0x0001), "Find a paired end read in the file!");
int readType = getReadType(b);
std::string name = getName(b);
bool canR = (samread(sam_in, b) >= 0);
if (!canR) return -1;
- if (b->core.flag & 0x0001) { fprintf(stderr, "Find a paired end read in the file!\n"); exit(-1); }
- //assert(!(b->core.flag & 0x0001)); //(b->core.flag & 0x0100) && && !(b->core.flag & 0x0004)
+ general_assert(!(b->core.flag & 0x0001), "Find a paired end read in the file!");
int readType = getReadType(b);
std::string name = getName(b);
bool canR = ((samread(sam_in, b) >= 0) && (samread(sam_in, b2) >= 0));
if (!canR) return -1;
- if (!((b->core.flag & 0x0001) && (b2->core.flag & 0x0001))) {
- fprintf(stderr, "One of the mate is not paired-end! (RSEM assumes the two mates of a paired-end read should be adjacent)\n");
- exit(-1);
- }
- //assert((b->core.flag & 0x0001) && (b2->core.flag & 0x0001));
+ general_assert((b->core.flag & 0x0001) && (b2->core.flag & 0x0001), \
+ "One of the mate is not paired-end! (RSEM assumes the two mates of a paired-end read should be adjacent)");
bam1_t *mp1 = NULL, *mp2 = NULL;
- if ((b->core.flag & 0x0040) && (b2->core.flag & 0x0080)) {
+ // If lose mate info, discard. is it necessary?
+ if (!((b->core.flag & 0x0040) && (b2->core.flag & 0x0080)) && !((b->core.flag & 0x0080) && (b2->core.flag & 0x0040))) return 4;
+ // If only one mate is mapped, discard
+ if (((b->core.flag & 0x0004) && !(b2->core.flag & 0x0004)) || (!(b->core.flag & 0x0004) && (b2->core.flag & 0x0004))) return 4;
+
+ if (b->core.flag & 0x0040) {
mp1 = b; mp2 = b2;
}
- else if ((b->core.flag & 0x0080) && (b2->core.flag & 0x0040)) {
+ else {
mp1 = b2; mp2 = b;
}
- else return 4; // If lose mate info, discard. is it necessary?
int readType = getReadType(mp1, mp2);
std::string name = getName(mp1);
bool canR = ((samread(sam_in, b) >= 0) && (samread(sam_in, b2) >= 0));
if (!canR) return -1;
- if (!((b->core.flag & 0x0001) && (b2->core.flag & 0x0001))) {
- fprintf(stderr, "One of the mate is not paired-end! (RSEM assumes the two mates of a paired-end read should be adjacent)\n");
- exit(-1);
- }
- //assert((b->core.flag & 0x0001) && (b2->core.flag & 0x0001));
+ general_assert((b->core.flag & 0x0001) && (b2->core.flag & 0x0001), \
+ "One of the mate is not paired-end! (RSEM assumes the two mates of a paired-end read should be adjacent)");
bam1_t *mp1 = NULL, *mp2 = NULL;
- if ((b->core.flag & 0x0040) && (b2->core.flag & 0x0080)) {
+ // If lose mate info, discard. is it necessary?
+ if (!((b->core.flag & 0x0040) && (b2->core.flag & 0x0080)) && !((b->core.flag & 0x0080) && (b2->core.flag & 0x0040))) return 4;
+ // If only one mate is mapped, discard
+ if (((b->core.flag & 0x0004) && !(b2->core.flag & 0x0004)) || (!(b->core.flag & 0x0004) && (b2->core.flag & 0x0004))) return 4;
+
+ if (b->core.flag & 0x0040) {
mp1 = b; mp2 = b2;
}
- else if ((b->core.flag & 0x0080) && (b2->core.flag & 0x0040)) {
+ else {
mp1 = b2; mp2 = b;
}
- else return 4;
int readType = getReadType(mp1, mp2);
std::string name = getName(mp1);
return (bam_aux2i(p) > 0 ? 2 : 0);
}
-
//For paired-end reads, do not print out type 2 reads
inline int SamParser::getReadType(const bam1_t* b, const bam1_t* b2) {
- if ((b->core.flag & 0x0002) && (b2->core.flag & 0x0002)) return 1;
+ if (!(b->core.flag & 0x0004) && !(b2->core.flag & 0x0004)) return 1;
+
+ if (!strcmp(rtTag, "")) return 0;
+
+ uint8_t *p = bam_aux_get(b, rtTag);
+ if (p != NULL && bam_aux2i(p) > 0) return 2;
+
+ p = bam_aux_get(b2, rtTag);
+ if (p != NULL && bam_aux2i(p) > 0) return 2;
return 0;
}