public void WriteHeader(SAMAlignmentHeader header, Stream writer)
{
if (header == null)
{
throw new ArgumentNullException("header");
}
if (writer == null)
{
throw new ArgumentNullException("writer");
}
string samHeader;
if (this.refSequences == null)
{
this.refSequences = header.GetReferenceSequenceRanges();
}
using (StringWriter strwriter = new StringWriter(CultureInfo.InvariantCulture))
{
SAMFormatter.WriteHeader(strwriter, header);
samHeader = strwriter.ToString();
}
int samHeaderLen = samHeader.Length;
byte[] bytes = Encoding.UTF8.GetBytes(samHeader);
byte[] bamMagicNumber = { 66, 65, 77, 1 };
// write BAM magic number
writer.Write(bamMagicNumber, 0, 4);
// Length of the header text
writer.Write(Helper.GetLittleEndianByteArray(samHeaderLen), 0, 4);
//Plain header text in SAM
writer.Write(bytes, 0, bytes.Length);
// number of reference sequences
writer.Write(Helper.GetLittleEndianByteArray(this.refSequences.Count), 0, 4);
foreach (SequenceRange range in this.refSequences)
{
int len = range.ID.Length;
byte[] array = Encoding.UTF8.GetBytes(range.ID);
writer.Write(Helper.GetLittleEndianByteArray(len + 1), 0, 4);
writer.Write(array, 0, len);
writer.WriteByte((byte)'\0');
writer.Write(Helper.GetLittleEndianByteArray((int)range.End), 0, 4);
}
}