From 11723fbcc23b2085272fb853263d5eec0f3d15e5 Mon Sep 17 00:00:00 2001 From: jmaguire Date: Tue, 12 May 2009 15:08:24 +0000 Subject: [PATCH] added method indelPileup. Generates a pileup of indel alleles given reads and ofsets (as from a locus walker). git-svn-id: file:///humgen/gsa-scr1/gsa-engineering/svn_contents/trunk@663 348d0f76-0448-11de-a6fe-93d51630548a --- .../sting/utils/BasicPileup.java | 59 ++++++++++++++++++- 1 file changed, 58 insertions(+), 1 deletion(-) diff --git a/java/src/org/broadinstitute/sting/utils/BasicPileup.java b/java/src/org/broadinstitute/sting/utils/BasicPileup.java index 31ebe5610..c8e2a2dea 100755 --- a/java/src/org/broadinstitute/sting/utils/BasicPileup.java +++ b/java/src/org/broadinstitute/sting/utils/BasicPileup.java @@ -1,7 +1,7 @@ package org.broadinstitute.sting.utils; import org.broadinstitute.sting.gatk.LocusContext; -import net.sf.samtools.SAMRecord; +import net.sf.samtools.*; import java.util.List; import java.util.ArrayList; @@ -226,6 +226,63 @@ abstract public class BasicPileup implements Pileup { return distString; } + public static String[] indelPileup( List reads, List offsets ) + { + String[] indels = new String[reads.size()]; + + for (int i = 0; i < reads.size(); i++) + { + SAMRecord read = reads.get(i); + Cigar cigar = read.getCigar(); + int offset = offsets.get(i); + + String cigar_string = read.getCigarString(); + if (! (cigar_string.contains("I") || cigar_string.contains("D"))) { indels[i] = "null"; continue; } + + //System.out.printf("%s:%d %s %s %s ", read.getReferenceName(), read.getAlignmentStart(), read.getReadName(), read.getReadString(), cigar_string); + int k = 0; + for (int j = 0; j < cigar.numCigarElements(); j++) + { + CigarOperator operator = cigar.getCigarElement(j).getOperator(); + int length = cigar.getCigarElement(j).getLength(); + if (operator == CigarOperator.M) + { + k += length; + } + else if ((k == offset+1) && (operator == CigarOperator.I)) + { + // this insertion is associated with this offset (kinda ;) ). + indels[i] = read.getReadString().substring(k, k+length); + //System.out.printf("(I,%d,%d)", k, offset); + break; + } + else if ((k != offset+1) && (operator == CigarOperator.I)) + { + //System.out.printf("(i,%d,%d)", k, offset); + k += length; + } + else if ((k == offset) && (operator == CigarOperator.D)) + { + // this deletion is associated with this offset. + indels[i] = length + "D"; + //System.out.printf("(D,%d,%d)", k, offset); + break; + } + else if (k >= offset) + { + // no indel here. + indels[i] = "null"; + //System.out.printf("(N,%d,%d)", k, offset); + break; + } + } + if (indels[i] == null) { indels[i] = "null"; } + //System.out.printf("\n"); + } + + return indels; + } + public static String pileupDiff(final Pileup a, final Pileup b) { return pileupDiff(a,b,true);