now updates mapping quality (to an arbitrary chosen value of 37 if the resulting mapping is unique) and X0, X1 tags after remapping (in REDUCE mode)
git-svn-id: file:///humgen/gsa-scr1/gsa-engineering/svn_contents/trunk@1216 348d0f76-0448-11de-a6fe-93d51630548a
This commit is contained in:
parent
b08b121756
commit
e01d37024a
|
|
@ -63,6 +63,7 @@ public class RemapAlignments extends CommandLineProgram {
|
||||||
private SAMFileWriter writer = null;
|
private SAMFileWriter writer = null;
|
||||||
private SAMFileReader reader = null;
|
private SAMFileReader reader = null;
|
||||||
|
|
||||||
|
private static int [] g_log_n; // copied from bwa
|
||||||
|
|
||||||
|
|
||||||
/** Required main method implementation. */
|
/** Required main method implementation. */
|
||||||
|
|
@ -72,6 +73,9 @@ public class RemapAlignments extends CommandLineProgram {
|
||||||
|
|
||||||
protected int doWork() {
|
protected int doWork() {
|
||||||
|
|
||||||
|
g_log_n = new int[256];
|
||||||
|
for (int i = 1; i < 256; ++i) g_log_n[i] = (int)(4.343 * Math.log(i) + 0.5);
|
||||||
|
|
||||||
reader = new SAMFileReader(IN);
|
reader = new SAMFileReader(IN);
|
||||||
reader.setValidationStringency(ValidationStringency.SILENT);
|
reader.setValidationStringency(ValidationStringency.SILENT);
|
||||||
SAMFileHeader oldHeader = reader.getFileHeader();
|
SAMFileHeader oldHeader = reader.getFileHeader();
|
||||||
|
|
@ -139,6 +143,9 @@ public class RemapAlignments extends CommandLineProgram {
|
||||||
|
|
||||||
|
|
||||||
if ( REDUCE ) {
|
if ( REDUCE ) {
|
||||||
|
|
||||||
|
updateCountsAndQuals(remappedReads);
|
||||||
|
|
||||||
for ( SAMRecord r : remappedReads ) {
|
for ( SAMRecord r : remappedReads ) {
|
||||||
writer.addAlignment(r); // emit non-redundant alignments for previous query
|
writer.addAlignment(r); // emit non-redundant alignments for previous query
|
||||||
writtenRecords++;
|
writtenRecords++;
|
||||||
|
|
@ -155,6 +162,7 @@ public class RemapAlignments extends CommandLineProgram {
|
||||||
|
|
||||||
// write remaining bunch of reads:
|
// write remaining bunch of reads:
|
||||||
if ( REDUCE ) {
|
if ( REDUCE ) {
|
||||||
|
updateCountsAndQuals(remappedReads);
|
||||||
for ( SAMRecord r : remappedReads ) {
|
for ( SAMRecord r : remappedReads ) {
|
||||||
writer.addAlignment(r); // emit non-redundant alignments for previous query
|
writer.addAlignment(r); // emit non-redundant alignments for previous query
|
||||||
writtenRecords++;
|
writtenRecords++;
|
||||||
|
|
@ -179,7 +187,6 @@ public class RemapAlignments extends CommandLineProgram {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int compare(SAMRecord r1, SAMRecord r2) {
|
public int compare(SAMRecord r1, SAMRecord r2) {
|
||||||
// TODO Auto-generated method stub
|
|
||||||
if ( r1.getReferenceIndex() < r2.getReferenceIndex() ) return -1;
|
if ( r1.getReferenceIndex() < r2.getReferenceIndex() ) return -1;
|
||||||
if ( r1.getReferenceIndex() > r2.getReferenceIndex() ) return 1;
|
if ( r1.getReferenceIndex() > r2.getReferenceIndex() ) return 1;
|
||||||
if ( r1.getAlignmentStart() < r2.getAlignmentStart() ) return -1;
|
if ( r1.getAlignmentStart() < r2.getAlignmentStart() ) return -1;
|
||||||
|
|
@ -189,6 +196,73 @@ public class RemapAlignments extends CommandLineProgram {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void updateCountsAndQuals(Set<SAMRecord> reads) {
|
||||||
|
if ( reads.size() == 1 ) {
|
||||||
|
SAMRecord r = reads.iterator().next();
|
||||||
|
|
||||||
|
// technically, if edit distance of the read is equal to max_diff used in alignments,
|
||||||
|
// we should have set 25...
|
||||||
|
r.setMappingQuality(37);
|
||||||
|
r.setAttribute("X0", new Integer(1));
|
||||||
|
r.setAttribute("X1", new Integer(0));
|
||||||
|
r.setNotPrimaryAlignmentFlag(false);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
// we have multiple alignments for the read
|
||||||
|
// need to figure out how many best vs inferior alignments are there:
|
||||||
|
int minNM = 1000000;
|
||||||
|
int cnt = 0; // count of best alignments
|
||||||
|
for ( SAMRecord r : reads ) {
|
||||||
|
int nm = (Integer)r.getAttribute("NM");
|
||||||
|
if ( nm < minNM ) {
|
||||||
|
minNM = nm;
|
||||||
|
cnt = 1;
|
||||||
|
} else if ( nm == minNM ) cnt++;
|
||||||
|
}
|
||||||
|
// now reset counts and quals:
|
||||||
|
for ( SAMRecord r : reads ) {
|
||||||
|
|
||||||
|
int cnt2 = reads.size() - cnt; // count of inferior alignments
|
||||||
|
|
||||||
|
r.setAttribute("X0", new Integer(cnt));
|
||||||
|
r.setAttribute("X1", new Integer(cnt2));
|
||||||
|
|
||||||
|
if ( cnt2 > 255 ) cnt2 = 255; // otherwise we will be out of bounds in g_log_n
|
||||||
|
|
||||||
|
if ( ((Integer)r.getAttribute("NM")).intValue() == minNM ) {
|
||||||
|
|
||||||
|
// one of the best alignments:
|
||||||
|
|
||||||
|
r.setNotPrimaryAlignmentFlag(false);
|
||||||
|
if ( cnt == 1 ) {
|
||||||
|
// single best alignment; additional inferior alignments will only affect mapping qual
|
||||||
|
r.setMappingQuality( 23 < g_log_n[cnt2] ? 0 : 23 - g_log_n[cnt2] ); // this recipe for Q is copied from bwa
|
||||||
|
} else {
|
||||||
|
r.setMappingQuality(0); // multiple best alignments - mapping quality is 0
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
|
||||||
|
// secondary alignment ( we know we hold a better one)
|
||||||
|
r.setNotPrimaryAlignmentFlag(true);
|
||||||
|
r.setMappingQuality(0); // ??? should we set 0 for secondary??
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
private int bwa_approx_mapQ(SAMRecord r, int max_diff) {
|
||||||
|
int c1 = (Integer)r.getAttribute("X0");
|
||||||
|
int c2 = (Integer)r.getAttribute("X1");
|
||||||
|
int mm = (Integer)r.getAttribute("NM");
|
||||||
|
if ( c1 > 0 ) return 0;
|
||||||
|
if ( c1 == 0 ) return 23;
|
||||||
|
if ( mm == max_diff ) return 25;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue