private void FlushBufferedRecords(ReadsForPosition reads) { foreach (byte[] buffer in reads.Reads) { _bamWriter.WriteAlignment(buffer); } }
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); } }
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); }
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); }
/// <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); }