IntaRNA 3.4.1
RNA-RNA interaction prediction | C++ API
Loading...
Searching...
No Matches
SeedHandlerMfe.h
Go to the documentation of this file.
1
2#ifndef INTARNA_SEEDHANDLERMFE_H_
3#define INTARNA_SEEDHANDLERMFE_H_
4
8
9#include <boost/multi_array.hpp>
10
11#include "IntaRNA/Matrix.h"
12
13namespace IntaRNA {
14
21{
22public:
23
31 typedef boost::multi_array<E_type,5> SeedRecMatrix;
32
35 typedef boost::array<SeedRecMatrix::index, 5> SeedIndex;
36
41
42
43public:
44
53 );
54
58 virtual ~SeedHandlerMfe();
59
68 virtual
69 size_t
70 fillSeed(const size_t i1, const size_t j1, const size_t i2, const size_t j2);
71
82 virtual
83 void
84 traceBackSeed( Interaction & interaction, const size_t i1, const size_t i2) const;
85
86
93 virtual
94 E_type
95 getSeedE( const size_t i1, const size_t i2 ) const;
96
105 virtual
106 bool
107 isSeedBound( const size_t i1, const size_t i2 ) const;
108
115 virtual
116 size_t
117 getSeedLength1( const size_t i1, const size_t i2 ) const;
118
125 virtual
126 size_t
127 getSeedLength2( const size_t i1, const size_t i2 ) const;
128
129
130
131protected:
132
137
141
143 size_t offset1;
144
146 size_t offset2;
147
160 E_type
161 getSeedE( const size_t i1, const size_t i2, const size_t bpInbetween, const size_t u1, const size_t u2 ) const;
162
179 void
180 setSeedE( const size_t i1, const size_t i2, const size_t bpInbetween, const size_t u1, const size_t u2, const E_type E );
181
188 size_t
189 encodeSeedLength( const size_t l1, const size_t l2 ) const;
190
197 size_t
198 decodeSeedLength1( const size_t code ) const;
199
206 size_t
207 decodeSeedLength2( const size_t code ) const;
208
221 void
223 , const size_t i1, const size_t i2, const size_t bp
224 , const size_t u1, const size_t u2 ) const;
225
226};
227
228
232
233
234inline
236 const InteractionEnergy & energy
237 , const SeedConstraint & seedConstraint
238 )
239 :
240 SeedHandler(energy,seedConstraint)
241 , seedE_rec( SeedIndex({{ 0,0,0,0,0 }}))
242 , seed()
243 , offset1(0)
244 , offset2(0)
245{
246#if INTARNA_IN_DEBUG_MODE
247 if ( ! seedConstraint.getExplicitSeeds().empty()) {
248 LOG(WARNING) <<"explicit seeds definitions not supported by mfe-seed handler (and thus ignored)";
249 }
250#endif
251}
252
254
255inline
259
261
262inline
263void
265traceBackSeed( Interaction & interaction
266 , const size_t i1
267 , const size_t i2
268 ) const
269{
270#if INTARNA_IN_DEBUG_MODE
271 if ( i1 < offset1 ) throw std::runtime_error("SeedHandlerMfe::traceBackSeed(i1="+toString(i1)+") is out of range (>"+toString(offset1)+")");
272 if ( i1-offset1 >= seed.size1() ) throw std::runtime_error("SeedHandlerMfe::traceBackSeed(i1="+toString(i1)+") is out of range (<"+toString(seed.size1()+offset1)+")");
273 if ( i2 < offset2 ) throw std::runtime_error("SeedHandlerMfe::traceBackSeed(i2="+toString(i2)+") is out of range (>"+toString(offset2)+")");
274 if ( i2-offset2 >= seed.size2() ) throw std::runtime_error("SeedHandlerMfe::traceBackSeed(i2="+toString(i2)+") is out of range (<"+toString(seed.size2()+offset2)+")");
275 if ( !( isSeedBound(i1,i2) ) ) throw std::runtime_error("SeedHandlerMfe::traceBackSeed(i1="+toString(i1)+",i2="+toString(i2)+") no seed known (E_INF)");
276 if ( i1+getSeedLength1(i1,i2)-1-offset1 >= seed.size1() ) throw std::runtime_error("SeedHandlerMfe::traceBackSeed(i1="+toString(i1)+") seed length ("+toString(getSeedLength1(i1,i2))+") exceeds of range (<"+toString(seed.size1()+offset1)+")");
277 if ( i2+getSeedLength2(i1,i2)-1-offset2 >= seed.size2() ) throw std::runtime_error("SeedHandlerMfe::traceBackSeed(i2="+toString(i2)+") seed length ("+toString(getSeedLength2(i1,i2))+") exceeds of range (<"+toString(seed.size2()+offset2)+")");
278#endif
279
280 // get number of base pairs within the seed
281 const size_t seedBps = getConstraint().getBasePairs();
282
283 // trace back the according seed
284 traceBackSeed( interaction, i1, i2
285 , seedBps-2
286 , getSeedLength1(i1,i2)-seedBps
287 , getSeedLength2(i1,i2)-seedBps );
288}
289
291
292inline
293E_type
295getSeedE( const size_t i1, const size_t i2 ) const
296{
297 return seed(i1-offset1,i2-offset2).first;
298}
299
301
302inline
303bool
305isSeedBound( const size_t i1, const size_t i2 ) const
306{
307 return E_isNotINF( getSeedE(i1,i2) );
308}
309
311
312inline
313size_t
315getSeedLength1( const size_t i1, const size_t i2 ) const
316{
317 return decodeSeedLength1(seed(i1-offset1,i2-offset2).second);
318}
319
321
322inline
323size_t
325getSeedLength2( const size_t i1, const size_t i2 ) const
326{
327 return decodeSeedLength2(seed(i1-offset1,i2-offset2).second);
328}
329
331
332inline
333E_type
335getSeedE( const size_t i1, const size_t i2, const size_t bpInbetween, const size_t u1, const size_t u2 ) const
336{
337#if INTARNA_IN_DEBUG_MODE
338 if ( i1 < offset1 ) throw std::runtime_error("SeedHandlerMfe::getSeedE(i1="+toString(i1)+") is out of range (>"+toString(offset1)+")");
339 if ( i1-offset1 >= seed.size1() ) throw std::runtime_error("SeedHandlerMfe::getSeedE(i1="+toString(i1)+") is out of range (<"+toString(seed.size1()+offset1)+")");
340 if ( i2 < offset2 ) throw std::runtime_error("SeedHandlerMfe::getSeedE(i2="+toString(i2)+") is out of range (>"+toString(offset2)+")");
341 if ( i2-offset2 >= seed.size2() ) throw std::runtime_error("SeedHandlerMfe::getSeedE(i2="+toString(i2)+") is out of range (<"+toString(seed.size2()+offset2)+")");
342#endif
343
344 return seedE_rec( SeedIndex({{
345 (SeedRecMatrix::index) (i1-offset1)
346 , (SeedRecMatrix::index) (i2-offset2)
347 , (SeedRecMatrix::index) bpInbetween
348 , (SeedRecMatrix::index) u1
349 , (SeedRecMatrix::index) u2 }}) );
350}
351
353
354inline
355void
357setSeedE( const size_t i1, const size_t i2, const size_t bpInbetween, const size_t u1, const size_t u2, const E_type E )
358{
359#if INTARNA_IN_DEBUG_MODE
360 if ( i1 < offset1 ) throw std::runtime_error("SeedHandlerMfe::setSeedE(i1="+toString(i1)+") is out of range (>"+toString(offset1)+")");
361 if ( i1-offset1 >= seed.size1() ) throw std::runtime_error("SeedHandlerMfe::setSeedE(i1="+toString(i1)+") is out of range (<"+toString(seed.size1()+offset1)+")");
362 if ( i2 < offset2 ) throw std::runtime_error("SeedHandlerMfe::setSeedE(i2="+toString(i2)+") is out of range (>"+toString(offset2)+")");
363 if ( i2-offset2 >= seed.size2() ) throw std::runtime_error("SeedHandlerMfe::setSeedE(i2="+toString(i2)+") is out of range (<"+toString(seed.size2()+offset2)+")");
364#endif
365
367 (SeedRecMatrix::index) (i1-offset1)
368 , (SeedRecMatrix::index) (i2-offset2)
369 , (SeedRecMatrix::index) bpInbetween
370 , (SeedRecMatrix::index) u1
371 , (SeedRecMatrix::index) u2 }}) ) = E;
372}
373
375
376inline
377size_t
379encodeSeedLength( const size_t l1, const size_t l2 ) const
380{
381 return l1 + l2*(seedConstraint.getMaxLength1()+1);
382}
383
385
386inline
387size_t
389decodeSeedLength1( const size_t code ) const
390{
391 return code % (seedConstraint.getMaxLength1()+1);
392}
393
395
396inline
397size_t
399decodeSeedLength2( const size_t code ) const
400{
401 return code / (seedConstraint.getMaxLength1()+1);
402}
403
405
406} // namespace
407
408#endif /* SEEDHANDLERMFE_H_ */
Definition InteractionEnergy.h:20
Definition Interaction.h:28
Definition Matrix.h:49
std::size_t size2() const noexcept
Definition Matrix.h:164
std::size_t size1() const noexcept
Definition Matrix.h:159
Definition SeedConstraint.h:20
size_t getBasePairs() const
Definition SeedConstraint.h:307
size_t getMaxLength1() const
Definition SeedConstraint.h:370
Definition SeedHandlerMfe.h:21
boost::array< SeedRecMatrix::index, 5 > SeedIndex
Definition SeedHandlerMfe.h:35
virtual bool isSeedBound(const size_t i1, const size_t i2) const
Definition SeedHandlerMfe.h:305
size_t decodeSeedLength1(const size_t code) const
Definition SeedHandlerMfe.h:389
size_t offset2
offset for seq2 indices for the current (restricted) matrices
Definition SeedHandlerMfe.h:146
virtual size_t getSeedLength1(const size_t i1, const size_t i2) const
Definition SeedHandlerMfe.h:315
SeedHandlerMfe(const InteractionEnergy &energy, const SeedConstraint &seedConstraint)
Definition SeedHandlerMfe.h:235
virtual ~SeedHandlerMfe()
Definition SeedHandlerMfe.h:256
size_t decodeSeedLength2(const size_t code) const
Definition SeedHandlerMfe.h:399
virtual void traceBackSeed(Interaction &interaction, const size_t i1, const size_t i2) const
Definition SeedHandlerMfe.h:265
virtual size_t fillSeed(const size_t i1, const size_t j1, const size_t i2, const size_t j2)
Matrix< std::pair< E_type, size_t > > SeedMatrix
Definition SeedHandlerMfe.h:40
void setSeedE(const size_t i1, const size_t i2, const size_t bpInbetween, const size_t u1, const size_t u2, const E_type E)
Definition SeedHandlerMfe.h:357
void traceBackSeed(Interaction &interaction, const size_t i1, const size_t i2, const size_t bp, const size_t u1, const size_t u2) const
boost::multi_array< E_type, 5 > SeedRecMatrix
Definition SeedHandlerMfe.h:31
size_t offset1
offset for seq1 indices for the current (restricted) matrices
Definition SeedHandlerMfe.h:143
SeedRecMatrix seedE_rec
Definition SeedHandlerMfe.h:136
size_t encodeSeedLength(const size_t l1, const size_t l2) const
Definition SeedHandlerMfe.h:379
virtual E_type getSeedE(const size_t i1, const size_t i2) const
Definition SeedHandlerMfe.h:295
SeedMatrix seed
Definition SeedHandlerMfe.h:140
virtual size_t getSeedLength2(const size_t i1, const size_t i2) const
Definition SeedHandlerMfe.h:325
Definition SeedHandler.h:17
const SeedConstraint & seedConstraint
the seed constraint to be applied
Definition SeedHandler.h:202
const InteractionEnergy & energy
the used energy function
Definition SeedHandler.h:199
virtual const SeedConstraint & getConstraint() const
Definition SeedHandler.h:237
#define E_isNotINF(e)
check if a given energy is NOT set to E_INF
Definition general.h:137
#define toString(x)
Definition general.h:60
Definition Accessibility.h:13
int E_type
type for energy values (energy + accessibility [ED]) (internally)
Definition general.h:78