Пример #1
0
        void EncodeQual(byte[] buffer, ref long i, BinaryWriter writer, FastqReader reader)
        {
            //the first byte starts with 0 if we are encoding a quality
            byte first = (byte)0;
            int  b     = 0;

            if (qualityRunLengthContinuation != 0)
            {
                buffer[b++] = (byte)qualityRunLengthContinuation;
                qualityRunLengthContinuation = 0;
            }
            while (reader.HasQLeft(i, 1) && b < BUFFER)
            {
                long j  = i + 1;
                int  rl = 1;
                while (reader.HasQLeft(j, 1) && reader.GetQ(j - 1) == reader.GetQ(j) && rl < MAX)
                {
                    j++;
                    rl++;
                }
                if (rl > 1)   //run length
                {
                    ae.GetBytes(reader.GetQ(j - 1).ToString(), 0, 1, buffer, b);
                    buffer[b] = (byte)(buffer[b] + 128);
                    b++;
                    if (b >= BUFFER)
                    {
                        qualityRunLengthContinuation = rl;
                    }
                    else
                    {
                        buffer[b++] = (byte)rl;
                    }
                    i = j;
                }
                else     //single char
                {
                    ae.GetBytes(reader.GetQ(i).ToString(), 0, 1, buffer, b);
                    b++;
                    i++;
                }
            }

            if (b == BUFFER)
            {
                writer.Write(first);
                writer.Write(buffer);
            }
            else
            {
                first += (byte)32;  //we have to tell the decoder that we have a block with a length
                                    //different than BUFFER
                writer.Write(first);
                writer.Write(b);
                writer.Write(buffer, 0, b);
            }
        }
Пример #2
0
        void EncodeQual(byte[] buffer, ref long i, BinaryWriter writer, FastqReader reader)
        {
            int b = 0;

            if (qualityRunLengthContinuation != 0)
            {
                buffer[b++] = (byte)qualityRunLengthContinuation;
                qualityRunLengthContinuation = 0;
            }
            while (reader.HasQLeft(i, 1) && b < BUFFER)
            {
                long j  = i + 1;
                int  rl = 1;
                while (reader.HasQLeft(j, 1) && reader.GetQ(j - 1) == reader.GetQ(j) && rl < MAX)
                {
                    j++;
                    rl++;
                }
                if (rl > 1)   //run length
                //ae.GetBytes(reader.GetQ(j-1).ToString(), 0, 1, buffer, b);
                {
                    buffer[b] = Convert.ToByte(reader.GetQ(j - 1));
                    buffer[b] = (byte)(buffer[b] + 128);
                    b++;
                    if (b >= BUFFER)
                    {
                        qualityRunLengthContinuation = rl;
                    }
                    else
                    {
                        buffer[b++] = (byte)rl;
                    }
                    i = j;
                }
                else     //single char
                //ae.GetBytes(reader.GetQ(i).ToString(), 0, 1, buffer, b);
                {
                    buffer[b] = Convert.ToByte(reader.GetQ(i));
                    b++;
                    i++;
                }
            }

            if (b == BUFFER)
            {
                writer.Write(buffer);
            }
            else
            {
                writer.Write(buffer, 0, b);
            }
        }
Пример #3
0
        //ASCIIEncoding ae = new ASCIIEncoding();

        /* Main compression method that keeps the two streams aligned and calls
         * the encoding methods for sequences and qualities.
         */
        public void Compress(FastqReader reader, BinaryWriter sequenceWriter, BinaryWriter qualityWriter)
        {
            long seqI  = 0;
            long qualI = 0;

            byte[]           buffer = new byte[BUFFER];
            WriteBitShepherd bits   = new WriteBitShepherd(sequenceWriter);

            while (true)
            {
                Spin("Encoding...");
                if (seqI <= qualI && reader.HasSeqLeft(seqI, 1))
                {
                    EncodeSeq(bits, ref seqI, reader);
                    continue;
                }
                if (reader.HasQLeft(qualI, 1))
                {
                    EncodeQual(buffer, ref qualI, qualityWriter, reader);
                    continue;
                }
                break;
            }
            bits.Close();
        }
Пример #4
0
        /* Main compression method that keeps the two streams aligned and calls
         * the encoding methods for sequences and qualities.
         */
        public void Compress(FastqReader reader, BinaryWriter writer)
        {
            long seqI      = 0;
            long qualI     = 0;
            int  idCounter = 0;

            byte[] buffer = new byte[BUFFER];
            ChooseIddc(reader, writer);

            while (true)
            {
                Spin("Encoding...");
                if (encodeIds && idCounter <= seqI / length && reader.HasIDLeft(idCounter, 1))
                {
                    iddc.EncodeId(ref idCounter);
                    continue;
                }
                if ((seqI <= qualI || !encodeQualities) && reader.HasSeqLeft(seqI, 1))
                {
                    EncodeSeq(buffer, ref seqI, writer, reader);
                    continue;
                }
                if (encodeQualities && reader.HasQLeft(qualI, 1))
                {
                    EncodeQual(buffer, ref qualI, writer, reader);
                    continue;
                }
                break;
            }
            Console.Error.WriteLine();
        }
Пример #5
0
        /* Main compression method that keeps the two streams aligned and calls
         * the encoding methods for sequences and qualities.
         */
        //public void Compress(FastqReader reader, BinaryWriter writer)
        public void Compress(FastqReader reader, BinaryWriter sequenceWriter, BinaryWriter qualityWriter)
        {
            long seqI  = 0;
            long qualI = 0;

            byte[] buffer = new byte[BUFFER];
            while (true)
            {
                Spin("Encoding...");
                if (seqI <= qualI && reader.HasSeqLeft(seqI, 1))
                {
                    EncodeSeq(buffer, ref seqI, sequenceWriter, reader);
                    continue;
                }
                if (reader.HasQLeft(qualI, 1))
                {
                    EncodeQual(buffer, ref qualI, qualityWriter, reader);
                    continue;
                }
                break;
            }
            Console.Error.WriteLine();
        }