예제 #1
0
        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);
        }
예제 #2
0
 public static void TryStitchAndAssertFailed(IAlignmentStitcher stitcher, AlignmentSet alignmentSet)
 {
     Assert.False(stitcher.TryStitch(alignmentSet).Stitched);
 }
예제 #3
0
 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));
 }
예제 #4
0
        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));
                    }
                }
            }
        }
예제 #5
0
        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);
        }
예제 #6
0
 public static void TryStitchAndAssertFailed(IAlignmentStitcher stitcher, AlignmentSet alignmentSet)
 {
     Assert.Throws <ReadsNotStitchableException>(() => stitcher.TryStitch(alignmentSet));
 }