/// <summary> /// Writes speciied BAMIndex data. /// </summary> /// <param name="bamIndex">BAMIndex instance to write.</param> public void Write(BAMIndex bamIndex) { if (bamIndex == null) { throw new ArgumentNullException("bamIndex"); } if (_stream == null) { throw new InvalidOperationException(Resource.BAM_CantUseBAMIndexStreamDisposed); } byte[] arrays = new byte[20]; byte[] magic = new byte[] { 66, 65, 73, 1 }; Write(magic, 0, 4); arrays = Helper.GetLittleEndianByteArray(bamIndex.RefIndexes.Count); Write(arrays, 0, 4); for (Int32 refindex = 0; refindex < bamIndex.RefIndexes.Count; refindex++) { BAMReferenceIndexes bamindices = bamIndex.RefIndexes[refindex]; arrays = Helper.GetLittleEndianByteArray(bamindices.Bins.Count); Write(arrays, 0, 4); for (Int32 binIndex = 0; binIndex < bamindices.Bins.Count; binIndex++) { Bin bin = bamindices.Bins[binIndex]; arrays = Helper.GetLittleEndianByteArray(bin.BinNumber); Write(arrays, 0, 4); arrays = Helper.GetLittleEndianByteArray(bin.Chunks.Count); Write(arrays, 0, 4); for (Int32 chunkIndex = 0; chunkIndex < bin.Chunks.Count; chunkIndex++) { Chunk chunk = bin.Chunks[chunkIndex]; arrays = GetBAMOffsetArray(chunk.ChunkStart); Write(arrays, 0, 8); arrays = GetBAMOffsetArray(chunk.ChunkEnd); Write(arrays, 0, 8); } } arrays = Helper.GetLittleEndianByteArray(bamindices.LinearOffsets.Count); Write(arrays, 0, 4); for (Int32 offsetIndex = 0; offsetIndex < bamindices.LinearOffsets.Count; offsetIndex++) { FileOffset value = bamindices.LinearOffsets[offsetIndex]; arrays = GetBAMOffsetArray(value); Write(arrays, 0, 8); } _stream.Flush(); } _stream.Flush(); }
/// <summary> /// Returns BAMIndex instance by parsing BAM index source. /// </summary> public BAMIndex Read() { if (_stream == null) { throw new InvalidOperationException(Resource.BAM_CantUseBAMIndexStreamDisposed); } BAMIndex bamIndex = new BAMIndex(); byte[] arrays = new byte[20]; Read(arrays, 0, 4); if (arrays[0] != 66 || arrays[1] != 65 || arrays[2] != 73 || arrays[3] != 1) { throw new FormatException(Resource.BAM_InvalidIndexFile); } Read(arrays, 0, 4); int n_ref = Helper.GetInt32(arrays, 0); for (Int32 refindex = 0; refindex < n_ref; refindex++) { BAMReferenceIndexes bamindices = new BAMReferenceIndexes(); bamIndex.RefIndexes.Add(bamindices); Read(arrays, 0, 4); int n_bin = Helper.GetInt32(arrays, 0); for (Int32 binIndex = 0; binIndex < n_bin; binIndex++) { Bin bin = new Bin(); bamindices.Bins.Add(bin); Read(arrays, 0, 4); bin.BinNumber = Helper.GetUInt32(arrays, 0); Read(arrays, 0, 4); int n_chunk = Helper.GetInt32(arrays, 0); for (Int32 chunkIndex = 0; chunkIndex < n_chunk; chunkIndex++) { Chunk chunk = new Chunk(); bin.Chunks.Add(chunk); Read(arrays, 0, 8); chunk.ChunkStart = GetBAMOffset(arrays, 0); Read(arrays, 0, 8); chunk.ChunkEnd = GetBAMOffset(arrays, 0); } } Read(arrays, 0, 4); int n_intv = Helper.GetInt32(arrays, 0); for (Int32 offsetIndex = 0; offsetIndex < n_intv; offsetIndex++) { FileOffset value; Read(arrays, 0, 8); value = GetBAMOffset(arrays, 0); bamindices.LinearOffsets.Add(value); } } return(bamIndex); }