Пример #1
0
        private static void AddIntervals(IAnnotatedPosition annotatedPosition,
                                         IIntervalSearch <ISupplementaryInterval> intervalArray, int begin, int end)
        {
            var intervals = intervalArray.GetAllOverlappingValues(begin, end);

            if (intervals == null)
            {
                return;
            }

            foreach (var overlappingInterval in intervals)
            {
                var reciprocalOverlap = annotatedPosition.Position.Start >= annotatedPosition.Position.End
                                ? null
                                : overlappingInterval.GetReciprocalOverlap(annotatedPosition.AnnotatedVariants[0].Variant);

                annotatedPosition.SupplementaryIntervals.Add(
                    new AnnotatedSupplementaryInterval(overlappingInterval, reciprocalOverlap));
            }
        }
Пример #2
0
        /// <summary>
        /// decompresses the 2-bit notation into bases
        /// </summary>
        public string Substring(int offset, int length)
        {
            offset -= _sequenceOffset;

            // handle negative offsets and lengths
            if (offset < 0 || length < 1 || offset >= NumBases)
            {
                return(null);
            }

            // sanity check: avoid going past the end of the sequence
            if (offset + length > NumBases)
            {
                length = NumBases - offset;
            }

            // allocate more memory if needed
            var decompressBuffer = new char[length];

            // set the initial state of the buffer
            var indexAndShiftTuple = GetBaseIndexAndShift(offset - 1);

            int  bufferIndex       = indexAndShiftTuple.Item1;
            int  bufferShift       = indexAndShiftTuple.Item2;
            byte currentBufferSeed = _buffer[bufferIndex];

            // get the overlapping masked interval
            var maskedIntervals = new List <MaskedEntry>();

            _maskedIntervalSearch.GetAllOverlappingValues(offset, offset + length - 1, maskedIntervals);

            // get the first masked interval
            int  numIntervals       = maskedIntervals.Count;
            bool hasMaskedIntervals = numIntervals > 0;
            int  currentOffset      = 0;
            var  currentInterval    = hasMaskedIntervals ? maskedIntervals[0] : null;

            for (int baseIndex = 0; baseIndex < length; baseIndex++)
            {
                int currentPosition = offset + baseIndex;

                if (hasMaskedIntervals && currentPosition >= currentInterval.Begin && currentPosition <= currentInterval.End)
                {
                    // evaluate the masked bases
                    for (; baseIndex <= currentInterval.End - offset && baseIndex < length; baseIndex++)
                    {
                        decompressBuffer[baseIndex] = 'N';
                    }
                    baseIndex--;

                    indexAndShiftTuple = GetBaseIndexAndShift(offset + baseIndex);

                    bufferIndex       = indexAndShiftTuple.Item1;
                    bufferShift       = indexAndShiftTuple.Item2;
                    currentBufferSeed = _buffer[bufferIndex];

                    currentOffset++;
                    hasMaskedIntervals = currentOffset < numIntervals;
                    currentInterval    = hasMaskedIntervals ? maskedIntervals[currentOffset] : null;
                }
                else
                {
                    // evaluate normal bases
                    decompressBuffer[baseIndex] = _convertNumberToBase[(currentBufferSeed >> bufferShift) & 3];

                    bufferShift -= 2;

                    if (bufferShift < 0)
                    {
                        bufferShift = CompressedSequenceReader.MaxShift;
                        bufferIndex++;
                        currentBufferSeed = _buffer[bufferIndex];
                    }
                }
            }

            return(new string(decompressBuffer, 0, length));
        }
Пример #3
0
        public string Substring(int offset, int length)
        {
            offset -= _sequenceOffset;

            // handle negative offsets and lengths
            if (offset < 0 || length < 1 || offset >= Length)
            {
                return(null);
            }

            // sanity check: avoid going past the end of the sequence
            if (offset + length > Length)
            {
                length = Length - offset;
            }

            // allocate more memory if needed
            if (length > _decompressBuffer.Length)
            {
                _decompressBuffer = new char[length];
            }

            // set the initial state of the buffer
            (int bufferIndex, int bufferShift) = GetBaseIndexAndShift(offset - 1);
            byte currentBufferSeed = _buffer[bufferIndex];

            // get the overlapping masked interval
            var maskedIntervals = _maskedIntervalSearch.GetAllOverlappingValues(offset, offset + length - 1);

            // get the first masked interval
            var  currentOffset      = 0;
            bool hasMaskedIntervals = maskedIntervals != null;
            int  numIntervals       = maskedIntervals?.Length ?? 0;
            var  currentInterval    = hasMaskedIntervals ? maskedIntervals[0] : null;

            for (var baseIndex = 0; baseIndex < length; baseIndex++)
            {
                int currentPosition = offset + baseIndex;

                if (hasMaskedIntervals && currentPosition >= currentInterval.Begin && currentPosition <= currentInterval.End)
                {
                    int numMaskedBases = MaskBases(offset, length, baseIndex, currentInterval);
                    baseIndex += numMaskedBases - 1;

                    (bufferIndex, bufferShift) = GetBaseIndexAndShift(offset + baseIndex);
                    currentBufferSeed          = _buffer[bufferIndex];

                    currentOffset++;
                    hasMaskedIntervals = currentOffset < numIntervals;
                    currentInterval    = hasMaskedIntervals ? maskedIntervals[currentOffset] : null;

                    continue;
                }

                // evaluate normal bases
                _decompressBuffer[baseIndex] = _convertNumberToBase[(currentBufferSeed >> bufferShift) & 3];

                bufferShift -= 2;

                if (bufferShift < 0)
                {
                    bufferShift = CompressedSequenceReader.MaxShift;
                    bufferIndex++;
                    currentBufferSeed = _buffer[bufferIndex];
                }
            }

            return(new string(_decompressBuffer, 0, length));
        }