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; }
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; }
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; }