/// <summary> /// VAlidates header info. /// </summary> /// <returns>Returns empty string if the header is valid; otherwise returns a string containing error message.</returns> public string IsValidHeader() { return(_seqHeader.IsValid()); }
/// <summary> /// Writes an ISequenceAlignment to the location specified by the writer. /// </summary> /// <param name="sequenceAlignment">The sequence alignment to format.</param> /// <param name="writer">The TextWriter used to write the formatted sequence alignment text.</param> public void Format(ISequenceAlignment sequenceAlignment, TextWriter writer) { string message = string.Empty; if (sequenceAlignment == null) { throw new ArgumentNullException(Resource.ParameterNameSequenceAlignment); } if (writer == null) { throw new ArgumentNullException(Resource.ParameterNameWriter); } #region Write alignment header SAMAlignmentHeader header = sequenceAlignment.Metadata[Helper.SAMAlignmentHeaderKey] as SAMAlignmentHeader; if (header != null) { WriteHeader(header, writer); } #endregion #region Write aligned sequences foreach (IAlignedSequence alignedSequence in sequenceAlignment.AlignedSequences) { SAMAlignedSequenceHeader alignedHeader = alignedSequence.Metadata[Helper.SAMAlignedSequenceHeaderKey] as SAMAlignedSequenceHeader; if (alignedHeader == null) { throw new ArgumentException(Resource.SAM_AlignedSequenceHeaderMissing); } StringBuilder alignmentLine = new StringBuilder(); message = alignedHeader.IsValid(); if (!string.IsNullOrEmpty(message)) { throw new ArgumentException(message); } alignmentLine.Append(alignedHeader.QName); alignmentLine.Append("\t"); alignmentLine.Append((int)alignedHeader.Flag); alignmentLine.Append("\t"); alignmentLine.Append(alignedHeader.RName); alignmentLine.Append("\t"); alignmentLine.Append(alignedHeader.Pos); alignmentLine.Append("\t"); alignmentLine.Append(alignedHeader.MapQ); alignmentLine.Append("\t"); alignmentLine.Append(alignedHeader.CIGAR); alignmentLine.Append("\t"); if (string.Compare(alignedHeader.MRNM, alignedHeader.RName, StringComparison.InvariantCultureIgnoreCase) == 0) { alignmentLine.Append("="); } else { alignmentLine.Append(alignedHeader.MRNM); } alignmentLine.Append("\t"); alignmentLine.Append(alignedHeader.MPos); alignmentLine.Append("\t"); alignmentLine.Append(alignedHeader.ISize); alignmentLine.Append("\t"); writer.Write(alignmentLine.ToString()); List <int> dotSymbolIndices = new List <int>(alignedHeader.DotSymbolIndices); List <int> equalSymbolIndices = new List <int>(alignedHeader.EqualSymbolIndices); if (alignedSequence.Sequences.Count > 0 && alignedSequence.Sequences[0] != null) { ISequence seq = alignedSequence.Sequences[0]; if (seq.Alphabet != Alphabets.DNA) { throw new ArgumentException(Resource.SAMFormatterSupportsDNAOnly); } for (int i = 0; i < seq.Count; i++) { char symbol = seq[i].Symbol; if (dotSymbolIndices.Count > 0) { if (dotSymbolIndices.Contains(i)) { symbol = '.'; dotSymbolIndices.Remove(i); } } if (equalSymbolIndices.Count > 0) { if (equalSymbolIndices.Contains(i)) { symbol = '='; equalSymbolIndices.Remove(i); } } writer.Write(symbol); } writer.Write("\t"); IQualitativeSequence qualSeq = seq as IQualitativeSequence; if (qualSeq != null) { writer.Write(ASCIIEncoding.ASCII.GetString(qualSeq.Scores)); } else { writer.Write("*"); } } else { writer.Write("*"); writer.Write("\t"); writer.Write("*"); } foreach (SAMOptionalField field in alignedHeader.OptionalFields) { writer.Write("\t"); writer.Write(field.Tag); writer.Write(":"); writer.Write(field.VType); writer.Write(":"); writer.Write(field.Value); } writer.WriteLine(); } #endregion writer.Flush(); }