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
28 virtual bool guaranteesStackOnlySeeds() const override;
29
30
38 typedef boost::multi_array<E_type,5> SeedRecMatrix;
39
42 typedef boost::array<SeedRecMatrix::index, 5> SeedIndex;
43
48
49
50public:
51
60 );
61
65 virtual ~SeedHandlerMfe() override;
66
75 virtual
76 size_t
77 fillSeed(const size_t i1, const size_t j1, const size_t i2, const size_t j2) override;
78
89 virtual
90 void
91 traceBackSeed( Interaction & interaction, const size_t i1, const size_t i2) const override;
92
93
100 virtual
101 E_type
102 getSeedE( const size_t i1, const size_t i2 ) const override;
103
112 virtual
113 bool
114 isSeedBound( const size_t i1, const size_t i2 ) const override;
115
122 virtual
123 size_t
124 getSeedLength1( const size_t i1, const size_t i2 ) const override;
125
132 virtual
133 size_t
134 getSeedLength2( const size_t i1, const size_t i2 ) const override;
135
136
137
138protected:
139
144
148
150 size_t offset1;
151
153 size_t offset2;
154
167 E_type
168 getSeedE( const size_t i1, const size_t i2, const size_t bpInbetween, const size_t u1, const size_t u2 ) const;
169
186 void
187 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 );
188
195 size_t
196 encodeSeedLength( const size_t l1, const size_t l2 ) const;
197
204 size_t
205 decodeSeedLength1( const size_t code ) const;
206
213 size_t
214 decodeSeedLength2( const size_t code ) const;
215
228 void
230 , const size_t i1, const size_t i2, const size_t bp
231 , const size_t u1, const size_t u2 ) const;
232
233};
234
235
239
240
241inline
243 const InteractionEnergy & energy
244 , const SeedConstraint & seedConstraint
245 )
246 :
247 SeedHandler(energy,seedConstraint)
248 , seedE_rec( SeedIndex({{ 0,0,0,0,0 }}))
249 , seed()
250 , offset1(0)
251 , offset2(0)
252{
253#if INTARNA_IN_DEBUG_MODE
254 if ( ! seedConstraint.getExplicitSeeds().empty()) {
255 LOG(WARNING) <<"explicit seeds definitions not supported by mfe-seed handler (and thus ignored)";
256 }
257#endif
258}
259
261
262inline
266
268
269inline
270void
272traceBackSeed( Interaction & interaction
273 , const size_t i1
274 , const size_t i2
275 ) const
276{
277#if INTARNA_IN_DEBUG_MODE
278 if ( i1 < offset1 ) throw std::runtime_error("SeedHandlerMfe::traceBackSeed(i1="+toString(i1)+") is out of range (>"+toString(offset1)+")");
279 if ( i1-offset1 >= seed.size1() ) throw std::runtime_error("SeedHandlerMfe::traceBackSeed(i1="+toString(i1)+") is out of range (<"+toString(seed.size1()+offset1)+")");
280 if ( i2 < offset2 ) throw std::runtime_error("SeedHandlerMfe::traceBackSeed(i2="+toString(i2)+") is out of range (>"+toString(offset2)+")");
281 if ( i2-offset2 >= seed.size2() ) throw std::runtime_error("SeedHandlerMfe::traceBackSeed(i2="+toString(i2)+") is out of range (<"+toString(seed.size2()+offset2)+")");
282 if ( !( isSeedBound(i1,i2) ) ) throw std::runtime_error("SeedHandlerMfe::traceBackSeed(i1="+toString(i1)+",i2="+toString(i2)+") no seed known (E_INF)");
283 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)+")");
284 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)+")");
285#endif
286
287 // get number of base pairs within the seed
288 const size_t seedBps = getConstraint().getBasePairs();
289
290 // trace back the according seed
291 traceBackSeed( interaction, i1, i2
292 , seedBps-2
293 , getSeedLength1(i1,i2)-seedBps
294 , getSeedLength2(i1,i2)-seedBps );
295}
296
298
299inline
300E_type
302getSeedE( const size_t i1, const size_t i2 ) const
303{
304 return seed(i1-offset1,i2-offset2).first;
305}
306
308
309inline
310bool
312isSeedBound( const size_t i1, const size_t i2 ) const
313{
314 return E_isNotINF( getSeedE(i1,i2) );
315}
316
318
319inline
320size_t
322getSeedLength1( const size_t i1, const size_t i2 ) const
323{
324 return decodeSeedLength1(seed(i1-offset1,i2-offset2).second);
325}
326
328
329inline
330size_t
332getSeedLength2( const size_t i1, const size_t i2 ) const
333{
334 return decodeSeedLength2(seed(i1-offset1,i2-offset2).second);
335}
336
338
339inline
340E_type
342getSeedE( const size_t i1, const size_t i2, const size_t bpInbetween, const size_t u1, const size_t u2 ) const
343{
344#if INTARNA_IN_DEBUG_MODE
345 if ( i1 < offset1 ) throw std::runtime_error("SeedHandlerMfe::getSeedE(i1="+toString(i1)+") is out of range (>"+toString(offset1)+")");
346 if ( i1-offset1 >= seed.size1() ) throw std::runtime_error("SeedHandlerMfe::getSeedE(i1="+toString(i1)+") is out of range (<"+toString(seed.size1()+offset1)+")");
347 if ( i2 < offset2 ) throw std::runtime_error("SeedHandlerMfe::getSeedE(i2="+toString(i2)+") is out of range (>"+toString(offset2)+")");
348 if ( i2-offset2 >= seed.size2() ) throw std::runtime_error("SeedHandlerMfe::getSeedE(i2="+toString(i2)+") is out of range (<"+toString(seed.size2()+offset2)+")");
349#endif
350
351 return seedE_rec( SeedIndex({{
352 (SeedRecMatrix::index) (i1-offset1)
353 , (SeedRecMatrix::index) (i2-offset2)
354 , (SeedRecMatrix::index) bpInbetween
355 , (SeedRecMatrix::index) u1
356 , (SeedRecMatrix::index) u2 }}) );
357}
358
360
361inline
362void
364setSeedE( const size_t i1, const size_t i2, const size_t bpInbetween, const size_t u1, const size_t u2, const E_type E )
365{
366#if INTARNA_IN_DEBUG_MODE
367 if ( i1 < offset1 ) throw std::runtime_error("SeedHandlerMfe::setSeedE(i1="+toString(i1)+") is out of range (>"+toString(offset1)+")");
368 if ( i1-offset1 >= seed.size1() ) throw std::runtime_error("SeedHandlerMfe::setSeedE(i1="+toString(i1)+") is out of range (<"+toString(seed.size1()+offset1)+")");
369 if ( i2 < offset2 ) throw std::runtime_error("SeedHandlerMfe::setSeedE(i2="+toString(i2)+") is out of range (>"+toString(offset2)+")");
370 if ( i2-offset2 >= seed.size2() ) throw std::runtime_error("SeedHandlerMfe::setSeedE(i2="+toString(i2)+") is out of range (<"+toString(seed.size2()+offset2)+")");
371#endif
372
374 (SeedRecMatrix::index) (i1-offset1)
375 , (SeedRecMatrix::index) (i2-offset2)
376 , (SeedRecMatrix::index) bpInbetween
377 , (SeedRecMatrix::index) u1
378 , (SeedRecMatrix::index) u2 }}) ) = E;
379}
380
382
383inline
384size_t
386encodeSeedLength( const size_t l1, const size_t l2 ) const
387{
388 return l1 + l2*(seedConstraint.getMaxLength1()+1);
389}
390
392
393inline
394size_t
396decodeSeedLength1( const size_t code ) const
397{
398 return code % (seedConstraint.getMaxLength1()+1);
399}
400
402
403inline
404size_t
406decodeSeedLength2( const size_t code ) const
407{
408 return code / (seedConstraint.getMaxLength1()+1);
409}
410
412
413inline bool
418
419} // namespace
420
421#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 getMaxUnpaired2() const
Definition SeedConstraint.h:352
size_t getBasePairs() const
Definition SeedConstraint.h:307
size_t getMaxLength1() const
Definition SeedConstraint.h:370
size_t getMaxUnpaired1() const
Definition SeedConstraint.h:343
Definition SeedHandlerMfe.h:21
virtual bool isSeedBound(const size_t i1, const size_t i2) const override
Definition SeedHandlerMfe.h:312
virtual size_t getSeedLength2(const size_t i1, const size_t i2) const override
Definition SeedHandlerMfe.h:332
boost::array< SeedRecMatrix::index, 5 > SeedIndex
Definition SeedHandlerMfe.h:42
virtual bool guaranteesStackOnlySeeds() const override
Definition SeedHandlerMfe.h:414
size_t decodeSeedLength1(const size_t code) const
Definition SeedHandlerMfe.h:396
virtual size_t fillSeed(const size_t i1, const size_t j1, const size_t i2, const size_t j2) override
virtual void traceBackSeed(Interaction &interaction, const size_t i1, const size_t i2) const override
Definition SeedHandlerMfe.h:272
size_t offset2
offset for seq2 indices for the current (restricted) matrices
Definition SeedHandlerMfe.h:153
virtual size_t getSeedLength1(const size_t i1, const size_t i2) const override
Definition SeedHandlerMfe.h:322
SeedHandlerMfe(const InteractionEnergy &energy, const SeedConstraint &seedConstraint)
Definition SeedHandlerMfe.h:242
virtual E_type getSeedE(const size_t i1, const size_t i2) const override
Definition SeedHandlerMfe.h:302
size_t decodeSeedLength2(const size_t code) const
Definition SeedHandlerMfe.h:406
virtual ~SeedHandlerMfe() override
Definition SeedHandlerMfe.h:263
Matrix< std::pair< E_type, size_t > > SeedMatrix
Definition SeedHandlerMfe.h:47
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:364
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:38
size_t offset1
offset for seq1 indices for the current (restricted) matrices
Definition SeedHandlerMfe.h:150
SeedRecMatrix seedE_rec
Definition SeedHandlerMfe.h:143
size_t encodeSeedLength(const size_t l1, const size_t l2) const
Definition SeedHandlerMfe.h:386
SeedMatrix seed
Definition SeedHandlerMfe.h:147
Definition SeedHandler.h:17
const SeedConstraint & seedConstraint
the seed constraint to be applied
Definition SeedHandler.h:209
const InteractionEnergy & energy
the used energy function
Definition SeedHandler.h:206
virtual const SeedConstraint & getConstraint() const
Definition SeedHandler.h:244
#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