Skip to content

Commit cee06fc

Browse files
authoredJan 31, 2020
v3.1.5
v 3.1.5
2 parents eff24d0 + 06325c3 commit cee06fc

12 files changed

+215
-103
lines changed
 

‎ChangeLog

+31
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,41 @@
1010
# changes in development version since last release
1111
################################################################################
1212

13+
################################################################################
14+
################################################################################
1315

16+
################################################################################
17+
### version 3.1.5
1418
################################################################################
19+
20+
# IntaRNA :
21+
- bugfix traceback of interactions with seed on right-boundary
22+
- bugfix traceback of seeds with bulges when outNoLP present
23+
1524
################################################################################
1625

26+
200131 Martin Raden
27+
* IntaRNA/PredictorMfe*SeedExtension* :
28+
* undo bugfix
29+
* traceback() :
30+
+ additional check if seed exceeds right interaction boundary
31+
* IntaRNA/SeedHandler :
32+
* isFeasibleSeedBasePair() :
33+
* debug checks obsolete since part of the check
34+
* updateToNextSeed() :
35+
* bugfix : right boundary was exclusive (but has to be inclusive)
36+
* IntaRNA/SeedHandlerMfe :
37+
* getSeedE()
38+
* setSeedE()
39+
* traceBackSeed()
40+
* now using global indices (offset shift done internally)
41+
* fillSeed() :
42+
+ additional feasibility test for noLP
43+
* traceback() :
44+
* bugfix noLP energy trace : energy was from wrong cells
45+
* trace small to large gaps (should be faster)
46+
* test/SeedHandlerMfe :
47+
+ traceback tests (number of bps in traced seeds)
1748

1849
################################################################################
1950
### version 3.1.4

‎configure.ac

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11

