private void WriteAlignedSequence(SAMAlignedSequence alignedSeq, Stream writer)
{
// Get the total block size required.
int blocksize = GetBlockSize(alignedSeq);
// Get Reference sequence index.
int rid = GetRefSeqID(alignedSeq.RName);
// bin<<16|mapQual<<8|read_name_len (including NULL)
uint bin_mq_nl = (uint)alignedSeq.Bin << 16;
bin_mq_nl = bin_mq_nl | (uint)alignedSeq.MapQ << 8;
bin_mq_nl = bin_mq_nl | (uint)(alignedSeq.QName.Length + 1);
// flag<<16|cigar_len
uint flag_nc = (uint)alignedSeq.Flag << 16;
flag_nc = flag_nc | (uint)GetCIGARLength(alignedSeq.CIGAR);
int readLen = (int)alignedSeq.QuerySequence.Count;
int mateRefId = GetRefSeqID(alignedSeq.MRNM);
byte[] readName = Encoding.UTF8.GetBytes(alignedSeq.QName);
// Cigar: op_len<<4|op. Op: MIDNSHP=X => 012345678
IList<uint> encodedCIGAR = GetEncodedCIGAR(alignedSeq.CIGAR);
//block size
writer.Write(Helper.GetLittleEndianByteArray(blocksize), 0, 4);
// Reference sequence index.
writer.Write(Helper.GetLittleEndianByteArray(rid), 0, 4);
// Pos
writer.Write(Helper.GetLittleEndianByteArray(alignedSeq.Pos > 0 ? alignedSeq.Pos - 1 : -1), 0, 4);
// bin<<16|mapQual<<8|read_name_len (including NULL)
writer.Write(Helper.GetLittleEndianByteArray(bin_mq_nl), 0, 4);
// flag<<16|cigar_len
writer.Write(Helper.GetLittleEndianByteArray(flag_nc), 0, 4);
// Length of the read
writer.Write(Helper.GetLittleEndianByteArray(readLen), 0, 4);
// Mate reference sequence index
writer.Write(Helper.GetLittleEndianByteArray(mateRefId), 0, 4);
// mate_pos - Leftmost coordinate of the mate
// As per SAM format Mpos will be 1 based and 0 indicates unpaired or pairing information is unavailabe.
// In case of BAM format Mpos will be zero based and -1 indicates unpaired or pairing information is unavailabe.
writer.Write(Helper.GetLittleEndianByteArray(alignedSeq.MPos - 1), 0, 4);
// Insert size of the read pair (if paired)
writer.Write(Helper.GetLittleEndianByteArray(alignedSeq.ISize), 0, 4);
// Read name, null terminated
writer.Write(readName, 0, readName.Length);
writer.WriteByte((byte)'\0');
// Cigar: op_len<<4|op. Op: MIDNSHP=>0123456
foreach (uint data in encodedCIGAR)
{
writer.Write(Helper.GetLittleEndianByteArray(data), 0, 4);
}
// 4-bit encoded read: =ACGTN=>0,1,2,4,8,15; the earlier base is stored in the high-order 4 bits of the byte.
byte[] encodedValues = GetEncodedSequence(alignedSeq);
writer.Write(encodedValues, 0, encodedValues.Length);
// Phred base quality (0xFF if absent)
encodedValues = GetQualityValue(alignedSeq.QuerySequence);
writer.Write(encodedValues, 0, encodedValues.Length);
// Optional fields
foreach (SAMOptionalField field in alignedSeq.OptionalFields)
{
byte[] optionalArray = GetOptioanField(field);
writer.Write(optionalArray, 0, optionalArray.Length);
}
}