Skip to content

Commit c29825e

Browse files
committed
Exposing alignment mappings to be able to map query sequence to target sequence
1 parent d41020d commit c29825e

File tree

2 files changed

+65
-31
lines changed

2 files changed

+65
-31
lines changed

biojava-core/src/main/java/org/biojava/nbio/core/alignment/SimpleAlignedSequence.java

Lines changed: 53 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,9 @@ public class SimpleAlignedSequence<S extends Sequence<C>, C extends Compound> im
6161
// cached (lazily initialized)
6262
private int numGaps = -1;
6363
private int numGapPositions = -1;
64-
private int[] alignmentFromSequence, sequenceFromAlignment;
64+
65+
private int[] alignmentFromSequence;
66+
private int[] sequenceFromAlignment;
6567

6668
/**
6769
* Creates an {@link AlignedSequence} for the given {@link Sequence} in a global alignment.
@@ -133,25 +135,35 @@ public void clearCache() {
133135
sequenceFromAlignment = null;
134136
}
135137

136-
@Override
137-
public int getAlignmentIndexAt(int sequenceIndex) {
138-
if (alignmentFromSequence == null) {
139-
alignmentFromSequence = new int[original.getLength()];
140-
int s = 1, a = 1;
141-
for (int i = 0; i < numBefore; i++, s++) {
142-
alignmentFromSequence[s - 1] = a;
143-
}
144-
for (; s <= alignmentFromSequence.length && a <= length; s++, a++) {
145-
while (a <= length && isGap(a)) {
146-
a++;
147-
}
148-
alignmentFromSequence[s - 1] = a;
149-
}
150-
a--;
151-
for (int i = 0; i < numAfter; i++, s++) {
152-
alignmentFromSequence[s - 1] = a;
138+
private void setAlignmentFromSequence() {
139+
alignmentFromSequence = new int[original.getLength()];
140+
int s = 1, a = 1;
141+
for (int i = 0; i < numBefore; i++, s++) {
142+
alignmentFromSequence[s - 1] = a;
143+
}
144+
for (; s <= alignmentFromSequence.length && a <= length; s++, a++) {
145+
while (a <= length && isGap(a)) {
146+
a++;
153147
}
148+
alignmentFromSequence[s - 1] = a;
154149
}
150+
a--;
151+
for (int i = 0; i < numAfter; i++, s++) {
152+
alignmentFromSequence[s - 1] = a;
153+
}
154+
}
155+
156+
@Override
157+
public int[] getAlignmentFromSequence() {
158+
if (alignmentFromSequence == null)
159+
setAlignmentFromSequence();
160+
return alignmentFromSequence;
161+
}
162+
163+
@Override
164+
public int getAlignmentIndexAt(int sequenceIndex) {
165+
if (alignmentFromSequence == null)
166+
setAlignmentFromSequence();
155167
return alignmentFromSequence[sequenceIndex - 1];
156168
}
157169

@@ -198,21 +210,31 @@ public int getOverlapCount() {
198210
return 1;
199211
}
200212

201-
@Override
202-
public int getSequenceIndexAt(int alignmentIndex) {
203-
if (sequenceFromAlignment == null) {
204-
sequenceFromAlignment = new int[length];
205-
int a = 1, s = numBefore + 1;
206-
for (int i = 0; i < getStart().getPosition(); i++, a++) {
207-
sequenceFromAlignment[a - 1] = s;
208-
}
209-
for (; a <= length; a++) {
210-
if (!isGap(a)) {
211-
s++;
212-
}
213-
sequenceFromAlignment[a - 1] = s;
213+
private void setSequenceFromAlignment() {
214+
sequenceFromAlignment = new int[length];
215+
int a = 1, s = numBefore + 1;
216+
for (int i = 0; i < getStart().getPosition(); i++, a++) {
217+
sequenceFromAlignment[a - 1] = s;
218+
}
219+
for (; a <= length; a++) {
220+
if (!isGap(a)) {
221+
s++;
214222
}
223+
sequenceFromAlignment[a - 1] = s;
215224
}
225+
}
226+
227+
@Override
228+
public int[] getSequenceFromAlignment() {
229+
if (sequenceFromAlignment == null)
230+
setSequenceFromAlignment();
231+
return sequenceFromAlignment;
232+
}
233+
234+
@Override
235+
public int getSequenceIndexAt(int alignmentIndex) {
236+
if (sequenceFromAlignment == null)
237+
setSequenceFromAlignment();
216238
return sequenceFromAlignment[alignmentIndex - 1];
217239
}
218240

biojava-core/src/main/java/org/biojava/nbio/core/alignment/template/AlignedSequence.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,18 @@ enum Step { COMPOUND, GAP }
4747
*/
4848
void clearCache();
4949

50+
/** Returns the alignment.
51+
*
52+
* @return the alignment
53+
*/
54+
int[] getAlignmentFromSequence();
55+
56+
/** Returns the sequence positions at each alignment index
57+
*
58+
* @return array of the sequence positions
59+
*/
60+
int[] getSequenceFromAlignment();
61+
5062
/**
5163
* Returns the column index within an alignment corresponding to the given index in the original {@link Sequence}.
5264
* Both indices are 1-indexed and inclusive.

0 commit comments

Comments
 (0)