Ejemplo n.º 1
0
 public PileUp(string rname, BaseAndQualityAndPosition bqp)
 {
     this.RName    = rname;
     this.Position = bqp.Position;
     this.Bases    = new List <BaseAndQuality>(DEFAULT_LIST_SIZE);
     this.Bases.Add(bqp.BaseWithQuality);
     this.InsertionOffSet = bqp.InsertionOffSet;
 }
Ejemplo n.º 2
0
 public PileUp(string rname, BaseAndQualityAndPosition bqp)
 {
     this.RName = rname;
     this.Position = bqp.Position;
     this.Bases = new List<BaseAndQuality>(DEFAULT_LIST_SIZE);
     this.Bases.Add(bqp.BaseWithQuality);
     this.InsertionOffSet = bqp.InsertPositionPassedRefPosition;
 }
Ejemplo n.º 3
0
        List<BaseAndQualityAndPosition> getBasesForSequence(SAMAlignedSequence seq)
        {
            List<BaseAndQualityAndPosition> toReturn = new List<BaseAndQualityAndPosition>(seq.RefEndPos - seq.Pos + 10);
            // Decode the cigar string into operations.
            // TODO: This code is duplicated in many places
            string CIGAR = seq.CIGAR;
            List<KeyValuePair<char, int>> charsAndPositions = new List<KeyValuePair<char, int>>();
            for (int i = 0; i < CIGAR.Length; i++)
            {
                char ch = CIGAR[i];
                if (Char.IsDigit(ch))
                {
                    continue;
                }
                charsAndPositions.Add(new KeyValuePair<char, int>(ch, i));
            }

            // Get sequence bases and error probabilities
            var qseq = seq.QuerySequence as QualitativeSequence;
            var seq_log10ErrorProb = qseq.GetPhredQualityScores().Select(Utils.GetLog10ErrorProbability).ToArray();
            var seq_bases = qseq.ToArray();
            // Use the cigar operations to emit bases.
            int curRef = seq.Pos;
            int curQuery = 0;
            for (int i = 0; i < charsAndPositions.Count; i++)
            {
                // Parse the current cigar operation
                char ch = charsAndPositions[i].Key;
                int cig_start = i==0 ? 0 : charsAndPositions[i - 1].Value + 1;
                int cig_end = charsAndPositions[i].Value - cig_start;
                int cig_len = int.Parse(CIGAR.Substring(cig_start, cig_end));
                // Emit or advance based on cigar operation.
                switch (ch)
                {
                    case 'P': //padding (Silent deltions from padded reference)
                    case 'N': //skipped region from reference
                        throw new Exception("Pile up methods not built to handle reference clipping (Cigar P or N) yet.");
                    case 'M': //match or mismatch
                    case '=': //match
                    case 'X': //mismatch
                        for (int k = 0; k < cig_len; k++)
                        {                            
                            var bqp= new BaseAndQualityAndPosition(curRef,0, new BaseAndQuality(seq_bases[curQuery], seq_log10ErrorProb[curQuery]));
                            toReturn.Add(bqp);
                            curQuery++;
                            curRef++;
                        }
                        break;
                    case 'I'://insertion to the reference
                        for (int k = 0; k < cig_len; k++)
                        {                            
                            var bqp =  new BaseAndQualityAndPosition(curRef,k, new BaseAndQuality(seq_bases[curQuery], seq_log10ErrorProb[curQuery]));
                            toReturn.Add(bqp);
                            curQuery++;
                        }
                        break;
                    case 'D'://Deletion from the reference
                        for (int k = 0; k < cig_len; k++)
                        {                            
                            var bqp = new BaseAndQualityAndPosition(curRef,k, new BaseAndQuality((byte)'-', Double.NaN));
                            toReturn.Add(bqp);
                            curRef++;
                        }
                        break;
                    case 'S': //soft clipped
                        curQuery += cig_len;
                        break;
                    case 'H'://had clipped
                        break;
                    default:
                        throw new FormatException("Unexpected SAM Cigar element found " + ch.ToString());
                }                
            }
            return toReturn;
        }