Fixed collection of bugs in reads aligning to multiple locations.
git-svn-id: file:///humgen/gsa-scr1/gsa-engineering/svn_contents/trunk@1955 348d0f76-0448-11de-a6fe-93d51630548a
This commit is contained in:
parent
af6d0003f8
commit
1896f334d9
|
|
@ -105,6 +105,8 @@ void BWA::copy_bases_into_sequence(bwa_seq_t* sequence, const char* bases, const
|
||||||
}
|
}
|
||||||
|
|
||||||
void BWA::create_alignments(bwa_seq_t* sequence, Alignment*& alignments, unsigned& num_alignments) {
|
void BWA::create_alignments(bwa_seq_t* sequence, Alignment*& alignments, unsigned& num_alignments) {
|
||||||
|
bool debug = false;
|
||||||
|
|
||||||
num_alignments = 0;
|
num_alignments = 0;
|
||||||
for(unsigned i = 0; i < (unsigned)sequence->n_aln; i++)
|
for(unsigned i = 0; i < (unsigned)sequence->n_aln; i++)
|
||||||
num_alignments += (sequence->aln + i)->l - (sequence->aln + i)->k + 1;
|
num_alignments += (sequence->aln + i)->l - (sequence->aln + i)->k + 1;
|
||||||
|
|
@ -127,8 +129,22 @@ void BWA::create_alignments(bwa_seq_t* sequence, Alignment*& alignments, unsigne
|
||||||
sequence->aln = &working_alignment_block;
|
sequence->aln = &working_alignment_block;
|
||||||
sequence->n_aln = 1;
|
sequence->n_aln = 1;
|
||||||
|
|
||||||
|
sequence->sa = sa_idx;
|
||||||
|
sequence->strand = alignment_block->a;
|
||||||
|
sequence->score = alignment_block->score;
|
||||||
|
|
||||||
|
// Each time through bwa_refine_gapped, seq gets reversed. Revert the reverse.
|
||||||
|
// TODO: Fix the interface to bwa_refine_gapped so its easier to work with.
|
||||||
|
if(alignment_idx > 0)
|
||||||
|
seq_reverse(sequence->len, sequence->seq, 0);
|
||||||
|
|
||||||
// Calculate the local alignment.
|
// Calculate the local alignment.
|
||||||
bwa_cal_pac_pos_core(bwts[0],bwts[1],sequence,options.max_diff,options.fnr);
|
bwa_cal_pac_pos_core(bwts[0],bwts[1],sequence,options.max_diff,options.fnr);
|
||||||
|
if(debug) {
|
||||||
|
printf("alignment_idx = %d, k = %d, l = %d, sa_idx = %d\n", alignment_idx, alignment_block->k, alignment_block->l, sa_idx);
|
||||||
|
printf("sequence->pos = %d\n",sequence->pos);
|
||||||
|
}
|
||||||
|
|
||||||
bwa_refine_gapped(bns, 1, sequence, 0, NULL);
|
bwa_refine_gapped(bns, 1, sequence, 0, NULL);
|
||||||
|
|
||||||
// Copy the local alignment data into the alignment object.
|
// Copy the local alignment data into the alignment object.
|
||||||
|
|
|
||||||
|
|
@ -25,6 +25,11 @@ public class AlignmentValidationWalker extends ReadWalker<Integer,Integer> {
|
||||||
*/
|
*/
|
||||||
private BWACAligner aligner = null;
|
private BWACAligner aligner = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Number of reads processed.
|
||||||
|
*/
|
||||||
|
private int count = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create an aligner object. The aligner object will load and hold the BWT until close() is called.
|
* Create an aligner object. The aligner object will load and hold the BWT until close() is called.
|
||||||
*/
|
*/
|
||||||
|
|
@ -39,6 +44,15 @@ public class AlignmentValidationWalker extends ReadWalker<Integer,Integer> {
|
||||||
prefix + ".rsa");
|
prefix + ".rsa");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Must return true for reads that need to be processed. Reads, for which this method return false will
|
||||||
|
* be skipped by the engine and never passed to the walker.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean filter(char[] ref, SAMRecord read) {
|
||||||
|
return true;
|
||||||
|
//return read.getReadName().contains("SL-XBC:1:76:604:397#0");
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Aligns a read to the given reference.
|
* Aligns a read to the given reference.
|
||||||
* @param ref Reference over the read. Read will most likely be unmapped, so ref will be null.
|
* @param ref Reference over the read. Read will most likely be unmapped, so ref will be null.
|
||||||
|
|
@ -47,6 +61,8 @@ public class AlignmentValidationWalker extends ReadWalker<Integer,Integer> {
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public Integer map(char[] ref, SAMRecord read) {
|
public Integer map(char[] ref, SAMRecord read) {
|
||||||
|
//logger.info(String.format("examining read %s", read.getReadName()));
|
||||||
|
|
||||||
byte[] bases = read.getReadBases();
|
byte[] bases = read.getReadBases();
|
||||||
if(read.getReadNegativeStrandFlag()) bases = BaseUtils.simpleReverseComplement(bases);
|
if(read.getReadNegativeStrandFlag()) bases = BaseUtils.simpleReverseComplement(bases);
|
||||||
|
|
||||||
|
|
@ -85,6 +101,10 @@ public class AlignmentValidationWalker extends ReadWalker<Integer,Integer> {
|
||||||
throw new StingException(String.format("Read %s mismatches!", read.getReadName()));
|
throw new StingException(String.format("Read %s mismatches!", read.getReadName()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(++count % 10000 == 0) logger.info(String.format("Processed %d reads", count));
|
||||||
|
|
||||||
|
//logger.info(String.format("validated read %s", read.getReadName()));
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue