diff --git a/java/src/org/broadinstitute/sting/oneoffprojects/walkers/association/AssociationContext.java b/java/src/org/broadinstitute/sting/oneoffprojects/walkers/association/AssociationContext.java new file mode 100755 index 000000000..b8b92a9df --- /dev/null +++ b/java/src/org/broadinstitute/sting/oneoffprojects/walkers/association/AssociationContext.java @@ -0,0 +1,40 @@ +package org.broadinstitute.sting.oneoffprojects.walkers.association; + +import java.lang.reflect.InvocationTargetException; +import java.util.*; + +/** + * @Author chartl + * @Date 2011-02-23 + * A general context for windowed association + */ +public abstract class AssociationContext { + private Class clazz; + private List window; + + public AssociationContext( Class zclaz ) { + window = new ArrayList(getWindowSize()); + clazz = zclaz; + } + + public X map(MapExtender e) throws NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException, ClassCastException { + return (X) clazz.getConstructor().newInstance(e); + } + + public boolean filter(MapExtender m) { return true; } + + public void reduce(X context) { + window.add(context); + } + + public abstract int getWindowSize(); + public abstract int slideByValue(); + + public boolean isFull() { + return window.size() >= getWindowSize(); + } + + public void slide() { + window = window.subList(slideByValue(),window.size()); + } +} \ No newline at end of file diff --git a/java/src/org/broadinstitute/sting/oneoffprojects/walkers/association/AssociationContextAtom.java b/java/src/org/broadinstitute/sting/oneoffprojects/walkers/association/AssociationContextAtom.java new file mode 100755 index 000000000..522943114 --- /dev/null +++ b/java/src/org/broadinstitute/sting/oneoffprojects/walkers/association/AssociationContextAtom.java @@ -0,0 +1,13 @@ +package org.broadinstitute.sting.oneoffprojects.walkers.association; + +/** + * @Author chartl + * @Date 2011-02-23 + * general class for calculating base data for generalized association tests + */ +public abstract class AssociationContextAtom { + + public AssociationContextAtom(MapExtender e) { + + } +} diff --git a/java/src/org/broadinstitute/sting/oneoffprojects/walkers/association/AssociationTestRunner.java b/java/src/org/broadinstitute/sting/oneoffprojects/walkers/association/AssociationTestRunner.java new file mode 100755 index 000000000..c0c469c25 --- /dev/null +++ b/java/src/org/broadinstitute/sting/oneoffprojects/walkers/association/AssociationTestRunner.java @@ -0,0 +1,44 @@ +package org.broadinstitute.sting.oneoffprojects.walkers.association; + +import java.util.ArrayList; +import java.util.List; +import org.broadinstitute.sting.oneoffprojects.walkers.association.interfaces.*; + +/** + * Created by IntelliJ IDEA. + * User: chartl + * Date: Feb 24, 2011 + * Time: 11:48:26 AM + * To change this template use File | Settings | File Templates. + */ +public class AssociationTestRunner { + + public static List runTests(AssociationContext context) { + List results = new ArrayList(); + if ( context.getClass().isInstance(TStatistic.class)) { + results.add(runStudentT(context)); + } + + if ( context.getClass().isInstance(ZStatistic.class)) { + results.add(runZ(context)); + } + + if ( context.getClass().isInstance(FisherExact.class) ) { + results.add(runFisherExact(context)); + } + + return results; + } + + public static String runStudentT(AssociationContext context) { + return "Test not yet implemented"; + } + + public static String runZ(AssociationContext context) { + return "Test not yet implemented"; + } + + public static String runFisherExact(AssociationContext context) { + return "Test not yet implemented"; + } +} diff --git a/java/src/org/broadinstitute/sting/oneoffprojects/walkers/association/MapExtender.java b/java/src/org/broadinstitute/sting/oneoffprojects/walkers/association/MapExtender.java new file mode 100755 index 000000000..a46e012ed --- /dev/null +++ b/java/src/org/broadinstitute/sting/oneoffprojects/walkers/association/MapExtender.java @@ -0,0 +1,52 @@ +package org.broadinstitute.sting.oneoffprojects.walkers.association; + +import org.broadinstitute.sting.gatk.contexts.ReferenceContext; +import org.broadinstitute.sting.gatk.contexts.StratifiedAlignmentContext; +import org.broadinstitute.sting.gatk.datasources.sample.Sample; +import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; + +import java.util.Map; + +/** + * @Author chartl + * @Date 2011-02-23 + * Holds multiple map contexts for use in the regional association walker + */ +public class MapExtender { + + private MapHolder previous = null; + private MapHolder current = null; + + public MapExtender() { + // no need to do anything + } + + public void set(MapHolder holder) { + previous = current; + current = holder; + } + + public Map getPreviousContext() { + return previous.getContext(); + } + + public ReferenceContext getPreviousRef() { + return previous.getRef(); + } + + public RefMetaDataTracker getPreviousTracker() { + return previous.getTracker(); + } + + public Map getContext() { + return current.getContext(); + } + + public ReferenceContext getReferenceContext() { + return current.getRef(); + } + + public RefMetaDataTracker getTracker() { + return current.getTracker(); + } +} diff --git a/java/src/org/broadinstitute/sting/oneoffprojects/walkers/association/MapHolder.java b/java/src/org/broadinstitute/sting/oneoffprojects/walkers/association/MapHolder.java new file mode 100755 index 000000000..f669022bc --- /dev/null +++ b/java/src/org/broadinstitute/sting/oneoffprojects/walkers/association/MapHolder.java @@ -0,0 +1,33 @@ +package org.broadinstitute.sting.oneoffprojects.walkers.association; + +import org.broadinstitute.sting.gatk.contexts.AlignmentContext; +import org.broadinstitute.sting.gatk.contexts.ReferenceContext; +import org.broadinstitute.sting.gatk.contexts.StratifiedAlignmentContext; +import org.broadinstitute.sting.gatk.datasources.sample.Sample; +import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; + +import java.util.Map; + +public class MapHolder { + private RefMetaDataTracker tracker; + private ReferenceContext ref; + private Map alignments; + + public MapHolder(RefMetaDataTracker t, ReferenceContext r, AlignmentContext a) { + tracker = t; + ref = r; + alignments = StratifiedAlignmentContext.splitContextBySample(a.getBasePileup()); + } + + public Map getContext() { + return alignments; + } + + public ReferenceContext getRef() { + return ref; + } + + public RefMetaDataTracker getTracker() { + return tracker; + } +} \ No newline at end of file diff --git a/java/src/org/broadinstitute/sting/oneoffprojects/walkers/association/RegionalAssociationHandler.java b/java/src/org/broadinstitute/sting/oneoffprojects/walkers/association/RegionalAssociationHandler.java new file mode 100755 index 000000000..1af6d06a2 --- /dev/null +++ b/java/src/org/broadinstitute/sting/oneoffprojects/walkers/association/RegionalAssociationHandler.java @@ -0,0 +1,62 @@ +package org.broadinstitute.sting.oneoffprojects.walkers.association; + +import org.broadinstitute.sting.utils.GenomeLoc; + +import java.lang.reflect.InvocationTargetException; +import java.util.*; + +/** + * @Author chartl + * @Date 2011-02-23 + * A general context for windowed association + */ +public class RegionalAssociationHandler { + private MapExtender maps; + // todo -- the correct way to do this is via the PluginManager (a la VariantEval) but this is a QND implementation + private Set associations; + + public RegionalAssociationHandler(Set contexts) { + maps = null; + associations = contexts; + } + + public void updateExtender(MapHolder mapHolder) { + maps.set(mapHolder); + } + + /** + * Once the instances are collected; run map-reduce + * @map: MapExtender --> A child of AssociationContextAtom + * @implementation: Indirect construction via newinstance + * @reduce: (List,AssociationContext) --> List + * @implementation: just append + */ + public void runMapReduce() throws NoSuchMethodException, IllegalAccessException, InstantiationException, InvocationTargetException { + for ( AssociationContext w : associations ) { + if ( w.filter(maps) ) { + w.reduce(w.map(maps)); + } + } + } + + /** + * For those AssociationContexts with full windows: + * 1) Run their associated test(s) + * 2) Slide the windows + */ + public List runTests() { + List testResults = new ArrayList(associations.size()); + for ( AssociationContext w : associations ) { + if ( w.isFull() ) { + testResults.addAll(AssociationTestRunner.runTests(w)); + w.slide(); + } + } + return testResults; + } + + public GenomeLoc getLocation() { + return maps.getReferenceContext().getLocus(); + } + +} \ No newline at end of file diff --git a/java/src/org/broadinstitute/sting/oneoffprojects/walkers/association/RegionalAssociationWalker.java b/java/src/org/broadinstitute/sting/oneoffprojects/walkers/association/RegionalAssociationWalker.java new file mode 100755 index 000000000..72511a1b6 --- /dev/null +++ b/java/src/org/broadinstitute/sting/oneoffprojects/walkers/association/RegionalAssociationWalker.java @@ -0,0 +1,78 @@ +package org.broadinstitute.sting.oneoffprojects.walkers.association; + +import org.broadinstitute.sting.commandline.Argument; +import org.broadinstitute.sting.commandline.Output; +import org.broadinstitute.sting.gatk.contexts.AlignmentContext; +import org.broadinstitute.sting.gatk.contexts.ReferenceContext; +import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; +import org.broadinstitute.sting.gatk.walkers.LocusWalker; +import org.broadinstitute.sting.gatk.walkers.TreeReducible; +import org.broadinstitute.sting.utils.exceptions.StingException; + +import java.io.PrintStream; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * @Author chartl + * @Date 2011-02-23 + * Generalized framework for regional (windowed) associations + */ +public class RegionalAssociationWalker extends LocusWalker implements TreeReducible { + @Argument(doc="foo",shortName="AT",fullName="associationType",required=false) + public String[] associationsToUse = null; + + @Output + PrintStream out; + + public RegionalAssociationHandler reduceInit() { + Set validAssociations = getAssociations(); + RegionalAssociationHandler wac = new RegionalAssociationHandler(validAssociations); + + return wac; + } + + public MapHolder map(RefMetaDataTracker tracker, ReferenceContext ref, AlignmentContext context) { + return new MapHolder(tracker,ref,context); + } + + public RegionalAssociationHandler reduce(MapHolder map, RegionalAssociationHandler rac) { + rac.updateExtender(map); + try { + rac.runMapReduce(); + } catch (Exception e) { + throw new StingException("Error in map reduce",e); + } + List testsHere = rac.runTests(); + // todo -- really awful shitty formatting + out.printf("%s%n",rac.getLocation().toString()); + for ( String s : testsHere ) { + out.printf("%s%n",s); + } + return rac; + } + + private AssociationContext stringToAssociationContext(String s) { + return null; + } + + private Set getAssociations() { + // todo -- this should use the package handler like variant eval + Set validAssociations = new HashSet(); + for ( String s : associationsToUse ) { + validAssociations.add(stringToAssociationContext(s)); + } + return validAssociations; + } + + public RegionalAssociationHandler treeReduce(RegionalAssociationHandler left, RegionalAssociationHandler right) { + // for now be dumb; in future fix the fact that left-most intervals of a 16kb shard won't see the context from + // the right-most locus of the previous shard + return right; + } + + public void onTraversalDone(RegionalAssociationHandler rac) { + // do nothing + } +} \ No newline at end of file diff --git a/java/src/org/broadinstitute/sting/oneoffprojects/walkers/association/interfaces/FisherExact.java b/java/src/org/broadinstitute/sting/oneoffprojects/walkers/association/interfaces/FisherExact.java new file mode 100755 index 000000000..6c3dfd0d0 --- /dev/null +++ b/java/src/org/broadinstitute/sting/oneoffprojects/walkers/association/interfaces/FisherExact.java @@ -0,0 +1,14 @@ +package org.broadinstitute.sting.oneoffprojects.walkers.association.interfaces; + +/** + * Created by IntelliJ IDEA. + * User: chartl + * Date: Feb 24, 2011 + * Time: 12:58:56 PM + * To change this template use File | Settings | File Templates. + */ +public interface FisherExact { + public abstract int[][] getCounts(); + public abstract String[] getRowNames(); + public abstract String[] getColNames(); +} \ No newline at end of file diff --git a/java/src/org/broadinstitute/sting/oneoffprojects/walkers/association/interfaces/TStatistic.java b/java/src/org/broadinstitute/sting/oneoffprojects/walkers/association/interfaces/TStatistic.java new file mode 100755 index 000000000..613db45f0 --- /dev/null +++ b/java/src/org/broadinstitute/sting/oneoffprojects/walkers/association/interfaces/TStatistic.java @@ -0,0 +1,12 @@ +package org.broadinstitute.sting.oneoffprojects.walkers.association.interfaces; + +/** + * Created by IntelliJ IDEA. + * User: chartl + * Date: Feb 24, 2011 + * Time: 12:58:16 PM + * To change this template use File | Settings | File Templates. + */ +public interface TStatistic { + public abstract double getTStatistic(); +} \ No newline at end of file diff --git a/java/src/org/broadinstitute/sting/oneoffprojects/walkers/association/interfaces/ZStatistic.java b/java/src/org/broadinstitute/sting/oneoffprojects/walkers/association/interfaces/ZStatistic.java new file mode 100755 index 000000000..b2c74d65e --- /dev/null +++ b/java/src/org/broadinstitute/sting/oneoffprojects/walkers/association/interfaces/ZStatistic.java @@ -0,0 +1,12 @@ +package org.broadinstitute.sting.oneoffprojects.walkers.association.interfaces; + +/** + * Created by IntelliJ IDEA. + * User: chartl + * Date: Feb 24, 2011 + * Time: 12:58:38 PM + * To change this template use File | Settings | File Templates. + */ +public interface ZStatistic { + public abstract double getZStatistic(); +} \ No newline at end of file