В этом примере показано, как создать пользовательский допуск, чтобы определить, имеют ли две последовательности ДНК расстояние Хэмминга в пределах указанного допуска. Для двух последовательностей ДНК одинаковой длины расстояние Хэмминга - это количество положений, в которых нуклеотиды (буквы) одной последовательности отличаются от другой.
В файле, DNA.m, в рабочей папке создайте простой класс для последовательности ДНК.
classdef DNA properties(SetAccess=immutable) Sequence end methods function dna = DNA(sequence) validLetters = ... sequence == 'A' | ... sequence == 'C' | ... sequence == 'T' | ... sequence == 'G'; if ~all(validLetters(:)) error('Sequence contained a letter not found in DNA.') end dna.Sequence = sequence; end end end
В файле в рабочей папке создайте класс допуска, чтобы можно было проверить, что последовательности ДНК находятся на заданном расстоянии Хэмминга. Конструктору требуется Value свойство, определяющее максимальное расстояние Хэмминга.
classdef HammingDistance < matlab.unittest.constraints.Tolerance properties Value end methods function tolerance = HammingDistance(value) tolerance.Value = value; end end end
В methods блок с HammingDistance определение класса, включите следующий метод, чтобы допуск поддерживал объекты ДНК. Классы допусков должны реализовывать supports способ.
methods
function tf = supports(~, value)
tf = isa(value, 'DNA');
end
end
В methods блок с HammingDistance определение класса, включить следующий метод, который возвращает true или false. Классы допусков должны реализовывать satisfiedBy способ. В рамках тестирования этот метод используется для определения того, находятся ли два значения в пределах допуска.
methods
function tf = satisfiedBy(tolerance, actual, expected)
if ~isSameSize(actual.Sequence, expected.Sequence)
tf = false;
return
end
tf = hammingDistance(actual.Sequence,expected.Sequence) <= tolerance.Value;
end
endВ HammingDistance.m , определите следующие вспомогательные функции вне classdef блок. isSameSize функция возвращает true если две последовательности ДНК имеют одинаковый размер, и hammingDistance функция возвращает расстояние Хэмминга между двумя последовательностями.
function tf = isSameSize(str1, str2) tf = isequal(size(str1), size(str2)); end function distance = hammingDistance(str1, str2) distance = nnz(str1 ~= str2); end
Функция возвращает Diagnostic с информацией о сравнении. В methods блок с HammingDistance определение класса, включить следующий метод, который возвращает StringDiagnostic. Классы допусков должны реализовывать getDiagosticFor способ.
methods
function diag = getDiagnosticFor(tolerance, actual, expected)
import matlab.unittest.diagnostics.StringDiagnostic
if ~isSameSize(actual.Sequence, expected.Sequence)
str = 'The DNA sequences must be the same length.';
else
str = sprintf('%s%d.\n%s%d.', ...
'The DNA sequences have a Hamming distance of ', ...
hammingDistance(actual.Sequence, expected.Sequence), ...
'The allowable distance is ', ...
tolerance.Value);
end
diag = StringDiagnostic(str);
end
end
Сводка по определению класса HammingDistance
В командной строке создайте TestCase для интерактивного тестирования.
import matlab.unittest.TestCase import matlab.unittest.constraints.IsEqualTo testCase = TestCase.forInteractiveUse;
Создайте два объекта ДНК.
sampleA = DNA('ACCTGAGTA'); sampleB = DNA('ACCACAGTA');
Убедитесь, что последовательности ДНК равны друг другу.
testCase.verifyThat(sampleA, IsEqualTo(sampleB))
Interactive verification failed.
---------------------
Framework Diagnostic:
---------------------
IsEqualTo failed.
--> ObjectComparator failed.
--> The objects are not equal using "isequal".
Actual Object:
DNA with properties:
Sequence: 'ACCTGAGTA'
Expected Object:
DNA with properties:
Sequence: 'ACCACAGTA'Убедитесь, что последовательности ДНК равны друг другу в пределах расстояния Хэмминга, равного 1.
testCase.verifyThat(sampleA, IsEqualTo(sampleB,... 'Within', HammingDistance(1)))
Interactive verification failed.
---------------------
Framework Diagnostic:
---------------------
IsEqualTo failed.
--> ObjectComparator failed.
--> The objects are not equal using "isequal".
--> The DNA sequences have a Hamming distance of 2.
The allowable distance is 1.
Actual Object:
DNA with properties:
Sequence: 'ACCTGAGTA'
Expected Object:
DNA with properties:
Sequence: 'ACCACAGTA'Последовательности не равны друг другу в пределах допуска 1. Платформа тестирования отображает дополнительную диагностику из getDiagnosticFor способ.
Убедитесь, что последовательности ДНК равны друг другу в пределах расстояния Хэмминга, равного 2.
testCase.verifyThat(sampleA, IsEqualTo(sampleB,... 'Within', HammingDistance(2)))
Interactive verification passed.