From 545789370ce9f41f8b0e752d45f68006c3655e84 Mon Sep 17 00:00:00 2001 From: peterjc Date: Wed, 20 Jun 2012 16:16:54 +0100 Subject: [PATCH] First attempt at updating MPOS in 'samtools depad' --- padding.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/padding.c b/padding.c index 88945e2..ad8bf5c 100644 --- a/padding.c +++ b/padding.c @@ -271,6 +271,31 @@ int bam_pad2unpad(samfile_t *in, samfile_t *out, faidx_t *fai) n2 = k; replace_cigar(b, n2, cigar2); b->core.pos = posmap[b->core.pos]; + if (b->core.mpos < 0) { + /* Nice case, no mate to worry about*/ + } else if (b->core.mtid == b->core.tid) { + /* Nice case, same reference */ + b->core.mpos = posmap[b->core.mpos]; + } else { + /* Nasty case, Must load alternative posmap */ + if (!fai) { + fprintf(stderr, "[depad] ERROR: Needed reference %s sequence for mate (and no FASTA file)\n", h->target_name[b->core.mtid]); + return -1; + } + /* Temporarily load the other reference sequence */ + if (load_unpadded_ref(fai, h->target_name[b->core.mtid], h->target_len[b->core.mtid], &r)) { + fprintf(stderr, "[depad] ERROR: Failed to load '%s' from reference FASTA\n", h->target_name[b->core.mtid]); + return -1; + } + posmap = update_posmap(posmap, r); + b->core.mpos = posmap[b->core.mpos]; + /* Restore the reference and posmap*/ + if (load_unpadded_ref(fai, h->target_name[b->core.tid], h->target_len[b->core.tid], &r)) { + fprintf(stderr, "[depad] ERROR: Failed to load '%s' from reference FASTA\n", h->target_name[b->core.tid]); + return -1; + } + posmap = update_posmap(posmap, r); + } } samwrite(out, b); } -- 2.39.2