В этом примере показано, как создать пользовательский допуск, чтобы определить, имеют ли две последовательности ДНК Расстояние Хемминга в заданном допуске. Для двух последовательностей ДНК той же длины Расстояние Хемминга является количеством положений, в которых нуклеотиды (буквы) от одной последовательности отличаются от другого.
В файле, 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.