public List <BamAlignment> ExtractReads(ReadPair pair) { const char Forward = 'F'; const char Reverse = 'R'; var reads = new List <BamAlignment>(); var chrom1 = _refIdMapping[pair.Read1.RefID]; var chrom2 = _refIdMapping[pair.Read2.RefID]; var alignmentSet = new AlignmentSet( new Read(chrom1, pair.Read1), new Read(chrom2, pair.Read2), false); var read1dir = pair.Read1.IsReverseStrand() ? Reverse : Forward; var read2dir = pair.Read2.IsReverseStrand() ? Reverse : Forward; if (pair.Read1.IsSecondMate()) { read1dir = pair.Read2.IsReverseStrand() ? Reverse : Forward; read2dir = pair.Read1.IsReverseStrand() ? Reverse : Forward; } bool stitched = false; if (_tryStitch) { stitched = _stitcher.TryStitch(alignmentSet); } if (stitched) { //_statusCounter.AddStatusCount("Stitched"); if (alignmentSet.ReadsForProcessing.Count > 1) { throw new InvalidDataException("AlignmentSets for stitched reads should only have one ReadsForProcessing."); } foreach (var read in alignmentSet.ReadsForProcessing) { var alignment = StitcherHelpers.StitchifyBamAlignment(pair, read, read1dir, read2dir); reads.Add(alignment); } } else { if (!_filterUnstitchablePairs) { //_statusCounter.AddStatusCount("Unstitchable Pairs Kept"); reads.Add(new BamAlignment(alignmentSet.PartnerRead1.BamAlignment)); reads.Add(new BamAlignment(alignmentSet.PartnerRead2.BamAlignment)); } else { _statusCounter.AddStatusCount("Unstitchable Pairs Filtered"); } } return(reads); }
public static void TryStitchAndAssertFailed(IAlignmentStitcher stitcher, AlignmentSet alignmentSet) { Assert.False(stitcher.TryStitch(alignmentSet).Stitched); }
public static void TryStitchAndAssertAddedSeparately(IAlignmentStitcher stitcher, AlignmentSet alignmentSet) { Assert.True(stitcher.TryStitch(alignmentSet).Stitched); Assert.True(alignmentSet.ReadsForProcessing.Contains(alignmentSet.PartnerRead1)); Assert.True(alignmentSet.ReadsForProcessing.Contains(alignmentSet.PartnerRead2)); }
public AlignmentSet GetNextAlignmentSet() { while (true) { if (!_alignmentExtractor.GetNextAlignment(_read)) { Logger.WriteToLog("Totals: {0} reads processed, {1} reads skipped, {2} read pairs unstitchable.", _totalReadsReturned, _totalSkipped, _unstitchablePairs); return(null); // no more reads } _lastReadPosition = _read.Position; if (ShouldSkipRead(_read)) { _totalSkipped++; continue; } if (!_read.IsProperPair || _mateFinder == null) { _totalReadsReturned++; return(new AlignmentSet(_read, null, true)); } var origMate = _mateFinder.GetMate(_read); if (origMate != null) { var alignmentSet = new AlignmentSet(origMate, _read); try { if (_stitcher != null) { _stitcher.TryStitch(alignmentSet); } else { alignmentSet.ReadsForProcessing.Add(alignmentSet.PartnerRead1); alignmentSet.ReadsForProcessing.Add(alignmentSet.PartnerRead2); } _totalReadsReturned += 2; return(alignmentSet); } catch (ReadsNotStitchableException ex) { _unstitchablePairs++; //For now go back to processing reads separately if they are unstitchable alignmentSet.ReadsForProcessing.Add(alignmentSet.PartnerRead1); alignmentSet.ReadsForProcessing.Add(alignmentSet.PartnerRead2); _totalReadsReturned += 2; return(alignmentSet); //if (Constants.DebugMode) // Logger.WriteToLog( // string.Format("Unable to stitch reads '{0}' and '{1}'. Will skip pair. Error: {2}", // origMate, alignment, ex.Message)); } } } }
public List <BamAlignment> ExtractReads(ReadPair pair) { var reads = new List <BamAlignment>(); var chrom1 = _refIdMapping[pair.Read1.RefID]; var chrom2 = _refIdMapping[pair.Read2.RefID]; var alignmentSet = new AlignmentSet( new Read(chrom1, pair.Read1), new Read(chrom2, pair.Read2), false); var stitched = _stitcher.TryStitch(alignmentSet); if (stitched) { if (alignmentSet.ReadsForProcessing.Count > 1) { throw new Exception("AlignmentSets for stitched reads should only have one ReadsForProcessing."); } foreach (var read in alignmentSet.ReadsForProcessing) { var alignment = new BamAlignment(read.BamAlignment); alignment.SetIsFirstMate(false); alignment.SetIsProperPair(false); var tagUtils = new TagUtils(); if (read.StitchedCigar != null) { alignment.CigarData = read.StitchedCigar; } if (read.CigarDirections != null) { tagUtils.AddStringTag("XD", read.CigarDirections.ToString()); } var tagData = tagUtils.ToBytes(); var existingTags = alignment.TagData; if (existingTags == null) { alignment.TagData = tagData; } else { alignment.AppendTagData(tagData); } reads.Add(alignment); } } else { if (!_filterUnstitchablePairs) { _statusCounter.AddStatusCount("Unstitchable Pairs Kept"); reads.Add(new BamAlignment(alignmentSet.PartnerRead1.BamAlignment)); reads.Add(new BamAlignment(alignmentSet.PartnerRead2.BamAlignment)); } else { _statusCounter.AddStatusCount("Unstitchable Pairs Filtered"); } } return(reads); }
public static void TryStitchAndAssertFailed(IAlignmentStitcher stitcher, AlignmentSet alignmentSet) { Assert.Throws <ReadsNotStitchableException>(() => stitcher.TryStitch(alignmentSet)); }