diff --git a/java/src/org/broadinstitute/sting/gatk/refdata/HapMapGenotypeROD.java b/java/src/org/broadinstitute/sting/gatk/refdata/HapMapGenotypeROD.java new file mode 100755 index 000000000..092d6fa96 --- /dev/null +++ b/java/src/org/broadinstitute/sting/gatk/refdata/HapMapGenotypeROD.java @@ -0,0 +1,44 @@ +package org.broadinstitute.sting.gatk.refdata; + +import java.util.*; + +import org.broadinstitute.sting.utils.GenomeLoc; +import org.broadinstitute.sting.utils.GenomeLocParser; + +public class HapMapGenotypeROD extends TabularROD +{ + public HapMapGenotypeROD(final String name) + { + super(name); + } + + public GenomeLoc getLocation() + { + //System.out.printf("chrom: %s; pos: %s\n", this.get("chrom"), this.get("pos")); + + return GenomeLocParser.createGenomeLoc(this.get("chrom").replaceAll("chr", ""), Long.parseLong(this.get("pos"))); + } + + public String[] getSampleIDs() + { + ArrayList header = this.getHeader(); + String[] sample_ids = new String[header.size()-11]; + for (int i = 11; i < header.size(); i++) + { + sample_ids[i-11] = header.get(i); + } + return sample_ids; + } + + public String[] getGenotypes() + { + ArrayList header = this.getHeader(); + String[] genotypes = new String[header.size()-11]; + for (int i = 11; i < header.size(); i++) + { + genotypes[i-11] = this.get(header.get(i)); + } + return genotypes; + } + +} diff --git a/java/src/org/broadinstitute/sting/gatk/refdata/ReferenceOrderedData.java b/java/src/org/broadinstitute/sting/gatk/refdata/ReferenceOrderedData.java index 3f36a12ab..df62d9976 100644 --- a/java/src/org/broadinstitute/sting/gatk/refdata/ReferenceOrderedData.java +++ b/java/src/org/broadinstitute/sting/gatk/refdata/ReferenceOrderedData.java @@ -68,6 +68,7 @@ public class ReferenceOrderedData implements addModule("PooledEM", PooledEMSNPROD.class); addModule("1KGSNPs", KGenomesSNPROD.class); addModule("SangerSNP", SangerSNPROD.class); + addModule("HapMapGenotype", HapMapGenotypeROD.class); addModule("Intervals", IntervalRod.class); addModule("Variants", rodVariants.class); } @@ -309,22 +310,22 @@ public class ReferenceOrderedData implements // Parsing // // ---------------------------------------------------------------------- + private Constructor parsing_constructor; private ROD newROD( final String name, final Class type ) { try { - Constructor c = type.getConstructor(String.class); - return (ROD)c.newInstance(name); + return (ROD)parsing_constructor.newInstance(name); } catch ( java.lang.InstantiationException e ) { throw new RuntimeException(e); } catch ( java.lang.IllegalAccessException e ) { throw new RuntimeException(e); - } catch ( java.lang.NoSuchMethodException e ) { - throw new RuntimeException(e); } catch ( InvocationTargetException e ) { throw new RuntimeException(e); } } private Object initializeROD(final String name, final File file, final Class type) { + try { parsing_constructor = type.getConstructor(String.class); } + catch (java.lang.NoSuchMethodException e) { throw new RuntimeException(e); } ROD rod = newROD(name, type); try { return rod.initialize(file); diff --git a/java/src/org/broadinstitute/sting/gatk/refdata/TabularROD.java b/java/src/org/broadinstitute/sting/gatk/refdata/TabularROD.java index 5fcba0356..ecc921a63 100755 --- a/java/src/org/broadinstitute/sting/gatk/refdata/TabularROD.java +++ b/java/src/org/broadinstitute/sting/gatk/refdata/TabularROD.java @@ -51,7 +51,7 @@ public class TabularROD extends BasicReferenceOrderedDatum implements Map header) { if ( header.size() == 0 ) return false; - if ( ! header.get(0).equals("HEADER") ) return false; + //if ( ! header.get(0).equals("HEADER") ) return false; return true; } @@ -304,4 +304,4 @@ public class TabularROD extends BasicReferenceOrderedDatum implements Map +public class MultiSampleCaller extends LocusWalker { @Argument(required=false, shortName="fractional_counts", doc="should we use fractional counts?") public boolean FRACTIONAL_COUNTS = false; @Argument(required=false, shortName="max_iterations", doc="Maximum number of iterations for EM") public int MAX_ITERATIONS = 10; @@ -36,6 +36,41 @@ public class MultiSampleCaller extends LocusWalker PrintStream individual_output_file; PrintStream discovery_output_file; + + class MultiSampleCallResult + { + char ref; + char alt; + EM_Result em_result; + double lod; + double strand_score; + double pD; + double pNull; + String in_dbsnp; + int n_ref; + int n_het; + int n_hom; + int EM_N; + double alt_freq; + public MultiSampleCallResult(char ref, char alt, EM_Result em_result, double lod, double strand_score, double pD, double pNull, String in_dbsnp, int n_ref, int n_het, int n_hom, int EM_N, double alt_freq) + { + this.ref = ref; + this.alt = alt; + this.em_result = em_result; + this.lod = lod; + this.strand_score = strand_score; + this.pD = pD; + this.pNull = pNull; + this.in_dbsnp = in_dbsnp; + this.n_ref = n_ref; + this.n_het = n_het; + this.n_hom = n_hom; + this.EM_N = EM_N; + this.alt_freq = alt_freq; + } + } + + ///////// // Walker Interface Functions public void initialize() @@ -76,15 +111,13 @@ public class MultiSampleCaller extends LocusWalker } } - public String in_dbsnp = "novel"; - public String map(RefMetaDataTracker tracker, char ref, LocusContext context) + public MultiSampleCallResult map(RefMetaDataTracker tracker, char ref, LocusContext context) { if (ref == 'N') { return null; } this.ref = ref; - if (tracker.lookup("DBSNP", null) != null) { in_dbsnp = "known"; } else { in_dbsnp = "novel"; } - this.MultiSampleCall(context, sample_names); - return null; + MultiSampleCallResult result = this.MultiSampleCall(tracker, ref, context, sample_names); + return result; } public void onTraversalDone(String sum) @@ -98,7 +131,7 @@ public class MultiSampleCaller extends LocusWalker return null; } - public String reduce(String record, String sum) + public String reduce(MultiSampleCallResult record, String sum) { return null; } @@ -273,11 +306,15 @@ public class MultiSampleCaller extends LocusWalker class EM_Result { + String[] sample_names; GenotypeLikelihoods[] genotype_likelihoods; double[] allele_likelihoods; int EM_N; - public EM_Result(GenotypeLikelihoods[] genotype_likelihoods, double[] allele_likelihoods) + + public EM_Result(List sample_names, GenotypeLikelihoods[] genotype_likelihoods, double[] allele_likelihoods) { + this.sample_names = new String[1]; + this.sample_names = sample_names.toArray(this.sample_names); this.genotype_likelihoods = genotype_likelihoods; this.allele_likelihoods = allele_likelihoods; @@ -317,7 +354,7 @@ public class MultiSampleCaller extends LocusWalker } } - return new EM_Result(G, allele_likelihoods); + return new EM_Result(sample_names, G, allele_likelihoods); } // Hacky global variables for debugging. @@ -429,8 +466,11 @@ public class MultiSampleCaller extends LocusWalker } // This should actually return a GLF Record - String MultiSampleCall(LocusContext context, List sample_names) + MultiSampleCallResult MultiSampleCall(RefMetaDataTracker tracker, char ref, LocusContext context, List sample_names) { + String in_dbsnp; + if (tracker.lookup("DBSNP", null) != null) { in_dbsnp = "known"; } else { in_dbsnp = "novel"; } + LocusContext[] contexts = filterLocusContextBySample(context, sample_names, 0); double lod = LOD(contexts); double strand_score = StrandScore(context); @@ -472,7 +512,7 @@ public class MultiSampleCaller extends LocusWalker individual_output_file.printf("\n"); } - return null; + return new MultiSampleCallResult(ref, alt, em_result, lod, strand_score, pD, pNull, in_dbsnp, n_ref, n_het, n_hom, em_result.EM_N, alt_freq); } // END Calling Functions