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