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)); } }
/// <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)); }
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)); }