private static (Stream jsonStream, Stream jasixStream) GetNirvanaJsonStreamWithoutGenes(int chromNumber) { var jsonStream = new MemoryStream(); var jasixStream = new MemoryStream(); using (var bgZipStream = new BlockGZipStream(jsonStream, CompressionMode.Compress, true)) using (var writer = new BgzipTextWriter(bgZipStream)) using (var jasixIndex = new JasixIndex()) { writer.Write(NirvanaHeader); writer.Flush(); jasixIndex.BeginSection(JasixCommons.PositionsSectionTag, writer.Position); for (int i = 100 * chromNumber; i < 123 * chromNumber; i++) { writer.WriteLine($"{{\"chromosome\":\"chr{chromNumber}\",\"position\":{i}}},"); if (i % 50 == 0) { writer.Flush(); //creating another block } } writer.WriteLine($"{{\"chromosome\":\"chr{chromNumber}\",\"position\":{100 *chromNumber +25}}}"); writer.Flush(); jasixIndex.EndSection(JasixCommons.PositionsSectionTag, writer.Position); writer.Write(NirvanaFooter); jasixIndex.Write(jasixStream); } jsonStream.Position = 0; jasixStream.Position = 0; return(jsonStream, jasixStream); }
// due to the flush, the end of a section will point to the next to last block for a section. // e.g. if positions start at block 2 and end at block 10, blocks 2..9 contains positions. private void BeginSection(string section) { if (_bgzipTextWriter == null) { return; } _bgzipTextWriter.Flush(); _jasixIndexCreator.BeginSection(section, _bgzipTextWriter.Position); }
public void BgzipTextWriter_EndToEnd() { var asterisks = new string('*', BlockGZipStream.BlockGZipFormatCommon.BlockSize); var observedLines = new List <string>(); var observedPositions = new List <long>(); using (var ms = new MemoryStream()) { using (var stream = new BlockGZipStream(ms, CompressionMode.Compress, true)) using (var writer = new BgzipTextWriter(stream)) { writer.Flush(); writer.WriteLine("BOB"); writer.WriteLine(); writer.Flush(); writer.Write("AB"); writer.Write(""); writer.Write("C"); writer.Write(" "); writer.WriteLine("123"); writer.WriteLine(asterisks); writer.WriteLine(asterisks); writer.WriteLine(asterisks); } ms.Position = 0; using (var reader = new BgzipTextReader(new BlockGZipStream(ms, CompressionMode.Decompress))) { while (true) { string line = reader.ReadLine(); observedPositions.Add(reader.Position); if (line == null) { break; } observedLines.Add(line); } } } Assert.Equal(6, observedLines.Count); Assert.Equal("BOB", observedLines[0]); Assert.Equal(0, observedLines[1].Length); Assert.Equal("ABC 123", observedLines[2]); Assert.Equal(asterisks, observedLines[3]); Assert.Equal(4, observedPositions[0]); Assert.Equal(5, observedPositions[1]); Assert.Equal(13, observedPositions[2]); Assert.Equal(43843598, observedPositions[3]); Assert.Equal(87097359, observedPositions[4]); }