22
AC_PREREQ([2.65])
33
# 5 argument version only available with aclocal >= 2.64
4-
AC_INIT([IntaRNA], [3.1.4], [], [intaRNA], [http://www.bioinf.uni-freiburg.de] )
4+
AC_INIT([IntaRNA], [3.1.5], [], [intaRNA], [http://www.bioinf.uni-freiburg.de] )
55

66
# minimal required version of the boost library
77
BOOST_REQUIRED_VERSION=1.50.0

‎doc/how-to-release-new-version.md

+4
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,12 @@
1111
- upload source code tar ball
1212
- (upload win binary)
1313
- (upload linux binary)
14+
- (via cygwin) to get cygwin dlls used for compilation on Windows run
15+
- `for f in `ldd ./IntaRNA | grep "/usr/bin/" | awk '{print $3}'`; do cp $f .; done`
16+
- zip these together with `IntaRNA.exe` (and additional script files etc.)
1417
- (upload API docu pdf and html.zip)
1518

19+
1620
- publish release on github
1721

1822
- update [bioconda recipe](https://github.com/bioconda/bioconda-recipes/tree/master/recipes/intarna)

‎src/IntaRNA/PredictorMfe2dHeuristicSeedExtension.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,8 @@ predict( const IndexRange & r1, const IndexRange & r2 )
7373

7474
size_t si1 = RnaSequence::lastPos, si2 = RnaSequence::lastPos;
7575
while( seedHandler.updateToNextSeed(si1,si2
76-
, 0, range_size1+1-seedHandler.getConstraint().getBasePairs()+seedHandler.getConstraint().getMaxUnpaired1()
77-
, 0, range_size2+1-seedHandler.getConstraint().getBasePairs()+seedHandler.getConstraint().getMaxUnpaired2()) )
76+
, 0, range_size1+1-seedHandler.getConstraint().getBasePairs()
77+
, 0, range_size2+1-seedHandler.getConstraint().getBasePairs()) )
7878
{
7979
E_type seedE = seedHandler.getSeedE(si1, si2);
8080
const size_t sl1 = seedHandler.getSeedLength1(si1, si2);

‎src/IntaRNA/PredictorMfe2dSeedExtension.cpp

+9-4
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,8 @@ predict( const IndexRange & r1, const IndexRange & r2 )
7474

7575
size_t si1 = RnaSequence::lastPos, si2 = RnaSequence::lastPos;
7676
while( seedHandler.updateToNextSeed(si1,si2
77-
, 0, range_size1+1-seedHandler.getConstraint().getBasePairs()+seedHandler.getConstraint().getMaxUnpaired1()
78-
, 0, range_size2+1-seedHandler.getConstraint().getBasePairs()+seedHandler.getConstraint().getMaxUnpaired2()) )
77+
, 0, range_size1+1-seedHandler.getConstraint().getBasePairs()
78+
, 0, range_size2+1-seedHandler.getConstraint().getBasePairs()) )
7979
{
8080
// get energy and boundaries of seed
8181
E_type seedE = seedHandler.getSeedE(si1, si2);
@@ -327,8 +327,8 @@ traceBack( Interaction & interaction )
327327

328328
size_t si1 = RnaSequence::lastPos, si2 = RnaSequence::lastPos;
329329
while( seedHandler.updateToNextSeed(si1,si2
330-
, i1,j1+1-seedHandler.getConstraint().getBasePairs()+seedHandler.getConstraint().getMaxUnpaired1()
331-
, i2,j2+1-seedHandler.getConstraint().getBasePairs()+seedHandler.getConstraint().getMaxUnpaired2() ) )
330+
, i1,j1+1-seedHandler.getConstraint().getBasePairs()
331+
, i2,j2+1-seedHandler.getConstraint().getBasePairs() ) )
332332
{
333333
E_type seedE = seedHandler.getSeedE(si1, si2);
334334
const size_t sl1 = seedHandler.getSeedLength1(si1, si2);
@@ -338,6 +338,11 @@ traceBack( Interaction & interaction )
338338
const size_t maxMatrixLen1 = energy.getAccessibility1().getMaxLength()-sl1+1;
339339
const size_t maxMatrixLen2 = energy.getAccessibility2().getMaxLength()-sl2+1;
340340

341+
// check if seed exceeds interaction (eg if with bulge)
342+
if ( sj1 > j1 || sj2 > j2 ) {
343+
continue;
344+
}
345+
341346
hybridE_left.resize( std::min(si1+1, maxMatrixLen1), std::min(si2+1, maxMatrixLen2) );
342347
fillHybridE_left( si1, si2 );
343348
hybridE_right.resize( std::min(j1-sj1+1, maxMatrixLen1), std::min(j2-sj2+1, maxMatrixLen2) );

‎src/IntaRNA/PredictorMfe2dSeedExtensionRIblast.cpp

+9-4
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,8 @@ predict( const IndexRange & r1, const IndexRange & r2 )
7878

7979
size_t si1 = RnaSequence::lastPos, si2 = RnaSequence::lastPos;
8080
while( seedHandler.updateToNextSeed(si1,si2
81-
, 0, interaction_size1+1-seedHandler.getConstraint().getBasePairs()+seedHandler.getConstraint().getMaxUnpaired1()
82-
, 0, interaction_size2+1-seedHandler.getConstraint().getBasePairs()+seedHandler.getConstraint().getMaxUnpaired2()) )
81+
, 0, interaction_size1+1-seedHandler.getConstraint().getBasePairs()
82+
, 0, interaction_size2+1-seedHandler.getConstraint().getBasePairs()) )
8383
{
8484
E_type seedE = seedHandler.getSeedE(si1, si2);
8585
size_t sl1 = seedHandler.getSeedLength1(si1, si2);
@@ -373,8 +373,8 @@ traceBack( Interaction & interaction )
373373

374374
size_t si1 = RnaSequence::lastPos, si2 = RnaSequence::lastPos;
375375
while( seedHandler.updateToNextSeed(si1,si2
376-
, i1,j1+1-seedHandler.getConstraint().getBasePairs()+seedHandler.getConstraint().getMaxUnpaired1()
377-
, i2,j2+1-seedHandler.getConstraint().getBasePairs()+seedHandler.getConstraint().getMaxUnpaired2() ) )
376+
, i1,j1+1-seedHandler.getConstraint().getBasePairs()
377+
, i2,j2+1-seedHandler.getConstraint().getBasePairs() ) )
378378
{
379379
E_type seedE = seedHandler.getSeedE(si1, si2);
380380

@@ -383,6 +383,11 @@ traceBack( Interaction & interaction )
383383
size_t sj1 = si1+sl1-1;
384384
size_t sj2 = si2+sl2-1;
385385

386+
// check if seed exceeds interaction (eg if with bulge)
387+
if ( sj1 > j1 || sj2 > j2 ) {
388+
continue;
389+
}
390+
386391
ExtendedSeed extension;
387392
extension.i1 = si1;
388393
extension.i2 = si2;

‎src/IntaRNA/PredictorMfeEns2dHeuristicSeedExtension.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,8 @@ predict( const IndexRange & r1, const IndexRange & r2 )
7575

7676
size_t si1 = RnaSequence::lastPos, si2 = RnaSequence::lastPos;
7777
while( seedHandler.updateToNextSeed(si1,si2
78-
, 0, range_size1+1-seedHandler.getConstraint().getBasePairs()+seedHandler.getConstraint().getMaxUnpaired1()
79-
, 0, range_size2+1-seedHandler.getConstraint().getBasePairs()+seedHandler.getConstraint().getMaxUnpaired2()) )
78+
, 0, range_size1+1-seedHandler.getConstraint().getBasePairs()
79+
, 0, range_size2+1-seedHandler.getConstraint().getBasePairs()) )
8080
{
8181
const Z_type seedZ = energy.getBoltzmannWeight( seedHandler.getSeedE(si1, si2) );
8282
const size_t sl1 = seedHandler.getSeedLength1(si1, si2);

‎src/IntaRNA/PredictorMfeEns2dSeedExtension.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -76,8 +76,8 @@ predict( const IndexRange & r1, const IndexRange & r2 )
7676

7777
size_t si1 = RnaSequence::lastPos, si2 = RnaSequence::lastPos;
7878
while( seedHandler.updateToNextSeed(si1,si2
79-
, 0, range_size1+1-seedHandler.getConstraint().getBasePairs()+seedHandler.getConstraint().getMaxUnpaired1()
80-
, 0, range_size2+1-seedHandler.getConstraint().getBasePairs()+seedHandler.getConstraint().getMaxUnpaired2()) )
79+
, 0, range_size1+1-seedHandler.getConstraint().getBasePairs()
80+
, 0, range_size2+1-seedHandler.getConstraint().getBasePairs()) )
8181
{
8282
// get Z and boundaries of seed
8383
const Z_type seedZ = energy.getBoltzmannWeight( seedHandler.getSeedE(si1, si2) );

‎src/IntaRNA/SeedHandler.cpp

+4-8
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,6 @@ bool
1111
SeedHandler::
1212
isFeasibleSeedBasePair( const size_t i1, const size_t i2, const bool atEndOfSeed ) const
1313
{
14-
#if INTARNA_IN_DEBUG_MODE
15-
if ( i1 >= energy.size1() ) throw std::runtime_error("SeedHandler::isFeasibleSeedBasePair: i1("+toString(i1)+") >= energy.size1("+toString(energy.size1())+")");
16-
if ( i2 >= energy.size2() ) throw std::runtime_error("SeedHandler::isFeasibleSeedBasePair: i2("+toString(i2)+") >= energy.size2("+toString(energy.size2())+")");
17-
#endif
1814

1915
return i1 < energy.size1() && i2 < energy.size2()
2016
&& energy.isAccessible1(i1)
@@ -52,23 +48,23 @@ updateToNextSeed( size_t & i1_out, size_t & i2_out
5248
i2 = i2min;
5349
} else {
5450
// update to next potential seed position
55-
if (++i1 >= i1maxVal) {
51+
if (++i1 > i1maxVal) {
5652
i1 = i1min;
5753
i2++;
5854
}
5955
}
6056

6157
// find next valid seed start within range
62-
while( i2 < i2maxVal && !(isSeedBound(i1,i2))) {
58+
while( i2 <= i2maxVal && !(isSeedBound(i1,i2))) {
6359
// update seed position within range
64-
if (++i1 == i1maxVal) {
60+
if (++i1 > i1maxVal) {
6561
i1 = i1min;
6662
i2++;
6763
}
6864
}
6965

7066
// check if we found a valid seed in the range
71-
if (i1 < i1maxVal && i2< i2maxVal) {
67+
if (i1 <= i1maxVal && i2 <= i2maxVal) {
7268
i1_out = i1;
7369
i2_out = i2;
7470
return true;

‎src/IntaRNA/SeedHandlerMfe.cpp

+43-38
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,20 @@ fillSeed( const size_t i1min, const size_t i1max, const size_t i2min, const size
6464
// bp=0 encodes 2 base pairs
6565
for (bpIn=0; bpIn<seedE_rec.shape()[2] && (i1+bpIn+1-offset1)<seed.size1() && (i2+bpIn+1-offset2)<seed.size2(); bpIn++) {
6666

67+
bool validLeftEnd = true;
68+
69+
// if no LP : check for direct right-stacking of i
70+
if (noLpShift > 0) {
71+
// check if feasible extension
72+
if (isFeasibleSeedBasePair(i1+1,i2+1)) {
73+
// get stacking energy
74+
iStackE = energy.getE_interLeft(i1,i1+1,i2,i2+1);
75+
} else {
76+
// no valid noLP extension possible
77+
validLeftEnd = false;
78+
}
79+
}
80+
6781
// for feasible unpaired in seq1 in increasing order
6882
for (u1=0; u1<seedE_rec.shape()[3] && (i1+bpIn+1+u1-offset1) < seed.size1(); u1++) {
6983

@@ -76,26 +90,16 @@ fillSeed( const size_t i1min, const size_t i1max, const size_t i2min, const size
7690
// get right seed boundaries
7791
j1 = i1+bpIn+1+u1;
7892
j2 = i2+bpIn+1+u2;
79-
// check if right boundary is complementary and feasible
80-
// check if this index range is to be considered for seed search
81-
bool validSeedSite = isFeasibleSeedBasePair(j1,j2,true);
82-
83-
// if no LP : check for direct right-stacking of i
84-
if (noLpShift > 0) {
85-
// check if feasible extension
86-
if (isFeasibleSeedBasePair(i1+1,i2+1)) {
87-
// get stacking energy
88-
iStackE = energy.getE_interLeft(i1,i1+1,i2,i2+1);
89-
} else {
90-
validSeedSite = false;
91-
}
92-
}
9393

9494
// init current seed energy
9595
curE = E_INF;
9696

97-
// check if right boundary is complementary
98-
if (validSeedSite) {
97+
// check if this index range is to be considered for seed search
98+
// check if boundaries are complementary
99+
if (validLeftEnd
100+
&& isFeasibleSeedBasePair(j1,j2,true)
101+
&& (noLpShift==0 || isFeasibleSeedBasePair(j1-1,j2-1)))
102+
{
99103

100104
// base case: only left and right base pair present
101105
if (bpIn==0) {
@@ -108,8 +112,8 @@ fillSeed( const size_t i1min, const size_t i1max, const size_t i2min, const size
108112
} else {
109113

110114
// explicitly check direct stacking extension in noLP mode
111-
if (noLpShift > 0 && E_isNotINF( getSeedE( i1+1-offset1, i2+1-offset2, bpIn-1, u1, u2 ) )) {
112-
curE = std::min( curE, iStackE + getSeedE( i1+1-offset1, i2+1-offset2, bpIn-1, u1, u2 ) );
115+
if (noLpShift > 0 && E_isNotINF( getSeedE( i1+1, i2+1, bpIn-1, u1, u2 ) )) {
116+
curE = std::min( curE, iStackE + getSeedE( i1+1, i2+1, bpIn-1, u1, u2 ) );
113117
}
114118

115119
// if enough interior base pairs left
@@ -127,15 +131,15 @@ fillSeed( const size_t i1min, const size_t i1max, const size_t i2min, const size
127131
k2 = i2+u2p+1+noLpShift;
128132
// check if split pair is complementary
129133
// and recursed entry is < E_INF
130-
if (! (isFeasibleSeedBasePair(k1,k2) && E_isNotINF( getSeedE( k1-offset1, k2-offset2, bpIn-1-noLpShift, u1-u1p, u2-u2p ) ) ) ) {
134+
if (! (isFeasibleSeedBasePair(k1,k2) && E_isNotINF( getSeedE( k1, k2, bpIn-1-noLpShift, u1-u1p, u2-u2p ) ) ) ) {
131135
continue; // not complementary -> skip
132136
}
133137

134138
// update mfe for split at k1,k2
135139
curE = std::min( curE,
136140
iStackE
137141
+ energy.getE_interLeft(i1+noLpShift,k1,i2+noLpShift,k2)
138-
+ getSeedE( k1-offset1, k2-offset2, bpIn-1-noLpShift, u1-u1p, u2-u2p )
142+
+ getSeedE( k1, k2, bpIn-1-noLpShift, u1-u1p, u2-u2p )
139143
);
140144
} // u2p
141145
} // u1p
@@ -145,8 +149,7 @@ fillSeed( const size_t i1min, const size_t i1max, const size_t i2min, const size
145149
} // (j1,j2) complementary
146150

147151
// store seed energy
148-
setSeedE( i1-offset1, i2-offset2, bpIn, u1, u2, curE );
149-
152+
setSeedE( i1, i2, bpIn, u1, u2, curE );
150153
} // u2
151154
} // u1
152155

@@ -176,7 +179,7 @@ fillSeed( const size_t i1min, const size_t i1max, const size_t i2min, const size
176179
}
177180

178181
// get overall interaction energy
179-
E_type curEhyb = getSeedE( i1-offset1, i2-offset2, bpIn, u1, u2 ) + energy.getE_init();
182+
E_type curEhyb = getSeedE( i1, i2, bpIn, u1, u2 ) + energy.getE_init();
180183
curE = energy.getE( i1, j1, i2, j2, curEhyb );
181184

182185
// check hybrid energy bound including Einit
@@ -195,7 +198,7 @@ fillSeed( const size_t i1min, const size_t i1max, const size_t i2min, const size
195198
// reduce bestE to hybridization energy only (init+loops)
196199
if (E_isNotINF( bestE )) {
197200
// get seed's hybridization loop energies only
198-
bestE = getSeedE( i1-offset1, i2-offset2, bpIn, u1best, u2best );
201+
bestE = getSeedE( i1, i2, bpIn, u1best, u2best );
199202
// count true seed
200203
seedCountNotInf++;
201204
}
@@ -256,13 +259,11 @@ traceBackSeed( Interaction & interaction
256259
// trace each seed base pair (excluding right most)
257260
for( size_t bpIn=1+bpInbetween; bpIn-- > 0; ) {
258261

259-
260-
261262
// base case: only left and right base pair present
262263
if (bpIn==0) {
263264
// add left base pair if not left seed boundary
264265
if (i1 != i1_) {
265-
interaction.basePairs.push_back( energy.getBasePair(i1+offset1,i2+offset2) );
266+
interaction.basePairs.push_back( energy.getBasePair(i1,i2) );
266267
}
267268

268269
} else {
@@ -272,12 +273,16 @@ traceBackSeed( Interaction & interaction
272273
// check if feasible extension
273274
assert(isFeasibleSeedBasePair(i1+1,i2+1));
274275
// get stacking energy
275-
iStackE = energy.getE_interLeft(i1+offset1,i1+1+offset1,i2+offset2,i2+1+offset2);
276+
iStackE = energy.getE_interLeft(i1,i1+1,i2,i2+1);
276277
// noLP : check stacking of i
277278
if ( E_equal( curE, iStackE + getSeedE( i1+1, i2+1, bpIn-1, u1max, u2max )) ) {
279+
// store left base pair if not left seed boundary
280+
if (i1 != i1_) {
281+
interaction.basePairs.push_back( energy.getBasePair(i1,i2) );
282+
}
278283
i1++;
279284
i2++;
280-
curE = getSeedE( i1+1, i2+1, bpIn-1, u1max, u2max );
285+
curE = getSeedE( i1, i2, bpIn-1, u1max, u2max );
281286
continue;
282287
}
283288
// sanity check for noLP mode
@@ -288,36 +293,36 @@ traceBackSeed( Interaction & interaction
288293
// i1 .. i1+u1p+1 .. j1
289294
// i2 .. i2+u2p+1 .. j2
290295
bool traceNotFound = true;
291-
for (u1=1+u1max; traceNotFound && u1-- > 0;) {
292-
for (u2=1+u2max; traceNotFound && u2-- > 0;) {
296+
for (u1=0; traceNotFound && u1<=u1max ; u1++) {
297+
for (u2=0; traceNotFound && u2<=u2max && (u1+u2)<=uMax ; u2++) {
293298
// check if overall number of unpaired is not exceeded
294299
// or skip stacked extension since covered above
295-
if (u1+u2 > uMax || u1+u2 < noLpShift) {
300+
if (u1+u2 < noLpShift) {
296301
continue;
297302
}
298303

299304
k1 = i1+u1+1+noLpShift;
300305
k2 = i2+u2+1+noLpShift;
301306

302307
// check if valid trace
303-
if ( isFeasibleSeedBasePair(k1+offset1, k2+offset2) && E_isNotINF( getSeedE( k1, k2, bpIn-1, u1max-u1, u2max-u2 ) ) ) {
308+
if ( isFeasibleSeedBasePair(k1, k2) && E_isNotINF( getSeedE( k1, k2, bpIn-1-noLpShift, u1max-u1, u2max-u2 ) ) ) {
304309

305310
// check if correct trace
306311
if ( E_equal( curE, iStackE
307-
+ energy.getE_interLeft(i1+noLpShift+offset1,k1+offset1,i2+noLpShift+offset2,k2+offset2)
312+
+ energy.getE_interLeft(i1+noLpShift,k1,i2+noLpShift,k2)
308313
+ getSeedE( k1, k2, bpIn-1-noLpShift, u1max-u1, u2max-u2 )) )
309314
{
315+
// store next energy value to trace
316+
curE = getSeedE( k1, k2, bpIn-1-noLpShift, u1max-u1, u2max-u2 );
310317
// store left base pair if not left seed boundary
311318
if (i1 != i1_) {
312-
interaction.basePairs.push_back( energy.getBasePair(i1+offset1,i2+offset2) );
319+
interaction.basePairs.push_back( energy.getBasePair(i1,i2) );
313320
}
314321
if (noLpShift > 0) {
315-
interaction.basePairs.push_back( energy.getBasePair(i1+noLpShift+offset1,i2+noLpShift+offset2) );
322+
interaction.basePairs.push_back( energy.getBasePair(i1+noLpShift,i2+noLpShift) );
316323
// reflect additional base pair
317324
bpIn--;
318325
}
319-
// store next energy value to trace
320-
curE = getSeedE( k1, k2, bpIn-1-noLpShift, u1max-u1, u2max-u2 );
321326
// reset for next trace step
322327
i1 = k1;
323328
i2 = k2;

0 commit comments

Comments
 (0)