Added walker to emit intervals of clustered SNP calls
git-svn-id: file:///humgen/gsa-scr1/gsa-engineering/svn_contents/trunk@981 348d0f76-0448-11de-a6fe-93d51630548a
This commit is contained in:
parent
678ddd914f
commit
3796654069
|
|
@ -0,0 +1,66 @@
|
||||||
|
|
||||||
|
package org.broadinstitute.sting.playground.gatk.walkers.indels;
|
||||||
|
|
||||||
|
import org.broadinstitute.sting.gatk.refdata.*;
|
||||||
|
import org.broadinstitute.sting.gatk.LocusContext;
|
||||||
|
import org.broadinstitute.sting.utils.*;
|
||||||
|
import org.broadinstitute.sting.gatk.walkers.*;
|
||||||
|
import org.broadinstitute.sting.utils.cmdLine.Argument;
|
||||||
|
|
||||||
|
@WalkerName("SNPClusters")
|
||||||
|
@By(DataSource.REFERENCE)
|
||||||
|
@Requires(DataSource.REFERENCE)
|
||||||
|
@Allows(DataSource.REFERENCE)
|
||||||
|
public class SNPClusterWalker extends RefWalker<GenomeLoc, GenomeLoc> {
|
||||||
|
@Argument(fullName="windowSize", shortName="window", doc="window size for calculating clusters", required=false)
|
||||||
|
public int windowSize = 10;
|
||||||
|
|
||||||
|
public void initialize() {
|
||||||
|
if ( windowSize < 1)
|
||||||
|
throw new RuntimeException("Window Size must be a positive integer");
|
||||||
|
}
|
||||||
|
|
||||||
|
public GenomeLoc map(RefMetaDataTracker tracker, char ref, LocusContext context) {
|
||||||
|
AllelicVariant eval = (AllelicVariant)tracker.lookup("eval", null);
|
||||||
|
if ( eval instanceof SNPCallFromGenotypes )
|
||||||
|
return context.getLocation();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onTraversalDone(GenomeLoc sum) {
|
||||||
|
if ( sum != null && sum.getStart() != sum.getStop() )
|
||||||
|
out.println(sum);
|
||||||
|
}
|
||||||
|
|
||||||
|
public GenomeLoc reduceInit() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public GenomeLoc reduce(GenomeLoc value, GenomeLoc sum) {
|
||||||
|
// ignore non-SNP variants
|
||||||
|
if ( value == null )
|
||||||
|
return sum;
|
||||||
|
|
||||||
|
// if we have no previous SNPs start with the new location
|
||||||
|
if ( sum == null )
|
||||||
|
return value;
|
||||||
|
|
||||||
|
// if we hit a new contig, emit and start with the new location
|
||||||
|
if ( sum.getContigIndex() != value.getContigIndex() ) {
|
||||||
|
if ( sum.getStart() != sum.getStop() )
|
||||||
|
out.println(sum);
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
// if the last SNP location was within a window, merge them
|
||||||
|
if ( value.getStart() - sum.getStop() <= windowSize ) {
|
||||||
|
sum.setStop(value.getStart());
|
||||||
|
return sum;
|
||||||
|
}
|
||||||
|
|
||||||
|
// otherwise, emit and start with the new location
|
||||||
|
if ( sum.getStart() != sum.getStop() )
|
||||||
|
out.println(sum);
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue