/// <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();
        }