// empty letter and special character i.e. the deletion of a special
// character
if ((i == 0 && this.structureAlphabet.isSpecial(c2))
|| (j == 0 && this.structureAlphabet.isSpecial(c1))) {
InnerStructure in1 = this.structureAlphabet.isSpecial(c1) ? stem1
.getInnerStructure(i - 1) : null;
InnerStructure in2 = this.structureAlphabet.isSpecial(c2) ? stem2
.getInnerStructure(j - 1) : null;
double innerScore = 0;
if (in1 != null) {
// calculate the deletion of the left side and the right side
InnerStructure in = in1;
this.sequenceSimilarity.setSequences(in.getSequenceLeft(),
emptyListHelper);
this.sequenceSimilarity.buildMatrix();
innerScore += this.sequenceSimilarity.getAlignmentScore();
this.sequenceSimilarity.setSequences(in.getSequenceRight(),
emptyListHelper);
this.sequenceSimilarity.buildMatrix();
innerScore += this.sequenceSimilarity.getAlignmentScore();
}
if (in2 != null) {
InnerStructure in = in2;
this.sequenceSimilarity.setSequences(in.getSequenceLeft(),
emptyListHelper);
this.sequenceSimilarity.buildMatrix();
innerScore += this.sequenceSimilarity.getAlignmentScore();
this.sequenceSimilarity.setSequences(in.getSequenceRight(),
emptyListHelper);
this.sequenceSimilarity.buildMatrix();
innerScore += this.sequenceSimilarity.getAlignmentScore();
}
return scoringMatrix.score(c1, c2) + innerScore;
}
if (!this.structureAlphabet.isSpecial(c1)
&& !this.structureAlphabet.isSpecial(c2)) {
// not a special case
return super.similarity(i, j);
}
if ((c1 == StemStructureAlphabet.INNER_LOOP && this.structureAlphabet
.isSpecial(c2))
|| (c2 == StemStructureAlphabet.INNER_LOOP && this.structureAlphabet
.isSpecial(c1))) {
// inner loop to right or left
InnerStructure in1 = stem1.getInnerStructure(i - 1);
InnerStructure in2 = stem2.getInnerStructure(j - 1);
double score = 0;
this.sequenceSimilarity.setSequences(in1.getSequenceLeft(),
in2.getSequenceLeft());
this.sequenceSimilarity.buildMatrix();
score = this.sequenceSimilarity.getAlignmentScore();
this.sequenceSimilarity.setSequences(in1.getSequenceRight(),
in2.getSequenceRight());
this.sequenceSimilarity.buildMatrix();
score += this.sequenceSimilarity.getAlignmentScore();
return score;
} else if (c1 == StemStructureAlphabet.BULDGE_RIGHT
&& c2 == StemStructureAlphabet.BULDGE_RIGHT) {
// right to right
InnerStructure in1 = stem1.getInnerStructure(i - 1);
InnerStructure in2 = stem2.getInnerStructure(j - 1);
this.sequenceSimilarity.setSequences(in1.getSequenceRight(),
in2.getSequenceRight());
this.sequenceSimilarity.buildMatrix();
return this.sequenceSimilarity.getAlignmentScore();
} else if ((c1 == StemStructureAlphabet.BULDGE_LEFT && c2 == StemStructureAlphabet.BULDGE_LEFT)) {
// left to left
InnerStructure in1 = stem1.getInnerStructure(i - 1);
InnerStructure in2 = stem2.getInnerStructure(j - 1);
this.sequenceSimilarity.setSequences(in1.getSequenceLeft(),
in2.getSequenceLeft());
this.sequenceSimilarity.buildMatrix();
return this.sequenceSimilarity.getAlignmentScore();
}
return Double.NEGATIVE_INFINITY;