/*
* Copyright 2015 MiLaboratory.com
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.milaboratory.core.alignment;
import com.milaboratory.core.sequence.NucleotideSequence;
import org.apache.commons.math3.random.RandomDataGenerator;
import org.apache.commons.math3.random.Well19937c;
import org.junit.Test;
import static com.milaboratory.test.TestUtil.its;
import static com.milaboratory.test.TestUtil.randomSequence;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
public class BandedLinearAlignerTest {
@Test
public void testGlobal() throws Exception {
NucleotideSequence sequence1 = new NucleotideSequence("ATTAGACA");
NucleotideSequence sequence2 = new NucleotideSequence("ATTGACA");
Alignment<NucleotideSequence> alignment = BandedLinearAligner.align(LinearGapAlignmentScoring.getNucleotideBLASTScoring(), sequence1, sequence2, 0);
AlignerTest.assertAlignment(alignment, sequence2);
//Mutations.printAlignment(sequence1, mut);
sequence1 = new NucleotideSequence("ATTGACA");
sequence2 = new NucleotideSequence("ATTAGACA");
alignment = BandedLinearAligner.align(LinearGapAlignmentScoring.getNucleotideBLASTScoring(), sequence1, sequence2, 0);
AlignerTest.assertAlignment(alignment, sequence2);
//Mutations.printAlignment(sequence1, mut);
sequence1 = new NucleotideSequence("ATTGACA");
sequence2 = new NucleotideSequence("AGTAGCCA");
alignment = BandedLinearAligner.align(LinearGapAlignmentScoring.getNucleotideBLASTScoring(), sequence1, sequence2, 0);
AlignerTest.assertAlignment(alignment, sequence2);
//Mutations.printAlignment(sequence1, mut);
sequence1 = new NucleotideSequence("ATTGACAATTGACA");
sequence2 = new NucleotideSequence("ATTGACATTGAA");
alignment = BandedLinearAligner.align(LinearGapAlignmentScoring.getNucleotideBLASTScoring(), sequence1, sequence2, 0);
AlignerTest.assertAlignment(alignment, sequence2);
//Mutations.printAlignment(sequence1, mut);
sequence1 = new NucleotideSequence("ATTGACAATTGACA");
sequence2 = new NucleotideSequence("ATGAAATTGCACA");
alignment = BandedLinearAligner.align(LinearGapAlignmentScoring.getNucleotideBLASTScoring(), sequence1, sequence2, 1);
AlignerTest.assertAlignment(alignment, sequence2);
//Mutations.printAlignment(sequence1, mut);
}
@Test
public void testRandomGlobal() throws Exception {
int its = its(100, 10000);
RandomDataGenerator random = new RandomDataGenerator(new Well19937c());
for (int i = 0; i < its; ++i) {
NucleotideSequence seq1, seq2;
seq1 = randomSequence(NucleotideSequence.ALPHABET, random, 10, 100);
seq2 = randomSequence(NucleotideSequence.ALPHABET, random, 10, 100);
Alignment<NucleotideSequence> alignment = BandedLinearAligner.align(LinearGapAlignmentScoring.getNucleotideBLASTScoring(),
seq1, seq2,
random.nextInt(0, Math.min(seq1.size(), seq2.size()) - 1));
AlignerTest.assertAlignment(alignment, seq2);
}
}
@Test
public void test5() {
NucleotideSequence seq1 = new NucleotideSequence("A"), seq2 = new NucleotideSequence("ATTA");
Alignment<NucleotideSequence> alignment = BandedLinearAligner.align(LinearGapAlignmentScoring.getNucleotideBLASTScoring(), seq1, seq2, 1);
AlignerTest.assertAlignment(alignment, seq2);
}
@Test
public void testRandomLeft() throws Exception {
int its = its(100, 10000);
RandomDataGenerator random = new RandomDataGenerator(new Well19937c());
for (int i = 0; i < its; ++i) {
NucleotideSequence seq1, seq2;
seq1 = randomSequence(NucleotideSequence.ALPHABET, random, 80, 84);
seq2 = randomSequence(NucleotideSequence.ALPHABET, random, 80, 84);
Alignment<NucleotideSequence> r = BandedLinearAligner.alignSemiLocalLeft(LinearGapAlignmentScoring.getNucleotideBLASTScoring(),
seq1, seq2,
random.nextInt(0, Math.min(seq1.size(), seq2.size()) - 1),
-10);
AlignerTest.assertAlignment(r, seq2);
}
}
@Test
public void testRandomRight() throws Exception {
int its = its(100, 10000);
RandomDataGenerator random = new RandomDataGenerator(new Well19937c());
for (int i = 0; i < its; ++i) {
NucleotideSequence seq1, seq2;
seq1 = randomSequence(NucleotideSequence.ALPHABET, random, 80, 84);
seq2 = randomSequence(NucleotideSequence.ALPHABET, random, 80, 84);
Alignment<NucleotideSequence> r =
BandedLinearAligner.alignSemiLocalRight(LinearGapAlignmentScoring.getNucleotideBLASTScoring(),
seq1, seq2,
random.nextInt(0, Math.min(seq1.size(), seq2.size()) - 1),
-10);
AlignerTest.assertAlignment(r, seq2);
}
}
@Test
public void testLocalLeft() throws Exception {
NucleotideSequence seq1 = new NucleotideSequence("ATTAGACA");
NucleotideSequence seq2 = new NucleotideSequence("ATTACGC");
Alignment<NucleotideSequence> r = BandedLinearAligner.alignSemiLocalLeft(LinearGapAlignmentScoring.getNucleotideBLASTScoring(), seq1, seq2, 0, -10);
AlignerTest.assertAlignment(r, seq2);
assertEquals(4, r.getSequence1Range().getTo());
assertEquals(4, r.getSequence2Range().getTo());
seq1 = new NucleotideSequence("ATTAGACA");
seq2 = new NucleotideSequence("ATTGACGC");
r = BandedLinearAligner.alignSemiLocalLeft(LinearGapAlignmentScoring.getNucleotideBLASTScoring(), seq1, seq2, 1, -10);
//Mutations.printAlignment(seq1.getSubSequence(0, r.sequence1Stop + 1), r.mutations);
AlignerTest.assertAlignment(r, seq2);
assertEquals(7, r.getSequence1Range().getTo());
assertEquals(6, r.getSequence2Range().getTo());
seq1 = new NucleotideSequence("ATAGACAGGGAGACA");
seq2 = new NucleotideSequence("ATTAGACATTAGACA");
r = BandedLinearAligner.alignSemiLocalLeft(LinearGapAlignmentScoring.getNucleotideBLASTScoring(), seq1, seq2, 1, -10);
//Mutations.printAlignment(seq1.getSubSequence(0, r.sequence1Stop + 1), r.mutations);
AlignerTest.assertAlignment(r, seq2);
assertEquals(7, r.getSequence1Range().getTo());
assertEquals(8, r.getSequence2Range().getTo());
}
@Test
public void testLocalRight() throws Exception {
NucleotideSequence seq1 = new NucleotideSequence("ATTAGACA");
NucleotideSequence seq2 = new NucleotideSequence("GACA");
Alignment<NucleotideSequence> r = BandedLinearAligner.alignSemiLocalRight(LinearGapAlignmentScoring.getNucleotideBLASTScoring(), seq1, seq2, 0, -10);
//Mutations.printAlignment(seq1.getSubSequence(r.sequence1Stop, seq1.size()), r.mutations);
AlignerTest.assertAlignment(r, seq2);
assertEquals(4, r.getSequence1Range().getFrom());
assertEquals(0, r.getSequence2Range().getFrom());
seq1 = new NucleotideSequence("ATTAGACAATTAGACA");
seq2 = new NucleotideSequence("GCGAATAGACA");
r = BandedLinearAligner.alignSemiLocalRight(LinearGapAlignmentScoring.getNucleotideBLASTScoring(), seq1, seq2, 0, -10);
//Mutations.printAlignment(seq1.getSubSequence(r.sequence1Stop, seq1.size()), Mutations.move(r.mutations, -r.sequence1Stop));
AlignerTest.assertAlignment(r, seq2);
assertEquals(7, r.getSequence1Range().getFrom());
assertEquals(3, r.getSequence2Range().getFrom());
}
@Test
public void testAddedRight1() throws Exception {
NucleotideSequence seq1 = new NucleotideSequence("ATTAGACA"),
seq2 = new NucleotideSequence("ATTTAGACA");
Alignment<NucleotideSequence> la = BandedLinearAligner.alignRightAdded(LinearGapAlignmentScoring.getNucleotideBLASTScoring(),
seq1, seq2, 0, seq1.size(), 0, 0, seq2.size(), 0, 1);
assertEquals(seq1.size(), la.getSequence1Range().getTo());
assertEquals(seq2.size(), la.getSequence2Range().getTo());
AlignerTest.assertAlignment(la, seq2);
}
@Test
public void testAddedRight2() throws Exception {
NucleotideSequence seq1 = new NucleotideSequence("ATTAGACA"),
seq2 = new NucleotideSequence("ATTTAGACAC");
Alignment<NucleotideSequence> la = BandedLinearAligner.alignRightAdded(LinearGapAlignmentScoring.getNucleotideBLASTScoring(),
seq1, seq2, 0, seq1.size(), 1, 0, seq2.size(), 1, 1);
assertEquals(seq1.size(), la.getSequence1Range().getTo());
assertEquals(seq2.size() - 1, la.getSequence2Range().getTo());
AlignerTest.assertAlignment(la, seq2);
}
@Test
public void testAddedRight3() throws Exception {
NucleotideSequence seq1 = new NucleotideSequence("ATTAGACA"),
seq2 = new NucleotideSequence("ATTTAGACAC");
Alignment<NucleotideSequence> la = BandedLinearAligner.alignRightAdded(LinearGapAlignmentScoring.getNucleotideBLASTScoring(),
seq1, seq2, 0, seq1.size(), 1, 0, seq2.size(), 0, 1);
assertEquals(seq1.size(), la.getSequence1Range().getTo());
assertEquals(seq2.size(), la.getSequence2Range().getTo());
AlignerTest.assertAlignment(la, seq2);
}
@Test
public void testAddedRightRandom1() throws Exception {
int its = its(1000, 100000);
NucleotideSequence seq1, seq2;
int offset1, offset2, length1, length2, added1, added2;
Alignment<NucleotideSequence> la;
RandomDataGenerator random = new RandomDataGenerator(new Well19937c());
for (int i = 0; i < its; ++i) {
seq1 = randomSequence(NucleotideSequence.ALPHABET, random, 80, 84);
seq2 = randomSequence(NucleotideSequence.ALPHABET, random, 80, 84);
offset1 = random.nextInt(0, seq1.size() - 10);
offset2 = random.nextInt(0, seq2.size() - 10);
length1 = random.nextInt(1, seq1.size() - offset1);
length2 = random.nextInt(1, seq2.size() - offset2);
added1 = random.nextInt(0, length1);
added2 = random.nextInt(0, length2);
la = BandedLinearAligner.alignRightAdded(LinearGapAlignmentScoring.getNucleotideBLASTScoring(),
seq1, seq2, offset1, length1, added1, offset2, length2, added2, 1);
assertTrue(la.getSequence1Range().getTo() == offset1 + length1 ||
la.getSequence2Range().getTo() == offset2 + length2);
assertTrue(la.getSequence1Range().getTo() >= offset1 + length1 - added1);
assertTrue(la.getSequence2Range().getTo() >= offset2 + length2 - added2);
AlignerTest.assertAlignment(la, seq2);
}
}
@Test
public void testAddedLeft1() throws Exception {
NucleotideSequence seq1 = new NucleotideSequence("ATTAGACA"),
seq2 = new NucleotideSequence("ATTTAGACA");
Alignment<NucleotideSequence> la = BandedLinearAligner.alignLeftAdded(LinearGapAlignmentScoring.getNucleotideBLASTScoring(),
seq1, seq2, 0, seq1.size(), 0, 0, seq2.size(), 0, 1);
assertEquals(0, la.getSequence1Range().getFrom());
assertEquals(0, la.getSequence2Range().getFrom());
AlignerTest.assertAlignment(la, seq2);
}
@Test
public void testAddedLeft2() throws Exception {
NucleotideSequence seq1 = new NucleotideSequence("CTTAGACA"),
seq2 = new NucleotideSequence("CATTTAGACA");
Alignment<NucleotideSequence> la = BandedLinearAligner.alignLeftAdded(LinearGapAlignmentScoring.getNucleotideBLASTScoring(),
seq1, seq2, 0, seq1.size(), 0, 0, seq2.size(), 1, 1);
assertEquals(0, la.getSequence1Range().getFrom());
assertEquals(0, la.getSequence2Range().getFrom());
AlignerTest.assertAlignment(la, seq2);
}
@Test
public void testAddedLeft3() throws Exception {
NucleotideSequence seq1 = new NucleotideSequence("CTTAGACA"),
seq2 = new NucleotideSequence("CATTTAGACA");
Alignment<NucleotideSequence> la = BandedLinearAligner.alignLeftAdded(LinearGapAlignmentScoring.getNucleotideBLASTScoring(),
seq1, seq2, 0, seq1.size(), 0, 0, seq2.size(), 3, 1);
assertEquals(0, la.getSequence1Range().getFrom());
assertEquals(2, la.getSequence2Range().getFrom());
AlignerTest.assertAlignment(la, seq2);
}
@Test
public void testAddedLeftRandom1() throws Exception {
int its = its(1000, 100000);
NucleotideSequence seq1, seq2;
int offset1, offset2, length1, length2, added1, added2;
Alignment<NucleotideSequence> la;
RandomDataGenerator random = new RandomDataGenerator(new Well19937c());
for (int i = 0; i < its; ++i) {
seq1 = randomSequence(NucleotideSequence.ALPHABET, random, 80, 84);
seq2 = randomSequence(NucleotideSequence.ALPHABET, random, 80, 84);
offset1 = random.nextInt(0, seq1.size() - 10);
offset2 = random.nextInt(0, seq2.size() - 10);
length1 = random.nextInt(1, seq1.size() - offset1);
length2 = random.nextInt(1, seq2.size() - offset2);
added1 = random.nextInt(0, length1);
added2 = random.nextInt(0, length2);
la = BandedLinearAligner.alignLeftAdded(LinearGapAlignmentScoring.getNucleotideBLASTScoring(),
seq1, seq2, offset1, length1, added1, offset2, length2, added2, 1);
assertTrue(la.getSequence1Range().getFrom() == offset1 ||
la.getSequence2Range().getFrom() == offset2);
assertTrue(la.getSequence1Range().getFrom() <= offset1 + added1);
assertTrue(la.getSequence2Range().getFrom() <= offset2 + added2);
AlignerTest.assertAlignment(la, seq2);
}
}
}