Beispiel #1
0
 private void FlushBufferedRecords(ReadsForPosition reads)
 {
     foreach (byte[] buffer in reads.Reads)
     {
         _bamWriter.WriteAlignment(buffer);
     }
 }
Beispiel #2
0
        private void AdjustMates(string tmpFile, BamWriter writer)
        {
            // Second pass: Adjust flags on mates
            Logger.WriteToLog("Writing reads with corrected mate flags, {0} total remapped reads", _remappings.Count);
            var read = new BamAlignment();

            using (var reader = new BamReader(tmpFile))
            {
                while (true)
                {
                    var result = reader.GetNextAlignment(ref read, false);
                    if (!result)
                    {
                        break;
                    }

                    // Adjust flags as needed:
                    var       mateKey = string.Format("{0}-{1}", read.Name, read.IsFirstMate() ? 2 : 1);
                    RemapInfo info;

                    if (!_remappings.TryGetValue(mateKey, out info))
                    {
                        writer.WriteAlignment(read);
                        continue;
                    }

                    if (info.Start == -1)
                    {
                        read.SetIsMateUnmapped(true);
                        read.SetIsProperPair(false);
                        read.FragmentLength = 0;
                    }
                    else
                    {
                        read.MatePosition = info.Start;
                    }
                    if (read.IsMateMapped() && read.IsProperPair())
                    {
                        int readEnd = read.Position + (int)read.CigarData.GetReferenceSpan() - 1;
                        // todo jg - should FragmentLength be 0 if the reads are mapped to diff chrs
                        read.FragmentLength = (read.Position < info.Start
                            ? info.End - read.Position + 1
                            : info.Start - readEnd - 1);
                    }

                    writer.WriteAlignment(read);
                }
            }
        }
 public void WriteAlignment(BamAlignment alignment)
 {
     if (alignment == null)
     {
         _writer?.Dispose();
     }
     else
     {
         _writer.WriteAlignment(alignment);
     }
 }
Beispiel #4
0
        public void Process(string inputBam, string outFolder, StitcherOptions stitcherOptions)
        {
            var jobManager   = new JobManager(10);
            var jobs         = new List <IJob>();
            var perChromBams = new List <string>();

            // Process each of the chromosomes separately
            foreach (var chrom in _chroms)
            {
                var intermediateOutput = Path.Combine(outFolder, Path.GetFileNameWithoutExtension(inputBam) + "." + chrom + ".stitched.bam");
                perChromBams.Add(intermediateOutput);
                var stitcher = new BamStitcher(inputBam, intermediateOutput, stitcherOptions, chrFilter: chrom);
                jobs.Add(new GenericJob(() => stitcher.Execute(), "Stitcher_" + chrom));
            }

            jobManager.Process(jobs);

            // Combine the per-chromosome bams
            Logger.WriteToLog("Writing final bam.");

            var outputBam = Path.Combine(outFolder, Path.GetFileNameWithoutExtension(inputBam) + ".final.stitched.bam");

            using (var finalOutput = new BamWriter(outputBam, _header, _references))
            {
                foreach (var bam in perChromBams)
                {
                    Logger.WriteToLog("Adding " + bam + " to final bam.");
                    var bamAlignment = new BamAlignment();

                    using (var bamReader = new BamReader(bam))
                    {
                        while (true)
                        {
                            var hasMoreReads = bamReader.GetNextAlignment(ref bamAlignment, false);
                            if (!hasMoreReads)
                            {
                                break;
                            }
                            finalOutput.WriteAlignment(bamAlignment);
                        }
                    }

                    File.Delete(bam);
                }
            }

            Logger.WriteToLog("Finished combining per-chromosome bams into final bam at " + outputBam);
        }
Beispiel #5
0
        public void HappyPath()
        {
            //var bamFilePath = Path.Combine(TestPaths.SharedBamDirectory, "Chr17Chr19.bam");
            //Assert.True(File.Exists(bamFilePath));
            // TODO figure out how to access the shared bams

            var tempPath = $"TemporaryBamFile_{Guid.NewGuid()}.bam";

            if (File.Exists(tempPath))
            {
                File.Delete(tempPath);
            }

            using (var bamWriter = new BamWriter(tempPath, "header", new List <GenomeMetadata.SequenceMetadata>()))
            {
                bamWriter.WriteAlignment(TestHelpers.CreateBamAlignment("ATCG", 1, 10, 30, true));
            }

            var bamWriterFactory = new BamWriterFactory(1, tempPath);

            var tempPath2 = $"TemporaryBamFile_{Guid.NewGuid()}.bam";

            if (File.Exists(tempPath2))
            {
                File.Delete(tempPath2);
            }

            var bamWriterHandle = bamWriterFactory.CreateSingleBamWriter(tempPath2);

            bamWriterHandle.WriteAlignment(TestHelpers.CreateBamAlignment("ATCAG", 1, 10, 30, true));
            bamWriterHandle.WriteAlignment(null);

            using (var reader = new BamReader(tempPath2))
            {
                // TODO more specific?
                var header = reader.GetHeader();
                Assert.Contains("ID:Gemini", header);
                Assert.Contains("PN:Gemini", header);
            }

            File.Delete(tempPath);
            File.Delete(tempPath2);
        }
Beispiel #6
0
 /// <summary>
 /// Seek to the unaligned (and mate-unaligned) reads at the tail of the input file, and write them all out to the output file.
 /// </summary>
 private void WriteUnalignedReads(BamWriter writer)
 {
     Logger.WriteToLog("Writing unaligned reads");
     using (var reader = new BamReader(_inputFile))
     {
         reader.JumpToUnaligned();
         var read = new BamAlignment();
         while (true)
         {
             var result = reader.GetNextAlignment(ref read, false);
             if (!result)
             {
                 break;
             }
             if (read.RefID != -1)
             {
                 continue;                   // skip over last reads
             }
             writer.WriteAlignment(read);
         }
     }
 }
 public void WriteAlignment(BamAlignment alignment)
 {
     _writer.WriteAlignment(alignment);
 }