From 8e0d191a708d8f50bdeef2fb7ea4f323a026df10 Mon Sep 17 00:00:00 2001 From: chartl Date: Wed, 13 Apr 2011 13:53:31 +0000 Subject: [PATCH] Added a walker to help sort out which samples in a region are giving signal. Lots of reused code that shouldn't be. Will refactor later. Also fixed an "issue" with InsertSizeDistribution -- apparently for mate pairs, the first mate (karyotypically) will have a POSITIVE insert size, and the second a NEGATIVE insert size -- thus the insert size distribution was being conflated with enrichment/depletion of first-in-pair or second-in-pair reads. Gah. git-svn-id: file:///humgen/gsa-scr1/gsa-engineering/svn_contents/trunk@5623 348d0f76-0448-11de-a6fe-93d51630548a --- .../walkers/association/RAWSampleStats.java | 123 ++++++++++++++++++ .../casecontrol/InsertSizeDistribution.java | 2 +- 2 files changed, 124 insertions(+), 1 deletion(-) create mode 100755 java/src/org/broadinstitute/sting/oneoffprojects/walkers/association/RAWSampleStats.java diff --git a/java/src/org/broadinstitute/sting/oneoffprojects/walkers/association/RAWSampleStats.java b/java/src/org/broadinstitute/sting/oneoffprojects/walkers/association/RAWSampleStats.java new file mode 100755 index 000000000..82dff0e8b --- /dev/null +++ b/java/src/org/broadinstitute/sting/oneoffprojects/walkers/association/RAWSampleStats.java @@ -0,0 +1,123 @@ +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.datasources.sample.Sample; +import org.broadinstitute.sting.gatk.refdata.RefMetaDataTracker; +import org.broadinstitute.sting.gatk.walkers.LocusWalker; +import org.broadinstitute.sting.oneoffprojects.walkers.association.AssociationContext; +import org.broadinstitute.sting.oneoffprojects.walkers.association.MapHolder; +import org.broadinstitute.sting.oneoffprojects.walkers.association.RegionalAssociationHandler; +import org.broadinstitute.sting.utils.MathUtils; +import org.broadinstitute.sting.utils.classloader.PluginManager; +import org.broadinstitute.sting.utils.collections.Pair; +import org.broadinstitute.sting.utils.exceptions.StingException; + +import java.io.PrintStream; +import java.util.*; + +/** + * Created by IntelliJ IDEA. + * User: chartl + * Date: 4/12/11 + * Time: 5:21 PM + * To change this template use File | Settings | File Templates. + */ +public class RAWSampleStats extends LocusWalker { + @Argument(doc="Association type(s) to use. Supports multiple arguments (-AT thing1 -AT thing2).",shortName="AT",fullName="associationType",required=false) + public String[] associationsToUse = null; + @Argument(doc="Set the window size for associations to this value",shortName="w",fullName="window",required=false) + public int windowSize = 50; + @Argument(doc="Set the window sliding value for associations to this value",shortName="s",fullName="slide",required=false) + public int slideBy = 10; + + @Output + PrintStream out; + + public RegionalAssociationHandler reduceInit() { + return new RegionalAssociationHandler(getAssociations(),getToolkit().getSAMFileSamples(),false); + } + + public MapHolder map(RefMetaDataTracker tracker, ReferenceContext ref, AlignmentContext context) { + return new MapHolder(tracker,ref,context); + } + + public RegionalAssociationHandler reduce(MapHolder holder, RegionalAssociationHandler handler) { + handler.updateExtender(holder); + StringBuffer contextBuf = new StringBuffer(); + contextBuf.append(holder.getRef().getLocus().toString()); + for ( AssociationContext context : handler.getAssociations() ) { + contextBuf.append("\t"); + contextBuf.append(context.getClass().getSimpleName()); + boolean first = true; + for ( Map.Entry entry : handler.getExtender().getContext().entrySet() ) { + if ( ! first ) { + contextBuf.append(";"); + } else { + first = false; + } + contextBuf.append(entry.getKey().getId()); + contextBuf.append("="); + contextBuf.append(handleMap(context.map(entry.getValue().getBasePileup()))); + } + contextBuf.append("\t"); + } + + out.printf("%s%n",contextBuf.toString()); + + return handler; + } + + public String handleMap(Object o) { + if ( o instanceof Pair) { + Pair k = (Pair) o; + return String.format("%.2f",k.first.doubleValue()/k.second.doubleValue()); + } + + if ( o instanceof Collection ) { + Collection k = (Collection) o; + return String.format("%.2f", MathUtils.average(k,true)); + } + + return "NA"; + } + + + public Set getAssociations() { + List> contexts = new PluginManager(AssociationContext.class).getPlugins(); + + if ( associationsToUse.length > 0 && associationsToUse[0].equals("ALL") ) { + HashSet allAssoc = new HashSet(contexts.size()); + for ( Class clazz : contexts ) { + AssociationContext context; + try { + context = clazz.getConstructor(new Class[] {}).newInstance(new Object[] {}); + } catch (Exception e ) { + throw new StingException("The class "+clazz.getSimpleName()+" could not be instantiated",e); + } + allAssoc.add(context); + } + return allAssoc; + } + + + Map> classNameToClass = new HashMap>(contexts.size()); + for ( Class clazz : contexts ) { + classNameToClass.put(clazz.getSimpleName(),clazz); + } + + Set validAssociations = new HashSet(); + for ( String s : associationsToUse ) { + AssociationContext context; + try { + context = classNameToClass.get(s).getConstructor(new Class[]{}).newInstance(new Object[] {}); + } catch ( Exception e ) { + throw new StingException("The class "+s+" could not be instantiated.",e); + } + validAssociations.add(context); + } + return validAssociations; + } +} diff --git a/java/src/org/broadinstitute/sting/oneoffprojects/walkers/association/modules/casecontrol/InsertSizeDistribution.java b/java/src/org/broadinstitute/sting/oneoffprojects/walkers/association/modules/casecontrol/InsertSizeDistribution.java index e4ed6008f..dcbe4dd13 100755 --- a/java/src/org/broadinstitute/sting/oneoffprojects/walkers/association/modules/casecontrol/InsertSizeDistribution.java +++ b/java/src/org/broadinstitute/sting/oneoffprojects/walkers/association/modules/casecontrol/InsertSizeDistribution.java @@ -17,7 +17,7 @@ public class InsertSizeDistribution extends ValueTest { public Collection map(ReadBackedPileup pileup) { List insertSizes = new ArrayList(pileup.size()); for ( PileupElement e : pileup ) { - insertSizes.add(e.getRead().getInferredInsertSize()); + insertSizes.add(Math.abs(e.getRead().getInferredInsertSize())); } return (Collection) insertSizes;