/// <summary> /// Parses the BAM file and returns the Header. /// </summary> private SAMAlignmentHeader GetHeader() { var header = new SAMAlignmentHeader(); RefSeqNames = new RegexValidatedStringList(SAMAlignedSequenceHeader.RNameRegxExprPattern); _refSeqLengths = new List <int>(); ReadStream.Seek(0, SeekOrigin.Begin); _deCompressedStream = null; var array = new byte[8]; ReadUnCompressedData(array, 0, 8); var lText = Helper.GetInt32(array, 4); var samHeaderData = new byte[lText]; if (lText != 0) { ReadUnCompressedData(samHeaderData, 0, lText); } ReadUnCompressedData(array, 0, 4); var noofRefSeqs = Helper.GetInt32(array, 0); for (var i = 0; i < noofRefSeqs; i++) { ReadUnCompressedData(array, 0, 4); var len = Helper.GetInt32(array, 0); var refName = new byte[len]; ReadUnCompressedData(refName, 0, len); ReadUnCompressedData(array, 0, 4); var refLen = Helper.GetInt32(array, 0); RefSeqNames.Add(Encoding.ASCII.GetString(refName, 0, refName.Length - 1)); _refSeqLengths.Add(refLen); } if (samHeaderData.Length != 0) { var str = Encoding.ASCII.GetString(samHeaderData); using (var reader = new StringReader(str)) { header = SAMParser.ParseSAMHeader(reader); } } header.ReferenceSequences.Clear(); for (var i = 0; i < RefSeqNames.Count; i++) { var refname = RefSeqNames[i]; var length = _refSeqLengths[i]; header.ReferenceSequences.Add(new ReferenceSequenceInfo(refname, length)); } return(header); }
/// <summary> /// The default constructor which chooses the default encoding based on the alphabet. /// </summary> protected AbstractBAMParser(string bamFileName) { BAMFileName = bamFileName; RefSeqNames = new RegexValidatedStringList(SAMAlignedSequenceHeader.RNameRegxExprPattern); _refSeqLengths = new List <int>(); ReadStream = new FileStream(bamFileName, FileMode.Open, FileAccess.Read, FileShare.Read); ValidateReader(); Header = GetHeader(); RefSeqChunks = null; LastChunk = null; Filter = new BAMAccept(); }