public PileupItem GetValue(string[] parts)
        {
            if (!Accept(parts))
            {
                return(null);
            }

            var result = new PileupItem
            {
                SequenceIdentifier = parts[0],
                Position           = long.Parse(parts[1]),
                Nucleotide         = parts[2][0]
            };

            var sampleIndex = 0;

            for (var countIndex = 3; countIndex < parts.Length; countIndex += _columnEachSample)
            {
                var pbl = new PileupBaseList();

                var      seq       = parts[countIndex + 1];
                var      scores    = parts[countIndex + 2];
                string[] positions = null;
                if (_columnEachSample > 3)
                {
                    positions = parts[countIndex + 3].Split(',');
                }

                var seqLength = seq.Length;

                var baseIndex     = 0;
                var scoreIndex    = 0;
                var positionIndex = 0;
                while (baseIndex < seqLength)
                {
                    //A ’>’ or ’<’ for a reference skip.
                    //The deleted bases will be presented as ‘*’ in the following lines.
                    if (seq[baseIndex] == '>' || seq[baseIndex] == '<' || seq[baseIndex] == '*')
                    {
                        baseIndex++;
                        scoreIndex++;
                        positionIndex++;
                        continue;
                    }

                    var pb = new PileupBase();

                    //Is it the start of read?
                    if (seq[baseIndex] == '^')
                    {
                        pb.Position           = PositionType.START;
                        pb.ReadMappingQuality = seq[baseIndex + 1] - 33;
                        baseIndex            += 2;
                        ParseMatchBase(result, pbl, pb, seq, scores, positions, seqLength, ref baseIndex, ref scoreIndex);
                    }
                    else if (Matches.Contains(seq[baseIndex]))
                    {
                        pb.Position = PositionType.MIDDLE;
                        ParseMatchBase(result, pbl, pb, seq, scores, positions, seqLength, ref baseIndex, ref scoreIndex);
                    }
                    //A pattern ‘\+[0-9]+[ACGTNacgtn]+’ indicates there is an insertion between this reference position and the next reference position. The length of the insertion is given by the integer in the pattern, followed by the inserted sequence. Similarly, a pattern ‘-[0-9]+[ACGTNacgtn]+’ represents a deletion from the reference.
                    else if (seq[baseIndex] == '+' || seq[baseIndex] == '-')
                    {
                        if (_ignoreInsertionDeletion)
                        {
                            //ignore and move to next base
                            baseIndex++;

                            var num = ParseInsertionDeletionCount(seq, seqLength, ref baseIndex);
                            baseIndex += num;
                        }
                        else
                        {
                            pb.Position = PositionType.MIDDLE;

                            var id = seq[baseIndex];
                            pb.EventType = id == '+' ? AlignedEventType.INSERTION : AlignedEventType.DELETION;
                            baseIndex++;

                            //get the sequence of insertion/deletion
                            var num   = ParseInsertionDeletionCount(seq, seqLength, ref baseIndex);
                            var idseq = seq.Substring(baseIndex, num);
                            pb.Event   = string.Format("{0}{1}{2}", id, num, idseq.ToUpper());
                            pb.Strand  = char.IsUpper(idseq[0]) ? StrandType.FORWARD : StrandType.REVERSE;
                            baseIndex += num;

                            pbl.Add(pb);
                        }

                        if (baseIndex < seqLength && seq[baseIndex] == '$')
                        {
                            pb.Position = PositionType.END;
                            baseIndex++;
                        }
                    }
                    else
                    {
                        throw new Exception(string.Format("I don't know the mean of character {0}", seq[baseIndex]));
                    }
                }

                if (pbl.Count < _minReadDepth)
                {
                    return(null);
                }

                sampleIndex++;
                pbl.SampleName = "S" + sampleIndex;
                pbl.InitEventCountList();
                result.Samples.Add(pbl);
            }

            return(result);
        }
        //Get major and minor allele only, without score and position information
        public PileupItem GetSlimValue(string[] parts)
        {
            if (!Accept(parts))
            {
                return(null);
            }

            var result = new PileupItem
            {
                SequenceIdentifier = parts[0],
                Position           = long.Parse(parts[1]),
                Nucleotide         = parts[2][0]
            };

            var sampleIndex = 0;

            for (var countIndex = 3; countIndex < parts.Length; countIndex += _columnEachSample)
            {
                var pbl = new PileupBaseList();

                var seq       = parts[countIndex + 1];
                var seqLength = seq.Length;

                var baseIndex = 0;
                while (baseIndex < seqLength)
                {
                    //A ’>’ or ’<’ for a reference skip.
                    //The deleted bases will be presented as ‘*’ in the following lines.
                    if (seq[baseIndex] == '>' || seq[baseIndex] == '<' || seq[baseIndex] == '*')
                    {
                        baseIndex++;
                        continue;
                    }

                    var pb = new PileupBase();

                    //Is it the start of read?
                    if (seq[baseIndex] == '^')
                    {
                        baseIndex += 2;
                        ParseSlimMatchBase(result, pbl, pb, seq, seqLength, ref baseIndex);
                    }
                    else if (Matches.Contains(seq[baseIndex]))
                    {
                        ParseSlimMatchBase(result, pbl, pb, seq, seqLength, ref baseIndex);
                    }
                    //A pattern ‘\+[0-9]+[ACGTNacgtn]+’ indicates there is an insertion between this reference position and the next reference position. The length of the insertion is given by the integer in the pattern, followed by the inserted sequence. Similarly, a pattern ‘-[0-9]+[ACGTNacgtn]+’ represents a deletion from the reference.
                    else if (seq[baseIndex] == '+' || seq[baseIndex] == '-')
                    {
                        //ignore and move to next base
                        baseIndex++;

                        var num = ParseInsertionDeletionCount(seq, seqLength, ref baseIndex);
                        baseIndex += num;

                        if (baseIndex < seqLength && seq[baseIndex] == '$')
                        {
                            baseIndex++;
                        }
                    }
                    else
                    {
                        throw new Exception(string.Format("I don't know the mean of character {0}", seq[baseIndex]));
                    }
                }

                if (pbl.Count < _minReadDepth)
                {
                    return(null);
                }

                sampleIndex++;
                pbl.SampleName = "S" + sampleIndex;
                pbl.InitEventCountList();
                result.Samples.Add(pbl);
            }

            return(result);
        }