From 46e7ac90a67a371907ba6b958dec87aa14e5e00e Mon Sep 17 00:00:00 2001 From: Vladimir Reinharz Date: Thu, 20 Sep 2012 11:53:41 -0400 Subject: [PATCH] initialized with 16_Jan_2012 src --- .gitignore | 1 + Makefile | 16 + lib/.DS_Store | Bin 0 -> 6148 bytes lib/dat/asint1x2.dat | 378 +++++ lib/dat/asint1x2.lop.dat | 96 ++ lib/dat/begin.dat | 12 + lib/dat/coaxial.dat | 72 + lib/dat/coaxstack.dat | 70 + lib/dat/dangle.dat | 80 ++ lib/dat/dangle.lop.dat | 8 + lib/dat/int11.dat | 108 ++ lib/dat/int21.dat | 378 +++++ lib/dat/int22.dat | 967 +++++++++++++ lib/dat/loop.dat | 34 + lib/dat/loop.lop.dat | 30 + lib/dat/miscloop.dat | 54 + lib/dat/miscloop.lop.dat | 12 + lib/dat/sint2.dat | 108 ++ lib/dat/sint2.lop.dat | 24 + lib/dat/sint4.dat | 967 +++++++++++++ lib/dat/sint4.lop.dat | 576 ++++++++ lib/dat/stack.dat | 69 + lib/dat/stack.lop.dat | 16 + lib/dat/temp.lop.dat | 1 + lib/dat/tloop.dat | 32 + lib/dat/tloop.lop.dat | 30 + lib/dat/triloop.dat | 2 + lib/dat/triloop.lop.dat | 0 lib/dat/tstack.dat | 69 + lib/dat/tstackcoax.dat | 69 + lib/dat/tstackh.dat | 70 + lib/dat/tstackh.lop.dat | 16 + lib/dat/tstacki.dat | 70 + lib/dat/tstacki.lop.dat | 16 + lib/dat/tstackm.dat | 70 + license.txt | 41 + readme.txt | 1 + scripts/fixedGCSampling.py | 283 ++++ src/RNAmutants.c | 2728 ++++++++++++++++++++++++++++++++++++ src/RNAmutants.h | 196 +++ src/constraints.c | 287 ++++ src/constraints.h | 29 + src/energy_functions.c | 698 +++++++++ src/energy_functions.h | 40 + src/energy_params_tables.h | 140 ++ src/hybrid.c | 1280 +++++++++++++++++ src/hybrid.h | 4 + src/mfe_backtrack.c | 1595 +++++++++++++++++++++ src/mfe_backtrack.h | 6 + src/reader_energy_params.c | 1243 ++++++++++++++++ src/reader_energy_params.h | 75 + src/sampling.c | 2276 ++++++++++++++++++++++++++++++ src/sampling.h | 10 + src/util.c | 605 ++++++++ src/util.h | 48 + 55 files changed, 16106 insertions(+) create mode 100644 .gitignore create mode 100644 Makefile create mode 100644 lib/.DS_Store create mode 100644 lib/dat/asint1x2.dat create mode 100644 lib/dat/asint1x2.lop.dat create mode 100644 lib/dat/begin.dat create mode 100644 lib/dat/coaxial.dat create mode 100644 lib/dat/coaxstack.dat create mode 100644 lib/dat/dangle.dat create mode 100644 lib/dat/dangle.lop.dat create mode 100644 lib/dat/int11.dat create mode 100644 lib/dat/int21.dat create mode 100644 lib/dat/int22.dat create mode 100644 lib/dat/loop.dat create mode 100644 lib/dat/loop.lop.dat create mode 100644 lib/dat/miscloop.dat create mode 100644 lib/dat/miscloop.lop.dat create mode 100644 lib/dat/sint2.dat create mode 100644 lib/dat/sint2.lop.dat create mode 100644 lib/dat/sint4.dat create mode 100644 lib/dat/sint4.lop.dat create mode 100644 lib/dat/stack.dat create mode 100644 lib/dat/stack.lop.dat create mode 100644 lib/dat/temp.lop.dat create mode 100644 lib/dat/tloop.dat create mode 100644 lib/dat/tloop.lop.dat create mode 100644 lib/dat/triloop.dat create mode 100644 lib/dat/triloop.lop.dat create mode 100644 lib/dat/tstack.dat create mode 100644 lib/dat/tstackcoax.dat create mode 100644 lib/dat/tstackh.dat create mode 100644 lib/dat/tstackh.lop.dat create mode 100644 lib/dat/tstacki.dat create mode 100644 lib/dat/tstacki.lop.dat create mode 100644 lib/dat/tstackm.dat create mode 100644 license.txt create mode 100644 readme.txt create mode 100644 scripts/fixedGCSampling.py create mode 100644 src/RNAmutants.c create mode 100644 src/RNAmutants.h create mode 100644 src/constraints.c create mode 100644 src/constraints.h create mode 100644 src/energy_functions.c create mode 100644 src/energy_functions.h create mode 100644 src/energy_params_tables.h create mode 100644 src/hybrid.c create mode 100644 src/hybrid.h create mode 100644 src/mfe_backtrack.c create mode 100644 src/mfe_backtrack.h create mode 100644 src/reader_energy_params.c create mode 100644 src/reader_energy_params.h create mode 100644 src/sampling.c create mode 100644 src/sampling.h create mode 100644 src/util.c create mode 100644 src/util.h diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e43b0f9 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.DS_Store diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..0ce3b6f --- /dev/null +++ b/Makefile @@ -0,0 +1,16 @@ +SRC_DIR = src + +SRC_C_FILES = src/constraints.c src/RNAmutants.c src/util.c src/sampling.c src/mfe_backtrack.c src/energy_functions.c src/reader_energy_params.c src/hybrid.c + +SRC_H_FILES = src/util.h src/constraints.h src/sampling.h src/reader_energy_params.h src/energy_params_tables.h src/mfe_backtrack.h src/RNAmutants.h src/energy_functions.h src/hybrid.h + + +all : RNAmutants + +RNAmutants : $(SRC_C_FILES) $(SRC_H_FILES) + (cd $(SRC_DIR) && $(MAKE) $@) || exit 1;\ + (mv $(SRC_DIR)/RNAmutants .) || exit 1 + +clean : + (cd $(SRC_DIR) && $(MAKE) $@) || exit 1;\ + (rm -f *~) || exit 1 diff --git a/lib/.DS_Store b/lib/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0 3' + X + A A + U U + YA + 3' <-- 5' +(A) . . . . +(C) . . . . +(G) . . . . +(U) . . . . + + Y Y Y Y Y Y + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + X X X X X X + A A A C A G A U A G A U + U U U G U C U A U U U G + YA YA YA YA YA YA + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + 3.90 3.70 3.10 5.50 3.20 3.00 2.40 4.80 3.20 3.00 2.40 4.80 3.90 3.70 3.10 5.50 3.90 3.70 3.10 5.50 3.90 3.70 3.10 5.50 + 3.80 3.70 5.50 3.70 3.10 3.00 4.80 3.00 3.10 3.00 4.80 3.00 3.80 3.70 5.50 3.70 3.80 3.70 5.50 3.70 3.80 3.70 5.50 3.70 + 3.20 5.50 2.30 5.50 2.50 4.80 1.60 4.80 2.50 4.80 1.60 4.80 3.20 5.50 2.30 5.50 3.20 5.50 2.30 5.50 3.20 5.50 2.30 5.50 + 5.50 5.50 5.50 5.50 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 + + Y Y Y Y Y Y + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + X X X X X X + A A A C A G A U A G A U + U U U G U C U A U U U G + YC YC YC YC YC YC + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + 3.60 3.20 3.10 5.50 2.90 2.50 2.40 4.80 2.90 2.50 2.40 4.80 3.60 3.20 3.10 5.50 3.60 3.20 3.10 5.50 3.60 3.20 3.10 5.50 + 3.70 4.00 5.50 3.70 3.00 3.30 4.80 3.00 3.00 3.30 4.80 3.00 3.70 4.00 5.50 3.70 3.70 4.00 5.50 3.70 3.70 4.00 5.50 3.70 + 5.50 5.50 5.50 5.50 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 + 5.50 3.70 5.50 2.80 4.80 3.00 4.80 2.10 4.80 3.00 4.80 2.10 5.50 3.70 5.50 2.80 5.50 3.70 5.50 2.80 5.50 3.70 5.50 2.80 + + Y Y Y Y Y Y + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + X X X X X X + A A A C A G A U A G A U + U U U G U C U A U U U G + YG YG YG YG YG YG + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + 2.50 2.10 1.90 5.50 1.80 1.40 1.20 4.80 1.80 1.40 1.20 4.80 2.50 2.10 1.90 5.50 2.50 2.10 1.90 5.50 2.50 2.10 1.90 5.50 + 5.50 5.50 5.50 5.50 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 + 2.30 5.50 3.70 5.50 1.60 4.80 3.00 4.80 1.60 4.80 3.00 4.80 2.30 5.50 3.70 5.50 2.30 5.50 3.70 5.50 2.30 5.50 3.70 5.50 + 5.50 5.50 5.50 5.50 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 + + Y Y Y Y Y Y + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + X X X X X X + A A A C A G A U A G A U + U U U G U C U A U U U G + YU YU YU YU YU YU + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + 5.50 5.50 5.50 5.50 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 + 4.00 3.40 5.50 3.70 3.30 2.70 4.80 3.00 3.30 2.70 4.80 3.00 4.00 3.40 5.50 3.70 4.00 3.40 5.50 3.70 4.00 3.40 5.50 3.70 + 5.50 5.50 5.50 5.50 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 + 5.50 3.20 5.50 2.70 4.80 2.50 4.80 2.00 4.80 2.50 4.80 2.00 5.50 3.20 5.50 2.70 5.50 3.20 5.50 2.70 5.50 3.20 5.50 2.70 + + Y Y Y Y Y Y + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + X X X X X X + C A C C C G C U C G C U + G U G G G C G A G U G G + YA YA YA YA YA YA + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + 3.20 3.00 2.40 4.80 2.30 2.20 1.10 4.00 2.40 2.20 1.60 4.00 3.20 3.00 2.40 4.80 3.20 3.00 2.40 4.80 3.20 3.00 2.40 4.80 + 3.10 3.00 4.80 3.00 2.30 2.20 4.00 2.20 2.30 2.20 4.00 2.20 3.10 3.00 4.80 3.00 3.10 3.00 4.80 3.00 3.10 3.00 4.80 3.00 + 2.50 4.80 1.60 4.80 1.70 4.00 0.80 4.00 1.70 4.00 0.80 4.00 2.50 4.80 1.60 4.80 2.50 4.80 1.60 4.80 2.50 4.80 1.60 4.80 + 4.80 4.80 4.80 4.80 4.00 4.00 4.00 4.00 4.00 4.00 4.00 4.00 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 + + Y Y Y Y Y Y + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + X X X X X X + C A C C C G C U C G C U + G U G G G C G A G U G G + YC YC YC YC YC YC + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + 2.90 2.50 2.40 4.80 2.10 1.70 1.60 4.00 2.10 1.70 1.60 4.00 2.90 2.50 2.40 4.80 2.90 2.50 2.40 4.80 2.90 2.50 2.40 4.80 + 3.00 3.30 4.80 3.00 2.20 2.50 4.00 2.20 2.20 2.50 4.00 2.20 3.00 3.30 4.80 3.00 3.00 3.30 4.80 3.00 3.00 3.30 4.80 3.00 + 4.80 4.80 4.80 4.80 4.00 4.00 4.00 4.00 4.00 4.00 4.00 4.00 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 + 4.80 3.00 4.80 2.10 4.00 2.20 4.00 1.50 4.00 2.20 4.00 1.30 4.80 3.00 4.80 2.10 4.80 3.00 4.80 2.10 4.80 3.00 4.80 2.10 + + Y Y Y Y Y Y + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + X X X X X X + C A C C C G C U C G C U + G U G G G C G A G U G G + YG YG YG YG YG YG + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + 1.80 1.40 1.20 4.80 0.80 0.60 0.40 4.00 1.00 0.60 0.40 4.00 1.80 1.40 1.20 4.80 1.80 1.40 1.20 4.80 1.80 1.40 1.20 4.80 + 4.80 4.80 4.80 4.80 4.00 4.00 4.00 4.00 4.00 4.00 4.00 4.00 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 + 1.60 4.80 3.00 4.80 0.80 4.00 2.20 4.00 0.80 4.00 2.20 4.00 1.60 4.80 3.00 4.80 1.60 4.80 3.00 4.80 1.60 4.80 3.00 4.80 + 4.80 4.80 4.80 4.80 4.00 4.00 4.00 4.00 4.00 4.00 4.00 4.00 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 + + Y Y Y Y Y Y + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + X X X X X X + C A C C C G C U C G C U + G U G G G C G A G U G G + YU YU YU YU YU YU + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + 4.80 4.80 4.80 4.80 4.00 4.00 4.00 4.00 4.00 4.00 4.00 4.00 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 + 3.30 2.70 4.80 3.00 2.50 1.90 4.00 2.20 2.50 1.90 4.00 2.20 3.30 2.70 4.80 3.00 3.30 2.70 4.80 3.00 3.30 2.70 4.80 3.00 + 4.80 4.80 4.80 4.80 4.00 4.00 4.00 4.00 4.00 4.00 4.00 4.00 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 + 4.80 2.50 4.80 2.00 4.00 1.70 4.00 1.20 4.00 1.70 4.00 1.20 4.80 2.50 4.80 2.00 4.80 2.50 4.80 2.00 4.80 2.50 4.80 2.00 + + Y Y Y Y Y Y + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + X X X X X X + G A G C G G G U G G G U + C U C G C C C A C U C G + YA YA YA YA YA YA + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + 3.20 3.00 2.40 4.80 2.40 2.20 1.60 4.00 2.50 2.20 2.10 4.00 3.20 3.00 2.40 4.80 3.20 3.00 2.40 4.80 3.20 3.00 2.40 4.80 + 3.10 3.00 4.80 3.00 2.30 2.20 4.00 2.20 2.30 2.20 4.00 2.20 3.10 3.00 4.80 3.00 3.10 3.00 4.80 3.00 3.10 3.00 4.80 3.00 + 2.50 4.80 1.60 4.80 1.70 4.00 0.80 4.00 1.70 4.00 0.80 4.00 2.50 4.80 1.60 4.80 2.50 4.80 1.60 4.80 2.50 4.80 1.60 4.80 + 4.80 4.80 4.80 4.80 4.00 4.00 4.00 4.00 4.00 4.00 4.00 4.00 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 + + Y Y Y Y Y Y + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + X X X X X X + G A G C G G G U G G G U + C U C G C C C A C U C G + YC YC YC YC YC YC + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + 2.90 2.50 2.40 4.80 2.10 1.70 1.60 4.00 2.10 1.70 1.60 4.00 2.90 2.50 2.40 4.80 2.90 2.50 2.40 4.80 2.90 2.50 2.40 4.80 + 3.00 3.30 4.80 3.00 2.20 2.50 4.00 2.20 2.20 2.50 4.00 2.20 3.00 3.30 4.80 3.00 3.00 3.30 4.80 3.00 3.00 3.30 4.80 3.00 + 4.80 4.80 4.80 4.80 4.00 4.00 4.00 4.00 4.00 4.00 4.00 4.00 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 + 4.80 3.00 4.80 2.10 4.00 2.20 4.00 1.30 4.00 2.20 4.00 1.20 4.80 3.00 4.80 2.10 4.80 3.00 4.80 2.10 4.80 3.00 4.80 2.10 + + Y Y Y Y Y Y + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + X X X X X X + G A G C G G G U G G G U + C U C G C C C A C U C G + YG YG YG YG YG YG + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + 1.80 1.40 1.20 4.80 1.00 0.60 0.40 4.00 1.20 0.60 0.40 4.00 1.80 1.40 1.20 4.80 1.80 1.40 1.20 4.80 1.80 1.40 1.20 4.80 + 4.80 4.80 4.80 4.80 4.00 4.00 4.00 4.00 4.00 4.00 4.00 4.00 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 + 1.60 4.80 3.00 4.80 0.80 4.00 2.20 4.00 0.80 4.00 2.20 4.00 1.60 4.80 3.00 4.80 1.60 4.80 3.00 4.80 1.60 4.80 3.00 4.80 + 4.80 4.80 4.80 4.80 4.00 4.00 4.00 4.00 4.00 4.00 4.00 4.00 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 + + Y Y Y Y Y Y + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + X X X X X X + G A G C G G G U G G G U + C U C G C C C A C U C G + YU YU YU YU YU YU + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + 4.80 4.80 4.80 4.80 4.00 4.00 4.00 4.00 4.00 4.00 4.00 4.00 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 + 3.30 2.70 4.80 3.00 2.50 1.90 4.00 2.20 2.50 1.90 4.00 2.20 3.30 2.70 4.80 3.00 3.30 2.70 4.80 3.00 3.30 2.70 4.80 3.00 + 4.80 4.80 4.80 4.80 4.00 4.00 4.00 4.00 4.00 4.00 4.00 4.00 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 + 4.80 2.50 4.80 2.00 4.00 1.70 4.00 1.20 4.00 1.70 4.00 1.20 4.80 2.50 4.80 2.00 4.80 2.50 4.80 2.00 4.80 2.50 4.80 2.00 + + Y Y Y Y Y Y + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + X X X X X X + U A U C U G U U U G U U + A U A G A C A A A U A G + YA YA YA YA YA YA + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + 3.90 3.70 3.10 5.50 3.20 3.00 2.40 4.80 3.20 3.00 2.40 4.80 3.90 3.70 3.10 5.50 3.90 3.70 3.10 5.50 3.90 3.70 3.10 5.50 + 3.80 3.70 5.50 3.70 3.10 3.00 4.80 3.00 3.10 3.00 4.80 3.00 3.80 3.70 5.50 3.70 3.80 3.70 5.50 3.70 3.80 3.70 5.50 3.70 + 3.20 5.50 2.30 5.50 2.50 4.80 1.60 4.80 2.50 4.80 1.60 4.80 3.20 5.50 2.30 5.50 3.20 5.50 2.30 5.50 3.20 5.50 2.30 5.50 + 5.50 5.50 5.50 5.50 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 + + Y Y Y Y Y Y + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + X X X X X X + U A U C U G U U U G U U + A U A G A C A A A U A G + YC YC YC YC YC YC + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + 3.60 3.20 3.10 5.50 2.90 2.50 2.40 4.80 2.90 2.50 2.40 4.80 3.60 3.20 3.10 5.50 3.60 3.20 3.10 5.50 3.60 3.20 3.10 5.50 + 3.70 4.00 5.50 3.70 3.00 3.30 4.80 3.00 3.00 3.30 4.80 3.00 3.70 4.00 5.50 3.70 3.70 4.00 5.50 3.70 3.70 4.00 5.50 3.70 + 5.50 5.50 5.50 5.50 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 + 5.50 3.70 5.50 2.80 4.80 3.00 4.80 2.10 4.80 3.00 4.80 2.10 5.50 3.70 5.50 2.80 5.50 3.70 5.50 2.80 5.50 3.70 5.50 2.80 + + Y Y Y Y Y Y + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + X X X X X X + U A U C U G U U U G U U + A U A G A C A A A U A G + YG YG YG YG YG YG + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + 2.50 2.10 1.90 5.50 1.80 1.40 1.20 4.80 1.80 1.40 1.20 4.80 2.50 2.10 1.90 5.50 2.50 2.10 1.90 5.50 2.50 2.10 1.90 5.50 + 5.50 5.50 5.50 5.50 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 + 2.30 5.50 3.70 5.50 1.60 4.80 3.00 4.80 1.60 4.80 3.00 4.80 2.30 5.50 3.70 5.50 2.30 5.50 3.70 5.50 2.30 5.50 3.70 5.50 + 5.50 5.50 5.50 5.50 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 + + Y Y Y Y Y Y + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + X X X X X X + U A U C U G U U U G U U + A U A G A C A A A U A G + YU YU YU YU YU YU + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + 5.50 5.50 5.50 5.50 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 + 4.00 3.40 5.50 3.70 3.30 2.70 4.80 3.00 3.30 2.70 4.80 3.00 4.00 3.40 5.50 3.70 4.00 3.40 5.50 3.70 4.00 3.40 5.50 3.70 + 5.50 5.50 5.50 5.50 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 + 5.50 3.20 5.50 2.70 4.80 2.50 4.80 2.00 4.80 2.50 4.80 2.00 5.50 3.20 5.50 2.70 5.50 3.20 5.50 2.70 5.50 3.20 5.50 2.70 + + Y Y Y Y Y Y + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + X X X X X X + G A G C G G G U G G G U + U U U G U C U A U U U G + YA YA YA YA YA YA + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + 3.90 3.70 3.10 5.50 3.20 3.00 2.40 4.80 3.20 3.00 2.40 4.80 3.90 3.70 3.10 5.50 3.90 3.70 3.10 5.50 3.90 3.70 3.10 5.50 + 3.80 3.70 5.50 3.70 3.10 3.00 4.80 3.00 3.10 3.00 4.80 3.00 3.80 3.70 5.50 3.70 3.80 3.70 5.50 3.70 3.80 3.70 5.50 3.70 + 3.20 5.50 2.30 5.50 2.50 4.80 1.60 4.80 2.50 4.80 1.60 4.80 3.20 5.50 2.30 5.50 3.20 5.50 2.30 5.50 3.20 5.50 2.30 5.50 + 5.50 5.50 5.50 5.50 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 + + Y Y Y Y Y Y + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + X X X X X X + G A G C G G G U G G G U + U U U G U C U A U U U G + YC YC YC YC YC YC + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + 3.60 3.20 3.10 5.50 2.90 2.50 2.40 4.80 2.90 2.50 2.40 4.80 3.60 3.20 3.10 5.50 3.60 3.20 3.10 5.50 3.60 3.20 3.10 5.50 + 3.70 4.00 5.50 3.70 3.00 3.30 4.80 3.00 3.00 3.30 4.80 3.00 3.70 4.00 5.50 3.70 3.70 4.00 5.50 3.70 3.70 4.00 5.50 3.70 + 5.50 5.50 5.50 5.50 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 + 5.50 3.70 5.50 2.80 4.80 3.00 4.80 2.10 4.80 3.00 4.80 2.10 5.50 3.70 5.50 2.80 5.50 3.70 5.50 2.80 5.50 3.70 5.50 2.80 + + Y Y Y Y Y Y + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + X X X X X X + G A G C G G G U G G G U + U U U G U C U A U U U G + YG YG YG YG YG YG + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + 2.50 2.10 1.90 5.50 1.80 1.40 1.20 4.80 1.80 1.40 1.20 4.80 2.50 2.10 1.90 5.50 2.50 2.10 1.90 5.50 2.50 2.10 1.90 5.50 + 5.50 5.50 5.50 5.50 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 + 2.30 5.50 3.70 5.50 1.60 4.80 3.00 4.80 1.60 4.80 3.00 4.80 2.30 5.50 3.70 5.50 2.30 5.50 3.70 5.50 2.30 5.50 3.70 5.50 + 5.50 5.50 5.50 5.50 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 + + Y Y Y Y Y Y + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + X X X X X X + G A G C G G G U G G G U + U U U G U C U A U U U G + YU YU YU YU YU YU + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + 5.50 5.50 5.50 5.50 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 + 4.00 3.40 5.50 3.70 3.30 2.70 4.80 3.00 3.30 2.70 4.80 3.00 4.00 3.40 5.50 3.70 4.00 3.40 5.50 3.70 4.00 3.40 5.50 3.70 + 5.50 5.50 5.50 5.50 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 + 5.50 3.20 5.50 2.70 4.80 2.50 4.80 2.00 4.80 2.50 4.80 2.00 5.50 3.20 5.50 2.70 5.50 3.20 5.50 2.70 5.50 3.20 5.50 2.70 + + Y Y Y Y Y Y + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + X X X X X X + U A U C U G U U U G U U + G U G G G C G A G U G G + YA YA YA YA YA YA + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + 3.90 3.70 3.10 5.50 3.20 3.00 2.40 4.80 3.20 3.00 2.40 4.80 3.90 3.70 3.10 5.50 3.90 3.70 3.10 5.50 3.90 3.70 3.10 5.50 + 3.80 3.70 5.50 3.70 3.10 3.00 4.80 3.00 3.10 3.00 4.80 3.00 3.80 3.70 5.50 3.70 3.80 3.70 5.50 3.70 3.80 3.70 5.50 3.70 + 3.20 5.50 2.30 5.50 2.50 4.80 1.60 4.80 2.50 4.80 1.60 4.80 3.20 5.50 2.30 5.50 3.20 5.50 2.30 5.50 3.20 5.50 2.30 5.50 + 5.50 5.50 5.50 5.50 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 + + Y Y Y Y Y Y + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + X X X X X X + U A U C U G U U U G U U + G U G G G C G A G U G G + YC YC YC YC YC YC + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + 3.60 3.20 3.10 5.50 2.90 2.50 2.40 4.80 2.90 2.50 2.40 4.80 3.60 3.20 3.10 5.50 3.60 3.20 3.10 5.50 3.60 3.20 3.10 5.50 + 3.70 4.00 5.50 3.70 3.00 3.30 4.80 3.00 3.00 3.30 4.80 3.00 3.70 4.00 5.50 3.70 3.70 4.00 5.50 3.70 3.70 4.00 5.50 3.70 + 5.50 5.50 5.50 5.50 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 + 5.50 3.70 5.50 2.80 4.80 3.00 4.80 2.10 4.80 3.00 4.80 2.10 5.50 3.70 5.50 2.80 5.50 3.70 5.50 2.80 5.50 3.70 5.50 2.80 + + Y Y Y Y Y Y + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + X X X X X X + U A U C U G U U U G U U + G U G G G C G A G U G G + YG YG YG YG YG YG + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + 2.50 2.10 1.90 5.50 1.80 1.40 1.20 4.80 1.80 1.40 1.20 4.80 2.50 2.10 1.90 5.50 2.50 2.10 1.90 5.50 2.50 2.10 1.90 5.50 + 5.50 5.50 5.50 5.50 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 + 2.30 5.50 3.70 5.50 1.60 4.80 3.00 4.80 1.60 4.80 3.00 4.80 2.30 5.50 3.70 5.50 2.30 5.50 3.70 5.50 2.30 5.50 3.70 5.50 + 5.50 5.50 5.50 5.50 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 + + Y Y Y Y Y Y + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + X X X X X X + U A U C U G U U U G U U + G U G G G C G A G U G G + YU YU YU YU YU YU + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + 5.50 5.50 5.50 5.50 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 + 4.00 3.40 5.50 3.70 3.30 2.70 4.80 3.00 3.30 2.70 4.80 3.00 4.00 3.40 5.50 3.70 4.00 3.40 5.50 3.70 4.00 3.40 5.50 3.70 + 5.50 5.50 5.50 5.50 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 + 5.50 3.20 5.50 2.70 4.80 2.50 4.80 2.00 4.80 2.50 4.80 2.00 5.50 3.20 5.50 2.70 5.50 3.20 5.50 2.70 5.50 3.20 5.50 2.70 diff --git a/lib/dat/asint1x2.lop.dat b/lib/dat/asint1x2.lop.dat new file mode 100644 index 0000000..f6f66c3 --- /dev/null +++ b/lib/dat/asint1x2.lop.dat @@ -0,0 +1,96 @@ + 3.90 3.70 3.10 5.50 3.20 3.00 2.40 4.80 3.20 3.00 2.40 4.80 3.90 3.70 3.10 5.50 3.90 3.70 3.10 5.50 3.90 3.70 3.10 5.50 + 3.80 3.70 5.50 3.70 3.10 3.00 4.80 3.00 3.10 3.00 4.80 3.00 3.80 3.70 5.50 3.70 3.80 3.70 5.50 3.70 3.80 3.70 5.50 3.70 + 3.20 5.50 2.30 5.50 2.50 4.80 1.60 4.80 2.50 4.80 1.60 4.80 3.20 5.50 2.30 5.50 3.20 5.50 2.30 5.50 3.20 5.50 2.30 5.50 + 5.50 5.50 5.50 5.50 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 + 3.60 3.20 3.10 5.50 2.90 2.50 2.40 4.80 2.90 2.50 2.40 4.80 3.60 3.20 3.10 5.50 3.60 3.20 3.10 5.50 3.60 3.20 3.10 5.50 + 3.70 4.00 5.50 3.70 3.00 3.30 4.80 3.00 3.00 3.30 4.80 3.00 3.70 4.00 5.50 3.70 3.70 4.00 5.50 3.70 3.70 4.00 5.50 3.70 + 5.50 5.50 5.50 5.50 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 + 5.50 3.70 5.50 2.80 4.80 3.00 4.80 2.10 4.80 3.00 4.80 2.10 5.50 3.70 5.50 2.80 5.50 3.70 5.50 2.80 5.50 3.70 5.50 2.80 + 2.50 2.10 1.90 5.50 1.80 1.40 1.20 4.80 1.80 1.40 1.20 4.80 2.50 2.10 1.90 5.50 2.50 2.10 1.90 5.50 2.50 2.10 1.90 5.50 + 5.50 5.50 5.50 5.50 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 + 2.30 5.50 3.70 5.50 1.60 4.80 3.00 4.80 1.60 4.80 3.00 4.80 2.30 5.50 3.70 5.50 2.30 5.50 3.70 5.50 2.30 5.50 3.70 5.50 + 5.50 5.50 5.50 5.50 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 + 5.50 5.50 5.50 5.50 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 + 4.00 3.40 5.50 3.70 3.30 2.70 4.80 3.00 3.30 2.70 4.80 3.00 4.00 3.40 5.50 3.70 4.00 3.40 5.50 3.70 4.00 3.40 5.50 3.70 + 5.50 5.50 5.50 5.50 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 + 5.50 3.20 5.50 2.70 4.80 2.50 4.80 2.00 4.80 2.50 4.80 2.00 5.50 3.20 5.50 2.70 5.50 3.20 5.50 2.70 5.50 3.20 5.50 2.70 + 3.20 3.00 2.40 4.80 2.30 2.20 1.10 4.00 2.40 2.20 1.60 4.00 3.20 3.00 2.40 4.80 3.20 3.00 2.40 4.80 3.20 3.00 2.40 4.80 + 3.10 3.00 4.80 3.00 2.30 2.20 4.00 2.20 2.30 2.20 4.00 2.20 3.10 3.00 4.80 3.00 3.10 3.00 4.80 3.00 3.10 3.00 4.80 3.00 + 2.50 4.80 1.60 4.80 1.70 4.00 0.80 4.00 1.70 4.00 0.80 4.00 2.50 4.80 1.60 4.80 2.50 4.80 1.60 4.80 2.50 4.80 1.60 4.80 + 4.80 4.80 4.80 4.80 4.00 4.00 4.00 4.00 4.00 4.00 4.00 4.00 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 + 2.90 2.50 2.40 4.80 2.10 1.70 1.60 4.00 2.10 1.70 1.60 4.00 2.90 2.50 2.40 4.80 2.90 2.50 2.40 4.80 2.90 2.50 2.40 4.80 + 3.00 3.30 4.80 3.00 2.20 2.50 4.00 2.20 2.20 2.50 4.00 2.20 3.00 3.30 4.80 3.00 3.00 3.30 4.80 3.00 3.00 3.30 4.80 3.00 + 4.80 4.80 4.80 4.80 4.00 4.00 4.00 4.00 4.00 4.00 4.00 4.00 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 + 4.80 3.00 4.80 2.10 4.00 2.20 4.00 1.50 4.00 2.20 4.00 1.30 4.80 3.00 4.80 2.10 4.80 3.00 4.80 2.10 4.80 3.00 4.80 2.10 + 1.80 1.40 1.20 4.80 0.80 0.60 0.40 4.00 1.00 0.60 0.40 4.00 1.80 1.40 1.20 4.80 1.80 1.40 1.20 4.80 1.80 1.40 1.20 4.80 + 4.80 4.80 4.80 4.80 4.00 4.00 4.00 4.00 4.00 4.00 4.00 4.00 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 + 1.60 4.80 3.00 4.80 0.80 4.00 2.20 4.00 0.80 4.00 2.20 4.00 1.60 4.80 3.00 4.80 1.60 4.80 3.00 4.80 1.60 4.80 3.00 4.80 + 4.80 4.80 4.80 4.80 4.00 4.00 4.00 4.00 4.00 4.00 4.00 4.00 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 + 4.80 4.80 4.80 4.80 4.00 4.00 4.00 4.00 4.00 4.00 4.00 4.00 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 + 3.30 2.70 4.80 3.00 2.50 1.90 4.00 2.20 2.50 1.90 4.00 2.20 3.30 2.70 4.80 3.00 3.30 2.70 4.80 3.00 3.30 2.70 4.80 3.00 + 4.80 4.80 4.80 4.80 4.00 4.00 4.00 4.00 4.00 4.00 4.00 4.00 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 + 4.80 2.50 4.80 2.00 4.00 1.70 4.00 1.20 4.00 1.70 4.00 1.20 4.80 2.50 4.80 2.00 4.80 2.50 4.80 2.00 4.80 2.50 4.80 2.00 + 3.20 3.00 2.40 4.80 2.40 2.20 1.60 4.00 2.50 2.20 2.10 4.00 3.20 3.00 2.40 4.80 3.20 3.00 2.40 4.80 3.20 3.00 2.40 4.80 + 3.10 3.00 4.80 3.00 2.30 2.20 4.00 2.20 2.30 2.20 4.00 2.20 3.10 3.00 4.80 3.00 3.10 3.00 4.80 3.00 3.10 3.00 4.80 3.00 + 2.50 4.80 1.60 4.80 1.70 4.00 0.80 4.00 1.70 4.00 0.80 4.00 2.50 4.80 1.60 4.80 2.50 4.80 1.60 4.80 2.50 4.80 1.60 4.80 + 4.80 4.80 4.80 4.80 4.00 4.00 4.00 4.00 4.00 4.00 4.00 4.00 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 + 2.90 2.50 2.40 4.80 2.10 1.70 1.60 4.00 2.10 1.70 1.60 4.00 2.90 2.50 2.40 4.80 2.90 2.50 2.40 4.80 2.90 2.50 2.40 4.80 + 3.00 3.30 4.80 3.00 2.20 2.50 4.00 2.20 2.20 2.50 4.00 2.20 3.00 3.30 4.80 3.00 3.00 3.30 4.80 3.00 3.00 3.30 4.80 3.00 + 4.80 4.80 4.80 4.80 4.00 4.00 4.00 4.00 4.00 4.00 4.00 4.00 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 + 4.80 3.00 4.80 2.10 4.00 2.20 4.00 1.30 4.00 2.20 4.00 1.20 4.80 3.00 4.80 2.10 4.80 3.00 4.80 2.10 4.80 3.00 4.80 2.10 + 1.80 1.40 1.20 4.80 1.00 0.60 0.40 4.00 1.20 0.60 0.40 4.00 1.80 1.40 1.20 4.80 1.80 1.40 1.20 4.80 1.80 1.40 1.20 4.80 + 4.80 4.80 4.80 4.80 4.00 4.00 4.00 4.00 4.00 4.00 4.00 4.00 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 + 1.60 4.80 3.00 4.80 0.80 4.00 2.20 4.00 0.80 4.00 2.20 4.00 1.60 4.80 3.00 4.80 1.60 4.80 3.00 4.80 1.60 4.80 3.00 4.80 + 4.80 4.80 4.80 4.80 4.00 4.00 4.00 4.00 4.00 4.00 4.00 4.00 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 + 4.80 4.80 4.80 4.80 4.00 4.00 4.00 4.00 4.00 4.00 4.00 4.00 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 + 3.30 2.70 4.80 3.00 2.50 1.90 4.00 2.20 2.50 1.90 4.00 2.20 3.30 2.70 4.80 3.00 3.30 2.70 4.80 3.00 3.30 2.70 4.80 3.00 + 4.80 4.80 4.80 4.80 4.00 4.00 4.00 4.00 4.00 4.00 4.00 4.00 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 + 4.80 2.50 4.80 2.00 4.00 1.70 4.00 1.20 4.00 1.70 4.00 1.20 4.80 2.50 4.80 2.00 4.80 2.50 4.80 2.00 4.80 2.50 4.80 2.00 + 3.90 3.70 3.10 5.50 3.20 3.00 2.40 4.80 3.20 3.00 2.40 4.80 3.90 3.70 3.10 5.50 3.90 3.70 3.10 5.50 3.90 3.70 3.10 5.50 + 3.80 3.70 5.50 3.70 3.10 3.00 4.80 3.00 3.10 3.00 4.80 3.00 3.80 3.70 5.50 3.70 3.80 3.70 5.50 3.70 3.80 3.70 5.50 3.70 + 3.20 5.50 2.30 5.50 2.50 4.80 1.60 4.80 2.50 4.80 1.60 4.80 3.20 5.50 2.30 5.50 3.20 5.50 2.30 5.50 3.20 5.50 2.30 5.50 + 5.50 5.50 5.50 5.50 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 + 3.60 3.20 3.10 5.50 2.90 2.50 2.40 4.80 2.90 2.50 2.40 4.80 3.60 3.20 3.10 5.50 3.60 3.20 3.10 5.50 3.60 3.20 3.10 5.50 + 3.70 4.00 5.50 3.70 3.00 3.30 4.80 3.00 3.00 3.30 4.80 3.00 3.70 4.00 5.50 3.70 3.70 4.00 5.50 3.70 3.70 4.00 5.50 3.70 + 5.50 5.50 5.50 5.50 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 + 5.50 3.70 5.50 2.80 4.80 3.00 4.80 2.10 4.80 3.00 4.80 2.10 5.50 3.70 5.50 2.80 5.50 3.70 5.50 2.80 5.50 3.70 5.50 2.80 + 2.50 2.10 1.90 5.50 1.80 1.40 1.20 4.80 1.80 1.40 1.20 4.80 2.50 2.10 1.90 5.50 2.50 2.10 1.90 5.50 2.50 2.10 1.90 5.50 + 5.50 5.50 5.50 5.50 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 + 2.30 5.50 3.70 5.50 1.60 4.80 3.00 4.80 1.60 4.80 3.00 4.80 2.30 5.50 3.70 5.50 2.30 5.50 3.70 5.50 2.30 5.50 3.70 5.50 + 5.50 5.50 5.50 5.50 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 + 5.50 5.50 5.50 5.50 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 + 4.00 3.40 5.50 3.70 3.30 2.70 4.80 3.00 3.30 2.70 4.80 3.00 4.00 3.40 5.50 3.70 4.00 3.40 5.50 3.70 4.00 3.40 5.50 3.70 + 5.50 5.50 5.50 5.50 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 + 5.50 3.20 5.50 2.70 4.80 2.50 4.80 2.00 4.80 2.50 4.80 2.00 5.50 3.20 5.50 2.70 5.50 3.20 5.50 2.70 5.50 3.20 5.50 2.70 + 3.90 3.70 3.10 5.50 3.20 3.00 2.40 4.80 3.20 3.00 2.40 4.80 3.90 3.70 3.10 5.50 3.90 3.70 3.10 5.50 3.90 3.70 3.10 5.50 + 3.80 3.70 5.50 3.70 3.10 3.00 4.80 3.00 3.10 3.00 4.80 3.00 3.80 3.70 5.50 3.70 3.80 3.70 5.50 3.70 3.80 3.70 5.50 3.70 + 3.20 5.50 2.30 5.50 2.50 4.80 1.60 4.80 2.50 4.80 1.60 4.80 3.20 5.50 2.30 5.50 3.20 5.50 2.30 5.50 3.20 5.50 2.30 5.50 + 5.50 5.50 5.50 5.50 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 + 3.60 3.20 3.10 5.50 2.90 2.50 2.40 4.80 2.90 2.50 2.40 4.80 3.60 3.20 3.10 5.50 3.60 3.20 3.10 5.50 3.60 3.20 3.10 5.50 + 3.70 4.00 5.50 3.70 3.00 3.30 4.80 3.00 3.00 3.30 4.80 3.00 3.70 4.00 5.50 3.70 3.70 4.00 5.50 3.70 3.70 4.00 5.50 3.70 + 5.50 5.50 5.50 5.50 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 + 5.50 3.70 5.50 2.80 4.80 3.00 4.80 2.10 4.80 3.00 4.80 2.10 5.50 3.70 5.50 2.80 5.50 3.70 5.50 2.80 5.50 3.70 5.50 2.80 + 2.50 2.10 1.90 5.50 1.80 1.40 1.20 4.80 1.80 1.40 1.20 4.80 2.50 2.10 1.90 5.50 2.50 2.10 1.90 5.50 2.50 2.10 1.90 5.50 + 5.50 5.50 5.50 5.50 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 + 2.30 5.50 3.70 5.50 1.60 4.80 3.00 4.80 1.60 4.80 3.00 4.80 2.30 5.50 3.70 5.50 2.30 5.50 3.70 5.50 2.30 5.50 3.70 5.50 + 5.50 5.50 5.50 5.50 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 + 5.50 5.50 5.50 5.50 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 + 4.00 3.40 5.50 3.70 3.30 2.70 4.80 3.00 3.30 2.70 4.80 3.00 4.00 3.40 5.50 3.70 4.00 3.40 5.50 3.70 4.00 3.40 5.50 3.70 + 5.50 5.50 5.50 5.50 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 + 5.50 3.20 5.50 2.70 4.80 2.50 4.80 2.00 4.80 2.50 4.80 2.00 5.50 3.20 5.50 2.70 5.50 3.20 5.50 2.70 5.50 3.20 5.50 2.70 + 3.90 3.70 3.10 5.50 3.20 3.00 2.40 4.80 3.20 3.00 2.40 4.80 3.90 3.70 3.10 5.50 3.90 3.70 3.10 5.50 3.90 3.70 3.10 5.50 + 3.80 3.70 5.50 3.70 3.10 3.00 4.80 3.00 3.10 3.00 4.80 3.00 3.80 3.70 5.50 3.70 3.80 3.70 5.50 3.70 3.80 3.70 5.50 3.70 + 3.20 5.50 2.30 5.50 2.50 4.80 1.60 4.80 2.50 4.80 1.60 4.80 3.20 5.50 2.30 5.50 3.20 5.50 2.30 5.50 3.20 5.50 2.30 5.50 + 5.50 5.50 5.50 5.50 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 + 3.60 3.20 3.10 5.50 2.90 2.50 2.40 4.80 2.90 2.50 2.40 4.80 3.60 3.20 3.10 5.50 3.60 3.20 3.10 5.50 3.60 3.20 3.10 5.50 + 3.70 4.00 5.50 3.70 3.00 3.30 4.80 3.00 3.00 3.30 4.80 3.00 3.70 4.00 5.50 3.70 3.70 4.00 5.50 3.70 3.70 4.00 5.50 3.70 + 5.50 5.50 5.50 5.50 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 + 5.50 3.70 5.50 2.80 4.80 3.00 4.80 2.10 4.80 3.00 4.80 2.10 5.50 3.70 5.50 2.80 5.50 3.70 5.50 2.80 5.50 3.70 5.50 2.80 + 2.50 2.10 1.90 5.50 1.80 1.40 1.20 4.80 1.80 1.40 1.20 4.80 2.50 2.10 1.90 5.50 2.50 2.10 1.90 5.50 2.50 2.10 1.90 5.50 + 5.50 5.50 5.50 5.50 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 + 2.30 5.50 3.70 5.50 1.60 4.80 3.00 4.80 1.60 4.80 3.00 4.80 2.30 5.50 3.70 5.50 2.30 5.50 3.70 5.50 2.30 5.50 3.70 5.50 + 5.50 5.50 5.50 5.50 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 + 5.50 5.50 5.50 5.50 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 + 4.00 3.40 5.50 3.70 3.30 2.70 4.80 3.00 3.30 2.70 4.80 3.00 4.00 3.40 5.50 3.70 4.00 3.40 5.50 3.70 4.00 3.40 5.50 3.70 + 5.50 5.50 5.50 5.50 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 + 5.50 3.20 5.50 2.70 4.80 2.50 4.80 2.00 4.80 2.50 4.80 2.00 5.50 3.20 5.50 2.70 5.50 3.20 5.50 2.70 5.50 3.20 5.50 2.70 diff --git a/lib/dat/begin.dat b/lib/dat/begin.dat new file mode 100644 index 0000000..8c66ad3 --- /dev/null +++ b/lib/dat/begin.dat @@ -0,0 +1,12 @@ + ____ __ __ + ____ ___ / __/___ / /___/ / + / __ `__ \/ /_/ __ \/ / __ / + / / / / / / __/ /_/ / / /_/ / + /_/ /_/ /_/_/ \____/_/\__,_/ + + _ _____ ___ + _ _____ __________(_)___ ____ |__ / < / +| | / / _ \/ ___/ ___/ / __ \/ __ \ /_ < / / +| |/ / __/ / (__ ) / /_/ / / / / ___/ / / / +|___/\___/_/ /____/_/\____/_/ /_/ /____(_)_/ + diff --git a/lib/dat/coaxial.dat b/lib/dat/coaxial.dat new file mode 100644 index 0000000..e795c39 --- /dev/null +++ b/lib/dat/coaxial.dat @@ -0,0 +1,72 @@ +Data Arangement: + + Y + ------------------ + (X) A C G U + ------------------ + 5' ==> 3' + AX + AY + 3' <== 5' + (A) . . . . + (C) . . . . + (G) . . . . + (U) -0.70 -0.10 -0.70 -0.10 + +-------------------------------- +STACKING ENERGIES : + + Y Y Y Y + ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + AX AX AX AX + AY CY GY UY + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + . . . . . . . . . . . . . . . -0.90 + . . . . . . . . . . . . . . -2.20 . + . . . . . . . . . . . . . -2.10 . -0.60 + . . . . . . . . . . . . -1.10 . -1.40 . + + + Y Y Y Y + ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + CX CX CX CX + AY CY GY UY + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + . . . . . . . . . . . -2.10 . . . . + . . . . . . . . . . -3.30 . . . . . + . . . . . . . . . -2.40 . -1.40 . . . . + . . . . . . . . -2.10 . -2.10 . . . . . + + + Y Y Y Y + ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + GX GX GX GX + AY CY GY UY + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + . . . . . . . -2.40 . . . . . . . -1.30 + . . . . . . -3.40 . . . . . . . -2.50 . + . . . . . -3.30 . -1.50 . . . . . -2.10 . -0.50 + . . . . -2.20 . -2.50 . . . . . -1.40 . 1.30 . + + + Y Y Y Y + ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + UX UX UX UX + AY CY GY UY + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + . . . -1.30 . . . . . . . -1.00 . . . . + . . -2.40 . . . . . . . -1.50 . . . . . + . -2.10 . -1.00 . . . . . -1.40 . 0.30 . . . . + -0.90 . -1.30 . . . . . -0.60 . -0.50 . . . . . diff --git a/lib/dat/coaxstack.dat b/lib/dat/coaxstack.dat new file mode 100644 index 0000000..1aa6a41 --- /dev/null +++ b/lib/dat/coaxstack.dat @@ -0,0 +1,70 @@ +Data Arangement: + + Y + ------------------ + (X) A C G U + ------------------ + 5' ==> 3' + AX + AY + 3' <== 5' + (A) . . . . + (C) . . . . + (G) . . . . + (U) -0.70 -0.10 -0.70 -0.10 + +-------------------------------- +STACKING ENERGIES : COAXIAL STACKING ENERGIES + + Y Y Y Y + ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + AX AX AX AX + AY CY GY UY + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + . . . . . . . . . . . . -2.10 -2.10 -2.10 -2.50 + . . . . . . . . . . . . -2.10 -2.10 -2.50 -2.10 + . . . . . . . . . . . . -2.10 -2.50 -2.10 -2.30 + . . . . . . . . . . . . -2.50 -2.10 -2.30 -2.10 + + Y Y Y Y + ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + CX CX CX CX + AY CY GY UY + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + . . . . . . . . -2.10 -2.10 -2.10 -2.50 . . . . + . . . . . . . . -2.10 -2.10 -2.50 -2.10 . . . . + . . . . . . . . -2.10 -2.50 -2.10 -2.30 . . . . + . . . . . . . . -2.50 -2.10 -2.30 -2.10 . . . . + + + Y Y Y Y + ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + GX GX GX GX + AY CY GY UY + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + . . . . -2.10 -2.10 -2.10 -2.50 . . . . -2.10 -2.10 -2.10 -2.50 + . . . . -2.10 -2.10 -2.50 -2.10 . . . . -2.10 -2.10 -2.50 -2.10 + . . . . -2.10 -2.50 -2.10 -2.30 . . . . -2.10 -2.50 -2.10 -2.30 + . . . . -2.50 -2.10 -2.30 -2.10 . . . . -2.50 -2.10 -2.30 -2.10 + + Y Y Y Y + ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + UX UX UX UX + AY CY GY UY + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + -2.10 -2.10 -2.10 -2.50 . . . . -2.10 -2.10 -2.10 -2.50 . . . . + -2.10 -2.10 -2.50 -2.10 . . . . -2.10 -2.10 -2.50 -2.10 . . . . + -2.10 -2.50 -2.10 -2.30 . . . . -2.10 -2.50 -2.10 -2.30 . . . . + -2.50 -2.10 -2.30 -2.10 . . . . -2.50 -2.10 -2.30 -2.10 . . . . diff --git a/lib/dat/dangle.dat b/lib/dat/dangle.dat new file mode 100644 index 0000000..0db27c2 --- /dev/null +++ b/lib/dat/dangle.dat @@ -0,0 +1,80 @@ + X X X X + ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + AX AX AX AX + A C G U + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + . . . . . . . . . . . . -0.80 -0.50 -0.80 -0.60 + + X X X X + ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + CX CX CX CX + A C G U + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + . . . . . . . . -1.70 -0.80 -1.70 -1.20 . . . . + + X X X X + ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + GX GX GX GX + A C G U + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + . . . . -1.10 -0.40 -1.30 -0.60 . . . . -0.80 -0.50 -0.80 -0.60 + + X X X X + ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + UX UX UX UX + A C G U + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' +-0.70 -0.10 -0.70 -0.10 . . . . -0.70 -0.10 -0.70 -0.10 . . . . + + X X X X + ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + A A A A + AX CX GX UX + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + . . . . . . . . . . . . -0.30 -0.10 -0.20 -0.20 + + X X X X + ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + C C C C + AX CX GX UX + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + . . . . . . . . -0.20 -0.30 -0.00 -0.00 . . . . + + X X X X + ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + G G G G + AX CX GX UX + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + . . . . -0.50 -0.30 -0.20 -0.10 . . . . -0.30 -0.10 -0.20 -0.20 + + X X X X + ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + U U U U + AX CX GX UX + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' +-0.30 -0.30 -0.40 -0.20 . . . . -0.30 -0.30 -0.40 -0.20 . . . . + diff --git a/lib/dat/dangle.lop.dat b/lib/dat/dangle.lop.dat new file mode 100644 index 0000000..3c9f509 --- /dev/null +++ b/lib/dat/dangle.lop.dat @@ -0,0 +1,8 @@ + . . . . . . . . . . . . -0.80 -0.50 -0.80 -0.60 + . . . . . . . . -1.70 -0.80 -1.70 -1.20 . . . . + . . . . -1.10 -0.40 -1.30 -0.60 . . . . -0.80 -0.50 -0.80 -0.60 +-0.70 -0.10 -0.70 -0.10 . . . . -0.70 -0.10 -0.70 -0.10 . . . . + . . . . . . . . . . . . -0.30 -0.10 -0.20 -0.20 + . . . . . . . . -0.20 -0.30 -0.00 -0.00 . . . . + . . . . -0.50 -0.30 -0.20 -0.10 . . . . -0.30 -0.10 -0.20 -0.20 +-0.30 -0.30 -0.40 -0.20 . . . . -0.30 -0.30 -0.40 -0.20 . . . . diff --git a/lib/dat/int11.dat b/lib/dat/int11.dat new file mode 100644 index 0000000..8935a7a --- /dev/null +++ b/lib/dat/int11.dat @@ -0,0 +1,108 @@ +Data table for symetric interior loops of size 2 +Free energies at 37 degrees for RNA +Data Arrangement: + + Y + ------------------ +(X) A C G U + ------------------ + 5' --> 3' + X + A A + U U + Y + 3' <-- 5' +(A) . . . . +(C) . . . . +(G) . . . . +(U) . . . . + + Y Y Y Y Y Y + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + X X X X X X + A A A C A G A U A G A U + U U U G U C U A U U U G + Y Y Y Y Y Y + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + 1.70 1.70 1.70 1.70 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 + 1.70 1.70 1.70 1.70 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 + 1.70 1.70 -0.40 1.70 1.10 1.10 -1.00 1.10 1.10 1.10 -1.00 1.10 1.70 1.70 -0.40 1.70 1.70 1.70 -0.40 1.70 1.70 1.70 -0.40 1.70 + 1.70 1.70 1.70 1.50 1.10 1.10 1.10 1.00 1.10 1.10 1.10 1.10 1.70 1.70 1.70 1.20 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 + + Y Y Y Y Y Y + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + X X X X X X + C A C C C G C U C G C U + G U G G G C G A G U G G + Y Y Y Y Y Y + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + 1.10 1.10 1.10 1.10 0.40 -0.40 0.40 0.40 1.10 0.40 0.40 0.40 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 + 1.10 1.10 1.10 1.10 0.30 0.50 0.40 0.50 0.40 0.40 0.40 0.40 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 + 1.10 1.10 -1.00 1.10 -0.10 0.40 -1.70 0.40 0.40 0.40 -1.40 0.40 1.10 1.10 -1.00 1.10 1.10 1.10 -1.00 1.10 1.10 1.10 -1.00 1.10 + 1.10 1.10 1.10 1.10 0.40 0.00 0.40 -0.30 0.40 0.40 0.40 0.40 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 + + Y Y Y Y Y Y + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + X X X X X X + G A G C G G G U G G G U + C U C G C C C A C U C G + Y Y Y Y Y Y + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + 1.10 1.10 1.10 1.10 0.80 0.40 0.40 0.40 0.40 0.30 -0.10 0.40 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 + 1.10 1.10 1.10 1.10 0.40 0.40 0.40 0.40 -0.40 0.50 0.40 0.00 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 + 1.10 1.10 -1.00 1.10 0.40 0.40 -2.10 0.40 0.40 0.40 -1.70 0.40 1.10 1.10 -1.00 1.10 1.10 1.10 -1.00 1.10 1.10 1.10 -1.00 1.10 + 1.10 1.10 1.10 1.10 0.40 0.40 0.40 -0.70 0.40 0.50 0.40 -0.30 1.10 1.10 1.10 1.00 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 + + Y Y Y Y Y Y + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + X X X X X X + U A U C U G U U U G U U + A U A G A C A A A U A G + Y Y Y Y Y Y + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + 1.70 1.70 1.70 1.70 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 + 1.70 1.70 1.70 1.70 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 + 1.70 1.70 -0.40 1.70 1.10 1.10 -1.00 1.10 1.10 1.10 -1.00 1.10 1.70 1.70 -0.40 1.70 1.70 1.70 -0.40 1.70 1.70 1.70 -0.40 1.70 + 1.70 1.70 1.70 1.80 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.70 1.70 1.70 1.50 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 + + Y Y Y Y Y Y + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + X X X X X X + G A G C G G G U G G G U + U U U G U C U A U U U G + Y Y Y Y Y Y + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + 1.70 1.70 1.70 1.70 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 + 1.70 1.70 1.70 1.70 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 + 1.70 1.70 -0.40 1.70 1.10 1.10 -1.00 1.10 1.10 1.10 -1.00 1.10 1.70 1.70 -0.40 1.70 1.70 1.70 -0.40 1.70 1.70 1.70 -0.40 1.70 + 1.70 1.70 1.70 1.70 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 + + Y Y Y Y Y Y + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + X X X X X X + U A U C U G U U U G U U + G U G G G C G A G U G G + Y Y Y Y Y Y + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + 1.70 1.70 1.70 1.70 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 + 1.70 1.70 1.70 1.70 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 + 1.70 1.70 -0.40 1.70 1.10 1.10 -1.00 1.10 1.10 1.10 -1.00 1.10 1.70 1.70 -0.40 1.70 1.70 1.70 -0.40 1.70 1.70 1.70 -0.40 1.70 + 1.70 1.70 1.70 1.70 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 diff --git a/lib/dat/int21.dat b/lib/dat/int21.dat new file mode 100644 index 0000000..ba94bd7 --- /dev/null +++ b/lib/dat/int21.dat @@ -0,0 +1,378 @@ +Data tables for asymmetric interior loops of size 3 +Free energies at 37 degrees for RNA +Data arrangement: + + Y + ------------------ +(X) A C G U + ------------------ + 5' --> 3' + X + A A + U U + YA + 3' <-- 5' +(A) . . . . +(C) . . . . +(G) . . . . +(U) . . . . + + Y Y Y Y Y Y + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + X X X X X X + A A A C A G A U A G A U + U U U G U C U A U U U G + YA YA YA YA YA YA + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + 3.90 3.70 3.10 5.50 3.20 3.00 2.40 4.80 3.20 3.00 2.40 4.80 3.90 3.70 3.10 5.50 3.90 3.70 3.10 5.50 3.90 3.70 3.10 5.50 + 3.80 3.70 5.50 3.70 3.10 3.00 4.80 3.00 3.10 3.00 4.80 3.00 3.80 3.70 5.50 3.70 3.80 3.70 5.50 3.70 3.80 3.70 5.50 3.70 + 3.20 5.50 2.30 5.50 2.50 4.80 1.60 4.80 2.50 4.80 1.60 4.80 3.20 5.50 2.30 5.50 3.20 5.50 2.30 5.50 3.20 5.50 2.30 5.50 + 5.50 5.50 5.50 5.50 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 + + Y Y Y Y Y Y + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + X X X X X X + A A A C A G A U A G A U + U U U G U C U A U U U G + YC YC YC YC YC YC + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + 3.60 3.20 3.10 5.50 2.90 2.50 2.40 4.80 2.90 2.50 2.40 4.80 3.60 3.20 3.10 5.50 3.60 3.20 3.10 5.50 3.60 3.20 3.10 5.50 + 3.70 4.00 5.50 3.70 3.00 3.30 4.80 3.00 3.00 3.30 4.80 3.00 3.70 4.00 5.50 3.70 3.70 4.00 5.50 3.70 3.70 4.00 5.50 3.70 + 5.50 5.50 5.50 5.50 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 + 5.50 3.70 5.50 2.80 4.80 3.00 4.80 2.10 4.80 3.00 4.80 2.10 5.50 3.70 5.50 2.80 5.50 3.70 5.50 2.80 5.50 3.70 5.50 2.80 + + Y Y Y Y Y Y + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + X X X X X X + A A A C A G A U A G A U + U U U G U C U A U U U G + YG YG YG YG YG YG + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + 2.50 2.10 1.90 5.50 1.80 1.40 1.20 4.80 1.80 1.40 1.20 4.80 2.50 2.10 1.90 5.50 2.50 2.10 1.90 5.50 2.50 2.10 1.90 5.50 + 5.50 5.50 5.50 5.50 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 + 2.30 5.50 3.70 5.50 1.60 4.80 3.00 4.80 1.60 4.80 3.00 4.80 2.30 5.50 3.70 5.50 2.30 5.50 3.70 5.50 2.30 5.50 3.70 5.50 + 5.50 5.50 5.50 5.50 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 + + Y Y Y Y Y Y + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + X X X X X X + A A A C A G A U A G A U + U U U G U C U A U U U G + YU YU YU YU YU YU + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + 5.50 5.50 5.50 5.50 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 + 4.00 3.40 5.50 3.70 3.30 2.70 4.80 3.00 3.30 2.70 4.80 3.00 4.00 3.40 5.50 3.70 4.00 3.40 5.50 3.70 4.00 3.40 5.50 3.70 + 5.50 5.50 5.50 5.50 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 + 5.50 3.20 5.50 2.70 4.80 2.50 4.80 2.00 4.80 2.50 4.80 2.00 5.50 3.20 5.50 2.70 5.50 3.20 5.50 2.70 5.50 3.20 5.50 2.70 + + Y Y Y Y Y Y + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + X X X X X X + C A C C C G C U C G C U + G U G G G C G A G U G G + YA YA YA YA YA YA + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + 3.20 3.00 2.40 4.80 2.30 2.20 1.10 4.00 2.40 2.20 1.60 4.00 3.20 3.00 2.40 4.80 3.20 3.00 2.40 4.80 3.20 3.00 2.40 4.80 + 3.10 3.00 4.80 3.00 2.30 2.20 4.00 2.20 2.30 2.20 4.00 2.20 3.10 3.00 4.80 3.00 3.10 3.00 4.80 3.00 3.10 3.00 4.80 3.00 + 2.50 4.80 1.60 4.80 1.70 4.00 0.80 4.00 1.70 4.00 0.80 4.00 2.50 4.80 1.60 4.80 2.50 4.80 1.60 4.80 2.50 4.80 1.60 4.80 + 4.80 4.80 4.80 4.80 4.00 4.00 4.00 4.00 4.00 4.00 4.00 4.00 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 + + Y Y Y Y Y Y + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + X X X X X X + C A C C C G C U C G C U + G U G G G C G A G U G G + YC YC YC YC YC YC + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + 2.90 2.50 2.40 4.80 2.10 1.70 1.60 4.00 2.10 1.70 1.60 4.00 2.90 2.50 2.40 4.80 2.90 2.50 2.40 4.80 2.90 2.50 2.40 4.80 + 3.00 3.30 4.80 3.00 2.20 2.50 4.00 2.20 2.20 2.50 4.00 2.20 3.00 3.30 4.80 3.00 3.00 3.30 4.80 3.00 3.00 3.30 4.80 3.00 + 4.80 4.80 4.80 4.80 4.00 4.00 4.00 4.00 4.00 4.00 4.00 4.00 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 + 4.80 3.00 4.80 2.10 4.00 2.20 4.00 1.50 4.00 2.20 4.00 1.30 4.80 3.00 4.80 2.10 4.80 3.00 4.80 2.10 4.80 3.00 4.80 2.10 + + Y Y Y Y Y Y + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + X X X X X X + C A C C C G C U C G C U + G U G G G C G A G U G G + YG YG YG YG YG YG + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + 1.80 1.40 1.20 4.80 0.80 0.60 0.40 4.00 1.00 0.60 0.40 4.00 1.80 1.40 1.20 4.80 1.80 1.40 1.20 4.80 1.80 1.40 1.20 4.80 + 4.80 4.80 4.80 4.80 4.00 4.00 4.00 4.00 4.00 4.00 4.00 4.00 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 + 1.60 4.80 3.00 4.80 0.80 4.00 2.20 4.00 0.80 4.00 2.20 4.00 1.60 4.80 3.00 4.80 1.60 4.80 3.00 4.80 1.60 4.80 3.00 4.80 + 4.80 4.80 4.80 4.80 4.00 4.00 4.00 4.00 4.00 4.00 4.00 4.00 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 + + Y Y Y Y Y Y + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + X X X X X X + C A C C C G C U C G C U + G U G G G C G A G U G G + YU YU YU YU YU YU + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + 4.80 4.80 4.80 4.80 4.00 4.00 4.00 4.00 4.00 4.00 4.00 4.00 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 + 3.30 2.70 4.80 3.00 2.50 1.90 4.00 2.20 2.50 1.90 4.00 2.20 3.30 2.70 4.80 3.00 3.30 2.70 4.80 3.00 3.30 2.70 4.80 3.00 + 4.80 4.80 4.80 4.80 4.00 4.00 4.00 4.00 4.00 4.00 4.00 4.00 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 + 4.80 2.50 4.80 2.00 4.00 1.70 4.00 1.20 4.00 1.70 4.00 1.20 4.80 2.50 4.80 2.00 4.80 2.50 4.80 2.00 4.80 2.50 4.80 2.00 + + Y Y Y Y Y Y + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + X X X X X X + G A G C G G G U G G G U + C U C G C C C A C U C G + YA YA YA YA YA YA + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + 3.20 3.00 2.40 4.80 2.40 2.20 1.60 4.00 2.50 2.20 2.10 4.00 3.20 3.00 2.40 4.80 3.20 3.00 2.40 4.80 3.20 3.00 2.40 4.80 + 3.10 3.00 4.80 3.00 2.30 2.20 4.00 2.20 2.30 2.20 4.00 2.20 3.10 3.00 4.80 3.00 3.10 3.00 4.80 3.00 3.10 3.00 4.80 3.00 + 2.50 4.80 1.60 4.80 1.70 4.00 0.80 4.00 1.70 4.00 0.80 4.00 2.50 4.80 1.60 4.80 2.50 4.80 1.60 4.80 2.50 4.80 1.60 4.80 + 4.80 4.80 4.80 4.80 4.00 4.00 4.00 4.00 4.00 4.00 4.00 4.00 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 + + Y Y Y Y Y Y + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + X X X X X X + G A G C G G G U G G G U + C U C G C C C A C U C G + YC YC YC YC YC YC + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + 2.90 2.50 2.40 4.80 2.10 1.70 1.60 4.00 2.10 1.70 1.60 4.00 2.90 2.50 2.40 4.80 2.90 2.50 2.40 4.80 2.90 2.50 2.40 4.80 + 3.00 3.30 4.80 3.00 2.20 2.50 4.00 2.20 2.20 2.50 4.00 2.20 3.00 3.30 4.80 3.00 3.00 3.30 4.80 3.00 3.00 3.30 4.80 3.00 + 4.80 4.80 4.80 4.80 4.00 4.00 4.00 4.00 4.00 4.00 4.00 4.00 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 + 4.80 3.00 4.80 2.10 4.00 2.20 4.00 1.30 4.00 2.20 4.00 1.20 4.80 3.00 4.80 2.10 4.80 3.00 4.80 2.10 4.80 3.00 4.80 2.10 + + Y Y Y Y Y Y + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + X X X X X X + G A G C G G G U G G G U + C U C G C C C A C U C G + YG YG YG YG YG YG + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + 1.80 1.40 1.20 4.80 1.00 0.60 0.40 4.00 1.20 0.60 0.40 4.00 1.80 1.40 1.20 4.80 1.80 1.40 1.20 4.80 1.80 1.40 1.20 4.80 + 4.80 4.80 4.80 4.80 4.00 4.00 4.00 4.00 4.00 4.00 4.00 4.00 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 + 1.60 4.80 3.00 4.80 0.80 4.00 2.20 4.00 0.80 4.00 2.20 4.00 1.60 4.80 3.00 4.80 1.60 4.80 3.00 4.80 1.60 4.80 3.00 4.80 + 4.80 4.80 4.80 4.80 4.00 4.00 4.00 4.00 4.00 4.00 4.00 4.00 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 + + Y Y Y Y Y Y + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + X X X X X X + G A G C G G G U G G G U + C U C G C C C A C U C G + YU YU YU YU YU YU + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + 4.80 4.80 4.80 4.80 4.00 4.00 4.00 4.00 4.00 4.00 4.00 4.00 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 + 3.30 2.70 4.80 3.00 2.50 1.90 4.00 2.20 2.50 1.90 4.00 2.20 3.30 2.70 4.80 3.00 3.30 2.70 4.80 3.00 3.30 2.70 4.80 3.00 + 4.80 4.80 4.80 4.80 4.00 4.00 4.00 4.00 4.00 4.00 4.00 4.00 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 + 4.80 2.50 4.80 2.00 4.00 1.70 4.00 1.20 4.00 1.70 4.00 1.20 4.80 2.50 4.80 2.00 4.80 2.50 4.80 2.00 4.80 2.50 4.80 2.00 + + Y Y Y Y Y Y + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + X X X X X X + U A U C U G U U U G U U + A U A G A C A A A U A G + YA YA YA YA YA YA + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + 3.90 3.70 3.10 5.50 3.20 3.00 2.40 4.80 3.20 3.00 2.40 4.80 3.90 3.70 3.10 5.50 3.90 3.70 3.10 5.50 3.90 3.70 3.10 5.50 + 3.80 3.70 5.50 3.70 3.10 3.00 4.80 3.00 3.10 3.00 4.80 3.00 3.80 3.70 5.50 3.70 3.80 3.70 5.50 3.70 3.80 3.70 5.50 3.70 + 3.20 5.50 2.30 5.50 2.50 4.80 1.60 4.80 2.50 4.80 1.60 4.80 3.20 5.50 2.30 5.50 3.20 5.50 2.30 5.50 3.20 5.50 2.30 5.50 + 5.50 5.50 5.50 5.50 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 + + Y Y Y Y Y Y + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + X X X X X X + U A U C U G U U U G U U + A U A G A C A A A U A G + YC YC YC YC YC YC + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + 3.60 3.20 3.10 5.50 2.90 2.50 2.40 4.80 2.90 2.50 2.40 4.80 3.60 3.20 3.10 5.50 3.60 3.20 3.10 5.50 3.60 3.20 3.10 5.50 + 3.70 4.00 5.50 3.70 3.00 3.30 4.80 3.00 3.00 3.30 4.80 3.00 3.70 4.00 5.50 3.70 3.70 4.00 5.50 3.70 3.70 4.00 5.50 3.70 + 5.50 5.50 5.50 5.50 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 + 5.50 3.70 5.50 2.80 4.80 3.00 4.80 2.10 4.80 3.00 4.80 2.10 5.50 3.70 5.50 2.80 5.50 3.70 5.50 2.80 5.50 3.70 5.50 2.80 + + Y Y Y Y Y Y + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + X X X X X X + U A U C U G U U U G U U + A U A G A C A A A U A G + YG YG YG YG YG YG + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + 2.50 2.10 1.90 5.50 1.80 1.40 1.20 4.80 1.80 1.40 1.20 4.80 2.50 2.10 1.90 5.50 2.50 2.10 1.90 5.50 2.50 2.10 1.90 5.50 + 5.50 5.50 5.50 5.50 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 + 2.30 5.50 3.70 5.50 1.60 4.80 3.00 4.80 1.60 4.80 3.00 4.80 2.30 5.50 3.70 5.50 2.30 5.50 3.70 5.50 2.30 5.50 3.70 5.50 + 5.50 5.50 5.50 5.50 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 + + Y Y Y Y Y Y + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + X X X X X X + U A U C U G U U U G U U + A U A G A C A A A U A G + YU YU YU YU YU YU + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + 5.50 5.50 5.50 5.50 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 + 4.00 3.40 5.50 3.70 3.30 2.70 4.80 3.00 3.30 2.70 4.80 3.00 4.00 3.40 5.50 3.70 4.00 3.40 5.50 3.70 4.00 3.40 5.50 3.70 + 5.50 5.50 5.50 5.50 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 + 5.50 3.20 5.50 2.70 4.80 2.50 4.80 2.00 4.80 2.50 4.80 2.00 5.50 3.20 5.50 2.70 5.50 3.20 5.50 2.70 5.50 3.20 5.50 2.70 + + Y Y Y Y Y Y + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + X X X X X X + G A G C G G G U G G G U + U U U G U C U A U U U G + YA YA YA YA YA YA + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + 3.90 3.70 3.10 5.50 3.20 3.00 2.40 4.80 3.20 3.00 2.40 4.80 3.90 3.70 3.10 5.50 3.90 3.70 3.10 5.50 3.90 3.70 3.10 5.50 + 3.80 3.70 5.50 3.70 3.10 3.00 4.80 3.00 3.10 3.00 4.80 3.00 3.80 3.70 5.50 3.70 3.80 3.70 5.50 3.70 3.80 3.70 5.50 3.70 + 3.20 5.50 2.30 5.50 2.50 4.80 1.60 4.80 2.50 4.80 1.60 4.80 3.20 5.50 2.30 5.50 3.20 5.50 2.30 5.50 3.20 5.50 2.30 5.50 + 5.50 5.50 5.50 5.50 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 + + Y Y Y Y Y Y + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + X X X X X X + G A G C G G G U G G G U + U U U G U C U A U U U G + YC YC YC YC YC YC + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + 3.60 3.20 3.10 5.50 2.90 2.50 2.40 4.80 2.90 2.50 2.40 4.80 3.60 3.20 3.10 5.50 3.60 3.20 3.10 5.50 3.60 3.20 3.10 5.50 + 3.70 4.00 5.50 3.70 3.00 3.30 4.80 3.00 3.00 3.30 4.80 3.00 3.70 4.00 5.50 3.70 3.70 4.00 5.50 3.70 3.70 4.00 5.50 3.70 + 5.50 5.50 5.50 5.50 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 + 5.50 3.70 5.50 2.80 4.80 3.00 4.80 2.10 4.80 3.00 4.80 2.10 5.50 3.70 5.50 2.80 5.50 3.70 5.50 2.80 5.50 3.70 5.50 2.80 + + Y Y Y Y Y Y + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + X X X X X X + G A G C G G G U G G G U + U U U G U C U A U U U G + YG YG YG YG YG YG + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + 2.50 2.10 1.90 5.50 1.80 1.40 1.20 4.80 1.80 1.40 1.20 4.80 2.50 2.10 1.90 5.50 2.50 2.10 1.90 5.50 2.50 2.10 1.90 5.50 + 5.50 5.50 5.50 5.50 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 + 2.30 5.50 3.70 5.50 1.60 4.80 3.00 4.80 1.60 4.80 3.00 4.80 2.30 5.50 3.70 5.50 2.30 5.50 3.70 5.50 2.30 5.50 3.70 5.50 + 5.50 5.50 5.50 5.50 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 + + Y Y Y Y Y Y + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + X X X X X X + G A G C G G G U G G G U + U U U G U C U A U U U G + YU YU YU YU YU YU + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + 5.50 5.50 5.50 5.50 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 + 4.00 3.40 5.50 3.70 3.30 2.70 4.80 3.00 3.30 2.70 4.80 3.00 4.00 3.40 5.50 3.70 4.00 3.40 5.50 3.70 4.00 3.40 5.50 3.70 + 5.50 5.50 5.50 5.50 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 + 5.50 3.20 5.50 2.70 4.80 2.50 4.80 2.00 4.80 2.50 4.80 2.00 5.50 3.20 5.50 2.70 5.50 3.20 5.50 2.70 5.50 3.20 5.50 2.70 + + Y Y Y Y Y Y + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + X X X X X X + U A U C U G U U U G U U + G U G G G C G A G U G G + YA YA YA YA YA YA + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + 3.90 3.70 3.10 5.50 3.20 3.00 2.40 4.80 3.20 3.00 2.40 4.80 3.90 3.70 3.10 5.50 3.90 3.70 3.10 5.50 3.90 3.70 3.10 5.50 + 3.80 3.70 5.50 3.70 3.10 3.00 4.80 3.00 3.10 3.00 4.80 3.00 3.80 3.70 5.50 3.70 3.80 3.70 5.50 3.70 3.80 3.70 5.50 3.70 + 3.20 5.50 2.30 5.50 2.50 4.80 1.60 4.80 2.50 4.80 1.60 4.80 3.20 5.50 2.30 5.50 3.20 5.50 2.30 5.50 3.20 5.50 2.30 5.50 + 5.50 5.50 5.50 5.50 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 + + Y Y Y Y Y Y + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + X X X X X X + U A U C U G U U U G U U + G U G G G C G A G U G G + YC YC YC YC YC YC + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + 3.60 3.20 3.10 5.50 2.90 2.50 2.40 4.80 2.90 2.50 2.40 4.80 3.60 3.20 3.10 5.50 3.60 3.20 3.10 5.50 3.60 3.20 3.10 5.50 + 3.70 4.00 5.50 3.70 3.00 3.30 4.80 3.00 3.00 3.30 4.80 3.00 3.70 4.00 5.50 3.70 3.70 4.00 5.50 3.70 3.70 4.00 5.50 3.70 + 5.50 5.50 5.50 5.50 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 + 5.50 3.70 5.50 2.80 4.80 3.00 4.80 2.10 4.80 3.00 4.80 2.10 5.50 3.70 5.50 2.80 5.50 3.70 5.50 2.80 5.50 3.70 5.50 2.80 + + Y Y Y Y Y Y + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + X X X X X X + U A U C U G U U U G U U + G U G G G C G A G U G G + YG YG YG YG YG YG + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + 2.50 2.10 1.90 5.50 1.80 1.40 1.20 4.80 1.80 1.40 1.20 4.80 2.50 2.10 1.90 5.50 2.50 2.10 1.90 5.50 2.50 2.10 1.90 5.50 + 5.50 5.50 5.50 5.50 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 + 2.30 5.50 3.70 5.50 1.60 4.80 3.00 4.80 1.60 4.80 3.00 4.80 2.30 5.50 3.70 5.50 2.30 5.50 3.70 5.50 2.30 5.50 3.70 5.50 + 5.50 5.50 5.50 5.50 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 + + Y Y Y Y Y Y + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + X X X X X X + U A U C U G U U U G U U + G U G G G C G A G U G G + YU YU YU YU YU YU + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + 5.50 5.50 5.50 5.50 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 + 4.00 3.40 5.50 3.70 3.30 2.70 4.80 3.00 3.30 2.70 4.80 3.00 4.00 3.40 5.50 3.70 4.00 3.40 5.50 3.70 4.00 3.40 5.50 3.70 + 5.50 5.50 5.50 5.50 4.80 4.80 4.80 4.80 4.80 4.80 4.80 4.80 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 + 5.50 3.20 5.50 2.70 4.80 2.50 4.80 2.00 4.80 2.50 4.80 2.00 5.50 3.20 5.50 2.70 5.50 3.20 5.50 2.70 5.50 3.20 5.50 2.70 diff --git a/lib/dat/int22.dat b/lib/dat/int22.dat new file mode 100644 index 0000000..cc8ad10 --- /dev/null +++ b/lib/dat/int22.dat @@ -0,0 +1,967 @@ +Data tables for symetric interior loops of size 4 +Free energies at 37 degrees for RNA +Data arrangement: + + Y + ---------------------------------------------------------------- +(X) A A A A C C C C G G G G U U U U + A C G U A C G U A C G U A C G U + ---------------------------------------------------------------- + 5' ------> 3' + A \/ \_/ A + U /\ | U + 3' <------ 5' + +(AA) . . . . . . . . . . . . . . . . +(AC) . . . . . . . . . . . . . . . . +(AG) . . . . . . . . . . . . . . . . +(AU) . . . . . . . . . . . . . . . . +(CA) . . . . . . . . . . . . . . . . +(CC) . . . . . . . . . . . . . . . . +(CG) . . . . . . . . . . . . . . . . +(CU) . . . . . . . . . . . . . . . . +(GA) . . . . . . . . . . . . . . . . +(GC) . . . . . . . . . . . . . . . . +(GG) . . . . . . . . . . . . . . . . +(GU) . . . . . . . . . . . . . . . . +(UA) . . . . . . . . . . . . . . . . +(UC) . . . . . . . . . . . . . . . . +(UG) . . . . . . . . . . . . . . . . +(UU) . . . . . . . . . . . . . . . . + + + Y + --------------------------------------------------------------------------------------------- + A A A A C C C C G G G G U U U U + A C G U A C G U A C G U A C G U + --------------------------------------------------------------------------------------------- + 5' ------> 3' + A \/ \_/ A + U /\ | U + 3' <------ 5' + 2.80 2.30 1.70 2.00 2.80 3.40 2.00 3.40 1.70 2.00 2.10 1.00 2.00 3.10 2.20 2.90 + 2.60 2.20 1.60 2.00 2.60 2.60 2.00 2.60 1.60 2.00 2.00 -0.20 2.00 2.30 1.10 1.80 + 1.50 1.10 0.50 2.00 1.50 2.50 2.00 2.50 0.50 2.00 0.90 0.50 2.00 2.20 1.80 2.50 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.50 2.10 1.50 2.00 2.50 2.50 2.00 2.50 1.50 2.00 1.90 -0.30 2.00 2.20 1.00 1.70 + 3.10 2.00 2.40 2.00 2.50 2.50 2.00 2.50 2.40 2.00 2.40 0.70 2.00 2.20 1.90 1.60 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.10 2.00 2.40 2.00 2.50 2.50 2.00 2.50 2.40 2.00 2.40 0.70 2.00 2.20 1.90 1.60 + 1.50 1.10 0.50 2.00 1.50 2.50 2.00 2.50 0.50 2.00 0.90 0.50 2.00 2.20 1.80 2.50 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.10 1.60 1.00 2.00 2.10 2.70 2.00 2.70 1.00 2.00 1.40 0.30 2.00 2.40 1.50 2.20 + 2.30 0.90 2.10 2.00 1.30 2.30 2.00 2.30 2.10 2.00 1.70 -1.50 2.00 2.00 -0.20 2.30 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.10 2.00 2.40 2.00 2.50 2.50 2.00 2.50 2.40 2.00 2.40 0.70 2.00 2.20 1.90 1.60 + 1.30 -0.10 1.10 2.00 0.30 1.30 2.00 1.30 1.10 2.00 0.70 -2.50 2.00 1.00 -1.20 1.30 + 2.70 1.20 2.40 2.00 1.70 1.70 2.00 1.70 2.40 2.00 2.00 0.70 2.00 1.40 1.90 0.80 + + Y + --------------------------------------------------------------------------------------------- + A A A A C C C C G G G G U U U U + A C G U A C G U A C G U A C G U + --------------------------------------------------------------------------------------------- + 5' ------> 3' + A \/ \_/ C + U /\ | G + 3' <------ 5' + 2.10 1.90 0.10 2.00 1.80 2.50 2.00 1.50 0.70 2.00 1.80 0.00 2.00 2.50 0.40 2.10 + 2.00 1.70 0.00 2.00 1.70 1.70 2.00 0.70 0.60 2.00 1.60 -1.20 2.00 1.80 -0.80 1.00 + 0.90 0.60 -1.10 2.00 0.60 1.60 2.00 0.70 -0.50 2.00 0.50 -0.50 2.00 1.70 -0.10 1.70 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.90 1.60 -0.10 2.00 1.60 1.60 2.00 0.60 0.50 2.00 1.50 -1.30 2.00 1.70 -0.90 0.90 + 2.40 1.60 0.80 2.00 1.50 1.60 2.00 0.60 1.40 2.00 2.10 -0.30 2.00 1.60 0.10 0.80 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.40 1.60 0.80 2.00 1.50 1.60 2.00 0.60 1.40 2.00 2.10 -0.30 2.00 1.60 0.10 0.80 + 0.90 0.60 -1.10 2.00 0.60 1.60 2.00 0.70 -0.50 2.00 0.50 -0.50 2.00 1.70 -0.10 1.70 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.40 1.20 -0.60 2.00 1.10 1.80 2.00 0.80 0.00 2.00 1.10 -0.70 2.00 1.80 -0.30 1.40 + 1.70 0.40 0.50 2.00 0.40 1.40 2.00 0.50 1.10 2.00 1.30 -2.50 2.00 1.50 -2.10 1.50 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.40 1.60 0.80 2.00 1.50 1.60 2.00 0.60 1.40 2.00 2.10 -0.30 2.00 1.60 0.10 0.80 + 0.70 -0.50 -0.50 2.00 -0.60 0.50 2.00 -0.50 0.10 2.00 0.40 -3.50 2.00 0.50 -3.10 0.50 + 2.00 0.80 0.80 2.00 0.70 0.80 2.00 -0.20 1.50 2.00 1.70 -0.30 2.00 0.80 0.10 0.00 + + Y + --------------------------------------------------------------------------------------------- + A A A A C C C C G G G G U U U U + A C G U A C G U A C G U A C G U + --------------------------------------------------------------------------------------------- + 5' ------> 3' + A \/ \_/ G + U /\ | C + 3' <------ 5' + 2.00 1.90 1.00 2.00 2.40 2.80 2.00 2.70 1.00 2.00 1.80 0.30 2.00 2.70 1.80 2.20 + 1.90 1.80 0.90 2.00 2.20 2.10 2.00 1.90 0.90 2.00 1.60 -0.80 2.00 1.90 0.70 1.00 + 0.80 0.70 -0.20 2.00 1.10 2.00 2.00 1.80 -0.20 2.00 0.50 -0.10 2.00 1.80 1.40 1.80 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.80 1.70 0.80 2.00 2.10 2.00 2.00 1.80 0.80 2.00 1.50 -0.90 2.00 1.80 0.60 0.90 + 2.30 1.60 1.70 2.00 2.10 1.90 2.00 1.80 1.70 2.00 2.10 0.00 2.00 1.80 1.50 0.90 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.30 1.60 1.70 2.00 2.10 1.90 2.00 1.80 1.70 2.00 2.10 0.00 2.00 1.80 1.50 0.90 + 0.80 0.70 -0.20 2.00 1.10 2.00 2.00 1.80 -0.20 2.00 0.50 -0.10 2.00 1.80 1.40 1.80 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.30 1.20 0.30 2.00 1.70 2.10 2.00 2.00 0.30 2.00 1.10 -0.40 2.00 2.00 1.10 1.50 + 1.60 0.50 1.40 2.00 0.90 1.80 2.00 1.60 1.40 2.00 1.30 -2.10 2.00 1.60 -0.60 1.60 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.30 1.60 1.70 2.00 2.10 1.90 2.00 1.80 1.70 2.00 2.10 0.00 2.00 1.80 1.50 0.90 + 0.60 -0.50 0.40 2.00 0.00 0.80 2.00 0.70 0.40 2.00 0.40 -3.10 2.00 0.70 -1.60 0.60 + 1.90 0.80 1.80 2.00 1.30 1.10 2.00 1.00 1.80 2.00 1.70 0.00 2.00 1.00 1.60 0.10 + + Y + --------------------------------------------------------------------------------------------- + A A A A C C C C G G G G U U U U + A C G U A C G U A C G U A C G U + --------------------------------------------------------------------------------------------- + 5' ------> 3' + A \/ \_/ U + U /\ | A + 3' <------ 5' + 2.80 2.50 1.50 2.00 2.60 3.10 2.00 3.10 1.50 2.00 2.10 1.30 2.00 3.10 2.30 2.70 + 2.60 2.40 1.40 2.00 2.50 2.30 2.00 2.30 1.40 2.00 1.90 0.20 2.00 2.30 1.20 1.50 + 1.50 1.30 0.30 2.00 1.40 2.20 2.00 2.20 0.30 2.00 0.80 0.90 2.00 2.20 1.90 2.20 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.50 2.30 1.30 2.00 2.40 2.20 2.00 2.20 1.30 2.00 1.80 0.10 2.00 2.20 1.10 1.40 + 3.10 2.20 2.20 2.00 2.30 2.20 2.00 2.20 2.20 2.00 2.40 1.00 2.00 2.20 2.00 1.40 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.10 2.20 2.20 2.00 2.30 2.20 2.00 2.20 2.20 2.00 2.40 1.00 2.00 2.20 2.00 1.40 + 1.50 1.30 0.30 2.00 1.40 2.20 2.00 2.20 0.30 2.00 0.80 0.90 2.00 2.20 1.90 2.20 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.10 1.80 0.80 2.00 1.90 2.40 2.00 2.40 0.80 2.00 1.40 0.70 2.00 2.40 1.60 2.00 + 2.30 1.10 1.90 2.00 1.20 2.00 2.00 2.00 1.90 2.00 1.60 -1.10 2.00 2.00 -0.10 2.00 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.10 2.20 2.20 2.00 2.30 2.20 2.00 2.20 2.20 2.00 2.40 1.00 2.00 2.20 2.00 1.40 + 1.30 0.10 0.90 2.00 0.20 1.00 2.00 1.00 0.90 2.00 0.70 -2.10 2.00 1.00 -1.10 1.10 + 2.70 1.40 2.20 2.00 1.50 1.40 2.00 1.40 2.20 2.00 2.00 1.10 2.00 1.40 2.00 0.60 + + Y + --------------------------------------------------------------------------------------------- + A A A A C C C C G G G G U U U U + A C G U A C G U A C G U A C G U + --------------------------------------------------------------------------------------------- + 5' ------> 3' + A \/ \_/ G + U /\ | U + 3' <------ 5' + 2.80 2.30 1.70 2.00 2.80 3.40 2.00 3.40 1.70 2.00 2.10 1.00 2.00 3.10 2.20 2.90 + 2.60 2.20 1.60 2.00 2.60 2.60 2.00 2.60 1.60 2.00 2.00 -0.20 2.00 2.30 1.10 1.80 + 1.50 1.10 0.50 2.00 1.50 2.50 2.00 2.50 0.50 2.00 0.90 0.50 2.00 2.20 1.80 2.50 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.50 2.10 1.50 2.00 2.50 2.50 2.00 2.50 1.50 2.00 1.90 -0.30 2.00 2.20 1.00 1.70 + 3.10 2.00 2.40 2.00 2.50 2.50 2.00 2.50 2.40 2.00 2.40 0.70 2.00 2.20 1.90 1.60 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.10 2.00 2.40 2.00 2.50 2.50 2.00 2.50 2.40 2.00 2.40 0.70 2.00 2.20 1.90 1.60 + 1.50 1.10 0.50 2.00 1.50 2.50 2.00 2.50 0.50 2.00 0.90 0.50 2.00 2.20 1.80 2.50 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.10 1.60 1.00 2.00 2.10 2.70 2.00 2.70 1.00 2.00 1.40 0.30 2.00 2.40 1.50 2.20 + 2.30 0.90 2.10 2.00 1.30 2.30 2.00 2.30 2.10 2.00 1.70 -1.50 2.00 2.00 -0.20 2.30 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.10 2.00 2.40 2.00 2.50 2.50 2.00 2.50 2.40 2.00 2.40 0.70 2.00 2.20 1.90 1.60 + 1.30 -0.10 1.10 2.00 0.30 1.30 2.00 1.30 1.10 2.00 0.70 -2.50 2.00 1.00 -1.20 1.30 + 2.70 1.20 2.40 2.00 1.70 1.70 2.00 1.70 2.40 2.00 2.00 0.70 2.00 1.40 1.90 0.80 + + Y + --------------------------------------------------------------------------------------------- + A A A A C C C C G G G G U U U U + A C G U A C G U A C G U A C G U + --------------------------------------------------------------------------------------------- + 5' ------> 3' + A \/ \_/ U + U /\ | G + 3' <------ 5' + 2.80 2.50 1.50 2.00 2.60 3.10 2.00 3.10 1.50 2.00 2.10 1.30 2.00 3.10 2.30 2.70 + 2.60 2.40 1.40 2.00 2.50 2.30 2.00 2.30 1.40 2.00 1.90 0.20 2.00 2.30 1.20 1.50 + 1.50 1.30 0.30 2.00 1.40 2.20 2.00 2.20 0.30 2.00 0.80 0.90 2.00 2.20 1.90 2.20 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.50 2.30 1.30 2.00 2.40 2.20 2.00 2.20 1.30 2.00 1.80 0.10 2.00 2.20 1.10 1.40 + 3.10 2.20 2.20 2.00 2.30 2.20 2.00 2.20 2.20 2.00 2.40 1.00 2.00 2.20 2.00 1.40 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.10 2.20 2.20 2.00 2.30 2.20 2.00 2.20 2.20 2.00 2.40 1.00 2.00 2.20 2.00 1.40 + 1.50 1.30 0.30 2.00 1.40 2.20 2.00 2.20 0.30 2.00 0.80 0.90 2.00 2.20 1.90 2.20 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.10 1.80 0.80 2.00 1.90 2.40 2.00 2.40 0.80 2.00 1.40 0.70 2.00 2.40 1.60 2.00 + 2.30 1.10 1.90 2.00 1.20 2.00 2.00 2.00 1.90 2.00 1.60 -1.10 2.00 2.00 -0.10 2.00 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.10 2.20 2.20 2.00 2.30 2.20 2.00 2.20 2.20 2.00 2.40 1.00 2.00 2.20 2.00 1.40 + 1.30 0.10 0.90 2.00 0.20 1.00 2.00 1.00 0.90 2.00 0.70 -2.10 2.00 1.00 -1.10 1.10 + 2.70 1.40 2.20 2.00 1.50 1.40 2.00 1.40 2.20 2.00 2.00 1.10 2.00 1.40 2.00 0.60 + + Y + --------------------------------------------------------------------------------------------- + A A A A C C C C G G G G U U U U + A C G U A C G U A C G U A C G U + --------------------------------------------------------------------------------------------- + 5' ------> 3' + C \/ \_/ A + G /\ | U + 3' <------ 5' + 2.00 1.60 1.00 2.00 2.00 2.60 2.00 2.60 1.00 2.00 1.40 0.20 2.00 2.30 1.50 2.20 + 2.40 1.90 1.30 2.00 2.40 2.40 2.00 2.40 1.30 2.00 1.70 -0.40 2.00 2.10 0.80 1.50 + 1.00 0.60 0.00 2.00 1.00 2.00 2.00 2.00 0.00 2.00 0.40 0.00 2.00 1.70 1.30 2.00 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.90 1.50 0.90 2.00 1.90 1.90 2.00 1.90 0.90 2.00 1.30 -0.90 2.00 1.60 0.40 1.10 + 2.80 1.80 2.20 2.00 2.20 2.20 2.00 2.20 2.20 2.00 2.20 0.40 2.00 1.90 1.70 1.40 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.70 1.60 2.00 2.00 2.10 2.10 2.00 2.10 2.00 2.00 2.00 0.30 2.00 1.80 1.50 1.20 + 1.00 0.60 0.00 2.00 1.00 2.00 2.00 2.00 0.00 2.00 0.40 0.00 2.00 1.70 1.30 2.00 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.80 1.30 0.70 2.00 1.80 2.40 2.00 2.40 0.70 2.00 1.10 0.00 2.00 2.10 1.20 1.90 + 1.80 0.40 1.60 2.00 0.80 1.80 2.00 1.80 1.60 2.00 1.20 -2.00 2.00 1.50 -0.70 1.80 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.70 1.60 2.00 2.00 2.10 2.10 2.00 2.10 2.00 2.00 2.00 0.30 2.00 1.80 1.50 1.20 + 0.30 -1.10 0.10 2.00 -0.70 0.30 2.00 0.30 0.10 2.00 -0.30 -3.50 2.00 0.00 -2.20 0.30 + 2.20 0.70 1.90 2.00 1.20 1.20 2.00 1.20 1.90 2.00 1.50 0.20 2.00 0.90 1.50 0.30 + + Y + --------------------------------------------------------------------------------------------- + A A A A C C C C G G G G U U U U + A C G U A C G U A C G U A C G U + --------------------------------------------------------------------------------------------- + 5' ------> 3' + C \/ \_/ C + G /\ | G + 3' <------ 5' + 0.50 1.10 -0.30 2.00 1.10 1.70 2.00 0.70 0.40 2.00 1.00 0.10 2.00 1.80 -0.50 1.50 + 0.60 1.50 0.10 2.00 1.10 1.50 2.00 0.50 0.50 2.00 1.40 -0.70 2.00 1.50 -0.60 0.00 + 0.00 -0.70 -1.60 2.00 -1.00 -0.60 2.00 0.20 -0.70 2.00 0.00 -0.80 2.00 1.20 -0.60 0.90 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.30 1.00 -0.70 2.00 1.00 1.00 2.00 0.00 0.70 2.00 0.90 -1.90 2.00 1.10 -1.50 -0.20 + 2.20 1.30 0.70 2.00 1.90 1.30 2.00 0.30 0.70 2.00 1.80 -0.30 2.00 1.40 -0.20 -0.10 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.00 1.20 0.40 2.00 1.10 1.20 2.00 1.70 1.00 2.00 1.70 -0.70 2.00 1.20 -0.30 0.20 + -0.20 -0.40 -1.70 2.00 0.70 1.10 2.00 0.20 -0.50 2.00 0.00 -0.90 2.00 1.20 -1.30 0.90 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.10 0.90 -0.90 2.00 0.80 1.50 2.00 0.50 -0.20 2.00 0.80 -1.00 2.00 1.50 -0.60 1.10 + 0.90 0.00 0.30 2.00 -0.10 1.00 2.00 0.00 0.60 2.00 0.90 -3.00 2.00 1.00 -2.40 0.60 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.00 1.20 0.40 2.00 1.10 1.20 2.00 0.20 0.50 2.00 1.70 -0.70 2.00 1.20 -0.10 0.40 + -0.10 -1.60 -1.60 2.00 -1.60 -0.60 2.00 -1.60 -0.60 2.00 -0.70 -4.40 2.00 -0.50 -4.10 -1.00 + 1.40 0.30 0.50 2.00 0.30 0.30 2.00 0.10 1.40 2.00 1.20 -1.00 2.00 0.30 0.10 0.60 + + Y + --------------------------------------------------------------------------------------------- + A A A A C C C C G G G G U U U U + A C G U A C G U A C G U A C G U + --------------------------------------------------------------------------------------------- + 5' ------> 3' + C \/ \_/ G + G /\ | C + 3' <------ 5' + 1.30 1.20 0.30 2.00 1.60 2.10 2.00 1.90 0.30 2.00 1.00 -0.40 2.00 1.90 1.10 1.40 + 1.60 1.50 0.60 2.00 2.00 1.80 2.00 1.70 0.60 2.00 1.40 -1.10 2.00 1.70 0.40 0.80 + 0.30 0.20 -0.70 2.00 0.60 1.50 2.00 1.30 -0.70 2.00 0.00 -0.60 2.00 1.30 0.90 1.30 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.20 1.10 0.20 2.00 1.50 1.40 2.00 1.20 0.20 2.00 0.90 -1.50 2.00 1.20 0.00 0.30 + 2.10 1.40 1.50 2.00 1.80 1.70 2.00 1.50 1.50 2.00 1.80 -0.20 2.00 1.50 1.30 0.60 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.90 1.20 1.30 2.00 1.70 1.50 2.00 1.40 1.30 2.00 1.70 -0.40 2.00 1.40 1.10 0.50 + 0.30 0.20 -0.70 2.00 0.60 1.50 2.00 1.30 -0.70 2.00 0.00 -0.60 2.00 1.30 0.90 1.30 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.00 0.90 0.00 2.00 1.40 1.80 2.00 1.70 0.00 2.00 0.80 -0.70 2.00 1.70 0.90 1.20 + 1.10 0.00 0.90 2.00 0.40 1.30 2.00 1.10 0.90 2.00 0.90 -2.60 2.00 1.10 -1.10 1.10 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.90 1.20 1.30 2.00 1.70 1.50 2.00 1.40 1.30 2.00 1.70 -0.40 2.00 1.40 1.10 0.50 + -0.40 -1.50 -0.60 2.00 -1.10 -0.20 2.00 -0.40 -0.60 2.00 -0.70 -4.20 2.00 -0.40 -2.60 -0.50 + 1.40 0.30 1.30 2.00 0.80 0.60 2.00 0.50 1.30 2.00 1.20 -0.50 2.00 0.50 1.10 -0.40 + + Y + --------------------------------------------------------------------------------------------- + A A A A C C C C G G G G U U U U + A C G U A C G U A C G U A C G U + --------------------------------------------------------------------------------------------- + 5' ------> 3' + C \/ \_/ U + G /\ | A + 3' <------ 5' + 2.00 1.80 0.80 2.00 1.90 2.30 2.00 2.30 0.80 2.00 1.30 0.60 2.00 2.30 1.60 1.90 + 2.40 2.10 1.10 2.00 2.20 2.10 2.00 2.10 1.10 2.00 1.70 0.00 2.00 2.10 0.90 1.30 + 1.00 0.80 -0.20 2.00 0.90 1.70 2.00 1.70 -0.20 2.00 0.30 0.40 2.00 1.70 1.40 1.80 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.90 1.70 0.70 2.00 1.80 1.60 2.00 1.60 0.70 2.00 1.20 -0.50 2.00 1.60 0.50 0.80 + 2.80 2.00 2.00 2.00 2.10 1.90 2.00 1.90 2.00 2.00 2.10 0.80 2.00 1.90 1.80 1.10 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.70 1.80 1.80 2.00 1.90 1.80 2.00 1.80 1.80 2.00 2.00 0.70 2.00 1.80 1.60 1.00 + 1.00 0.80 -0.20 2.00 0.90 1.70 2.00 1.70 -0.20 2.00 0.30 0.40 2.00 1.70 1.40 1.80 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.80 1.50 0.50 2.00 1.60 2.10 2.00 2.10 0.50 2.00 1.10 0.40 2.00 2.10 1.30 1.70 + 1.80 0.60 1.40 2.00 0.70 1.50 2.00 1.50 1.40 2.00 1.10 -1.60 2.00 1.50 -0.60 1.60 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.70 1.80 1.80 2.00 1.90 1.80 2.00 1.80 1.80 2.00 2.00 0.70 2.00 1.80 1.60 1.00 + 0.30 -0.90 -0.10 2.00 -0.80 0.00 2.00 0.00 -0.10 2.00 -0.40 -3.10 2.00 0.00 -2.10 0.00 + 2.20 0.90 1.80 2.00 1.00 0.90 2.00 0.90 1.80 2.00 1.50 0.60 2.00 0.90 1.60 0.10 + + Y + --------------------------------------------------------------------------------------------- + A A A A C C C C G G G G U U U U + A C G U A C G U A C G U A C G U + --------------------------------------------------------------------------------------------- + 5' ------> 3' + C \/ \_/ G + G /\ | U + 3' <------ 5' + 2.00 1.60 1.00 2.00 2.00 2.60 2.00 2.60 1.00 2.00 1.40 0.20 2.00 2.30 1.50 2.20 + 2.40 1.90 1.30 2.00 2.40 2.40 2.00 2.40 1.30 2.00 1.70 -0.40 2.00 2.10 0.80 1.50 + 1.00 0.60 0.00 2.00 1.00 2.00 2.00 2.00 0.00 2.00 0.40 0.00 2.00 1.70 1.30 2.00 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.90 1.50 0.90 2.00 1.90 1.90 2.00 1.90 0.90 2.00 1.30 -0.90 2.00 1.60 0.40 1.10 + 2.80 1.80 2.20 2.00 2.20 2.20 2.00 2.20 2.20 2.00 2.20 0.40 2.00 1.90 1.70 1.40 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.70 1.60 2.00 2.00 2.10 2.10 2.00 2.10 2.00 2.00 2.00 0.30 2.00 1.80 1.50 1.20 + 1.00 0.60 0.00 2.00 1.00 2.00 2.00 2.00 0.00 2.00 0.40 0.00 2.00 1.70 1.30 2.00 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.80 1.30 0.70 2.00 1.80 2.40 2.00 2.40 0.70 2.00 1.10 0.00 2.00 2.10 1.20 1.90 + 1.80 0.40 1.60 2.00 0.80 1.80 2.00 1.80 1.60 2.00 1.20 -2.00 2.00 1.50 -0.70 1.80 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.70 1.60 2.00 2.00 2.10 2.10 2.00 2.10 2.00 2.00 2.00 0.30 2.00 1.80 1.50 1.20 + 0.30 -1.10 0.10 2.00 -0.70 0.30 2.00 0.30 0.10 2.00 -0.30 -3.50 2.00 0.00 -2.20 0.30 + 2.20 0.70 1.90 2.00 1.20 1.20 2.00 1.20 1.90 2.00 1.50 0.20 2.00 0.90 1.50 0.30 + + Y + --------------------------------------------------------------------------------------------- + A A A A C C C C G G G G U U U U + A C G U A C G U A C G U A C G U + --------------------------------------------------------------------------------------------- + 5' ------> 3' + C \/ \_/ U + G /\ | G + 3' <------ 5' + 2.00 1.80 0.80 2.00 1.90 2.30 2.00 2.30 0.80 2.00 1.30 0.60 2.00 2.30 1.60 1.90 + 2.40 2.10 1.10 2.00 2.20 2.10 2.00 2.10 1.10 2.00 1.70 0.00 2.00 2.10 0.90 1.30 + 1.00 0.80 -0.20 2.00 0.90 1.70 2.00 1.70 -0.20 2.00 0.30 0.40 2.00 1.70 1.40 1.80 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.90 1.70 0.70 2.00 1.80 1.60 2.00 1.60 0.70 2.00 1.20 -0.50 2.00 1.60 0.50 0.80 + 2.80 2.00 2.00 2.00 2.10 1.90 2.00 1.90 2.00 2.00 2.10 0.80 2.00 1.90 1.80 1.10 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.70 1.80 1.80 2.00 1.90 1.80 2.00 1.80 1.80 2.00 2.00 0.70 2.00 1.80 1.60 1.00 + 1.00 0.80 -0.20 2.00 0.90 1.70 2.00 1.70 -0.20 2.00 0.30 0.40 2.00 1.70 1.40 1.80 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.80 1.50 0.50 2.00 1.60 2.10 2.00 2.10 0.50 2.00 1.10 0.40 2.00 2.10 1.30 1.70 + 1.80 0.60 1.40 2.00 0.70 1.50 2.00 1.50 1.40 2.00 1.10 -1.60 2.00 1.50 -0.60 1.60 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.70 1.80 1.80 2.00 1.90 1.80 2.00 1.80 1.80 2.00 2.00 0.70 2.00 1.80 1.60 1.00 + 0.30 -0.90 -0.10 2.00 -0.80 0.00 2.00 0.00 -0.10 2.00 -0.40 -3.10 2.00 0.00 -2.10 0.00 + 2.20 0.90 1.80 2.00 1.00 0.90 2.00 0.90 1.80 2.00 1.50 0.60 2.00 0.90 1.60 0.10 + + Y + --------------------------------------------------------------------------------------------- + A A A A C C C C G G G G U U U U + A C G U A C G U A C G U A C G U + --------------------------------------------------------------------------------------------- + 5' ------> 3' + G \/ \_/ A + C /\ | U + 3' <------ 5' + 2.10 1.70 1.10 2.00 2.10 2.70 2.00 2.70 1.10 2.00 1.50 0.30 2.00 2.40 1.60 2.30 + 1.80 1.40 0.80 2.00 1.80 1.80 2.00 1.80 0.80 2.00 1.20 -1.00 2.00 1.50 0.30 1.00 + 0.70 0.30 -0.30 2.00 0.70 1.70 2.00 1.70 -0.30 2.00 0.10 -0.30 2.00 1.40 1.00 1.70 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.90 1.40 0.80 2.00 1.90 1.90 2.00 1.90 0.80 2.00 1.20 -0.90 2.00 1.60 0.30 1.00 + 2.50 1.40 1.80 2.00 1.90 1.90 2.00 1.90 1.80 2.00 1.80 0.10 2.00 1.60 1.30 1.00 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.50 1.50 1.90 2.00 1.90 1.90 2.00 1.90 1.90 2.00 1.90 0.10 2.00 1.60 1.40 1.10 + 0.10 -0.30 -0.90 2.00 0.10 1.10 2.00 1.10 -0.90 2.00 -0.50 -0.90 2.00 0.80 0.40 1.10 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.80 1.30 0.70 2.00 1.80 2.40 2.00 2.40 0.70 2.00 1.10 0.00 2.00 2.10 1.20 1.90 + 0.40 -1.10 0.10 2.00 -0.60 0.40 2.00 0.40 0.10 2.00 -0.30 -3.50 2.00 0.10 -2.20 0.30 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.50 0.40 0.90 2.00 0.90 0.90 2.00 0.90 0.90 2.00 0.80 -0.90 2.00 0.60 0.40 0.00 + 0.00 -1.50 -0.30 2.00 -1.00 0.00 2.00 0.00 -0.30 2.00 -0.70 -3.90 2.00 -0.30 -2.60 -0.10 + 2.10 0.70 1.90 2.00 1.10 1.10 2.00 1.10 1.90 2.00 1.50 0.10 2.00 0.80 1.40 0.30 + + Y + --------------------------------------------------------------------------------------------- + A A A A C C C C G G G G U U U U + A C G U A C G U A C G U A C G U + --------------------------------------------------------------------------------------------- + 5' ------> 3' + G \/ \_/ C + C /\ | G + 3' <------ 5' + 1.50 1.20 -0.50 2.00 1.20 1.80 2.00 0.80 0.10 2.00 1.10 -0.70 2.00 1.90 -0.30 1.50 + 1.20 0.90 -0.80 2.00 0.90 0.90 2.00 0.00 -0.20 2.00 0.80 -2.00 2.00 1.00 -1.60 0.20 + 0.10 -0.10 -1.90 2.00 -0.20 0.90 2.00 -0.10 -1.30 2.00 -0.20 -1.30 2.00 0.90 -0.90 0.90 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.20 1.00 -0.80 2.00 0.90 1.00 2.00 0.00 -0.10 2.00 0.90 -1.90 2.00 1.00 -1.50 0.20 + 1.80 1.00 0.20 2.00 0.90 1.00 2.00 0.00 0.90 2.00 1.50 -0.90 2.00 1.00 -0.50 0.20 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.90 1.00 0.30 2.00 1.00 1.00 2.00 0.00 0.90 2.00 1.50 -0.90 2.00 1.10 -0.50 0.30 + -0.50 -0.80 -2.60 2.00 -0.80 0.20 2.00 -0.80 -1.90 2.00 -0.90 -1.90 2.00 0.30 -1.50 0.30 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.10 0.90 -0.90 2.00 0.80 1.50 2.00 0.50 -0.20 2.00 0.80 -1.00 2.00 1.50 -0.60 1.10 + -0.30 -1.50 -1.50 2.00 -1.60 -0.50 2.00 -1.50 -0.90 2.00 -0.60 -4.50 2.00 -0.50 -4.10 -0.50 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 0.80 0.00 -0.80 2.00 0.00 0.00 2.00 -1.00 -0.10 2.00 0.50 -1.90 2.00 0.00 -1.50 -0.70 + -0.70 -1.90 -1.90 2.00 -2.00 -0.90 2.00 -1.90 -1.30 2.00 -1.00 -4.90 2.00 -0.90 -4.50 -0.90 + 1.50 0.20 0.30 2.00 0.20 0.20 2.00 -0.70 0.90 2.00 1.10 -0.90 2.00 0.30 -0.50 -0.50 + + Y + --------------------------------------------------------------------------------------------- + A A A A C C C C G G G G U U U U + A C G U A C G U A C G U A C G U + --------------------------------------------------------------------------------------------- + 5' ------> 3' + G \/ \_/ G + C /\ | C + 3' <------ 5' + 0.50 1.30 -0.20 2.00 0.60 2.20 2.00 2.00 0.00 2.00 1.10 -0.10 2.00 2.00 0.90 1.40 + 1.10 1.00 0.70 2.00 1.10 1.90 2.00 1.10 -1.00 2.00 0.80 -1.60 2.00 1.10 -0.10 0.30 + 0.40 0.70 -0.50 2.00 0.50 0.70 2.00 0.50 -0.70 2.00 -0.20 -0.60 2.00 1.00 0.60 1.40 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.10 1.00 -0.40 2.00 1.50 1.30 2.00 1.20 -0.70 2.00 0.90 -1.60 2.00 1.20 0.00 0.30 + 1.70 1.00 1.10 2.00 1.50 1.30 2.00 1.20 -0.60 2.00 1.50 -0.60 2.00 1.20 1.00 0.30 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.80 1.10 1.20 2.00 1.50 1.40 2.00 1.20 1.20 2.00 1.50 -0.50 2.00 1.20 1.00 0.30 + -0.30 -0.70 -1.70 2.00 0.10 0.70 2.00 0.40 -1.60 2.00 -0.90 -1.60 2.00 0.40 0.30 0.50 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.00 0.90 0.00 2.00 1.40 1.80 2.00 1.70 0.00 2.00 0.80 -0.70 2.00 1.70 0.90 1.20 + -0.50 -1.50 -1.30 2.00 -0.60 -0.20 2.00 -0.10 -0.60 2.00 -0.60 -4.10 2.00 -0.30 -2.40 0.10 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 0.70 0.00 0.20 2.00 0.50 0.30 2.00 0.20 0.20 2.00 0.50 -1.60 2.00 1.70 0.00 0.10 + 0.10 -1.90 -0.90 2.00 -0.70 -0.30 2.00 -0.70 -0.80 2.00 -1.00 -4.40 2.00 -0.70 -3.00 -1.00 + 1.50 -0.20 0.90 2.00 0.00 -0.10 2.00 0.40 0.90 2.00 1.10 -1.00 2.00 0.20 0.60 0.60 + + Y + --------------------------------------------------------------------------------------------- + A A A A C C C C G G G G U U U U + A C G U A C G U A C G U A C G U + --------------------------------------------------------------------------------------------- + 5' ------> 3' + G \/ \_/ U + C /\ | A + 3' <------ 5' + 2.10 1.90 0.90 2.00 2.00 2.40 2.00 2.40 0.90 2.00 1.40 0.70 2.00 2.40 1.70 2.00 + 1.80 1.60 0.60 2.00 1.70 1.50 2.00 1.50 0.60 2.00 1.10 -0.60 2.00 1.50 0.40 0.70 + 0.70 0.50 -0.50 2.00 0.60 1.40 2.00 1.40 -0.50 2.00 0.00 0.10 2.00 1.40 1.10 1.50 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.90 1.60 0.60 2.00 1.70 1.60 2.00 1.60 0.60 2.00 1.20 -0.50 2.00 1.60 0.40 0.80 + 2.50 1.60 1.60 2.00 1.70 1.60 2.00 1.60 1.60 2.00 1.80 0.50 2.00 1.60 1.40 0.80 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.50 1.70 1.70 2.00 1.80 1.60 2.00 1.60 1.70 2.00 1.80 0.50 2.00 1.60 1.50 0.80 + 0.10 -0.10 -1.10 2.00 0.00 0.80 2.00 0.80 -1.10 2.00 -0.60 -0.50 2.00 0.80 0.50 0.80 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.80 1.50 0.50 2.00 1.60 2.10 2.00 2.10 0.50 2.00 1.10 0.40 2.00 2.10 1.30 1.70 + 0.40 -0.90 -0.10 2.00 -0.80 0.10 2.00 0.10 -0.10 2.00 -0.30 -3.10 2.00 0.10 -2.10 0.10 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.50 0.60 0.70 2.00 0.70 0.60 2.00 0.60 0.70 2.00 0.80 -0.50 2.00 0.60 0.50 -0.20 + 0.00 -1.30 -0.50 2.00 -1.20 -0.30 2.00 -0.30 -0.50 2.00 -0.70 -3.50 2.00 -0.30 -2.50 -0.30 + 2.10 0.90 1.70 2.00 1.00 0.80 2.00 0.80 1.70 2.00 1.40 0.50 2.00 0.80 1.50 0.00 + + Y + --------------------------------------------------------------------------------------------- + A A A A C C C C G G G G U U U U + A C G U A C G U A C G U A C G U + --------------------------------------------------------------------------------------------- + 5' ------> 3' + G \/ \_/ G + C /\ | U + 3' <------ 5' + 2.10 1.70 1.10 2.00 2.10 2.70 2.00 2.70 1.10 2.00 1.50 0.30 2.00 2.40 1.60 2.30 + 1.80 1.40 0.80 2.00 1.80 1.80 2.00 1.80 0.80 2.00 1.20 -1.00 2.00 1.50 0.30 1.00 + 0.70 0.30 -0.30 2.00 0.70 1.70 2.00 1.70 -0.30 2.00 0.10 -0.30 2.00 1.40 1.00 1.70 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.90 1.40 0.80 2.00 1.90 1.90 2.00 1.90 0.80 2.00 1.20 -0.90 2.00 1.60 0.30 1.00 + 2.50 1.40 1.80 2.00 1.90 1.90 2.00 1.90 1.80 2.00 1.80 0.10 2.00 1.60 1.30 1.00 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.50 1.50 1.90 2.00 1.90 1.90 2.00 1.90 1.90 2.00 1.90 0.10 2.00 1.60 1.40 1.10 + 0.10 -0.30 -0.90 2.00 0.10 1.10 2.00 1.10 -0.90 2.00 -0.50 -0.90 2.00 0.80 0.40 1.10 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.80 1.30 0.70 2.00 1.80 2.40 2.00 2.40 0.70 2.00 1.10 0.00 2.00 2.10 1.20 1.90 + 0.40 -1.10 0.10 2.00 -0.60 0.40 2.00 0.40 0.10 2.00 -0.30 -3.50 2.00 0.10 -2.20 0.30 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.50 0.40 0.90 2.00 0.90 0.90 2.00 0.90 0.90 2.00 0.80 -0.90 2.00 0.60 0.40 0.00 + 0.00 -1.50 -0.30 2.00 -1.00 0.00 2.00 0.00 -0.30 2.00 -0.70 -3.90 2.00 -0.30 -2.60 -0.10 + 2.10 0.70 1.90 2.00 1.10 1.10 2.00 1.10 1.90 2.00 1.50 0.10 2.00 0.80 1.40 0.30 + + Y + --------------------------------------------------------------------------------------------- + A A A A C C C C G G G G U U U U + A C G U A C G U A C G U A C G U + --------------------------------------------------------------------------------------------- + 5' ------> 3' + G \/ \_/ U + C /\ | G + 3' <------ 5' + 2.10 1.90 0.90 2.00 2.00 2.40 2.00 2.40 0.90 2.00 1.40 0.70 2.00 2.40 1.70 2.00 + 1.80 1.60 0.60 2.00 1.70 1.50 2.00 1.50 0.60 2.00 1.10 -0.60 2.00 1.50 0.40 0.70 + 0.70 0.50 -0.50 2.00 0.60 1.40 2.00 1.40 -0.50 2.00 0.00 0.10 2.00 1.40 1.10 1.50 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.90 1.60 0.60 2.00 1.70 1.60 2.00 1.60 0.60 2.00 1.20 -0.50 2.00 1.60 0.40 0.80 + 2.50 1.60 1.60 2.00 1.70 1.60 2.00 1.60 1.60 2.00 1.80 0.50 2.00 1.60 1.40 0.80 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.50 1.70 1.70 2.00 1.80 1.60 2.00 1.60 1.70 2.00 1.80 0.50 2.00 1.60 1.50 0.80 + 0.10 -0.10 -1.10 2.00 0.00 0.80 2.00 0.80 -1.10 2.00 -0.60 -0.50 2.00 0.80 0.50 0.80 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.80 1.50 0.50 2.00 1.60 2.10 2.00 2.10 0.50 2.00 1.10 0.40 2.00 2.10 1.30 1.70 + 0.40 -0.90 -0.10 2.00 -0.80 0.10 2.00 0.10 -0.10 2.00 -0.30 -3.10 2.00 0.10 -2.10 0.10 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.50 0.60 0.70 2.00 0.70 0.60 2.00 0.60 0.70 2.00 0.80 -0.50 2.00 0.60 0.50 -0.20 + 0.00 -1.30 -0.50 2.00 -1.20 -0.30 2.00 -0.30 -0.50 2.00 -0.70 -3.50 2.00 -0.30 -2.50 -0.30 + 2.10 0.90 1.70 2.00 1.00 0.80 2.00 0.80 1.70 2.00 1.40 0.50 2.00 0.80 1.50 0.00 + + Y + --------------------------------------------------------------------------------------------- + A A A A C C C C G G G G U U U U + A C G U A C G U A C G U A C G U + --------------------------------------------------------------------------------------------- + 5' ------> 3' + U \/ \_/ A + A /\ | U + 3' <------ 5' + 2.80 2.30 1.70 2.00 2.80 3.40 2.00 3.40 1.70 2.00 2.10 1.00 2.00 3.10 2.20 2.90 + 2.80 2.30 1.70 2.00 2.80 2.80 2.00 2.80 1.70 2.00 2.10 0.00 2.00 2.50 1.20 1.90 + 1.70 1.30 0.70 2.00 1.70 2.70 2.00 2.70 0.70 2.00 1.10 0.70 2.00 2.40 2.00 2.70 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.30 1.90 1.30 2.00 2.30 2.30 2.00 2.30 1.30 2.00 1.70 -0.50 2.00 2.00 0.80 1.50 + 3.40 2.30 2.70 2.00 2.80 2.80 2.00 2.80 2.70 2.00 2.70 1.00 2.00 2.50 2.20 1.90 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.10 2.00 2.40 2.00 2.50 2.50 2.00 2.50 2.40 2.00 2.40 0.70 2.00 2.20 1.90 1.60 + 1.70 1.30 0.70 2.00 1.70 2.70 2.00 2.70 0.70 2.00 1.10 0.70 2.00 2.40 2.00 2.70 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.10 1.70 1.10 2.00 2.10 2.70 2.00 2.70 1.10 2.00 1.50 0.30 2.00 2.40 1.60 2.30 + 2.20 0.80 2.00 2.00 1.20 2.20 2.00 2.20 2.00 2.00 1.60 -1.60 2.00 1.90 -0.30 2.20 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.40 2.30 2.70 2.00 2.80 2.80 2.00 2.80 2.70 2.00 2.70 1.00 2.00 2.50 2.20 1.90 + 1.00 -0.50 0.70 2.00 0.00 1.00 2.00 1.00 0.70 2.00 0.30 -2.90 2.00 0.70 -1.60 0.90 + 2.90 1.50 2.70 2.00 1.90 1.90 2.00 1.90 2.70 2.00 2.30 0.90 2.00 1.60 2.20 1.10 + + Y + --------------------------------------------------------------------------------------------- + A A A A C C C C G G G G U U U U + A C G U A C G U A C G U A C G U + --------------------------------------------------------------------------------------------- + 5' ------> 3' + U \/ \_/ C + A /\ | G + 3' <------ 5' + 2.10 1.90 0.10 2.00 1.80 2.50 2.00 1.50 0.70 2.00 1.80 0.00 2.00 2.50 0.40 2.10 + 2.10 1.90 0.10 2.00 1.80 1.90 2.00 0.90 0.70 2.00 1.80 -1.00 2.00 1.90 -0.60 1.10 + 1.10 0.80 -0.90 2.00 0.80 1.80 2.00 0.90 -0.30 2.00 0.70 -0.30 2.00 1.90 0.10 1.90 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.70 1.40 -0.30 2.00 1.40 1.40 2.00 0.40 0.30 2.00 1.30 -1.50 2.00 1.50 -1.10 0.70 + 2.70 1.90 1.10 2.00 1.80 1.90 2.00 0.90 1.70 2.00 2.40 0.00 2.00 1.90 0.40 1.10 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.40 1.60 0.80 2.00 1.50 1.60 2.00 0.60 1.40 2.00 2.10 -0.30 2.00 1.60 0.10 0.80 + 1.10 0.80 -0.90 2.00 0.80 1.80 2.00 0.90 -0.30 2.00 0.70 -0.30 2.00 1.90 0.10 1.90 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.50 1.20 -0.50 2.00 1.20 1.80 2.00 0.80 0.10 2.00 1.10 -0.70 2.00 1.90 -0.30 1.50 + 1.60 0.30 0.40 2.00 0.30 1.30 2.00 0.40 1.00 2.00 1.20 -2.60 2.00 1.40 -2.20 1.40 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.70 1.90 1.10 2.00 1.80 1.90 2.00 0.90 1.70 2.00 2.40 0.00 2.00 1.90 0.40 1.10 + 0.30 -0.90 -0.90 2.00 -1.00 0.10 2.00 -0.90 -0.30 2.00 0.00 -3.90 2.00 0.10 -3.50 0.10 + 2.30 1.00 1.10 2.00 1.00 1.00 2.00 0.00 1.70 2.00 1.90 -0.10 2.00 1.10 0.30 0.30 + + Y + --------------------------------------------------------------------------------------------- + A A A A C C C C G G G G U U U U + A C G U A C G U A C G U A C G U + --------------------------------------------------------------------------------------------- + 5' ------> 3' + U \/ \_/ G + A /\ | C + 3' <------ 5' + 2.00 1.90 1.00 2.00 2.40 2.80 2.00 2.70 1.00 2.00 1.80 0.30 2.00 2.70 1.80 2.20 + 2.00 1.90 1.00 2.00 2.40 2.20 2.00 2.10 1.00 2.00 1.80 -0.70 2.00 2.10 0.80 1.20 + 1.00 0.90 0.00 2.00 1.30 2.20 2.00 2.00 0.00 2.00 0.70 0.10 2.00 2.00 1.60 1.90 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.60 1.50 0.60 2.00 1.90 1.80 2.00 1.60 0.60 2.00 1.30 -1.10 2.00 1.60 0.40 0.70 + 2.60 1.90 2.00 2.00 2.40 2.20 2.00 2.10 2.00 2.00 2.40 0.30 2.00 2.10 1.80 1.20 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.30 1.60 1.70 2.00 2.10 1.90 2.00 1.80 1.70 2.00 2.10 0.00 2.00 1.80 1.50 0.90 + 1.00 0.90 0.00 2.00 1.30 2.20 2.00 2.00 0.00 2.00 0.70 0.10 2.00 2.00 1.60 1.90 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.40 1.30 0.40 2.00 1.70 2.20 2.00 2.00 0.40 2.00 1.10 -0.30 2.00 2.00 1.20 1.50 + 1.50 0.40 1.30 2.00 0.80 1.70 2.00 1.50 1.30 2.00 1.20 -2.20 2.00 1.50 -0.70 1.50 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.60 1.90 2.00 2.00 2.40 2.20 2.00 2.10 2.00 2.00 2.40 0.30 2.00 2.10 1.80 1.20 + 0.20 -0.90 0.00 2.00 -0.40 0.40 2.00 0.30 0.00 2.00 0.00 -3.50 2.00 0.30 -2.00 0.20 + 2.20 1.10 2.00 2.00 1.50 1.40 2.00 1.20 2.00 2.00 1.90 0.30 2.00 1.20 1.80 0.30 + + Y + --------------------------------------------------------------------------------------------- + A A A A C C C C G G G G U U U U + A C G U A C G U A C G U A C G U + --------------------------------------------------------------------------------------------- + 5' ------> 3' + U \/ \_/ U + A /\ | A + 3' <------ 5' + 2.80 2.50 1.50 2.00 2.60 3.10 2.00 3.10 1.50 2.00 2.10 1.30 2.00 3.10 2.30 2.70 + 2.80 2.50 1.50 2.00 2.60 2.50 2.00 2.50 1.50 2.00 2.10 0.30 2.00 2.50 1.30 1.70 + 1.70 1.50 0.50 2.00 1.60 2.40 2.00 2.40 0.50 2.00 1.00 1.10 2.00 2.40 2.10 2.40 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.30 2.10 1.10 2.00 2.20 2.00 2.00 2.00 1.10 2.00 1.60 -0.10 2.00 2.00 0.90 1.20 + 3.40 2.50 2.50 2.00 2.60 2.50 2.00 2.50 2.50 2.00 2.70 1.30 2.00 2.50 2.30 1.70 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.10 2.20 2.20 2.00 2.30 2.20 2.00 2.20 2.20 2.00 2.40 1.00 2.00 2.20 2.00 1.40 + 1.70 1.50 0.50 2.00 1.60 2.40 2.00 2.40 0.50 2.00 1.00 1.10 2.00 2.40 2.10 2.40 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.10 1.90 0.90 2.00 2.00 2.40 2.00 2.40 0.90 2.00 1.40 0.70 2.00 2.40 1.70 2.00 + 2.20 1.00 1.80 2.00 1.10 1.90 2.00 1.90 1.80 2.00 1.50 -1.20 2.00 1.90 -0.20 1.90 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.40 2.50 2.50 2.00 2.60 2.50 2.00 2.50 2.50 2.00 2.70 1.30 2.00 2.50 2.30 1.70 + 1.00 -0.30 0.50 2.00 -0.20 0.70 2.00 0.70 0.50 2.00 0.30 -2.50 2.00 0.70 -1.50 0.70 + 2.90 1.70 2.50 2.00 1.80 1.60 2.00 1.60 2.50 2.00 2.20 1.30 2.00 1.60 2.30 0.80 + + Y + --------------------------------------------------------------------------------------------- + A A A A C C C C G G G G U U U U + A C G U A C G U A C G U A C G U + --------------------------------------------------------------------------------------------- + 5' ------> 3' + U \/ \_/ G + A /\ | U + 3' <------ 5' + 2.80 2.30 1.70 2.00 2.80 3.40 2.00 3.40 1.70 2.00 2.10 1.00 2.00 3.10 2.20 2.90 + 2.80 2.30 1.70 2.00 2.80 2.80 2.00 2.80 1.70 2.00 2.10 0.00 2.00 2.50 1.20 1.90 + 1.70 1.30 0.70 2.00 1.70 2.70 2.00 2.70 0.70 2.00 1.10 0.70 2.00 2.40 2.00 2.70 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.30 1.90 1.30 2.00 2.30 2.30 2.00 2.30 1.30 2.00 1.70 -0.50 2.00 2.00 0.80 1.50 + 3.40 2.30 2.70 2.00 2.80 2.80 2.00 2.80 2.70 2.00 2.70 1.00 2.00 2.50 2.20 1.90 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.10 2.00 2.40 2.00 2.50 2.50 2.00 2.50 2.40 2.00 2.40 0.70 2.00 2.20 1.90 1.60 + 1.70 1.30 0.70 2.00 1.70 2.70 2.00 2.70 0.70 2.00 1.10 0.70 2.00 2.40 2.00 2.70 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.10 1.70 1.10 2.00 2.10 2.70 2.00 2.70 1.10 2.00 1.50 0.30 2.00 2.40 1.60 2.30 + 2.20 0.80 2.00 2.00 1.20 2.20 2.00 2.20 2.00 2.00 1.60 -1.60 2.00 1.90 -0.30 2.20 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.40 2.30 2.70 2.00 2.80 2.80 2.00 2.80 2.70 2.00 2.70 1.00 2.00 2.50 2.20 1.90 + 1.00 -0.50 0.70 2.00 0.00 1.00 2.00 1.00 0.70 2.00 0.30 -2.90 2.00 0.70 -1.60 0.90 + 2.90 1.50 2.70 2.00 1.90 1.90 2.00 1.90 2.70 2.00 2.30 0.90 2.00 1.60 2.20 1.10 + + Y + --------------------------------------------------------------------------------------------- + A A A A C C C C G G G G U U U U + A C G U A C G U A C G U A C G U + --------------------------------------------------------------------------------------------- + 5' ------> 3' + U \/ \_/ U + A /\ | G + 3' <------ 5' + 2.80 2.50 1.50 2.00 2.60 3.10 2.00 3.10 1.50 2.00 2.10 1.30 2.00 3.10 2.30 2.70 + 2.80 2.50 1.50 2.00 2.60 2.50 2.00 2.50 1.50 2.00 2.10 0.30 2.00 2.50 1.30 1.70 + 1.70 1.50 0.50 2.00 1.60 2.40 2.00 2.40 0.50 2.00 1.00 1.10 2.00 2.40 2.10 2.40 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.30 2.10 1.10 2.00 2.20 2.00 2.00 2.00 1.10 2.00 1.60 -0.10 2.00 2.00 0.90 1.20 + 3.40 2.50 2.50 2.00 2.60 2.50 2.00 2.50 2.50 2.00 2.70 1.30 2.00 2.50 2.30 1.70 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.10 2.20 2.20 2.00 2.30 2.20 2.00 2.20 2.20 2.00 2.40 1.00 2.00 2.20 2.00 1.40 + 1.70 1.50 0.50 2.00 1.60 2.40 2.00 2.40 0.50 2.00 1.00 1.10 2.00 2.40 2.10 2.40 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.10 1.90 0.90 2.00 2.00 2.40 2.00 2.40 0.90 2.00 1.40 0.70 2.00 2.40 1.70 2.00 + 2.20 1.00 1.80 2.00 1.10 1.90 2.00 1.90 1.80 2.00 1.50 -1.20 2.00 1.90 -0.20 1.90 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.40 2.50 2.50 2.00 2.60 2.50 2.00 2.50 2.50 2.00 2.70 1.30 2.00 2.50 2.30 1.70 + 1.00 -0.30 0.50 2.00 -0.20 0.70 2.00 0.70 0.50 2.00 0.30 -2.50 2.00 0.70 -1.50 0.70 + 2.90 1.70 2.50 2.00 1.80 1.60 2.00 1.60 2.50 2.00 2.20 1.30 2.00 1.60 2.30 0.80 + + Y + --------------------------------------------------------------------------------------------- + A A A A C C C C G G G G U U U U + A C G U A C G U A C G U A C G U + --------------------------------------------------------------------------------------------- + 5' ------> 3' + G \/ \_/ A + U /\ | U + 3' <------ 5' + 2.80 2.30 1.70 2.00 2.80 3.40 2.00 3.40 1.70 2.00 2.10 1.00 2.00 3.10 2.20 2.90 + 2.60 2.20 1.60 2.00 2.60 2.60 2.00 2.60 1.60 2.00 2.00 -0.20 2.00 2.30 1.10 1.80 + 1.50 1.10 0.50 2.00 1.50 2.50 2.00 2.50 0.50 2.00 0.90 0.50 2.00 2.20 1.80 2.50 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.50 2.10 1.50 2.00 2.50 2.50 2.00 2.50 1.50 2.00 1.90 -0.30 2.00 2.20 1.00 1.70 + 3.10 2.00 2.40 2.00 2.50 2.50 2.00 2.50 2.40 2.00 2.40 0.70 2.00 2.20 1.90 1.60 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.10 2.00 2.40 2.00 2.50 2.50 2.00 2.50 2.40 2.00 2.40 0.70 2.00 2.20 1.90 1.60 + 1.50 1.10 0.50 2.00 1.50 2.50 2.00 2.50 0.50 2.00 0.90 0.50 2.00 2.20 1.80 2.50 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.10 1.60 1.00 2.00 2.10 2.70 2.00 2.70 1.00 2.00 1.40 0.30 2.00 2.40 1.50 2.20 + 2.30 0.90 2.10 2.00 1.30 2.30 2.00 2.30 2.10 2.00 1.70 -1.50 2.00 2.00 -0.20 2.30 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.10 2.00 2.40 2.00 2.50 2.50 2.00 2.50 2.40 2.00 2.40 0.70 2.00 2.20 1.90 1.60 + 1.30 -0.10 1.10 2.00 0.30 1.30 2.00 1.30 1.10 2.00 0.70 -2.50 2.00 1.00 -1.20 1.30 + 2.70 1.20 2.40 2.00 1.70 1.70 2.00 1.70 2.40 2.00 2.00 0.70 2.00 1.40 1.90 0.80 + + Y + --------------------------------------------------------------------------------------------- + A A A A C C C C G G G G U U U U + A C G U A C G U A C G U A C G U + --------------------------------------------------------------------------------------------- + 5' ------> 3' + G \/ \_/ C + U /\ | G + 3' <------ 5' + 2.10 1.90 0.10 2.00 1.80 2.50 2.00 1.50 0.70 2.00 1.80 0.00 2.00 2.50 0.40 2.10 + 2.00 1.70 0.00 2.00 1.70 1.70 2.00 0.70 0.60 2.00 1.60 -1.20 2.00 1.80 -0.80 1.00 + 0.90 0.60 -1.10 2.00 0.60 1.60 2.00 0.70 -0.50 2.00 0.50 -0.50 2.00 1.70 -0.10 1.70 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.90 1.60 -0.10 2.00 1.60 1.60 2.00 0.60 0.50 2.00 1.50 -1.30 2.00 1.70 -0.90 0.90 + 2.40 1.60 0.80 2.00 1.50 1.60 2.00 0.60 1.40 2.00 2.10 -0.30 2.00 1.60 0.10 0.80 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.40 1.60 0.80 2.00 1.50 1.60 2.00 0.60 1.40 2.00 2.10 -0.30 2.00 1.60 0.10 0.80 + 0.90 0.60 -1.10 2.00 0.60 1.60 2.00 0.70 -0.50 2.00 0.50 -0.50 2.00 1.70 -0.10 1.70 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.40 1.20 -0.60 2.00 1.10 1.80 2.00 0.80 0.00 2.00 1.10 -0.70 2.00 1.80 -0.30 1.40 + 1.70 0.40 0.50 2.00 0.40 1.40 2.00 0.50 1.10 2.00 1.30 -2.50 2.00 1.50 -2.10 1.50 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.40 1.60 0.80 2.00 1.50 1.60 2.00 0.60 1.40 2.00 2.10 -0.30 2.00 1.60 0.10 0.80 + 0.70 -0.50 -0.50 2.00 -0.60 0.50 2.00 -0.50 0.10 2.00 0.40 -3.50 2.00 0.50 -3.10 0.50 + 2.00 0.80 0.80 2.00 0.70 0.80 2.00 -0.20 1.50 2.00 1.70 -0.30 2.00 0.80 0.10 0.00 + + Y + --------------------------------------------------------------------------------------------- + A A A A C C C C G G G G U U U U + A C G U A C G U A C G U A C G U + --------------------------------------------------------------------------------------------- + 5' ------> 3' + G \/ \_/ G + U /\ | C + 3' <------ 5' + 2.00 1.90 1.00 2.00 2.40 2.80 2.00 2.70 1.00 2.00 1.80 0.30 2.00 2.70 1.80 2.20 + 1.90 1.80 0.90 2.00 2.20 2.10 2.00 1.90 0.90 2.00 1.60 -0.80 2.00 1.90 0.70 1.00 + 0.80 0.70 -0.20 2.00 1.10 2.00 2.00 1.80 -0.20 2.00 0.50 -0.10 2.00 1.80 1.40 1.80 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.80 1.70 0.80 2.00 2.10 2.00 2.00 1.80 0.80 2.00 1.50 -0.90 2.00 1.80 0.60 0.90 + 2.30 1.60 1.70 2.00 2.10 1.90 2.00 1.80 1.70 2.00 2.10 0.00 2.00 1.80 1.50 0.90 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.30 1.60 1.70 2.00 2.10 1.90 2.00 1.80 1.70 2.00 2.10 0.00 2.00 1.80 1.50 0.90 + 0.80 0.70 -0.20 2.00 1.10 2.00 2.00 1.80 -0.20 2.00 0.50 -0.10 2.00 1.80 1.40 1.80 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.30 1.20 0.30 2.00 1.70 2.10 2.00 2.00 0.30 2.00 1.10 -0.40 2.00 2.00 1.10 1.50 + 1.60 0.50 1.40 2.00 0.90 1.80 2.00 1.60 1.40 2.00 1.30 -2.10 2.00 1.60 -0.60 1.60 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.30 1.60 1.70 2.00 2.10 1.90 2.00 1.80 1.70 2.00 2.10 0.00 2.00 1.80 1.50 0.90 + 0.60 -0.50 0.40 2.00 0.00 0.80 2.00 0.70 0.40 2.00 0.40 -3.10 2.00 0.70 -1.60 0.60 + 1.90 0.80 1.80 2.00 1.30 1.10 2.00 1.00 1.80 2.00 1.70 0.00 2.00 1.00 1.60 0.10 + + Y + --------------------------------------------------------------------------------------------- + A A A A C C C C G G G G U U U U + A C G U A C G U A C G U A C G U + --------------------------------------------------------------------------------------------- + 5' ------> 3' + G \/ \_/ U + U /\ | A + 3' <------ 5' + 2.80 2.50 1.50 2.00 2.60 3.10 2.00 3.10 1.50 2.00 2.10 1.30 2.00 3.10 2.30 2.70 + 2.60 2.40 1.40 2.00 2.50 2.30 2.00 2.30 1.40 2.00 1.90 0.20 2.00 2.30 1.20 1.50 + 1.50 1.30 0.30 2.00 1.40 2.20 2.00 2.20 0.30 2.00 0.80 0.90 2.00 2.20 1.90 2.20 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.50 2.30 1.30 2.00 2.40 2.20 2.00 2.20 1.30 2.00 1.80 0.10 2.00 2.20 1.10 1.40 + 3.10 2.20 2.20 2.00 2.30 2.20 2.00 2.20 2.20 2.00 2.40 1.00 2.00 2.20 2.00 1.40 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.10 2.20 2.20 2.00 2.30 2.20 2.00 2.20 2.20 2.00 2.40 1.00 2.00 2.20 2.00 1.40 + 1.50 1.30 0.30 2.00 1.40 2.20 2.00 2.20 0.30 2.00 0.80 0.90 2.00 2.20 1.90 2.20 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.10 1.80 0.80 2.00 1.90 2.40 2.00 2.40 0.80 2.00 1.40 0.70 2.00 2.40 1.60 2.00 + 2.30 1.10 1.90 2.00 1.20 2.00 2.00 2.00 1.90 2.00 1.60 -1.10 2.00 2.00 -0.10 2.00 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.10 2.20 2.20 2.00 2.30 2.20 2.00 2.20 2.20 2.00 2.40 1.00 2.00 2.20 2.00 1.40 + 1.30 0.10 0.90 2.00 0.20 1.00 2.00 1.00 0.90 2.00 0.70 -2.10 2.00 1.00 -1.10 1.10 + 2.70 1.40 2.20 2.00 1.50 1.40 2.00 1.40 2.20 2.00 2.00 1.10 2.00 1.40 2.00 0.60 + + Y + --------------------------------------------------------------------------------------------- + A A A A C C C C G G G G U U U U + A C G U A C G U A C G U A C G U + --------------------------------------------------------------------------------------------- + 5' ------> 3' + G \/ \_/ G + U /\ | U + 3' <------ 5' + 2.80 2.30 1.70 2.00 2.80 3.40 2.00 3.40 1.70 2.00 2.10 1.00 2.00 3.10 2.20 2.90 + 2.60 2.20 1.60 2.00 2.60 2.60 2.00 2.60 1.60 2.00 2.00 -0.20 2.00 2.30 1.10 1.80 + 1.50 1.10 0.50 2.00 1.50 2.50 2.00 2.50 0.50 2.00 0.90 0.50 2.00 2.20 1.80 2.50 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.50 2.10 1.50 2.00 2.50 2.50 2.00 2.50 1.50 2.00 1.90 -0.30 2.00 2.20 1.00 1.70 + 3.10 2.00 2.40 2.00 2.50 2.50 2.00 2.50 2.40 2.00 2.40 0.70 2.00 2.20 1.90 1.60 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.10 2.00 2.40 2.00 2.50 2.50 2.00 2.50 2.40 2.00 2.40 0.70 2.00 2.20 1.90 1.60 + 1.50 1.10 0.50 2.00 1.50 2.50 2.00 2.50 0.50 2.00 0.90 0.50 2.00 2.20 1.80 2.50 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.10 1.60 1.00 2.00 2.10 2.70 2.00 2.70 1.00 2.00 1.40 0.30 2.00 2.40 1.50 2.20 + 2.30 0.90 2.10 2.00 1.30 2.30 2.00 2.30 2.10 2.00 1.70 -1.50 2.00 2.00 -0.20 2.30 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.10 2.00 2.40 2.00 2.50 2.50 2.00 2.50 2.40 2.00 2.40 0.70 2.00 2.20 1.90 1.60 + 1.30 -0.10 1.10 2.00 0.30 1.30 2.00 1.30 1.10 2.00 0.70 -2.50 2.00 1.00 -1.20 1.30 + 2.70 1.20 2.40 2.00 1.70 1.70 2.00 1.70 2.40 2.00 2.00 0.70 2.00 1.40 1.90 0.80 + + Y + --------------------------------------------------------------------------------------------- + A A A A C C C C G G G G U U U U + A C G U A C G U A C G U A C G U + --------------------------------------------------------------------------------------------- + 5' ------> 3' + G \/ \_/ U + U /\ | G + 3' <------ 5' + 2.80 2.50 1.50 2.00 2.60 3.10 2.00 3.10 1.50 2.00 2.10 1.30 2.00 3.10 2.30 2.70 + 2.60 2.40 1.40 2.00 2.50 2.30 2.00 2.30 1.40 2.00 1.90 0.20 2.00 2.30 1.20 1.50 + 1.50 1.30 0.30 2.00 1.40 2.20 2.00 2.20 0.30 2.00 0.80 0.90 2.00 2.20 1.90 2.20 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.50 2.30 1.30 2.00 2.40 2.20 2.00 2.20 1.30 2.00 1.80 0.10 2.00 2.20 1.10 1.40 + 3.10 2.20 2.20 2.00 2.30 2.20 2.00 2.20 2.20 2.00 2.40 1.00 2.00 2.20 2.00 1.40 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.10 2.20 2.20 2.00 2.30 2.20 2.00 2.20 2.20 2.00 2.40 1.00 2.00 2.20 2.00 1.40 + 1.50 1.30 0.30 2.00 1.40 2.20 2.00 2.20 0.30 2.00 0.80 0.90 2.00 2.20 1.90 2.20 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.10 1.80 0.80 2.00 1.90 2.40 2.00 2.40 0.80 2.00 1.40 0.70 2.00 2.40 1.60 2.00 + 2.30 1.10 1.90 2.00 1.20 2.00 2.00 2.00 1.90 2.00 1.60 -1.10 2.00 2.00 -0.10 2.00 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.10 2.20 2.20 2.00 2.30 2.20 2.00 2.20 2.20 2.00 2.40 1.00 2.00 2.20 2.00 1.40 + 1.30 0.10 0.90 2.00 0.20 1.00 2.00 1.00 0.90 2.00 0.70 -2.10 2.00 1.00 -1.10 1.10 + 2.70 1.40 2.20 2.00 1.50 1.40 2.00 1.40 2.20 2.00 2.00 1.10 2.00 1.40 2.00 0.60 + + Y + --------------------------------------------------------------------------------------------- + A A A A C C C C G G G G U U U U + A C G U A C G U A C G U A C G U + --------------------------------------------------------------------------------------------- + 5' ------> 3' + U \/ \_/ A + G /\ | U + 3' <------ 5' + 2.80 2.30 1.70 2.00 2.80 3.40 2.00 3.40 1.70 2.00 2.10 1.00 2.00 3.10 2.20 2.90 + 2.80 2.30 1.70 2.00 2.80 2.80 2.00 2.80 1.70 2.00 2.10 0.00 2.00 2.50 1.20 1.90 + 1.70 1.30 0.70 2.00 1.70 2.70 2.00 2.70 0.70 2.00 1.10 0.70 2.00 2.40 2.00 2.70 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.30 1.90 1.30 2.00 2.30 2.30 2.00 2.30 1.30 2.00 1.70 -0.50 2.00 2.00 0.80 1.50 + 3.40 2.30 2.70 2.00 2.80 2.80 2.00 2.80 2.70 2.00 2.70 1.00 2.00 2.50 2.20 1.90 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.10 2.00 2.40 2.00 2.50 2.50 2.00 2.50 2.40 2.00 2.40 0.70 2.00 2.20 1.90 1.60 + 1.70 1.30 0.70 2.00 1.70 2.70 2.00 2.70 0.70 2.00 1.10 0.70 2.00 2.40 2.00 2.70 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.10 1.70 1.10 2.00 2.10 2.70 2.00 2.70 1.10 2.00 1.50 0.30 2.00 2.40 1.60 2.30 + 2.20 0.80 2.00 2.00 1.20 2.20 2.00 2.20 2.00 2.00 1.60 -1.60 2.00 1.90 -0.30 2.20 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.40 2.30 2.70 2.00 2.80 2.80 2.00 2.80 2.70 2.00 2.70 1.00 2.00 2.50 2.20 1.90 + 1.00 -0.50 0.70 2.00 0.00 1.00 2.00 1.00 0.70 2.00 0.30 -2.90 2.00 0.70 -1.60 0.90 + 2.90 1.50 2.70 2.00 1.90 1.90 2.00 1.90 2.70 2.00 2.30 0.90 2.00 1.60 2.20 1.10 + + Y + --------------------------------------------------------------------------------------------- + A A A A C C C C G G G G U U U U + A C G U A C G U A C G U A C G U + --------------------------------------------------------------------------------------------- + 5' ------> 3' + U \/ \_/ C + G /\ | G + 3' <------ 5' + 2.10 1.90 0.10 2.00 1.80 2.50 2.00 1.50 0.70 2.00 1.80 0.00 2.00 2.50 0.40 2.10 + 2.10 1.90 0.10 2.00 1.80 1.90 2.00 0.90 0.70 2.00 1.80 -1.00 2.00 1.90 -0.60 1.10 + 1.10 0.80 -0.90 2.00 0.80 1.80 2.00 0.90 -0.30 2.00 0.70 -0.30 2.00 1.90 0.10 1.90 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.70 1.40 -0.30 2.00 1.40 1.40 2.00 0.40 0.30 2.00 1.30 -1.50 2.00 1.50 -1.10 0.70 + 2.70 1.90 1.10 2.00 1.80 1.90 2.00 0.90 1.70 2.00 2.40 0.00 2.00 1.90 0.40 1.10 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.40 1.60 0.80 2.00 1.50 1.60 2.00 0.60 1.40 2.00 2.10 -0.30 2.00 1.60 0.10 0.80 + 1.10 0.80 -0.90 2.00 0.80 1.80 2.00 0.90 -0.30 2.00 0.70 -0.30 2.00 1.90 0.10 1.90 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.50 1.20 -0.50 2.00 1.20 1.80 2.00 0.80 0.10 2.00 1.10 -0.70 2.00 1.90 -0.30 1.50 + 1.60 0.30 0.40 2.00 0.30 1.30 2.00 0.40 1.00 2.00 1.20 -2.60 2.00 1.40 -2.20 1.40 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.70 1.90 1.10 2.00 1.80 1.90 2.00 0.90 1.70 2.00 2.40 0.00 2.00 1.90 0.40 1.10 + 0.30 -0.90 -0.90 2.00 -1.00 0.10 2.00 -0.90 -0.30 2.00 0.00 -3.90 2.00 0.10 -3.50 0.10 + 2.30 1.00 1.10 2.00 1.00 1.00 2.00 0.00 1.70 2.00 1.90 -0.10 2.00 1.10 0.30 0.30 + + Y + --------------------------------------------------------------------------------------------- + A A A A C C C C G G G G U U U U + A C G U A C G U A C G U A C G U + --------------------------------------------------------------------------------------------- + 5' ------> 3' + U \/ \_/ G + G /\ | C + 3' <------ 5' + 2.00 1.90 1.00 2.00 2.40 2.80 2.00 2.70 1.00 2.00 1.80 0.30 2.00 2.70 1.80 2.20 + 2.00 1.90 1.00 2.00 2.40 2.20 2.00 2.10 1.00 2.00 1.80 -0.70 2.00 2.10 0.80 1.20 + 1.00 0.90 0.00 2.00 1.30 2.20 2.00 2.00 0.00 2.00 0.70 0.10 2.00 2.00 1.60 1.90 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.60 1.50 0.60 2.00 1.90 1.80 2.00 1.60 0.60 2.00 1.30 -1.10 2.00 1.60 0.40 0.70 + 2.60 1.90 2.00 2.00 2.40 2.20 2.00 2.10 2.00 2.00 2.40 0.30 2.00 2.10 1.80 1.20 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.30 1.60 1.70 2.00 2.10 1.90 2.00 1.80 1.70 2.00 2.10 0.00 2.00 1.80 1.50 0.90 + 1.00 0.90 0.00 2.00 1.30 2.20 2.00 2.00 0.00 2.00 0.70 0.10 2.00 2.00 1.60 1.90 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.40 1.30 0.40 2.00 1.70 2.20 2.00 2.00 0.40 2.00 1.10 -0.30 2.00 2.00 1.20 1.50 + 1.50 0.40 1.30 2.00 0.80 1.70 2.00 1.50 1.30 2.00 1.20 -2.20 2.00 1.50 -0.70 1.50 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.60 1.90 2.00 2.00 2.40 2.20 2.00 2.10 2.00 2.00 2.40 0.30 2.00 2.10 1.80 1.20 + 0.20 -0.90 0.00 2.00 -0.40 0.40 2.00 0.30 0.00 2.00 0.00 -3.50 2.00 0.30 -2.00 0.20 + 2.20 1.10 2.00 2.00 1.50 1.40 2.00 1.20 2.00 2.00 1.90 0.30 2.00 1.20 1.80 0.30 + + Y + --------------------------------------------------------------------------------------------- + A A A A C C C C G G G G U U U U + A C G U A C G U A C G U A C G U + --------------------------------------------------------------------------------------------- + 5' ------> 3' + U \/ \_/ U + G /\ | A + 3' <------ 5' + 2.80 2.50 1.50 2.00 2.60 3.10 2.00 3.10 1.50 2.00 2.10 1.30 2.00 3.10 2.30 2.70 + 2.80 2.50 1.50 2.00 2.60 2.50 2.00 2.50 1.50 2.00 2.10 0.30 2.00 2.50 1.30 1.70 + 1.70 1.50 0.50 2.00 1.60 2.40 2.00 2.40 0.50 2.00 1.00 1.10 2.00 2.40 2.10 2.40 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.30 2.10 1.10 2.00 2.20 2.00 2.00 2.00 1.10 2.00 1.60 -0.10 2.00 2.00 0.90 1.20 + 3.40 2.50 2.50 2.00 2.60 2.50 2.00 2.50 2.50 2.00 2.70 1.30 2.00 2.50 2.30 1.70 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.10 2.20 2.20 2.00 2.30 2.20 2.00 2.20 2.20 2.00 2.40 1.00 2.00 2.20 2.00 1.40 + 1.70 1.50 0.50 2.00 1.60 2.40 2.00 2.40 0.50 2.00 1.00 1.10 2.00 2.40 2.10 2.40 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.10 1.90 0.90 2.00 2.00 2.40 2.00 2.40 0.90 2.00 1.40 0.70 2.00 2.40 1.70 2.00 + 2.20 1.00 1.80 2.00 1.10 1.90 2.00 1.90 1.80 2.00 1.50 -1.20 2.00 1.90 -0.20 1.90 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.40 2.50 2.50 2.00 2.60 2.50 2.00 2.50 2.50 2.00 2.70 1.30 2.00 2.50 2.30 1.70 + 1.00 -0.30 0.50 2.00 -0.20 0.70 2.00 0.70 0.50 2.00 0.30 -2.50 2.00 0.70 -1.50 0.70 + 2.90 1.70 2.50 2.00 1.80 1.60 2.00 1.60 2.50 2.00 2.20 1.30 2.00 1.60 2.30 0.80 + + Y + --------------------------------------------------------------------------------------------- + A A A A C C C C G G G G U U U U + A C G U A C G U A C G U A C G U + --------------------------------------------------------------------------------------------- + 5' ------> 3' + U \/ \_/ G + G /\ | U + 3' <------ 5' + 2.80 2.30 1.70 2.00 2.80 3.40 2.00 3.40 1.70 2.00 2.10 1.00 2.00 3.10 2.20 2.90 + 2.80 2.30 1.70 2.00 2.80 2.80 2.00 2.80 1.70 2.00 2.10 0.00 2.00 2.50 1.20 1.90 + 1.70 1.30 0.70 2.00 1.70 2.70 2.00 2.70 0.70 2.00 1.10 0.70 2.00 2.40 2.00 2.70 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.30 1.90 1.30 2.00 2.30 2.30 2.00 2.30 1.30 2.00 1.70 -0.50 2.00 2.00 0.80 1.50 + 3.40 2.30 2.70 2.00 2.80 2.80 2.00 2.80 2.70 2.00 2.70 1.00 2.00 2.50 2.20 1.90 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.10 2.00 2.40 2.00 2.50 2.50 2.00 2.50 2.40 2.00 2.40 0.70 2.00 2.20 1.90 1.60 + 1.70 1.30 0.70 2.00 1.70 2.70 2.00 2.70 0.70 2.00 1.10 0.70 2.00 2.40 2.00 2.70 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.10 1.70 1.10 2.00 2.10 2.70 2.00 2.70 1.10 2.00 1.50 0.30 2.00 2.40 1.60 2.30 + 2.20 0.80 2.00 2.00 1.20 2.20 2.00 2.20 2.00 2.00 1.60 -1.60 2.00 1.90 -0.30 2.20 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.40 2.30 2.70 2.00 2.80 2.80 2.00 2.80 2.70 2.00 2.70 1.00 2.00 2.50 2.20 1.90 + 1.00 -0.50 0.70 2.00 0.00 1.00 2.00 1.00 0.70 2.00 0.30 -2.90 2.00 0.70 -1.60 0.90 + 2.90 1.50 2.70 2.00 1.90 1.90 2.00 1.90 2.70 2.00 2.30 0.90 2.00 1.60 2.20 1.10 + + Y + --------------------------------------------------------------------------------------------- + A A A A C C C C G G G G U U U U + A C G U A C G U A C G U A C G U + --------------------------------------------------------------------------------------------- + 5' ------> 3' + U \/ \_/ U + G /\ | G + 3' <------ 5' + 2.80 2.50 1.50 2.00 2.60 3.10 2.00 3.10 1.50 2.00 2.10 1.30 2.00 3.10 2.30 2.70 + 2.80 2.50 1.50 2.00 2.60 2.50 2.00 2.50 1.50 2.00 2.10 0.30 2.00 2.50 1.30 1.70 + 1.70 1.50 0.50 2.00 1.60 2.40 2.00 2.40 0.50 2.00 1.00 1.10 2.00 2.40 2.10 2.40 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.30 2.10 1.10 2.00 2.20 2.00 2.00 2.00 1.10 2.00 1.60 -0.10 2.00 2.00 0.90 1.20 + 3.40 2.50 2.50 2.00 2.60 2.50 2.00 2.50 2.50 2.00 2.70 1.30 2.00 2.50 2.30 1.70 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.10 2.20 2.20 2.00 2.30 2.20 2.00 2.20 2.20 2.00 2.40 1.00 2.00 2.20 2.00 1.40 + 1.70 1.50 0.50 2.00 1.60 2.40 2.00 2.40 0.50 2.00 1.00 1.10 2.00 2.40 2.10 2.40 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.10 1.90 0.90 2.00 2.00 2.40 2.00 2.40 0.90 2.00 1.40 0.70 2.00 2.40 1.70 2.00 + 2.20 1.00 1.80 2.00 1.10 1.90 2.00 1.90 1.80 2.00 1.50 -1.20 2.00 1.90 -0.20 1.90 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.40 2.50 2.50 2.00 2.60 2.50 2.00 2.50 2.50 2.00 2.70 1.30 2.00 2.50 2.30 1.70 + 1.00 -0.30 0.50 2.00 -0.20 0.70 2.00 0.70 0.50 2.00 0.30 -2.50 2.00 0.70 -1.50 0.70 + 2.90 1.70 2.50 2.00 1.80 1.60 2.00 1.60 2.50 2.00 2.20 1.30 2.00 1.60 2.30 0.80 diff --git a/lib/dat/loop.dat b/lib/dat/loop.dat new file mode 100644 index 0000000..927fbbd --- /dev/null +++ b/lib/dat/loop.dat @@ -0,0 +1,34 @@ +DESTABILIZING ENERGIES BY SIZE OF LOOP (INTERPOLATE WHERE NEEDED) +hp3 ave calc no tmm;hp4 ave calc with tmm; ave all bulges +SIZE INTERNAL BULGE HAIRPIN +------------------------------------------------------- +1 . 3.80 . +2 . 2.80 . +3 . 3.20 5.70 +4 1.70 3.60 5.60 +5 1.80 4.00 5.60 +6 2.00 4.40 5.40 +7 2.20 4.60 5.90 +8 2.30 4.70 5.60 +9 2.40 4.80 6.40 +10 2.50 4.90 6.50 +11 2.60 5.00 6.60 +12 2.70 5.10 6.70 +13 2.80 5.20 6.80 +14 2.90 5.30 6.90 +15 3.00 5.40 6.90 +16 3.00 5.40 7.00 +17 3.10 5.50 7.10 +18 3.10 5.50 7.10 +19 3.20 5.60 7.20 +20 3.30 5.70 7.20 +21 3.30 5.70 7.30 +22 3.40 5.80 7.30 +23 3.40 5.80 7.40 +24 3.40 5.80 7.40 +25 3.50 5.90 7.50 +26 3.50 5.90 7.50 +27 3.60 6.00 7.50 +28 3.60 6.00 7.60 +29 3.60 6.00 7.60 +30 3.70 6.10 7.70 diff --git a/lib/dat/loop.lop.dat b/lib/dat/loop.lop.dat new file mode 100644 index 0000000..255a53a --- /dev/null +++ b/lib/dat/loop.lop.dat @@ -0,0 +1,30 @@ +1 . 3.80 . +2 . 2.80 . +3 . 3.20 5.70 +4 1.70 3.60 5.60 +5 1.80 4.00 5.60 +6 2.00 4.40 5.40 +7 2.20 4.60 5.90 +8 2.30 4.70 5.60 +9 2.40 4.80 6.40 +10 2.50 4.90 6.50 +11 2.60 5.00 6.60 +12 2.70 5.10 6.70 +13 2.80 5.20 6.80 +14 2.90 5.30 6.90 +15 3.00 5.40 6.90 +16 3.00 5.40 7.00 +17 3.10 5.50 7.10 +18 3.10 5.50 7.10 +19 3.20 5.60 7.20 +20 3.30 5.70 7.20 +21 3.30 5.70 7.30 +22 3.40 5.80 7.30 +23 3.40 5.80 7.40 +24 3.40 5.80 7.40 +25 3.50 5.90 7.50 +26 3.50 5.90 7.50 +27 3.60 6.00 7.50 +28 3.60 6.00 7.60 +29 3.60 6.00 7.60 +30 3.70 6.10 7.70 diff --git a/lib/dat/miscloop.dat b/lib/dat/miscloop.dat new file mode 100644 index 0000000..8199fb3 --- /dev/null +++ b/lib/dat/miscloop.dat @@ -0,0 +1,54 @@ +Miscellaneous free energy rules +------------------------------- + +Extrapolation for large loops based on polymer theory +internal, bulge or hairpin loops > 30: dS(T)=dS(30)+param*ln(n/30) +--> +1.079 + +asymmetric internal loops: the ninio equation +the maximum correction +--> +3.00 + +the f(m) array (see Ninio for details) +--> + .50 .50 .50 .50 + +multibranched loops + offset, free base penalty, helix penalty +--> + 3.40 .00 .40 + +efn2 multibranched loops + offset, free base penalty, helix penalty +--> + 10.10 -0.30 -0.30 + +terminal AU penalty +--> + 0.50 + +bonus for GGG hairpin +--> +-2.20 + +c hairpin slope +--> +0.30 + +c hairpin intercept +--> +1.60 + +c hairpin of 3 +--> +1.40 + +Intermolecular initiation free energy +--> +4.10 + +GAIL Rule (Grossly Asymmetric Interior Loop Rule) (on/off <-> 1/0) +--> +1 diff --git a/lib/dat/miscloop.lop.dat b/lib/dat/miscloop.lop.dat new file mode 100644 index 0000000..0b1b0dc --- /dev/null +++ b/lib/dat/miscloop.lop.dat @@ -0,0 +1,12 @@ +1.079 +3.00 + .50 .50 .50 .50 + 3.40 .00 .40 + 10.10 -0.30 -0.30 + 0.50 +-2.20 +0.30 +1.60 +1.40 +4.10 +1 diff --git a/lib/dat/sint2.dat b/lib/dat/sint2.dat new file mode 100644 index 0000000..8935a7a --- /dev/null +++ b/lib/dat/sint2.dat @@ -0,0 +1,108 @@ +Data table for symetric interior loops of size 2 +Free energies at 37 degrees for RNA +Data Arrangement: + + Y + ------------------ +(X) A C G U + ------------------ + 5' --> 3' + X + A A + U U + Y + 3' <-- 5' +(A) . . . . +(C) . . . . +(G) . . . . +(U) . . . . + + Y Y Y Y Y Y + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + X X X X X X + A A A C A G A U A G A U + U U U G U C U A U U U G + Y Y Y Y Y Y + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + 1.70 1.70 1.70 1.70 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 + 1.70 1.70 1.70 1.70 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 + 1.70 1.70 -0.40 1.70 1.10 1.10 -1.00 1.10 1.10 1.10 -1.00 1.10 1.70 1.70 -0.40 1.70 1.70 1.70 -0.40 1.70 1.70 1.70 -0.40 1.70 + 1.70 1.70 1.70 1.50 1.10 1.10 1.10 1.00 1.10 1.10 1.10 1.10 1.70 1.70 1.70 1.20 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 + + Y Y Y Y Y Y + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + X X X X X X + C A C C C G C U C G C U + G U G G G C G A G U G G + Y Y Y Y Y Y + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + 1.10 1.10 1.10 1.10 0.40 -0.40 0.40 0.40 1.10 0.40 0.40 0.40 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 + 1.10 1.10 1.10 1.10 0.30 0.50 0.40 0.50 0.40 0.40 0.40 0.40 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 + 1.10 1.10 -1.00 1.10 -0.10 0.40 -1.70 0.40 0.40 0.40 -1.40 0.40 1.10 1.10 -1.00 1.10 1.10 1.10 -1.00 1.10 1.10 1.10 -1.00 1.10 + 1.10 1.10 1.10 1.10 0.40 0.00 0.40 -0.30 0.40 0.40 0.40 0.40 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 + + Y Y Y Y Y Y + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + X X X X X X + G A G C G G G U G G G U + C U C G C C C A C U C G + Y Y Y Y Y Y + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + 1.10 1.10 1.10 1.10 0.80 0.40 0.40 0.40 0.40 0.30 -0.10 0.40 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 + 1.10 1.10 1.10 1.10 0.40 0.40 0.40 0.40 -0.40 0.50 0.40 0.00 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 + 1.10 1.10 -1.00 1.10 0.40 0.40 -2.10 0.40 0.40 0.40 -1.70 0.40 1.10 1.10 -1.00 1.10 1.10 1.10 -1.00 1.10 1.10 1.10 -1.00 1.10 + 1.10 1.10 1.10 1.10 0.40 0.40 0.40 -0.70 0.40 0.50 0.40 -0.30 1.10 1.10 1.10 1.00 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 + + Y Y Y Y Y Y + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + X X X X X X + U A U C U G U U U G U U + A U A G A C A A A U A G + Y Y Y Y Y Y + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + 1.70 1.70 1.70 1.70 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 + 1.70 1.70 1.70 1.70 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 + 1.70 1.70 -0.40 1.70 1.10 1.10 -1.00 1.10 1.10 1.10 -1.00 1.10 1.70 1.70 -0.40 1.70 1.70 1.70 -0.40 1.70 1.70 1.70 -0.40 1.70 + 1.70 1.70 1.70 1.80 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.70 1.70 1.70 1.50 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 + + Y Y Y Y Y Y + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + X X X X X X + G A G C G G G U G G G U + U U U G U C U A U U U G + Y Y Y Y Y Y + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + 1.70 1.70 1.70 1.70 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 + 1.70 1.70 1.70 1.70 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 + 1.70 1.70 -0.40 1.70 1.10 1.10 -1.00 1.10 1.10 1.10 -1.00 1.10 1.70 1.70 -0.40 1.70 1.70 1.70 -0.40 1.70 1.70 1.70 -0.40 1.70 + 1.70 1.70 1.70 1.70 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 + + Y Y Y Y Y Y + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + X X X X X X + U A U C U G U U U G U U + G U G G G C G A G U G G + Y Y Y Y Y Y + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + 1.70 1.70 1.70 1.70 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 + 1.70 1.70 1.70 1.70 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 + 1.70 1.70 -0.40 1.70 1.10 1.10 -1.00 1.10 1.10 1.10 -1.00 1.10 1.70 1.70 -0.40 1.70 1.70 1.70 -0.40 1.70 1.70 1.70 -0.40 1.70 + 1.70 1.70 1.70 1.70 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 diff --git a/lib/dat/sint2.lop.dat b/lib/dat/sint2.lop.dat new file mode 100644 index 0000000..0f2b189 --- /dev/null +++ b/lib/dat/sint2.lop.dat @@ -0,0 +1,24 @@ + 1.70 1.70 1.70 1.70 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 + 1.70 1.70 1.70 1.70 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 + 1.70 1.70 -0.40 1.70 1.10 1.10 -1.00 1.10 1.10 1.10 -1.00 1.10 1.70 1.70 -0.40 1.70 1.70 1.70 -0.40 1.70 1.70 1.70 -0.40 1.70 + 1.70 1.70 1.70 1.50 1.10 1.10 1.10 1.00 1.10 1.10 1.10 1.10 1.70 1.70 1.70 1.20 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 + 1.10 1.10 1.10 1.10 0.40 -0.40 0.40 0.40 1.10 0.40 0.40 0.40 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 + 1.10 1.10 1.10 1.10 0.30 0.50 0.40 0.50 0.40 0.40 0.40 0.40 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 + 1.10 1.10 -1.00 1.10 -0.10 0.40 -1.70 0.40 0.40 0.40 -1.40 0.40 1.10 1.10 -1.00 1.10 1.10 1.10 -1.00 1.10 1.10 1.10 -1.00 1.10 + 1.10 1.10 1.10 1.10 0.40 0.00 0.40 -0.30 0.40 0.40 0.40 0.40 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 + 1.10 1.10 1.10 1.10 0.80 0.40 0.40 0.40 0.40 0.30 -0.10 0.40 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 + 1.10 1.10 1.10 1.10 0.40 0.40 0.40 0.40 -0.40 0.50 0.40 0.00 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 + 1.10 1.10 -1.00 1.10 0.40 0.40 -2.10 0.40 0.40 0.40 -1.70 0.40 1.10 1.10 -1.00 1.10 1.10 1.10 -1.00 1.10 1.10 1.10 -1.00 1.10 + 1.10 1.10 1.10 1.10 0.40 0.40 0.40 -0.70 0.40 0.50 0.40 -0.30 1.10 1.10 1.10 1.00 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 + 1.70 1.70 1.70 1.70 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 + 1.70 1.70 1.70 1.70 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 + 1.70 1.70 -0.40 1.70 1.10 1.10 -1.00 1.10 1.10 1.10 -1.00 1.10 1.70 1.70 -0.40 1.70 1.70 1.70 -0.40 1.70 1.70 1.70 -0.40 1.70 + 1.70 1.70 1.70 1.80 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.70 1.70 1.70 1.50 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 + 1.70 1.70 1.70 1.70 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 + 1.70 1.70 1.70 1.70 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 + 1.70 1.70 -0.40 1.70 1.10 1.10 -1.00 1.10 1.10 1.10 -1.00 1.10 1.70 1.70 -0.40 1.70 1.70 1.70 -0.40 1.70 1.70 1.70 -0.40 1.70 + 1.70 1.70 1.70 1.70 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 + 1.70 1.70 1.70 1.70 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 + 1.70 1.70 1.70 1.70 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 + 1.70 1.70 -0.40 1.70 1.10 1.10 -1.00 1.10 1.10 1.10 -1.00 1.10 1.70 1.70 -0.40 1.70 1.70 1.70 -0.40 1.70 1.70 1.70 -0.40 1.70 + 1.70 1.70 1.70 1.70 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.10 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 diff --git a/lib/dat/sint4.dat b/lib/dat/sint4.dat new file mode 100644 index 0000000..cc8ad10 --- /dev/null +++ b/lib/dat/sint4.dat @@ -0,0 +1,967 @@ +Data tables for symetric interior loops of size 4 +Free energies at 37 degrees for RNA +Data arrangement: + + Y + ---------------------------------------------------------------- +(X) A A A A C C C C G G G G U U U U + A C G U A C G U A C G U A C G U + ---------------------------------------------------------------- + 5' ------> 3' + A \/ \_/ A + U /\ | U + 3' <------ 5' + +(AA) . . . . . . . . . . . . . . . . +(AC) . . . . . . . . . . . . . . . . +(AG) . . . . . . . . . . . . . . . . +(AU) . . . . . . . . . . . . . . . . +(CA) . . . . . . . . . . . . . . . . +(CC) . . . . . . . . . . . . . . . . +(CG) . . . . . . . . . . . . . . . . +(CU) . . . . . . . . . . . . . . . . +(GA) . . . . . . . . . . . . . . . . +(GC) . . . . . . . . . . . . . . . . +(GG) . . . . . . . . . . . . . . . . +(GU) . . . . . . . . . . . . . . . . +(UA) . . . . . . . . . . . . . . . . +(UC) . . . . . . . . . . . . . . . . +(UG) . . . . . . . . . . . . . . . . +(UU) . . . . . . . . . . . . . . . . + + + Y + --------------------------------------------------------------------------------------------- + A A A A C C C C G G G G U U U U + A C G U A C G U A C G U A C G U + --------------------------------------------------------------------------------------------- + 5' ------> 3' + A \/ \_/ A + U /\ | U + 3' <------ 5' + 2.80 2.30 1.70 2.00 2.80 3.40 2.00 3.40 1.70 2.00 2.10 1.00 2.00 3.10 2.20 2.90 + 2.60 2.20 1.60 2.00 2.60 2.60 2.00 2.60 1.60 2.00 2.00 -0.20 2.00 2.30 1.10 1.80 + 1.50 1.10 0.50 2.00 1.50 2.50 2.00 2.50 0.50 2.00 0.90 0.50 2.00 2.20 1.80 2.50 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.50 2.10 1.50 2.00 2.50 2.50 2.00 2.50 1.50 2.00 1.90 -0.30 2.00 2.20 1.00 1.70 + 3.10 2.00 2.40 2.00 2.50 2.50 2.00 2.50 2.40 2.00 2.40 0.70 2.00 2.20 1.90 1.60 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.10 2.00 2.40 2.00 2.50 2.50 2.00 2.50 2.40 2.00 2.40 0.70 2.00 2.20 1.90 1.60 + 1.50 1.10 0.50 2.00 1.50 2.50 2.00 2.50 0.50 2.00 0.90 0.50 2.00 2.20 1.80 2.50 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.10 1.60 1.00 2.00 2.10 2.70 2.00 2.70 1.00 2.00 1.40 0.30 2.00 2.40 1.50 2.20 + 2.30 0.90 2.10 2.00 1.30 2.30 2.00 2.30 2.10 2.00 1.70 -1.50 2.00 2.00 -0.20 2.30 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.10 2.00 2.40 2.00 2.50 2.50 2.00 2.50 2.40 2.00 2.40 0.70 2.00 2.20 1.90 1.60 + 1.30 -0.10 1.10 2.00 0.30 1.30 2.00 1.30 1.10 2.00 0.70 -2.50 2.00 1.00 -1.20 1.30 + 2.70 1.20 2.40 2.00 1.70 1.70 2.00 1.70 2.40 2.00 2.00 0.70 2.00 1.40 1.90 0.80 + + Y + --------------------------------------------------------------------------------------------- + A A A A C C C C G G G G U U U U + A C G U A C G U A C G U A C G U + --------------------------------------------------------------------------------------------- + 5' ------> 3' + A \/ \_/ C + U /\ | G + 3' <------ 5' + 2.10 1.90 0.10 2.00 1.80 2.50 2.00 1.50 0.70 2.00 1.80 0.00 2.00 2.50 0.40 2.10 + 2.00 1.70 0.00 2.00 1.70 1.70 2.00 0.70 0.60 2.00 1.60 -1.20 2.00 1.80 -0.80 1.00 + 0.90 0.60 -1.10 2.00 0.60 1.60 2.00 0.70 -0.50 2.00 0.50 -0.50 2.00 1.70 -0.10 1.70 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.90 1.60 -0.10 2.00 1.60 1.60 2.00 0.60 0.50 2.00 1.50 -1.30 2.00 1.70 -0.90 0.90 + 2.40 1.60 0.80 2.00 1.50 1.60 2.00 0.60 1.40 2.00 2.10 -0.30 2.00 1.60 0.10 0.80 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.40 1.60 0.80 2.00 1.50 1.60 2.00 0.60 1.40 2.00 2.10 -0.30 2.00 1.60 0.10 0.80 + 0.90 0.60 -1.10 2.00 0.60 1.60 2.00 0.70 -0.50 2.00 0.50 -0.50 2.00 1.70 -0.10 1.70 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.40 1.20 -0.60 2.00 1.10 1.80 2.00 0.80 0.00 2.00 1.10 -0.70 2.00 1.80 -0.30 1.40 + 1.70 0.40 0.50 2.00 0.40 1.40 2.00 0.50 1.10 2.00 1.30 -2.50 2.00 1.50 -2.10 1.50 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.40 1.60 0.80 2.00 1.50 1.60 2.00 0.60 1.40 2.00 2.10 -0.30 2.00 1.60 0.10 0.80 + 0.70 -0.50 -0.50 2.00 -0.60 0.50 2.00 -0.50 0.10 2.00 0.40 -3.50 2.00 0.50 -3.10 0.50 + 2.00 0.80 0.80 2.00 0.70 0.80 2.00 -0.20 1.50 2.00 1.70 -0.30 2.00 0.80 0.10 0.00 + + Y + --------------------------------------------------------------------------------------------- + A A A A C C C C G G G G U U U U + A C G U A C G U A C G U A C G U + --------------------------------------------------------------------------------------------- + 5' ------> 3' + A \/ \_/ G + U /\ | C + 3' <------ 5' + 2.00 1.90 1.00 2.00 2.40 2.80 2.00 2.70 1.00 2.00 1.80 0.30 2.00 2.70 1.80 2.20 + 1.90 1.80 0.90 2.00 2.20 2.10 2.00 1.90 0.90 2.00 1.60 -0.80 2.00 1.90 0.70 1.00 + 0.80 0.70 -0.20 2.00 1.10 2.00 2.00 1.80 -0.20 2.00 0.50 -0.10 2.00 1.80 1.40 1.80 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.80 1.70 0.80 2.00 2.10 2.00 2.00 1.80 0.80 2.00 1.50 -0.90 2.00 1.80 0.60 0.90 + 2.30 1.60 1.70 2.00 2.10 1.90 2.00 1.80 1.70 2.00 2.10 0.00 2.00 1.80 1.50 0.90 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.30 1.60 1.70 2.00 2.10 1.90 2.00 1.80 1.70 2.00 2.10 0.00 2.00 1.80 1.50 0.90 + 0.80 0.70 -0.20 2.00 1.10 2.00 2.00 1.80 -0.20 2.00 0.50 -0.10 2.00 1.80 1.40 1.80 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.30 1.20 0.30 2.00 1.70 2.10 2.00 2.00 0.30 2.00 1.10 -0.40 2.00 2.00 1.10 1.50 + 1.60 0.50 1.40 2.00 0.90 1.80 2.00 1.60 1.40 2.00 1.30 -2.10 2.00 1.60 -0.60 1.60 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.30 1.60 1.70 2.00 2.10 1.90 2.00 1.80 1.70 2.00 2.10 0.00 2.00 1.80 1.50 0.90 + 0.60 -0.50 0.40 2.00 0.00 0.80 2.00 0.70 0.40 2.00 0.40 -3.10 2.00 0.70 -1.60 0.60 + 1.90 0.80 1.80 2.00 1.30 1.10 2.00 1.00 1.80 2.00 1.70 0.00 2.00 1.00 1.60 0.10 + + Y + --------------------------------------------------------------------------------------------- + A A A A C C C C G G G G U U U U + A C G U A C G U A C G U A C G U + --------------------------------------------------------------------------------------------- + 5' ------> 3' + A \/ \_/ U + U /\ | A + 3' <------ 5' + 2.80 2.50 1.50 2.00 2.60 3.10 2.00 3.10 1.50 2.00 2.10 1.30 2.00 3.10 2.30 2.70 + 2.60 2.40 1.40 2.00 2.50 2.30 2.00 2.30 1.40 2.00 1.90 0.20 2.00 2.30 1.20 1.50 + 1.50 1.30 0.30 2.00 1.40 2.20 2.00 2.20 0.30 2.00 0.80 0.90 2.00 2.20 1.90 2.20 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.50 2.30 1.30 2.00 2.40 2.20 2.00 2.20 1.30 2.00 1.80 0.10 2.00 2.20 1.10 1.40 + 3.10 2.20 2.20 2.00 2.30 2.20 2.00 2.20 2.20 2.00 2.40 1.00 2.00 2.20 2.00 1.40 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.10 2.20 2.20 2.00 2.30 2.20 2.00 2.20 2.20 2.00 2.40 1.00 2.00 2.20 2.00 1.40 + 1.50 1.30 0.30 2.00 1.40 2.20 2.00 2.20 0.30 2.00 0.80 0.90 2.00 2.20 1.90 2.20 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.10 1.80 0.80 2.00 1.90 2.40 2.00 2.40 0.80 2.00 1.40 0.70 2.00 2.40 1.60 2.00 + 2.30 1.10 1.90 2.00 1.20 2.00 2.00 2.00 1.90 2.00 1.60 -1.10 2.00 2.00 -0.10 2.00 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.10 2.20 2.20 2.00 2.30 2.20 2.00 2.20 2.20 2.00 2.40 1.00 2.00 2.20 2.00 1.40 + 1.30 0.10 0.90 2.00 0.20 1.00 2.00 1.00 0.90 2.00 0.70 -2.10 2.00 1.00 -1.10 1.10 + 2.70 1.40 2.20 2.00 1.50 1.40 2.00 1.40 2.20 2.00 2.00 1.10 2.00 1.40 2.00 0.60 + + Y + --------------------------------------------------------------------------------------------- + A A A A C C C C G G G G U U U U + A C G U A C G U A C G U A C G U + --------------------------------------------------------------------------------------------- + 5' ------> 3' + A \/ \_/ G + U /\ | U + 3' <------ 5' + 2.80 2.30 1.70 2.00 2.80 3.40 2.00 3.40 1.70 2.00 2.10 1.00 2.00 3.10 2.20 2.90 + 2.60 2.20 1.60 2.00 2.60 2.60 2.00 2.60 1.60 2.00 2.00 -0.20 2.00 2.30 1.10 1.80 + 1.50 1.10 0.50 2.00 1.50 2.50 2.00 2.50 0.50 2.00 0.90 0.50 2.00 2.20 1.80 2.50 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.50 2.10 1.50 2.00 2.50 2.50 2.00 2.50 1.50 2.00 1.90 -0.30 2.00 2.20 1.00 1.70 + 3.10 2.00 2.40 2.00 2.50 2.50 2.00 2.50 2.40 2.00 2.40 0.70 2.00 2.20 1.90 1.60 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.10 2.00 2.40 2.00 2.50 2.50 2.00 2.50 2.40 2.00 2.40 0.70 2.00 2.20 1.90 1.60 + 1.50 1.10 0.50 2.00 1.50 2.50 2.00 2.50 0.50 2.00 0.90 0.50 2.00 2.20 1.80 2.50 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.10 1.60 1.00 2.00 2.10 2.70 2.00 2.70 1.00 2.00 1.40 0.30 2.00 2.40 1.50 2.20 + 2.30 0.90 2.10 2.00 1.30 2.30 2.00 2.30 2.10 2.00 1.70 -1.50 2.00 2.00 -0.20 2.30 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.10 2.00 2.40 2.00 2.50 2.50 2.00 2.50 2.40 2.00 2.40 0.70 2.00 2.20 1.90 1.60 + 1.30 -0.10 1.10 2.00 0.30 1.30 2.00 1.30 1.10 2.00 0.70 -2.50 2.00 1.00 -1.20 1.30 + 2.70 1.20 2.40 2.00 1.70 1.70 2.00 1.70 2.40 2.00 2.00 0.70 2.00 1.40 1.90 0.80 + + Y + --------------------------------------------------------------------------------------------- + A A A A C C C C G G G G U U U U + A C G U A C G U A C G U A C G U + --------------------------------------------------------------------------------------------- + 5' ------> 3' + A \/ \_/ U + U /\ | G + 3' <------ 5' + 2.80 2.50 1.50 2.00 2.60 3.10 2.00 3.10 1.50 2.00 2.10 1.30 2.00 3.10 2.30 2.70 + 2.60 2.40 1.40 2.00 2.50 2.30 2.00 2.30 1.40 2.00 1.90 0.20 2.00 2.30 1.20 1.50 + 1.50 1.30 0.30 2.00 1.40 2.20 2.00 2.20 0.30 2.00 0.80 0.90 2.00 2.20 1.90 2.20 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.50 2.30 1.30 2.00 2.40 2.20 2.00 2.20 1.30 2.00 1.80 0.10 2.00 2.20 1.10 1.40 + 3.10 2.20 2.20 2.00 2.30 2.20 2.00 2.20 2.20 2.00 2.40 1.00 2.00 2.20 2.00 1.40 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.10 2.20 2.20 2.00 2.30 2.20 2.00 2.20 2.20 2.00 2.40 1.00 2.00 2.20 2.00 1.40 + 1.50 1.30 0.30 2.00 1.40 2.20 2.00 2.20 0.30 2.00 0.80 0.90 2.00 2.20 1.90 2.20 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.10 1.80 0.80 2.00 1.90 2.40 2.00 2.40 0.80 2.00 1.40 0.70 2.00 2.40 1.60 2.00 + 2.30 1.10 1.90 2.00 1.20 2.00 2.00 2.00 1.90 2.00 1.60 -1.10 2.00 2.00 -0.10 2.00 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.10 2.20 2.20 2.00 2.30 2.20 2.00 2.20 2.20 2.00 2.40 1.00 2.00 2.20 2.00 1.40 + 1.30 0.10 0.90 2.00 0.20 1.00 2.00 1.00 0.90 2.00 0.70 -2.10 2.00 1.00 -1.10 1.10 + 2.70 1.40 2.20 2.00 1.50 1.40 2.00 1.40 2.20 2.00 2.00 1.10 2.00 1.40 2.00 0.60 + + Y + --------------------------------------------------------------------------------------------- + A A A A C C C C G G G G U U U U + A C G U A C G U A C G U A C G U + --------------------------------------------------------------------------------------------- + 5' ------> 3' + C \/ \_/ A + G /\ | U + 3' <------ 5' + 2.00 1.60 1.00 2.00 2.00 2.60 2.00 2.60 1.00 2.00 1.40 0.20 2.00 2.30 1.50 2.20 + 2.40 1.90 1.30 2.00 2.40 2.40 2.00 2.40 1.30 2.00 1.70 -0.40 2.00 2.10 0.80 1.50 + 1.00 0.60 0.00 2.00 1.00 2.00 2.00 2.00 0.00 2.00 0.40 0.00 2.00 1.70 1.30 2.00 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.90 1.50 0.90 2.00 1.90 1.90 2.00 1.90 0.90 2.00 1.30 -0.90 2.00 1.60 0.40 1.10 + 2.80 1.80 2.20 2.00 2.20 2.20 2.00 2.20 2.20 2.00 2.20 0.40 2.00 1.90 1.70 1.40 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.70 1.60 2.00 2.00 2.10 2.10 2.00 2.10 2.00 2.00 2.00 0.30 2.00 1.80 1.50 1.20 + 1.00 0.60 0.00 2.00 1.00 2.00 2.00 2.00 0.00 2.00 0.40 0.00 2.00 1.70 1.30 2.00 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.80 1.30 0.70 2.00 1.80 2.40 2.00 2.40 0.70 2.00 1.10 0.00 2.00 2.10 1.20 1.90 + 1.80 0.40 1.60 2.00 0.80 1.80 2.00 1.80 1.60 2.00 1.20 -2.00 2.00 1.50 -0.70 1.80 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.70 1.60 2.00 2.00 2.10 2.10 2.00 2.10 2.00 2.00 2.00 0.30 2.00 1.80 1.50 1.20 + 0.30 -1.10 0.10 2.00 -0.70 0.30 2.00 0.30 0.10 2.00 -0.30 -3.50 2.00 0.00 -2.20 0.30 + 2.20 0.70 1.90 2.00 1.20 1.20 2.00 1.20 1.90 2.00 1.50 0.20 2.00 0.90 1.50 0.30 + + Y + --------------------------------------------------------------------------------------------- + A A A A C C C C G G G G U U U U + A C G U A C G U A C G U A C G U + --------------------------------------------------------------------------------------------- + 5' ------> 3' + C \/ \_/ C + G /\ | G + 3' <------ 5' + 0.50 1.10 -0.30 2.00 1.10 1.70 2.00 0.70 0.40 2.00 1.00 0.10 2.00 1.80 -0.50 1.50 + 0.60 1.50 0.10 2.00 1.10 1.50 2.00 0.50 0.50 2.00 1.40 -0.70 2.00 1.50 -0.60 0.00 + 0.00 -0.70 -1.60 2.00 -1.00 -0.60 2.00 0.20 -0.70 2.00 0.00 -0.80 2.00 1.20 -0.60 0.90 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.30 1.00 -0.70 2.00 1.00 1.00 2.00 0.00 0.70 2.00 0.90 -1.90 2.00 1.10 -1.50 -0.20 + 2.20 1.30 0.70 2.00 1.90 1.30 2.00 0.30 0.70 2.00 1.80 -0.30 2.00 1.40 -0.20 -0.10 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.00 1.20 0.40 2.00 1.10 1.20 2.00 1.70 1.00 2.00 1.70 -0.70 2.00 1.20 -0.30 0.20 + -0.20 -0.40 -1.70 2.00 0.70 1.10 2.00 0.20 -0.50 2.00 0.00 -0.90 2.00 1.20 -1.30 0.90 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.10 0.90 -0.90 2.00 0.80 1.50 2.00 0.50 -0.20 2.00 0.80 -1.00 2.00 1.50 -0.60 1.10 + 0.90 0.00 0.30 2.00 -0.10 1.00 2.00 0.00 0.60 2.00 0.90 -3.00 2.00 1.00 -2.40 0.60 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.00 1.20 0.40 2.00 1.10 1.20 2.00 0.20 0.50 2.00 1.70 -0.70 2.00 1.20 -0.10 0.40 + -0.10 -1.60 -1.60 2.00 -1.60 -0.60 2.00 -1.60 -0.60 2.00 -0.70 -4.40 2.00 -0.50 -4.10 -1.00 + 1.40 0.30 0.50 2.00 0.30 0.30 2.00 0.10 1.40 2.00 1.20 -1.00 2.00 0.30 0.10 0.60 + + Y + --------------------------------------------------------------------------------------------- + A A A A C C C C G G G G U U U U + A C G U A C G U A C G U A C G U + --------------------------------------------------------------------------------------------- + 5' ------> 3' + C \/ \_/ G + G /\ | C + 3' <------ 5' + 1.30 1.20 0.30 2.00 1.60 2.10 2.00 1.90 0.30 2.00 1.00 -0.40 2.00 1.90 1.10 1.40 + 1.60 1.50 0.60 2.00 2.00 1.80 2.00 1.70 0.60 2.00 1.40 -1.10 2.00 1.70 0.40 0.80 + 0.30 0.20 -0.70 2.00 0.60 1.50 2.00 1.30 -0.70 2.00 0.00 -0.60 2.00 1.30 0.90 1.30 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.20 1.10 0.20 2.00 1.50 1.40 2.00 1.20 0.20 2.00 0.90 -1.50 2.00 1.20 0.00 0.30 + 2.10 1.40 1.50 2.00 1.80 1.70 2.00 1.50 1.50 2.00 1.80 -0.20 2.00 1.50 1.30 0.60 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.90 1.20 1.30 2.00 1.70 1.50 2.00 1.40 1.30 2.00 1.70 -0.40 2.00 1.40 1.10 0.50 + 0.30 0.20 -0.70 2.00 0.60 1.50 2.00 1.30 -0.70 2.00 0.00 -0.60 2.00 1.30 0.90 1.30 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.00 0.90 0.00 2.00 1.40 1.80 2.00 1.70 0.00 2.00 0.80 -0.70 2.00 1.70 0.90 1.20 + 1.10 0.00 0.90 2.00 0.40 1.30 2.00 1.10 0.90 2.00 0.90 -2.60 2.00 1.10 -1.10 1.10 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.90 1.20 1.30 2.00 1.70 1.50 2.00 1.40 1.30 2.00 1.70 -0.40 2.00 1.40 1.10 0.50 + -0.40 -1.50 -0.60 2.00 -1.10 -0.20 2.00 -0.40 -0.60 2.00 -0.70 -4.20 2.00 -0.40 -2.60 -0.50 + 1.40 0.30 1.30 2.00 0.80 0.60 2.00 0.50 1.30 2.00 1.20 -0.50 2.00 0.50 1.10 -0.40 + + Y + --------------------------------------------------------------------------------------------- + A A A A C C C C G G G G U U U U + A C G U A C G U A C G U A C G U + --------------------------------------------------------------------------------------------- + 5' ------> 3' + C \/ \_/ U + G /\ | A + 3' <------ 5' + 2.00 1.80 0.80 2.00 1.90 2.30 2.00 2.30 0.80 2.00 1.30 0.60 2.00 2.30 1.60 1.90 + 2.40 2.10 1.10 2.00 2.20 2.10 2.00 2.10 1.10 2.00 1.70 0.00 2.00 2.10 0.90 1.30 + 1.00 0.80 -0.20 2.00 0.90 1.70 2.00 1.70 -0.20 2.00 0.30 0.40 2.00 1.70 1.40 1.80 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.90 1.70 0.70 2.00 1.80 1.60 2.00 1.60 0.70 2.00 1.20 -0.50 2.00 1.60 0.50 0.80 + 2.80 2.00 2.00 2.00 2.10 1.90 2.00 1.90 2.00 2.00 2.10 0.80 2.00 1.90 1.80 1.10 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.70 1.80 1.80 2.00 1.90 1.80 2.00 1.80 1.80 2.00 2.00 0.70 2.00 1.80 1.60 1.00 + 1.00 0.80 -0.20 2.00 0.90 1.70 2.00 1.70 -0.20 2.00 0.30 0.40 2.00 1.70 1.40 1.80 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.80 1.50 0.50 2.00 1.60 2.10 2.00 2.10 0.50 2.00 1.10 0.40 2.00 2.10 1.30 1.70 + 1.80 0.60 1.40 2.00 0.70 1.50 2.00 1.50 1.40 2.00 1.10 -1.60 2.00 1.50 -0.60 1.60 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.70 1.80 1.80 2.00 1.90 1.80 2.00 1.80 1.80 2.00 2.00 0.70 2.00 1.80 1.60 1.00 + 0.30 -0.90 -0.10 2.00 -0.80 0.00 2.00 0.00 -0.10 2.00 -0.40 -3.10 2.00 0.00 -2.10 0.00 + 2.20 0.90 1.80 2.00 1.00 0.90 2.00 0.90 1.80 2.00 1.50 0.60 2.00 0.90 1.60 0.10 + + Y + --------------------------------------------------------------------------------------------- + A A A A C C C C G G G G U U U U + A C G U A C G U A C G U A C G U + --------------------------------------------------------------------------------------------- + 5' ------> 3' + C \/ \_/ G + G /\ | U + 3' <------ 5' + 2.00 1.60 1.00 2.00 2.00 2.60 2.00 2.60 1.00 2.00 1.40 0.20 2.00 2.30 1.50 2.20 + 2.40 1.90 1.30 2.00 2.40 2.40 2.00 2.40 1.30 2.00 1.70 -0.40 2.00 2.10 0.80 1.50 + 1.00 0.60 0.00 2.00 1.00 2.00 2.00 2.00 0.00 2.00 0.40 0.00 2.00 1.70 1.30 2.00 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.90 1.50 0.90 2.00 1.90 1.90 2.00 1.90 0.90 2.00 1.30 -0.90 2.00 1.60 0.40 1.10 + 2.80 1.80 2.20 2.00 2.20 2.20 2.00 2.20 2.20 2.00 2.20 0.40 2.00 1.90 1.70 1.40 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.70 1.60 2.00 2.00 2.10 2.10 2.00 2.10 2.00 2.00 2.00 0.30 2.00 1.80 1.50 1.20 + 1.00 0.60 0.00 2.00 1.00 2.00 2.00 2.00 0.00 2.00 0.40 0.00 2.00 1.70 1.30 2.00 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.80 1.30 0.70 2.00 1.80 2.40 2.00 2.40 0.70 2.00 1.10 0.00 2.00 2.10 1.20 1.90 + 1.80 0.40 1.60 2.00 0.80 1.80 2.00 1.80 1.60 2.00 1.20 -2.00 2.00 1.50 -0.70 1.80 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.70 1.60 2.00 2.00 2.10 2.10 2.00 2.10 2.00 2.00 2.00 0.30 2.00 1.80 1.50 1.20 + 0.30 -1.10 0.10 2.00 -0.70 0.30 2.00 0.30 0.10 2.00 -0.30 -3.50 2.00 0.00 -2.20 0.30 + 2.20 0.70 1.90 2.00 1.20 1.20 2.00 1.20 1.90 2.00 1.50 0.20 2.00 0.90 1.50 0.30 + + Y + --------------------------------------------------------------------------------------------- + A A A A C C C C G G G G U U U U + A C G U A C G U A C G U A C G U + --------------------------------------------------------------------------------------------- + 5' ------> 3' + C \/ \_/ U + G /\ | G + 3' <------ 5' + 2.00 1.80 0.80 2.00 1.90 2.30 2.00 2.30 0.80 2.00 1.30 0.60 2.00 2.30 1.60 1.90 + 2.40 2.10 1.10 2.00 2.20 2.10 2.00 2.10 1.10 2.00 1.70 0.00 2.00 2.10 0.90 1.30 + 1.00 0.80 -0.20 2.00 0.90 1.70 2.00 1.70 -0.20 2.00 0.30 0.40 2.00 1.70 1.40 1.80 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.90 1.70 0.70 2.00 1.80 1.60 2.00 1.60 0.70 2.00 1.20 -0.50 2.00 1.60 0.50 0.80 + 2.80 2.00 2.00 2.00 2.10 1.90 2.00 1.90 2.00 2.00 2.10 0.80 2.00 1.90 1.80 1.10 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.70 1.80 1.80 2.00 1.90 1.80 2.00 1.80 1.80 2.00 2.00 0.70 2.00 1.80 1.60 1.00 + 1.00 0.80 -0.20 2.00 0.90 1.70 2.00 1.70 -0.20 2.00 0.30 0.40 2.00 1.70 1.40 1.80 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.80 1.50 0.50 2.00 1.60 2.10 2.00 2.10 0.50 2.00 1.10 0.40 2.00 2.10 1.30 1.70 + 1.80 0.60 1.40 2.00 0.70 1.50 2.00 1.50 1.40 2.00 1.10 -1.60 2.00 1.50 -0.60 1.60 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.70 1.80 1.80 2.00 1.90 1.80 2.00 1.80 1.80 2.00 2.00 0.70 2.00 1.80 1.60 1.00 + 0.30 -0.90 -0.10 2.00 -0.80 0.00 2.00 0.00 -0.10 2.00 -0.40 -3.10 2.00 0.00 -2.10 0.00 + 2.20 0.90 1.80 2.00 1.00 0.90 2.00 0.90 1.80 2.00 1.50 0.60 2.00 0.90 1.60 0.10 + + Y + --------------------------------------------------------------------------------------------- + A A A A C C C C G G G G U U U U + A C G U A C G U A C G U A C G U + --------------------------------------------------------------------------------------------- + 5' ------> 3' + G \/ \_/ A + C /\ | U + 3' <------ 5' + 2.10 1.70 1.10 2.00 2.10 2.70 2.00 2.70 1.10 2.00 1.50 0.30 2.00 2.40 1.60 2.30 + 1.80 1.40 0.80 2.00 1.80 1.80 2.00 1.80 0.80 2.00 1.20 -1.00 2.00 1.50 0.30 1.00 + 0.70 0.30 -0.30 2.00 0.70 1.70 2.00 1.70 -0.30 2.00 0.10 -0.30 2.00 1.40 1.00 1.70 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.90 1.40 0.80 2.00 1.90 1.90 2.00 1.90 0.80 2.00 1.20 -0.90 2.00 1.60 0.30 1.00 + 2.50 1.40 1.80 2.00 1.90 1.90 2.00 1.90 1.80 2.00 1.80 0.10 2.00 1.60 1.30 1.00 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.50 1.50 1.90 2.00 1.90 1.90 2.00 1.90 1.90 2.00 1.90 0.10 2.00 1.60 1.40 1.10 + 0.10 -0.30 -0.90 2.00 0.10 1.10 2.00 1.10 -0.90 2.00 -0.50 -0.90 2.00 0.80 0.40 1.10 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.80 1.30 0.70 2.00 1.80 2.40 2.00 2.40 0.70 2.00 1.10 0.00 2.00 2.10 1.20 1.90 + 0.40 -1.10 0.10 2.00 -0.60 0.40 2.00 0.40 0.10 2.00 -0.30 -3.50 2.00 0.10 -2.20 0.30 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.50 0.40 0.90 2.00 0.90 0.90 2.00 0.90 0.90 2.00 0.80 -0.90 2.00 0.60 0.40 0.00 + 0.00 -1.50 -0.30 2.00 -1.00 0.00 2.00 0.00 -0.30 2.00 -0.70 -3.90 2.00 -0.30 -2.60 -0.10 + 2.10 0.70 1.90 2.00 1.10 1.10 2.00 1.10 1.90 2.00 1.50 0.10 2.00 0.80 1.40 0.30 + + Y + --------------------------------------------------------------------------------------------- + A A A A C C C C G G G G U U U U + A C G U A C G U A C G U A C G U + --------------------------------------------------------------------------------------------- + 5' ------> 3' + G \/ \_/ C + C /\ | G + 3' <------ 5' + 1.50 1.20 -0.50 2.00 1.20 1.80 2.00 0.80 0.10 2.00 1.10 -0.70 2.00 1.90 -0.30 1.50 + 1.20 0.90 -0.80 2.00 0.90 0.90 2.00 0.00 -0.20 2.00 0.80 -2.00 2.00 1.00 -1.60 0.20 + 0.10 -0.10 -1.90 2.00 -0.20 0.90 2.00 -0.10 -1.30 2.00 -0.20 -1.30 2.00 0.90 -0.90 0.90 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.20 1.00 -0.80 2.00 0.90 1.00 2.00 0.00 -0.10 2.00 0.90 -1.90 2.00 1.00 -1.50 0.20 + 1.80 1.00 0.20 2.00 0.90 1.00 2.00 0.00 0.90 2.00 1.50 -0.90 2.00 1.00 -0.50 0.20 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.90 1.00 0.30 2.00 1.00 1.00 2.00 0.00 0.90 2.00 1.50 -0.90 2.00 1.10 -0.50 0.30 + -0.50 -0.80 -2.60 2.00 -0.80 0.20 2.00 -0.80 -1.90 2.00 -0.90 -1.90 2.00 0.30 -1.50 0.30 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.10 0.90 -0.90 2.00 0.80 1.50 2.00 0.50 -0.20 2.00 0.80 -1.00 2.00 1.50 -0.60 1.10 + -0.30 -1.50 -1.50 2.00 -1.60 -0.50 2.00 -1.50 -0.90 2.00 -0.60 -4.50 2.00 -0.50 -4.10 -0.50 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 0.80 0.00 -0.80 2.00 0.00 0.00 2.00 -1.00 -0.10 2.00 0.50 -1.90 2.00 0.00 -1.50 -0.70 + -0.70 -1.90 -1.90 2.00 -2.00 -0.90 2.00 -1.90 -1.30 2.00 -1.00 -4.90 2.00 -0.90 -4.50 -0.90 + 1.50 0.20 0.30 2.00 0.20 0.20 2.00 -0.70 0.90 2.00 1.10 -0.90 2.00 0.30 -0.50 -0.50 + + Y + --------------------------------------------------------------------------------------------- + A A A A C C C C G G G G U U U U + A C G U A C G U A C G U A C G U + --------------------------------------------------------------------------------------------- + 5' ------> 3' + G \/ \_/ G + C /\ | C + 3' <------ 5' + 0.50 1.30 -0.20 2.00 0.60 2.20 2.00 2.00 0.00 2.00 1.10 -0.10 2.00 2.00 0.90 1.40 + 1.10 1.00 0.70 2.00 1.10 1.90 2.00 1.10 -1.00 2.00 0.80 -1.60 2.00 1.10 -0.10 0.30 + 0.40 0.70 -0.50 2.00 0.50 0.70 2.00 0.50 -0.70 2.00 -0.20 -0.60 2.00 1.00 0.60 1.40 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.10 1.00 -0.40 2.00 1.50 1.30 2.00 1.20 -0.70 2.00 0.90 -1.60 2.00 1.20 0.00 0.30 + 1.70 1.00 1.10 2.00 1.50 1.30 2.00 1.20 -0.60 2.00 1.50 -0.60 2.00 1.20 1.00 0.30 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.80 1.10 1.20 2.00 1.50 1.40 2.00 1.20 1.20 2.00 1.50 -0.50 2.00 1.20 1.00 0.30 + -0.30 -0.70 -1.70 2.00 0.10 0.70 2.00 0.40 -1.60 2.00 -0.90 -1.60 2.00 0.40 0.30 0.50 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.00 0.90 0.00 2.00 1.40 1.80 2.00 1.70 0.00 2.00 0.80 -0.70 2.00 1.70 0.90 1.20 + -0.50 -1.50 -1.30 2.00 -0.60 -0.20 2.00 -0.10 -0.60 2.00 -0.60 -4.10 2.00 -0.30 -2.40 0.10 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 0.70 0.00 0.20 2.00 0.50 0.30 2.00 0.20 0.20 2.00 0.50 -1.60 2.00 1.70 0.00 0.10 + 0.10 -1.90 -0.90 2.00 -0.70 -0.30 2.00 -0.70 -0.80 2.00 -1.00 -4.40 2.00 -0.70 -3.00 -1.00 + 1.50 -0.20 0.90 2.00 0.00 -0.10 2.00 0.40 0.90 2.00 1.10 -1.00 2.00 0.20 0.60 0.60 + + Y + --------------------------------------------------------------------------------------------- + A A A A C C C C G G G G U U U U + A C G U A C G U A C G U A C G U + --------------------------------------------------------------------------------------------- + 5' ------> 3' + G \/ \_/ U + C /\ | A + 3' <------ 5' + 2.10 1.90 0.90 2.00 2.00 2.40 2.00 2.40 0.90 2.00 1.40 0.70 2.00 2.40 1.70 2.00 + 1.80 1.60 0.60 2.00 1.70 1.50 2.00 1.50 0.60 2.00 1.10 -0.60 2.00 1.50 0.40 0.70 + 0.70 0.50 -0.50 2.00 0.60 1.40 2.00 1.40 -0.50 2.00 0.00 0.10 2.00 1.40 1.10 1.50 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.90 1.60 0.60 2.00 1.70 1.60 2.00 1.60 0.60 2.00 1.20 -0.50 2.00 1.60 0.40 0.80 + 2.50 1.60 1.60 2.00 1.70 1.60 2.00 1.60 1.60 2.00 1.80 0.50 2.00 1.60 1.40 0.80 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.50 1.70 1.70 2.00 1.80 1.60 2.00 1.60 1.70 2.00 1.80 0.50 2.00 1.60 1.50 0.80 + 0.10 -0.10 -1.10 2.00 0.00 0.80 2.00 0.80 -1.10 2.00 -0.60 -0.50 2.00 0.80 0.50 0.80 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.80 1.50 0.50 2.00 1.60 2.10 2.00 2.10 0.50 2.00 1.10 0.40 2.00 2.10 1.30 1.70 + 0.40 -0.90 -0.10 2.00 -0.80 0.10 2.00 0.10 -0.10 2.00 -0.30 -3.10 2.00 0.10 -2.10 0.10 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.50 0.60 0.70 2.00 0.70 0.60 2.00 0.60 0.70 2.00 0.80 -0.50 2.00 0.60 0.50 -0.20 + 0.00 -1.30 -0.50 2.00 -1.20 -0.30 2.00 -0.30 -0.50 2.00 -0.70 -3.50 2.00 -0.30 -2.50 -0.30 + 2.10 0.90 1.70 2.00 1.00 0.80 2.00 0.80 1.70 2.00 1.40 0.50 2.00 0.80 1.50 0.00 + + Y + --------------------------------------------------------------------------------------------- + A A A A C C C C G G G G U U U U + A C G U A C G U A C G U A C G U + --------------------------------------------------------------------------------------------- + 5' ------> 3' + G \/ \_/ G + C /\ | U + 3' <------ 5' + 2.10 1.70 1.10 2.00 2.10 2.70 2.00 2.70 1.10 2.00 1.50 0.30 2.00 2.40 1.60 2.30 + 1.80 1.40 0.80 2.00 1.80 1.80 2.00 1.80 0.80 2.00 1.20 -1.00 2.00 1.50 0.30 1.00 + 0.70 0.30 -0.30 2.00 0.70 1.70 2.00 1.70 -0.30 2.00 0.10 -0.30 2.00 1.40 1.00 1.70 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.90 1.40 0.80 2.00 1.90 1.90 2.00 1.90 0.80 2.00 1.20 -0.90 2.00 1.60 0.30 1.00 + 2.50 1.40 1.80 2.00 1.90 1.90 2.00 1.90 1.80 2.00 1.80 0.10 2.00 1.60 1.30 1.00 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.50 1.50 1.90 2.00 1.90 1.90 2.00 1.90 1.90 2.00 1.90 0.10 2.00 1.60 1.40 1.10 + 0.10 -0.30 -0.90 2.00 0.10 1.10 2.00 1.10 -0.90 2.00 -0.50 -0.90 2.00 0.80 0.40 1.10 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.80 1.30 0.70 2.00 1.80 2.40 2.00 2.40 0.70 2.00 1.10 0.00 2.00 2.10 1.20 1.90 + 0.40 -1.10 0.10 2.00 -0.60 0.40 2.00 0.40 0.10 2.00 -0.30 -3.50 2.00 0.10 -2.20 0.30 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.50 0.40 0.90 2.00 0.90 0.90 2.00 0.90 0.90 2.00 0.80 -0.90 2.00 0.60 0.40 0.00 + 0.00 -1.50 -0.30 2.00 -1.00 0.00 2.00 0.00 -0.30 2.00 -0.70 -3.90 2.00 -0.30 -2.60 -0.10 + 2.10 0.70 1.90 2.00 1.10 1.10 2.00 1.10 1.90 2.00 1.50 0.10 2.00 0.80 1.40 0.30 + + Y + --------------------------------------------------------------------------------------------- + A A A A C C C C G G G G U U U U + A C G U A C G U A C G U A C G U + --------------------------------------------------------------------------------------------- + 5' ------> 3' + G \/ \_/ U + C /\ | G + 3' <------ 5' + 2.10 1.90 0.90 2.00 2.00 2.40 2.00 2.40 0.90 2.00 1.40 0.70 2.00 2.40 1.70 2.00 + 1.80 1.60 0.60 2.00 1.70 1.50 2.00 1.50 0.60 2.00 1.10 -0.60 2.00 1.50 0.40 0.70 + 0.70 0.50 -0.50 2.00 0.60 1.40 2.00 1.40 -0.50 2.00 0.00 0.10 2.00 1.40 1.10 1.50 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.90 1.60 0.60 2.00 1.70 1.60 2.00 1.60 0.60 2.00 1.20 -0.50 2.00 1.60 0.40 0.80 + 2.50 1.60 1.60 2.00 1.70 1.60 2.00 1.60 1.60 2.00 1.80 0.50 2.00 1.60 1.40 0.80 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.50 1.70 1.70 2.00 1.80 1.60 2.00 1.60 1.70 2.00 1.80 0.50 2.00 1.60 1.50 0.80 + 0.10 -0.10 -1.10 2.00 0.00 0.80 2.00 0.80 -1.10 2.00 -0.60 -0.50 2.00 0.80 0.50 0.80 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.80 1.50 0.50 2.00 1.60 2.10 2.00 2.10 0.50 2.00 1.10 0.40 2.00 2.10 1.30 1.70 + 0.40 -0.90 -0.10 2.00 -0.80 0.10 2.00 0.10 -0.10 2.00 -0.30 -3.10 2.00 0.10 -2.10 0.10 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.50 0.60 0.70 2.00 0.70 0.60 2.00 0.60 0.70 2.00 0.80 -0.50 2.00 0.60 0.50 -0.20 + 0.00 -1.30 -0.50 2.00 -1.20 -0.30 2.00 -0.30 -0.50 2.00 -0.70 -3.50 2.00 -0.30 -2.50 -0.30 + 2.10 0.90 1.70 2.00 1.00 0.80 2.00 0.80 1.70 2.00 1.40 0.50 2.00 0.80 1.50 0.00 + + Y + --------------------------------------------------------------------------------------------- + A A A A C C C C G G G G U U U U + A C G U A C G U A C G U A C G U + --------------------------------------------------------------------------------------------- + 5' ------> 3' + U \/ \_/ A + A /\ | U + 3' <------ 5' + 2.80 2.30 1.70 2.00 2.80 3.40 2.00 3.40 1.70 2.00 2.10 1.00 2.00 3.10 2.20 2.90 + 2.80 2.30 1.70 2.00 2.80 2.80 2.00 2.80 1.70 2.00 2.10 0.00 2.00 2.50 1.20 1.90 + 1.70 1.30 0.70 2.00 1.70 2.70 2.00 2.70 0.70 2.00 1.10 0.70 2.00 2.40 2.00 2.70 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.30 1.90 1.30 2.00 2.30 2.30 2.00 2.30 1.30 2.00 1.70 -0.50 2.00 2.00 0.80 1.50 + 3.40 2.30 2.70 2.00 2.80 2.80 2.00 2.80 2.70 2.00 2.70 1.00 2.00 2.50 2.20 1.90 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.10 2.00 2.40 2.00 2.50 2.50 2.00 2.50 2.40 2.00 2.40 0.70 2.00 2.20 1.90 1.60 + 1.70 1.30 0.70 2.00 1.70 2.70 2.00 2.70 0.70 2.00 1.10 0.70 2.00 2.40 2.00 2.70 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.10 1.70 1.10 2.00 2.10 2.70 2.00 2.70 1.10 2.00 1.50 0.30 2.00 2.40 1.60 2.30 + 2.20 0.80 2.00 2.00 1.20 2.20 2.00 2.20 2.00 2.00 1.60 -1.60 2.00 1.90 -0.30 2.20 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.40 2.30 2.70 2.00 2.80 2.80 2.00 2.80 2.70 2.00 2.70 1.00 2.00 2.50 2.20 1.90 + 1.00 -0.50 0.70 2.00 0.00 1.00 2.00 1.00 0.70 2.00 0.30 -2.90 2.00 0.70 -1.60 0.90 + 2.90 1.50 2.70 2.00 1.90 1.90 2.00 1.90 2.70 2.00 2.30 0.90 2.00 1.60 2.20 1.10 + + Y + --------------------------------------------------------------------------------------------- + A A A A C C C C G G G G U U U U + A C G U A C G U A C G U A C G U + --------------------------------------------------------------------------------------------- + 5' ------> 3' + U \/ \_/ C + A /\ | G + 3' <------ 5' + 2.10 1.90 0.10 2.00 1.80 2.50 2.00 1.50 0.70 2.00 1.80 0.00 2.00 2.50 0.40 2.10 + 2.10 1.90 0.10 2.00 1.80 1.90 2.00 0.90 0.70 2.00 1.80 -1.00 2.00 1.90 -0.60 1.10 + 1.10 0.80 -0.90 2.00 0.80 1.80 2.00 0.90 -0.30 2.00 0.70 -0.30 2.00 1.90 0.10 1.90 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.70 1.40 -0.30 2.00 1.40 1.40 2.00 0.40 0.30 2.00 1.30 -1.50 2.00 1.50 -1.10 0.70 + 2.70 1.90 1.10 2.00 1.80 1.90 2.00 0.90 1.70 2.00 2.40 0.00 2.00 1.90 0.40 1.10 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.40 1.60 0.80 2.00 1.50 1.60 2.00 0.60 1.40 2.00 2.10 -0.30 2.00 1.60 0.10 0.80 + 1.10 0.80 -0.90 2.00 0.80 1.80 2.00 0.90 -0.30 2.00 0.70 -0.30 2.00 1.90 0.10 1.90 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.50 1.20 -0.50 2.00 1.20 1.80 2.00 0.80 0.10 2.00 1.10 -0.70 2.00 1.90 -0.30 1.50 + 1.60 0.30 0.40 2.00 0.30 1.30 2.00 0.40 1.00 2.00 1.20 -2.60 2.00 1.40 -2.20 1.40 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.70 1.90 1.10 2.00 1.80 1.90 2.00 0.90 1.70 2.00 2.40 0.00 2.00 1.90 0.40 1.10 + 0.30 -0.90 -0.90 2.00 -1.00 0.10 2.00 -0.90 -0.30 2.00 0.00 -3.90 2.00 0.10 -3.50 0.10 + 2.30 1.00 1.10 2.00 1.00 1.00 2.00 0.00 1.70 2.00 1.90 -0.10 2.00 1.10 0.30 0.30 + + Y + --------------------------------------------------------------------------------------------- + A A A A C C C C G G G G U U U U + A C G U A C G U A C G U A C G U + --------------------------------------------------------------------------------------------- + 5' ------> 3' + U \/ \_/ G + A /\ | C + 3' <------ 5' + 2.00 1.90 1.00 2.00 2.40 2.80 2.00 2.70 1.00 2.00 1.80 0.30 2.00 2.70 1.80 2.20 + 2.00 1.90 1.00 2.00 2.40 2.20 2.00 2.10 1.00 2.00 1.80 -0.70 2.00 2.10 0.80 1.20 + 1.00 0.90 0.00 2.00 1.30 2.20 2.00 2.00 0.00 2.00 0.70 0.10 2.00 2.00 1.60 1.90 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.60 1.50 0.60 2.00 1.90 1.80 2.00 1.60 0.60 2.00 1.30 -1.10 2.00 1.60 0.40 0.70 + 2.60 1.90 2.00 2.00 2.40 2.20 2.00 2.10 2.00 2.00 2.40 0.30 2.00 2.10 1.80 1.20 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.30 1.60 1.70 2.00 2.10 1.90 2.00 1.80 1.70 2.00 2.10 0.00 2.00 1.80 1.50 0.90 + 1.00 0.90 0.00 2.00 1.30 2.20 2.00 2.00 0.00 2.00 0.70 0.10 2.00 2.00 1.60 1.90 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.40 1.30 0.40 2.00 1.70 2.20 2.00 2.00 0.40 2.00 1.10 -0.30 2.00 2.00 1.20 1.50 + 1.50 0.40 1.30 2.00 0.80 1.70 2.00 1.50 1.30 2.00 1.20 -2.20 2.00 1.50 -0.70 1.50 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.60 1.90 2.00 2.00 2.40 2.20 2.00 2.10 2.00 2.00 2.40 0.30 2.00 2.10 1.80 1.20 + 0.20 -0.90 0.00 2.00 -0.40 0.40 2.00 0.30 0.00 2.00 0.00 -3.50 2.00 0.30 -2.00 0.20 + 2.20 1.10 2.00 2.00 1.50 1.40 2.00 1.20 2.00 2.00 1.90 0.30 2.00 1.20 1.80 0.30 + + Y + --------------------------------------------------------------------------------------------- + A A A A C C C C G G G G U U U U + A C G U A C G U A C G U A C G U + --------------------------------------------------------------------------------------------- + 5' ------> 3' + U \/ \_/ U + A /\ | A + 3' <------ 5' + 2.80 2.50 1.50 2.00 2.60 3.10 2.00 3.10 1.50 2.00 2.10 1.30 2.00 3.10 2.30 2.70 + 2.80 2.50 1.50 2.00 2.60 2.50 2.00 2.50 1.50 2.00 2.10 0.30 2.00 2.50 1.30 1.70 + 1.70 1.50 0.50 2.00 1.60 2.40 2.00 2.40 0.50 2.00 1.00 1.10 2.00 2.40 2.10 2.40 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.30 2.10 1.10 2.00 2.20 2.00 2.00 2.00 1.10 2.00 1.60 -0.10 2.00 2.00 0.90 1.20 + 3.40 2.50 2.50 2.00 2.60 2.50 2.00 2.50 2.50 2.00 2.70 1.30 2.00 2.50 2.30 1.70 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.10 2.20 2.20 2.00 2.30 2.20 2.00 2.20 2.20 2.00 2.40 1.00 2.00 2.20 2.00 1.40 + 1.70 1.50 0.50 2.00 1.60 2.40 2.00 2.40 0.50 2.00 1.00 1.10 2.00 2.40 2.10 2.40 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.10 1.90 0.90 2.00 2.00 2.40 2.00 2.40 0.90 2.00 1.40 0.70 2.00 2.40 1.70 2.00 + 2.20 1.00 1.80 2.00 1.10 1.90 2.00 1.90 1.80 2.00 1.50 -1.20 2.00 1.90 -0.20 1.90 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.40 2.50 2.50 2.00 2.60 2.50 2.00 2.50 2.50 2.00 2.70 1.30 2.00 2.50 2.30 1.70 + 1.00 -0.30 0.50 2.00 -0.20 0.70 2.00 0.70 0.50 2.00 0.30 -2.50 2.00 0.70 -1.50 0.70 + 2.90 1.70 2.50 2.00 1.80 1.60 2.00 1.60 2.50 2.00 2.20 1.30 2.00 1.60 2.30 0.80 + + Y + --------------------------------------------------------------------------------------------- + A A A A C C C C G G G G U U U U + A C G U A C G U A C G U A C G U + --------------------------------------------------------------------------------------------- + 5' ------> 3' + U \/ \_/ G + A /\ | U + 3' <------ 5' + 2.80 2.30 1.70 2.00 2.80 3.40 2.00 3.40 1.70 2.00 2.10 1.00 2.00 3.10 2.20 2.90 + 2.80 2.30 1.70 2.00 2.80 2.80 2.00 2.80 1.70 2.00 2.10 0.00 2.00 2.50 1.20 1.90 + 1.70 1.30 0.70 2.00 1.70 2.70 2.00 2.70 0.70 2.00 1.10 0.70 2.00 2.40 2.00 2.70 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.30 1.90 1.30 2.00 2.30 2.30 2.00 2.30 1.30 2.00 1.70 -0.50 2.00 2.00 0.80 1.50 + 3.40 2.30 2.70 2.00 2.80 2.80 2.00 2.80 2.70 2.00 2.70 1.00 2.00 2.50 2.20 1.90 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.10 2.00 2.40 2.00 2.50 2.50 2.00 2.50 2.40 2.00 2.40 0.70 2.00 2.20 1.90 1.60 + 1.70 1.30 0.70 2.00 1.70 2.70 2.00 2.70 0.70 2.00 1.10 0.70 2.00 2.40 2.00 2.70 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.10 1.70 1.10 2.00 2.10 2.70 2.00 2.70 1.10 2.00 1.50 0.30 2.00 2.40 1.60 2.30 + 2.20 0.80 2.00 2.00 1.20 2.20 2.00 2.20 2.00 2.00 1.60 -1.60 2.00 1.90 -0.30 2.20 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.40 2.30 2.70 2.00 2.80 2.80 2.00 2.80 2.70 2.00 2.70 1.00 2.00 2.50 2.20 1.90 + 1.00 -0.50 0.70 2.00 0.00 1.00 2.00 1.00 0.70 2.00 0.30 -2.90 2.00 0.70 -1.60 0.90 + 2.90 1.50 2.70 2.00 1.90 1.90 2.00 1.90 2.70 2.00 2.30 0.90 2.00 1.60 2.20 1.10 + + Y + --------------------------------------------------------------------------------------------- + A A A A C C C C G G G G U U U U + A C G U A C G U A C G U A C G U + --------------------------------------------------------------------------------------------- + 5' ------> 3' + U \/ \_/ U + A /\ | G + 3' <------ 5' + 2.80 2.50 1.50 2.00 2.60 3.10 2.00 3.10 1.50 2.00 2.10 1.30 2.00 3.10 2.30 2.70 + 2.80 2.50 1.50 2.00 2.60 2.50 2.00 2.50 1.50 2.00 2.10 0.30 2.00 2.50 1.30 1.70 + 1.70 1.50 0.50 2.00 1.60 2.40 2.00 2.40 0.50 2.00 1.00 1.10 2.00 2.40 2.10 2.40 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.30 2.10 1.10 2.00 2.20 2.00 2.00 2.00 1.10 2.00 1.60 -0.10 2.00 2.00 0.90 1.20 + 3.40 2.50 2.50 2.00 2.60 2.50 2.00 2.50 2.50 2.00 2.70 1.30 2.00 2.50 2.30 1.70 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.10 2.20 2.20 2.00 2.30 2.20 2.00 2.20 2.20 2.00 2.40 1.00 2.00 2.20 2.00 1.40 + 1.70 1.50 0.50 2.00 1.60 2.40 2.00 2.40 0.50 2.00 1.00 1.10 2.00 2.40 2.10 2.40 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.10 1.90 0.90 2.00 2.00 2.40 2.00 2.40 0.90 2.00 1.40 0.70 2.00 2.40 1.70 2.00 + 2.20 1.00 1.80 2.00 1.10 1.90 2.00 1.90 1.80 2.00 1.50 -1.20 2.00 1.90 -0.20 1.90 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.40 2.50 2.50 2.00 2.60 2.50 2.00 2.50 2.50 2.00 2.70 1.30 2.00 2.50 2.30 1.70 + 1.00 -0.30 0.50 2.00 -0.20 0.70 2.00 0.70 0.50 2.00 0.30 -2.50 2.00 0.70 -1.50 0.70 + 2.90 1.70 2.50 2.00 1.80 1.60 2.00 1.60 2.50 2.00 2.20 1.30 2.00 1.60 2.30 0.80 + + Y + --------------------------------------------------------------------------------------------- + A A A A C C C C G G G G U U U U + A C G U A C G U A C G U A C G U + --------------------------------------------------------------------------------------------- + 5' ------> 3' + G \/ \_/ A + U /\ | U + 3' <------ 5' + 2.80 2.30 1.70 2.00 2.80 3.40 2.00 3.40 1.70 2.00 2.10 1.00 2.00 3.10 2.20 2.90 + 2.60 2.20 1.60 2.00 2.60 2.60 2.00 2.60 1.60 2.00 2.00 -0.20 2.00 2.30 1.10 1.80 + 1.50 1.10 0.50 2.00 1.50 2.50 2.00 2.50 0.50 2.00 0.90 0.50 2.00 2.20 1.80 2.50 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.50 2.10 1.50 2.00 2.50 2.50 2.00 2.50 1.50 2.00 1.90 -0.30 2.00 2.20 1.00 1.70 + 3.10 2.00 2.40 2.00 2.50 2.50 2.00 2.50 2.40 2.00 2.40 0.70 2.00 2.20 1.90 1.60 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.10 2.00 2.40 2.00 2.50 2.50 2.00 2.50 2.40 2.00 2.40 0.70 2.00 2.20 1.90 1.60 + 1.50 1.10 0.50 2.00 1.50 2.50 2.00 2.50 0.50 2.00 0.90 0.50 2.00 2.20 1.80 2.50 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.10 1.60 1.00 2.00 2.10 2.70 2.00 2.70 1.00 2.00 1.40 0.30 2.00 2.40 1.50 2.20 + 2.30 0.90 2.10 2.00 1.30 2.30 2.00 2.30 2.10 2.00 1.70 -1.50 2.00 2.00 -0.20 2.30 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.10 2.00 2.40 2.00 2.50 2.50 2.00 2.50 2.40 2.00 2.40 0.70 2.00 2.20 1.90 1.60 + 1.30 -0.10 1.10 2.00 0.30 1.30 2.00 1.30 1.10 2.00 0.70 -2.50 2.00 1.00 -1.20 1.30 + 2.70 1.20 2.40 2.00 1.70 1.70 2.00 1.70 2.40 2.00 2.00 0.70 2.00 1.40 1.90 0.80 + + Y + --------------------------------------------------------------------------------------------- + A A A A C C C C G G G G U U U U + A C G U A C G U A C G U A C G U + --------------------------------------------------------------------------------------------- + 5' ------> 3' + G \/ \_/ C + U /\ | G + 3' <------ 5' + 2.10 1.90 0.10 2.00 1.80 2.50 2.00 1.50 0.70 2.00 1.80 0.00 2.00 2.50 0.40 2.10 + 2.00 1.70 0.00 2.00 1.70 1.70 2.00 0.70 0.60 2.00 1.60 -1.20 2.00 1.80 -0.80 1.00 + 0.90 0.60 -1.10 2.00 0.60 1.60 2.00 0.70 -0.50 2.00 0.50 -0.50 2.00 1.70 -0.10 1.70 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.90 1.60 -0.10 2.00 1.60 1.60 2.00 0.60 0.50 2.00 1.50 -1.30 2.00 1.70 -0.90 0.90 + 2.40 1.60 0.80 2.00 1.50 1.60 2.00 0.60 1.40 2.00 2.10 -0.30 2.00 1.60 0.10 0.80 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.40 1.60 0.80 2.00 1.50 1.60 2.00 0.60 1.40 2.00 2.10 -0.30 2.00 1.60 0.10 0.80 + 0.90 0.60 -1.10 2.00 0.60 1.60 2.00 0.70 -0.50 2.00 0.50 -0.50 2.00 1.70 -0.10 1.70 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.40 1.20 -0.60 2.00 1.10 1.80 2.00 0.80 0.00 2.00 1.10 -0.70 2.00 1.80 -0.30 1.40 + 1.70 0.40 0.50 2.00 0.40 1.40 2.00 0.50 1.10 2.00 1.30 -2.50 2.00 1.50 -2.10 1.50 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.40 1.60 0.80 2.00 1.50 1.60 2.00 0.60 1.40 2.00 2.10 -0.30 2.00 1.60 0.10 0.80 + 0.70 -0.50 -0.50 2.00 -0.60 0.50 2.00 -0.50 0.10 2.00 0.40 -3.50 2.00 0.50 -3.10 0.50 + 2.00 0.80 0.80 2.00 0.70 0.80 2.00 -0.20 1.50 2.00 1.70 -0.30 2.00 0.80 0.10 0.00 + + Y + --------------------------------------------------------------------------------------------- + A A A A C C C C G G G G U U U U + A C G U A C G U A C G U A C G U + --------------------------------------------------------------------------------------------- + 5' ------> 3' + G \/ \_/ G + U /\ | C + 3' <------ 5' + 2.00 1.90 1.00 2.00 2.40 2.80 2.00 2.70 1.00 2.00 1.80 0.30 2.00 2.70 1.80 2.20 + 1.90 1.80 0.90 2.00 2.20 2.10 2.00 1.90 0.90 2.00 1.60 -0.80 2.00 1.90 0.70 1.00 + 0.80 0.70 -0.20 2.00 1.10 2.00 2.00 1.80 -0.20 2.00 0.50 -0.10 2.00 1.80 1.40 1.80 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.80 1.70 0.80 2.00 2.10 2.00 2.00 1.80 0.80 2.00 1.50 -0.90 2.00 1.80 0.60 0.90 + 2.30 1.60 1.70 2.00 2.10 1.90 2.00 1.80 1.70 2.00 2.10 0.00 2.00 1.80 1.50 0.90 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.30 1.60 1.70 2.00 2.10 1.90 2.00 1.80 1.70 2.00 2.10 0.00 2.00 1.80 1.50 0.90 + 0.80 0.70 -0.20 2.00 1.10 2.00 2.00 1.80 -0.20 2.00 0.50 -0.10 2.00 1.80 1.40 1.80 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.30 1.20 0.30 2.00 1.70 2.10 2.00 2.00 0.30 2.00 1.10 -0.40 2.00 2.00 1.10 1.50 + 1.60 0.50 1.40 2.00 0.90 1.80 2.00 1.60 1.40 2.00 1.30 -2.10 2.00 1.60 -0.60 1.60 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.30 1.60 1.70 2.00 2.10 1.90 2.00 1.80 1.70 2.00 2.10 0.00 2.00 1.80 1.50 0.90 + 0.60 -0.50 0.40 2.00 0.00 0.80 2.00 0.70 0.40 2.00 0.40 -3.10 2.00 0.70 -1.60 0.60 + 1.90 0.80 1.80 2.00 1.30 1.10 2.00 1.00 1.80 2.00 1.70 0.00 2.00 1.00 1.60 0.10 + + Y + --------------------------------------------------------------------------------------------- + A A A A C C C C G G G G U U U U + A C G U A C G U A C G U A C G U + --------------------------------------------------------------------------------------------- + 5' ------> 3' + G \/ \_/ U + U /\ | A + 3' <------ 5' + 2.80 2.50 1.50 2.00 2.60 3.10 2.00 3.10 1.50 2.00 2.10 1.30 2.00 3.10 2.30 2.70 + 2.60 2.40 1.40 2.00 2.50 2.30 2.00 2.30 1.40 2.00 1.90 0.20 2.00 2.30 1.20 1.50 + 1.50 1.30 0.30 2.00 1.40 2.20 2.00 2.20 0.30 2.00 0.80 0.90 2.00 2.20 1.90 2.20 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.50 2.30 1.30 2.00 2.40 2.20 2.00 2.20 1.30 2.00 1.80 0.10 2.00 2.20 1.10 1.40 + 3.10 2.20 2.20 2.00 2.30 2.20 2.00 2.20 2.20 2.00 2.40 1.00 2.00 2.20 2.00 1.40 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.10 2.20 2.20 2.00 2.30 2.20 2.00 2.20 2.20 2.00 2.40 1.00 2.00 2.20 2.00 1.40 + 1.50 1.30 0.30 2.00 1.40 2.20 2.00 2.20 0.30 2.00 0.80 0.90 2.00 2.20 1.90 2.20 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.10 1.80 0.80 2.00 1.90 2.40 2.00 2.40 0.80 2.00 1.40 0.70 2.00 2.40 1.60 2.00 + 2.30 1.10 1.90 2.00 1.20 2.00 2.00 2.00 1.90 2.00 1.60 -1.10 2.00 2.00 -0.10 2.00 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.10 2.20 2.20 2.00 2.30 2.20 2.00 2.20 2.20 2.00 2.40 1.00 2.00 2.20 2.00 1.40 + 1.30 0.10 0.90 2.00 0.20 1.00 2.00 1.00 0.90 2.00 0.70 -2.10 2.00 1.00 -1.10 1.10 + 2.70 1.40 2.20 2.00 1.50 1.40 2.00 1.40 2.20 2.00 2.00 1.10 2.00 1.40 2.00 0.60 + + Y + --------------------------------------------------------------------------------------------- + A A A A C C C C G G G G U U U U + A C G U A C G U A C G U A C G U + --------------------------------------------------------------------------------------------- + 5' ------> 3' + G \/ \_/ G + U /\ | U + 3' <------ 5' + 2.80 2.30 1.70 2.00 2.80 3.40 2.00 3.40 1.70 2.00 2.10 1.00 2.00 3.10 2.20 2.90 + 2.60 2.20 1.60 2.00 2.60 2.60 2.00 2.60 1.60 2.00 2.00 -0.20 2.00 2.30 1.10 1.80 + 1.50 1.10 0.50 2.00 1.50 2.50 2.00 2.50 0.50 2.00 0.90 0.50 2.00 2.20 1.80 2.50 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.50 2.10 1.50 2.00 2.50 2.50 2.00 2.50 1.50 2.00 1.90 -0.30 2.00 2.20 1.00 1.70 + 3.10 2.00 2.40 2.00 2.50 2.50 2.00 2.50 2.40 2.00 2.40 0.70 2.00 2.20 1.90 1.60 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.10 2.00 2.40 2.00 2.50 2.50 2.00 2.50 2.40 2.00 2.40 0.70 2.00 2.20 1.90 1.60 + 1.50 1.10 0.50 2.00 1.50 2.50 2.00 2.50 0.50 2.00 0.90 0.50 2.00 2.20 1.80 2.50 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.10 1.60 1.00 2.00 2.10 2.70 2.00 2.70 1.00 2.00 1.40 0.30 2.00 2.40 1.50 2.20 + 2.30 0.90 2.10 2.00 1.30 2.30 2.00 2.30 2.10 2.00 1.70 -1.50 2.00 2.00 -0.20 2.30 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.10 2.00 2.40 2.00 2.50 2.50 2.00 2.50 2.40 2.00 2.40 0.70 2.00 2.20 1.90 1.60 + 1.30 -0.10 1.10 2.00 0.30 1.30 2.00 1.30 1.10 2.00 0.70 -2.50 2.00 1.00 -1.20 1.30 + 2.70 1.20 2.40 2.00 1.70 1.70 2.00 1.70 2.40 2.00 2.00 0.70 2.00 1.40 1.90 0.80 + + Y + --------------------------------------------------------------------------------------------- + A A A A C C C C G G G G U U U U + A C G U A C G U A C G U A C G U + --------------------------------------------------------------------------------------------- + 5' ------> 3' + G \/ \_/ U + U /\ | G + 3' <------ 5' + 2.80 2.50 1.50 2.00 2.60 3.10 2.00 3.10 1.50 2.00 2.10 1.30 2.00 3.10 2.30 2.70 + 2.60 2.40 1.40 2.00 2.50 2.30 2.00 2.30 1.40 2.00 1.90 0.20 2.00 2.30 1.20 1.50 + 1.50 1.30 0.30 2.00 1.40 2.20 2.00 2.20 0.30 2.00 0.80 0.90 2.00 2.20 1.90 2.20 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.50 2.30 1.30 2.00 2.40 2.20 2.00 2.20 1.30 2.00 1.80 0.10 2.00 2.20 1.10 1.40 + 3.10 2.20 2.20 2.00 2.30 2.20 2.00 2.20 2.20 2.00 2.40 1.00 2.00 2.20 2.00 1.40 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.10 2.20 2.20 2.00 2.30 2.20 2.00 2.20 2.20 2.00 2.40 1.00 2.00 2.20 2.00 1.40 + 1.50 1.30 0.30 2.00 1.40 2.20 2.00 2.20 0.30 2.00 0.80 0.90 2.00 2.20 1.90 2.20 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.10 1.80 0.80 2.00 1.90 2.40 2.00 2.40 0.80 2.00 1.40 0.70 2.00 2.40 1.60 2.00 + 2.30 1.10 1.90 2.00 1.20 2.00 2.00 2.00 1.90 2.00 1.60 -1.10 2.00 2.00 -0.10 2.00 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.10 2.20 2.20 2.00 2.30 2.20 2.00 2.20 2.20 2.00 2.40 1.00 2.00 2.20 2.00 1.40 + 1.30 0.10 0.90 2.00 0.20 1.00 2.00 1.00 0.90 2.00 0.70 -2.10 2.00 1.00 -1.10 1.10 + 2.70 1.40 2.20 2.00 1.50 1.40 2.00 1.40 2.20 2.00 2.00 1.10 2.00 1.40 2.00 0.60 + + Y + --------------------------------------------------------------------------------------------- + A A A A C C C C G G G G U U U U + A C G U A C G U A C G U A C G U + --------------------------------------------------------------------------------------------- + 5' ------> 3' + U \/ \_/ A + G /\ | U + 3' <------ 5' + 2.80 2.30 1.70 2.00 2.80 3.40 2.00 3.40 1.70 2.00 2.10 1.00 2.00 3.10 2.20 2.90 + 2.80 2.30 1.70 2.00 2.80 2.80 2.00 2.80 1.70 2.00 2.10 0.00 2.00 2.50 1.20 1.90 + 1.70 1.30 0.70 2.00 1.70 2.70 2.00 2.70 0.70 2.00 1.10 0.70 2.00 2.40 2.00 2.70 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.30 1.90 1.30 2.00 2.30 2.30 2.00 2.30 1.30 2.00 1.70 -0.50 2.00 2.00 0.80 1.50 + 3.40 2.30 2.70 2.00 2.80 2.80 2.00 2.80 2.70 2.00 2.70 1.00 2.00 2.50 2.20 1.90 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.10 2.00 2.40 2.00 2.50 2.50 2.00 2.50 2.40 2.00 2.40 0.70 2.00 2.20 1.90 1.60 + 1.70 1.30 0.70 2.00 1.70 2.70 2.00 2.70 0.70 2.00 1.10 0.70 2.00 2.40 2.00 2.70 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.10 1.70 1.10 2.00 2.10 2.70 2.00 2.70 1.10 2.00 1.50 0.30 2.00 2.40 1.60 2.30 + 2.20 0.80 2.00 2.00 1.20 2.20 2.00 2.20 2.00 2.00 1.60 -1.60 2.00 1.90 -0.30 2.20 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.40 2.30 2.70 2.00 2.80 2.80 2.00 2.80 2.70 2.00 2.70 1.00 2.00 2.50 2.20 1.90 + 1.00 -0.50 0.70 2.00 0.00 1.00 2.00 1.00 0.70 2.00 0.30 -2.90 2.00 0.70 -1.60 0.90 + 2.90 1.50 2.70 2.00 1.90 1.90 2.00 1.90 2.70 2.00 2.30 0.90 2.00 1.60 2.20 1.10 + + Y + --------------------------------------------------------------------------------------------- + A A A A C C C C G G G G U U U U + A C G U A C G U A C G U A C G U + --------------------------------------------------------------------------------------------- + 5' ------> 3' + U \/ \_/ C + G /\ | G + 3' <------ 5' + 2.10 1.90 0.10 2.00 1.80 2.50 2.00 1.50 0.70 2.00 1.80 0.00 2.00 2.50 0.40 2.10 + 2.10 1.90 0.10 2.00 1.80 1.90 2.00 0.90 0.70 2.00 1.80 -1.00 2.00 1.90 -0.60 1.10 + 1.10 0.80 -0.90 2.00 0.80 1.80 2.00 0.90 -0.30 2.00 0.70 -0.30 2.00 1.90 0.10 1.90 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.70 1.40 -0.30 2.00 1.40 1.40 2.00 0.40 0.30 2.00 1.30 -1.50 2.00 1.50 -1.10 0.70 + 2.70 1.90 1.10 2.00 1.80 1.90 2.00 0.90 1.70 2.00 2.40 0.00 2.00 1.90 0.40 1.10 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.40 1.60 0.80 2.00 1.50 1.60 2.00 0.60 1.40 2.00 2.10 -0.30 2.00 1.60 0.10 0.80 + 1.10 0.80 -0.90 2.00 0.80 1.80 2.00 0.90 -0.30 2.00 0.70 -0.30 2.00 1.90 0.10 1.90 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.50 1.20 -0.50 2.00 1.20 1.80 2.00 0.80 0.10 2.00 1.10 -0.70 2.00 1.90 -0.30 1.50 + 1.60 0.30 0.40 2.00 0.30 1.30 2.00 0.40 1.00 2.00 1.20 -2.60 2.00 1.40 -2.20 1.40 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.70 1.90 1.10 2.00 1.80 1.90 2.00 0.90 1.70 2.00 2.40 0.00 2.00 1.90 0.40 1.10 + 0.30 -0.90 -0.90 2.00 -1.00 0.10 2.00 -0.90 -0.30 2.00 0.00 -3.90 2.00 0.10 -3.50 0.10 + 2.30 1.00 1.10 2.00 1.00 1.00 2.00 0.00 1.70 2.00 1.90 -0.10 2.00 1.10 0.30 0.30 + + Y + --------------------------------------------------------------------------------------------- + A A A A C C C C G G G G U U U U + A C G U A C G U A C G U A C G U + --------------------------------------------------------------------------------------------- + 5' ------> 3' + U \/ \_/ G + G /\ | C + 3' <------ 5' + 2.00 1.90 1.00 2.00 2.40 2.80 2.00 2.70 1.00 2.00 1.80 0.30 2.00 2.70 1.80 2.20 + 2.00 1.90 1.00 2.00 2.40 2.20 2.00 2.10 1.00 2.00 1.80 -0.70 2.00 2.10 0.80 1.20 + 1.00 0.90 0.00 2.00 1.30 2.20 2.00 2.00 0.00 2.00 0.70 0.10 2.00 2.00 1.60 1.90 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.60 1.50 0.60 2.00 1.90 1.80 2.00 1.60 0.60 2.00 1.30 -1.10 2.00 1.60 0.40 0.70 + 2.60 1.90 2.00 2.00 2.40 2.20 2.00 2.10 2.00 2.00 2.40 0.30 2.00 2.10 1.80 1.20 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.30 1.60 1.70 2.00 2.10 1.90 2.00 1.80 1.70 2.00 2.10 0.00 2.00 1.80 1.50 0.90 + 1.00 0.90 0.00 2.00 1.30 2.20 2.00 2.00 0.00 2.00 0.70 0.10 2.00 2.00 1.60 1.90 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.40 1.30 0.40 2.00 1.70 2.20 2.00 2.00 0.40 2.00 1.10 -0.30 2.00 2.00 1.20 1.50 + 1.50 0.40 1.30 2.00 0.80 1.70 2.00 1.50 1.30 2.00 1.20 -2.20 2.00 1.50 -0.70 1.50 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.60 1.90 2.00 2.00 2.40 2.20 2.00 2.10 2.00 2.00 2.40 0.30 2.00 2.10 1.80 1.20 + 0.20 -0.90 0.00 2.00 -0.40 0.40 2.00 0.30 0.00 2.00 0.00 -3.50 2.00 0.30 -2.00 0.20 + 2.20 1.10 2.00 2.00 1.50 1.40 2.00 1.20 2.00 2.00 1.90 0.30 2.00 1.20 1.80 0.30 + + Y + --------------------------------------------------------------------------------------------- + A A A A C C C C G G G G U U U U + A C G U A C G U A C G U A C G U + --------------------------------------------------------------------------------------------- + 5' ------> 3' + U \/ \_/ U + G /\ | A + 3' <------ 5' + 2.80 2.50 1.50 2.00 2.60 3.10 2.00 3.10 1.50 2.00 2.10 1.30 2.00 3.10 2.30 2.70 + 2.80 2.50 1.50 2.00 2.60 2.50 2.00 2.50 1.50 2.00 2.10 0.30 2.00 2.50 1.30 1.70 + 1.70 1.50 0.50 2.00 1.60 2.40 2.00 2.40 0.50 2.00 1.00 1.10 2.00 2.40 2.10 2.40 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.30 2.10 1.10 2.00 2.20 2.00 2.00 2.00 1.10 2.00 1.60 -0.10 2.00 2.00 0.90 1.20 + 3.40 2.50 2.50 2.00 2.60 2.50 2.00 2.50 2.50 2.00 2.70 1.30 2.00 2.50 2.30 1.70 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.10 2.20 2.20 2.00 2.30 2.20 2.00 2.20 2.20 2.00 2.40 1.00 2.00 2.20 2.00 1.40 + 1.70 1.50 0.50 2.00 1.60 2.40 2.00 2.40 0.50 2.00 1.00 1.10 2.00 2.40 2.10 2.40 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.10 1.90 0.90 2.00 2.00 2.40 2.00 2.40 0.90 2.00 1.40 0.70 2.00 2.40 1.70 2.00 + 2.20 1.00 1.80 2.00 1.10 1.90 2.00 1.90 1.80 2.00 1.50 -1.20 2.00 1.90 -0.20 1.90 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.40 2.50 2.50 2.00 2.60 2.50 2.00 2.50 2.50 2.00 2.70 1.30 2.00 2.50 2.30 1.70 + 1.00 -0.30 0.50 2.00 -0.20 0.70 2.00 0.70 0.50 2.00 0.30 -2.50 2.00 0.70 -1.50 0.70 + 2.90 1.70 2.50 2.00 1.80 1.60 2.00 1.60 2.50 2.00 2.20 1.30 2.00 1.60 2.30 0.80 + + Y + --------------------------------------------------------------------------------------------- + A A A A C C C C G G G G U U U U + A C G U A C G U A C G U A C G U + --------------------------------------------------------------------------------------------- + 5' ------> 3' + U \/ \_/ G + G /\ | U + 3' <------ 5' + 2.80 2.30 1.70 2.00 2.80 3.40 2.00 3.40 1.70 2.00 2.10 1.00 2.00 3.10 2.20 2.90 + 2.80 2.30 1.70 2.00 2.80 2.80 2.00 2.80 1.70 2.00 2.10 0.00 2.00 2.50 1.20 1.90 + 1.70 1.30 0.70 2.00 1.70 2.70 2.00 2.70 0.70 2.00 1.10 0.70 2.00 2.40 2.00 2.70 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.30 1.90 1.30 2.00 2.30 2.30 2.00 2.30 1.30 2.00 1.70 -0.50 2.00 2.00 0.80 1.50 + 3.40 2.30 2.70 2.00 2.80 2.80 2.00 2.80 2.70 2.00 2.70 1.00 2.00 2.50 2.20 1.90 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.10 2.00 2.40 2.00 2.50 2.50 2.00 2.50 2.40 2.00 2.40 0.70 2.00 2.20 1.90 1.60 + 1.70 1.30 0.70 2.00 1.70 2.70 2.00 2.70 0.70 2.00 1.10 0.70 2.00 2.40 2.00 2.70 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.10 1.70 1.10 2.00 2.10 2.70 2.00 2.70 1.10 2.00 1.50 0.30 2.00 2.40 1.60 2.30 + 2.20 0.80 2.00 2.00 1.20 2.20 2.00 2.20 2.00 2.00 1.60 -1.60 2.00 1.90 -0.30 2.20 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.40 2.30 2.70 2.00 2.80 2.80 2.00 2.80 2.70 2.00 2.70 1.00 2.00 2.50 2.20 1.90 + 1.00 -0.50 0.70 2.00 0.00 1.00 2.00 1.00 0.70 2.00 0.30 -2.90 2.00 0.70 -1.60 0.90 + 2.90 1.50 2.70 2.00 1.90 1.90 2.00 1.90 2.70 2.00 2.30 0.90 2.00 1.60 2.20 1.10 + + Y + --------------------------------------------------------------------------------------------- + A A A A C C C C G G G G U U U U + A C G U A C G U A C G U A C G U + --------------------------------------------------------------------------------------------- + 5' ------> 3' + U \/ \_/ U + G /\ | G + 3' <------ 5' + 2.80 2.50 1.50 2.00 2.60 3.10 2.00 3.10 1.50 2.00 2.10 1.30 2.00 3.10 2.30 2.70 + 2.80 2.50 1.50 2.00 2.60 2.50 2.00 2.50 1.50 2.00 2.10 0.30 2.00 2.50 1.30 1.70 + 1.70 1.50 0.50 2.00 1.60 2.40 2.00 2.40 0.50 2.00 1.00 1.10 2.00 2.40 2.10 2.40 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.30 2.10 1.10 2.00 2.20 2.00 2.00 2.00 1.10 2.00 1.60 -0.10 2.00 2.00 0.90 1.20 + 3.40 2.50 2.50 2.00 2.60 2.50 2.00 2.50 2.50 2.00 2.70 1.30 2.00 2.50 2.30 1.70 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.10 2.20 2.20 2.00 2.30 2.20 2.00 2.20 2.20 2.00 2.40 1.00 2.00 2.20 2.00 1.40 + 1.70 1.50 0.50 2.00 1.60 2.40 2.00 2.40 0.50 2.00 1.00 1.10 2.00 2.40 2.10 2.40 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.10 1.90 0.90 2.00 2.00 2.40 2.00 2.40 0.90 2.00 1.40 0.70 2.00 2.40 1.70 2.00 + 2.20 1.00 1.80 2.00 1.10 1.90 2.00 1.90 1.80 2.00 1.50 -1.20 2.00 1.90 -0.20 1.90 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.40 2.50 2.50 2.00 2.60 2.50 2.00 2.50 2.50 2.00 2.70 1.30 2.00 2.50 2.30 1.70 + 1.00 -0.30 0.50 2.00 -0.20 0.70 2.00 0.70 0.50 2.00 0.30 -2.50 2.00 0.70 -1.50 0.70 + 2.90 1.70 2.50 2.00 1.80 1.60 2.00 1.60 2.50 2.00 2.20 1.30 2.00 1.60 2.30 0.80 diff --git a/lib/dat/sint4.lop.dat b/lib/dat/sint4.lop.dat new file mode 100644 index 0000000..c661bc2 --- /dev/null +++ b/lib/dat/sint4.lop.dat @@ -0,0 +1,576 @@ + 2.80 2.30 1.70 2.00 2.80 3.40 2.00 3.40 1.70 2.00 2.10 1.00 2.00 3.10 2.20 2.90 + 2.60 2.20 1.60 2.00 2.60 2.60 2.00 2.60 1.60 2.00 2.00 -0.20 2.00 2.30 1.10 1.80 + 1.50 1.10 0.50 2.00 1.50 2.50 2.00 2.50 0.50 2.00 0.90 0.50 2.00 2.20 1.80 2.50 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.50 2.10 1.50 2.00 2.50 2.50 2.00 2.50 1.50 2.00 1.90 -0.30 2.00 2.20 1.00 1.70 + 3.10 2.00 2.40 2.00 2.50 2.50 2.00 2.50 2.40 2.00 2.40 0.70 2.00 2.20 1.90 1.60 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.10 2.00 2.40 2.00 2.50 2.50 2.00 2.50 2.40 2.00 2.40 0.70 2.00 2.20 1.90 1.60 + 1.50 1.10 0.50 2.00 1.50 2.50 2.00 2.50 0.50 2.00 0.90 0.50 2.00 2.20 1.80 2.50 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.10 1.60 1.00 2.00 2.10 2.70 2.00 2.70 1.00 2.00 1.40 0.30 2.00 2.40 1.50 2.20 + 2.30 0.90 2.10 2.00 1.30 2.30 2.00 2.30 2.10 2.00 1.70 -1.50 2.00 2.00 -0.20 2.30 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.10 2.00 2.40 2.00 2.50 2.50 2.00 2.50 2.40 2.00 2.40 0.70 2.00 2.20 1.90 1.60 + 1.30 -0.10 1.10 2.00 0.30 1.30 2.00 1.30 1.10 2.00 0.70 -2.50 2.00 1.00 -1.20 1.30 + 2.70 1.20 2.40 2.00 1.70 1.70 2.00 1.70 2.40 2.00 2.00 0.70 2.00 1.40 1.90 0.80 + 2.10 1.90 0.10 2.00 1.80 2.50 2.00 1.50 0.70 2.00 1.80 0.00 2.00 2.50 0.40 2.10 + 2.00 1.70 0.00 2.00 1.70 1.70 2.00 0.70 0.60 2.00 1.60 -1.20 2.00 1.80 -0.80 1.00 + 0.90 0.60 -1.10 2.00 0.60 1.60 2.00 0.70 -0.50 2.00 0.50 -0.50 2.00 1.70 -0.10 1.70 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.90 1.60 -0.10 2.00 1.60 1.60 2.00 0.60 0.50 2.00 1.50 -1.30 2.00 1.70 -0.90 0.90 + 2.40 1.60 0.80 2.00 1.50 1.60 2.00 0.60 1.40 2.00 2.10 -0.30 2.00 1.60 0.10 0.80 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.40 1.60 0.80 2.00 1.50 1.60 2.00 0.60 1.40 2.00 2.10 -0.30 2.00 1.60 0.10 0.80 + 0.90 0.60 -1.10 2.00 0.60 1.60 2.00 0.70 -0.50 2.00 0.50 -0.50 2.00 1.70 -0.10 1.70 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.40 1.20 -0.60 2.00 1.10 1.80 2.00 0.80 0.00 2.00 1.10 -0.70 2.00 1.80 -0.30 1.40 + 1.70 0.40 0.50 2.00 0.40 1.40 2.00 0.50 1.10 2.00 1.30 -2.50 2.00 1.50 -2.10 1.50 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.40 1.60 0.80 2.00 1.50 1.60 2.00 0.60 1.40 2.00 2.10 -0.30 2.00 1.60 0.10 0.80 + 0.70 -0.50 -0.50 2.00 -0.60 0.50 2.00 -0.50 0.10 2.00 0.40 -3.50 2.00 0.50 -3.10 0.50 + 2.00 0.80 0.80 2.00 0.70 0.80 2.00 -0.20 1.50 2.00 1.70 -0.30 2.00 0.80 0.10 0.00 + 2.00 1.90 1.00 2.00 2.40 2.80 2.00 2.70 1.00 2.00 1.80 0.30 2.00 2.70 1.80 2.20 + 1.90 1.80 0.90 2.00 2.20 2.10 2.00 1.90 0.90 2.00 1.60 -0.80 2.00 1.90 0.70 1.00 + 0.80 0.70 -0.20 2.00 1.10 2.00 2.00 1.80 -0.20 2.00 0.50 -0.10 2.00 1.80 1.40 1.80 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.80 1.70 0.80 2.00 2.10 2.00 2.00 1.80 0.80 2.00 1.50 -0.90 2.00 1.80 0.60 0.90 + 2.30 1.60 1.70 2.00 2.10 1.90 2.00 1.80 1.70 2.00 2.10 0.00 2.00 1.80 1.50 0.90 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.30 1.60 1.70 2.00 2.10 1.90 2.00 1.80 1.70 2.00 2.10 0.00 2.00 1.80 1.50 0.90 + 0.80 0.70 -0.20 2.00 1.10 2.00 2.00 1.80 -0.20 2.00 0.50 -0.10 2.00 1.80 1.40 1.80 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.30 1.20 0.30 2.00 1.70 2.10 2.00 2.00 0.30 2.00 1.10 -0.40 2.00 2.00 1.10 1.50 + 1.60 0.50 1.40 2.00 0.90 1.80 2.00 1.60 1.40 2.00 1.30 -2.10 2.00 1.60 -0.60 1.60 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.30 1.60 1.70 2.00 2.10 1.90 2.00 1.80 1.70 2.00 2.10 0.00 2.00 1.80 1.50 0.90 + 0.60 -0.50 0.40 2.00 0.00 0.80 2.00 0.70 0.40 2.00 0.40 -3.10 2.00 0.70 -1.60 0.60 + 1.90 0.80 1.80 2.00 1.30 1.10 2.00 1.00 1.80 2.00 1.70 0.00 2.00 1.00 1.60 0.10 + 2.80 2.50 1.50 2.00 2.60 3.10 2.00 3.10 1.50 2.00 2.10 1.30 2.00 3.10 2.30 2.70 + 2.60 2.40 1.40 2.00 2.50 2.30 2.00 2.30 1.40 2.00 1.90 0.20 2.00 2.30 1.20 1.50 + 1.50 1.30 0.30 2.00 1.40 2.20 2.00 2.20 0.30 2.00 0.80 0.90 2.00 2.20 1.90 2.20 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.50 2.30 1.30 2.00 2.40 2.20 2.00 2.20 1.30 2.00 1.80 0.10 2.00 2.20 1.10 1.40 + 3.10 2.20 2.20 2.00 2.30 2.20 2.00 2.20 2.20 2.00 2.40 1.00 2.00 2.20 2.00 1.40 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.10 2.20 2.20 2.00 2.30 2.20 2.00 2.20 2.20 2.00 2.40 1.00 2.00 2.20 2.00 1.40 + 1.50 1.30 0.30 2.00 1.40 2.20 2.00 2.20 0.30 2.00 0.80 0.90 2.00 2.20 1.90 2.20 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.10 1.80 0.80 2.00 1.90 2.40 2.00 2.40 0.80 2.00 1.40 0.70 2.00 2.40 1.60 2.00 + 2.30 1.10 1.90 2.00 1.20 2.00 2.00 2.00 1.90 2.00 1.60 -1.10 2.00 2.00 -0.10 2.00 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.10 2.20 2.20 2.00 2.30 2.20 2.00 2.20 2.20 2.00 2.40 1.00 2.00 2.20 2.00 1.40 + 1.30 0.10 0.90 2.00 0.20 1.00 2.00 1.00 0.90 2.00 0.70 -2.10 2.00 1.00 -1.10 1.10 + 2.70 1.40 2.20 2.00 1.50 1.40 2.00 1.40 2.20 2.00 2.00 1.10 2.00 1.40 2.00 0.60 + 2.80 2.30 1.70 2.00 2.80 3.40 2.00 3.40 1.70 2.00 2.10 1.00 2.00 3.10 2.20 2.90 + 2.60 2.20 1.60 2.00 2.60 2.60 2.00 2.60 1.60 2.00 2.00 -0.20 2.00 2.30 1.10 1.80 + 1.50 1.10 0.50 2.00 1.50 2.50 2.00 2.50 0.50 2.00 0.90 0.50 2.00 2.20 1.80 2.50 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.50 2.10 1.50 2.00 2.50 2.50 2.00 2.50 1.50 2.00 1.90 -0.30 2.00 2.20 1.00 1.70 + 3.10 2.00 2.40 2.00 2.50 2.50 2.00 2.50 2.40 2.00 2.40 0.70 2.00 2.20 1.90 1.60 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.10 2.00 2.40 2.00 2.50 2.50 2.00 2.50 2.40 2.00 2.40 0.70 2.00 2.20 1.90 1.60 + 1.50 1.10 0.50 2.00 1.50 2.50 2.00 2.50 0.50 2.00 0.90 0.50 2.00 2.20 1.80 2.50 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.10 1.60 1.00 2.00 2.10 2.70 2.00 2.70 1.00 2.00 1.40 0.30 2.00 2.40 1.50 2.20 + 2.30 0.90 2.10 2.00 1.30 2.30 2.00 2.30 2.10 2.00 1.70 -1.50 2.00 2.00 -0.20 2.30 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.10 2.00 2.40 2.00 2.50 2.50 2.00 2.50 2.40 2.00 2.40 0.70 2.00 2.20 1.90 1.60 + 1.30 -0.10 1.10 2.00 0.30 1.30 2.00 1.30 1.10 2.00 0.70 -2.50 2.00 1.00 -1.20 1.30 + 2.70 1.20 2.40 2.00 1.70 1.70 2.00 1.70 2.40 2.00 2.00 0.70 2.00 1.40 1.90 0.80 + 2.80 2.50 1.50 2.00 2.60 3.10 2.00 3.10 1.50 2.00 2.10 1.30 2.00 3.10 2.30 2.70 + 2.60 2.40 1.40 2.00 2.50 2.30 2.00 2.30 1.40 2.00 1.90 0.20 2.00 2.30 1.20 1.50 + 1.50 1.30 0.30 2.00 1.40 2.20 2.00 2.20 0.30 2.00 0.80 0.90 2.00 2.20 1.90 2.20 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.50 2.30 1.30 2.00 2.40 2.20 2.00 2.20 1.30 2.00 1.80 0.10 2.00 2.20 1.10 1.40 + 3.10 2.20 2.20 2.00 2.30 2.20 2.00 2.20 2.20 2.00 2.40 1.00 2.00 2.20 2.00 1.40 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.10 2.20 2.20 2.00 2.30 2.20 2.00 2.20 2.20 2.00 2.40 1.00 2.00 2.20 2.00 1.40 + 1.50 1.30 0.30 2.00 1.40 2.20 2.00 2.20 0.30 2.00 0.80 0.90 2.00 2.20 1.90 2.20 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.10 1.80 0.80 2.00 1.90 2.40 2.00 2.40 0.80 2.00 1.40 0.70 2.00 2.40 1.60 2.00 + 2.30 1.10 1.90 2.00 1.20 2.00 2.00 2.00 1.90 2.00 1.60 -1.10 2.00 2.00 -0.10 2.00 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.10 2.20 2.20 2.00 2.30 2.20 2.00 2.20 2.20 2.00 2.40 1.00 2.00 2.20 2.00 1.40 + 1.30 0.10 0.90 2.00 0.20 1.00 2.00 1.00 0.90 2.00 0.70 -2.10 2.00 1.00 -1.10 1.10 + 2.70 1.40 2.20 2.00 1.50 1.40 2.00 1.40 2.20 2.00 2.00 1.10 2.00 1.40 2.00 0.60 + 2.00 1.60 1.00 2.00 2.00 2.60 2.00 2.60 1.00 2.00 1.40 0.20 2.00 2.30 1.50 2.20 + 2.40 1.90 1.30 2.00 2.40 2.40 2.00 2.40 1.30 2.00 1.70 -0.40 2.00 2.10 0.80 1.50 + 1.00 0.60 0.00 2.00 1.00 2.00 2.00 2.00 0.00 2.00 0.40 0.00 2.00 1.70 1.30 2.00 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.90 1.50 0.90 2.00 1.90 1.90 2.00 1.90 0.90 2.00 1.30 -0.90 2.00 1.60 0.40 1.10 + 2.80 1.80 2.20 2.00 2.20 2.20 2.00 2.20 2.20 2.00 2.20 0.40 2.00 1.90 1.70 1.40 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.70 1.60 2.00 2.00 2.10 2.10 2.00 2.10 2.00 2.00 2.00 0.30 2.00 1.80 1.50 1.20 + 1.00 0.60 0.00 2.00 1.00 2.00 2.00 2.00 0.00 2.00 0.40 0.00 2.00 1.70 1.30 2.00 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.80 1.30 0.70 2.00 1.80 2.40 2.00 2.40 0.70 2.00 1.10 0.00 2.00 2.10 1.20 1.90 + 1.80 0.40 1.60 2.00 0.80 1.80 2.00 1.80 1.60 2.00 1.20 -2.00 2.00 1.50 -0.70 1.80 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.70 1.60 2.00 2.00 2.10 2.10 2.00 2.10 2.00 2.00 2.00 0.30 2.00 1.80 1.50 1.20 + 0.30 -1.10 0.10 2.00 -0.70 0.30 2.00 0.30 0.10 2.00 -0.30 -3.50 2.00 0.00 -2.20 0.30 + 2.20 0.70 1.90 2.00 1.20 1.20 2.00 1.20 1.90 2.00 1.50 0.20 2.00 0.90 1.50 0.30 + 0.50 1.10 -0.30 2.00 1.10 1.70 2.00 0.70 0.40 2.00 1.00 0.10 2.00 1.80 -0.50 1.50 + 0.60 1.50 0.10 2.00 1.10 1.50 2.00 0.50 0.50 2.00 1.40 -0.70 2.00 1.50 -0.60 0.00 + 0.00 -0.70 -1.60 2.00 -1.00 -0.60 2.00 0.20 -0.70 2.00 0.00 -0.80 2.00 1.20 -0.60 0.90 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.30 1.00 -0.70 2.00 1.00 1.00 2.00 0.00 0.70 2.00 0.90 -1.90 2.00 1.10 -1.50 -0.20 + 2.20 1.30 0.70 2.00 1.90 1.30 2.00 0.30 0.70 2.00 1.80 -0.30 2.00 1.40 -0.20 -0.10 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.00 1.20 0.40 2.00 1.10 1.20 2.00 1.70 1.00 2.00 1.70 -0.70 2.00 1.20 -0.30 0.20 + -0.20 -0.40 -1.70 2.00 0.70 1.10 2.00 0.20 -0.50 2.00 0.00 -0.90 2.00 1.20 -1.30 0.90 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.10 0.90 -0.90 2.00 0.80 1.50 2.00 0.50 -0.20 2.00 0.80 -1.00 2.00 1.50 -0.60 1.10 + 0.90 0.00 0.30 2.00 -0.10 1.00 2.00 0.00 0.60 2.00 0.90 -3.00 2.00 1.00 -2.40 0.60 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.00 1.20 0.40 2.00 1.10 1.20 2.00 0.20 0.50 2.00 1.70 -0.70 2.00 1.20 -0.10 0.40 + -0.10 -1.60 -1.60 2.00 -1.60 -0.60 2.00 -1.60 -0.60 2.00 -0.70 -4.40 2.00 -0.50 -4.10 -1.00 + 1.40 0.30 0.50 2.00 0.30 0.30 2.00 0.10 1.40 2.00 1.20 -1.00 2.00 0.30 0.10 0.60 + 1.30 1.20 0.30 2.00 1.60 2.10 2.00 1.90 0.30 2.00 1.00 -0.40 2.00 1.90 1.10 1.40 + 1.60 1.50 0.60 2.00 2.00 1.80 2.00 1.70 0.60 2.00 1.40 -1.10 2.00 1.70 0.40 0.80 + 0.30 0.20 -0.70 2.00 0.60 1.50 2.00 1.30 -0.70 2.00 0.00 -0.60 2.00 1.30 0.90 1.30 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.20 1.10 0.20 2.00 1.50 1.40 2.00 1.20 0.20 2.00 0.90 -1.50 2.00 1.20 0.00 0.30 + 2.10 1.40 1.50 2.00 1.80 1.70 2.00 1.50 1.50 2.00 1.80 -0.20 2.00 1.50 1.30 0.60 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.90 1.20 1.30 2.00 1.70 1.50 2.00 1.40 1.30 2.00 1.70 -0.40 2.00 1.40 1.10 0.50 + 0.30 0.20 -0.70 2.00 0.60 1.50 2.00 1.30 -0.70 2.00 0.00 -0.60 2.00 1.30 0.90 1.30 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.00 0.90 0.00 2.00 1.40 1.80 2.00 1.70 0.00 2.00 0.80 -0.70 2.00 1.70 0.90 1.20 + 1.10 0.00 0.90 2.00 0.40 1.30 2.00 1.10 0.90 2.00 0.90 -2.60 2.00 1.10 -1.10 1.10 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.90 1.20 1.30 2.00 1.70 1.50 2.00 1.40 1.30 2.00 1.70 -0.40 2.00 1.40 1.10 0.50 + -0.40 -1.50 -0.60 2.00 -1.10 -0.20 2.00 -0.40 -0.60 2.00 -0.70 -4.20 2.00 -0.40 -2.60 -0.50 + 1.40 0.30 1.30 2.00 0.80 0.60 2.00 0.50 1.30 2.00 1.20 -0.50 2.00 0.50 1.10 -0.40 + 2.00 1.80 0.80 2.00 1.90 2.30 2.00 2.30 0.80 2.00 1.30 0.60 2.00 2.30 1.60 1.90 + 2.40 2.10 1.10 2.00 2.20 2.10 2.00 2.10 1.10 2.00 1.70 0.00 2.00 2.10 0.90 1.30 + 1.00 0.80 -0.20 2.00 0.90 1.70 2.00 1.70 -0.20 2.00 0.30 0.40 2.00 1.70 1.40 1.80 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.90 1.70 0.70 2.00 1.80 1.60 2.00 1.60 0.70 2.00 1.20 -0.50 2.00 1.60 0.50 0.80 + 2.80 2.00 2.00 2.00 2.10 1.90 2.00 1.90 2.00 2.00 2.10 0.80 2.00 1.90 1.80 1.10 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.70 1.80 1.80 2.00 1.90 1.80 2.00 1.80 1.80 2.00 2.00 0.70 2.00 1.80 1.60 1.00 + 1.00 0.80 -0.20 2.00 0.90 1.70 2.00 1.70 -0.20 2.00 0.30 0.40 2.00 1.70 1.40 1.80 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.80 1.50 0.50 2.00 1.60 2.10 2.00 2.10 0.50 2.00 1.10 0.40 2.00 2.10 1.30 1.70 + 1.80 0.60 1.40 2.00 0.70 1.50 2.00 1.50 1.40 2.00 1.10 -1.60 2.00 1.50 -0.60 1.60 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.70 1.80 1.80 2.00 1.90 1.80 2.00 1.80 1.80 2.00 2.00 0.70 2.00 1.80 1.60 1.00 + 0.30 -0.90 -0.10 2.00 -0.80 0.00 2.00 0.00 -0.10 2.00 -0.40 -3.10 2.00 0.00 -2.10 0.00 + 2.20 0.90 1.80 2.00 1.00 0.90 2.00 0.90 1.80 2.00 1.50 0.60 2.00 0.90 1.60 0.10 + 2.00 1.60 1.00 2.00 2.00 2.60 2.00 2.60 1.00 2.00 1.40 0.20 2.00 2.30 1.50 2.20 + 2.40 1.90 1.30 2.00 2.40 2.40 2.00 2.40 1.30 2.00 1.70 -0.40 2.00 2.10 0.80 1.50 + 1.00 0.60 0.00 2.00 1.00 2.00 2.00 2.00 0.00 2.00 0.40 0.00 2.00 1.70 1.30 2.00 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.90 1.50 0.90 2.00 1.90 1.90 2.00 1.90 0.90 2.00 1.30 -0.90 2.00 1.60 0.40 1.10 + 2.80 1.80 2.20 2.00 2.20 2.20 2.00 2.20 2.20 2.00 2.20 0.40 2.00 1.90 1.70 1.40 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.70 1.60 2.00 2.00 2.10 2.10 2.00 2.10 2.00 2.00 2.00 0.30 2.00 1.80 1.50 1.20 + 1.00 0.60 0.00 2.00 1.00 2.00 2.00 2.00 0.00 2.00 0.40 0.00 2.00 1.70 1.30 2.00 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.80 1.30 0.70 2.00 1.80 2.40 2.00 2.40 0.70 2.00 1.10 0.00 2.00 2.10 1.20 1.90 + 1.80 0.40 1.60 2.00 0.80 1.80 2.00 1.80 1.60 2.00 1.20 -2.00 2.00 1.50 -0.70 1.80 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.70 1.60 2.00 2.00 2.10 2.10 2.00 2.10 2.00 2.00 2.00 0.30 2.00 1.80 1.50 1.20 + 0.30 -1.10 0.10 2.00 -0.70 0.30 2.00 0.30 0.10 2.00 -0.30 -3.50 2.00 0.00 -2.20 0.30 + 2.20 0.70 1.90 2.00 1.20 1.20 2.00 1.20 1.90 2.00 1.50 0.20 2.00 0.90 1.50 0.30 + 2.00 1.80 0.80 2.00 1.90 2.30 2.00 2.30 0.80 2.00 1.30 0.60 2.00 2.30 1.60 1.90 + 2.40 2.10 1.10 2.00 2.20 2.10 2.00 2.10 1.10 2.00 1.70 0.00 2.00 2.10 0.90 1.30 + 1.00 0.80 -0.20 2.00 0.90 1.70 2.00 1.70 -0.20 2.00 0.30 0.40 2.00 1.70 1.40 1.80 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.90 1.70 0.70 2.00 1.80 1.60 2.00 1.60 0.70 2.00 1.20 -0.50 2.00 1.60 0.50 0.80 + 2.80 2.00 2.00 2.00 2.10 1.90 2.00 1.90 2.00 2.00 2.10 0.80 2.00 1.90 1.80 1.10 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.70 1.80 1.80 2.00 1.90 1.80 2.00 1.80 1.80 2.00 2.00 0.70 2.00 1.80 1.60 1.00 + 1.00 0.80 -0.20 2.00 0.90 1.70 2.00 1.70 -0.20 2.00 0.30 0.40 2.00 1.70 1.40 1.80 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.80 1.50 0.50 2.00 1.60 2.10 2.00 2.10 0.50 2.00 1.10 0.40 2.00 2.10 1.30 1.70 + 1.80 0.60 1.40 2.00 0.70 1.50 2.00 1.50 1.40 2.00 1.10 -1.60 2.00 1.50 -0.60 1.60 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.70 1.80 1.80 2.00 1.90 1.80 2.00 1.80 1.80 2.00 2.00 0.70 2.00 1.80 1.60 1.00 + 0.30 -0.90 -0.10 2.00 -0.80 0.00 2.00 0.00 -0.10 2.00 -0.40 -3.10 2.00 0.00 -2.10 0.00 + 2.20 0.90 1.80 2.00 1.00 0.90 2.00 0.90 1.80 2.00 1.50 0.60 2.00 0.90 1.60 0.10 + 2.10 1.70 1.10 2.00 2.10 2.70 2.00 2.70 1.10 2.00 1.50 0.30 2.00 2.40 1.60 2.30 + 1.80 1.40 0.80 2.00 1.80 1.80 2.00 1.80 0.80 2.00 1.20 -1.00 2.00 1.50 0.30 1.00 + 0.70 0.30 -0.30 2.00 0.70 1.70 2.00 1.70 -0.30 2.00 0.10 -0.30 2.00 1.40 1.00 1.70 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.90 1.40 0.80 2.00 1.90 1.90 2.00 1.90 0.80 2.00 1.20 -0.90 2.00 1.60 0.30 1.00 + 2.50 1.40 1.80 2.00 1.90 1.90 2.00 1.90 1.80 2.00 1.80 0.10 2.00 1.60 1.30 1.00 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.50 1.50 1.90 2.00 1.90 1.90 2.00 1.90 1.90 2.00 1.90 0.10 2.00 1.60 1.40 1.10 + 0.10 -0.30 -0.90 2.00 0.10 1.10 2.00 1.10 -0.90 2.00 -0.50 -0.90 2.00 0.80 0.40 1.10 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.80 1.30 0.70 2.00 1.80 2.40 2.00 2.40 0.70 2.00 1.10 0.00 2.00 2.10 1.20 1.90 + 0.40 -1.10 0.10 2.00 -0.60 0.40 2.00 0.40 0.10 2.00 -0.30 -3.50 2.00 0.10 -2.20 0.30 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.50 0.40 0.90 2.00 0.90 0.90 2.00 0.90 0.90 2.00 0.80 -0.90 2.00 0.60 0.40 0.00 + 0.00 -1.50 -0.30 2.00 -1.00 0.00 2.00 0.00 -0.30 2.00 -0.70 -3.90 2.00 -0.30 -2.60 -0.10 + 2.10 0.70 1.90 2.00 1.10 1.10 2.00 1.10 1.90 2.00 1.50 0.10 2.00 0.80 1.40 0.30 + 1.50 1.20 -0.50 2.00 1.20 1.80 2.00 0.80 0.10 2.00 1.10 -0.70 2.00 1.90 -0.30 1.50 + 1.20 0.90 -0.80 2.00 0.90 0.90 2.00 0.00 -0.20 2.00 0.80 -2.00 2.00 1.00 -1.60 0.20 + 0.10 -0.10 -1.90 2.00 -0.20 0.90 2.00 -0.10 -1.30 2.00 -0.20 -1.30 2.00 0.90 -0.90 0.90 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.20 1.00 -0.80 2.00 0.90 1.00 2.00 0.00 -0.10 2.00 0.90 -1.90 2.00 1.00 -1.50 0.20 + 1.80 1.00 0.20 2.00 0.90 1.00 2.00 0.00 0.90 2.00 1.50 -0.90 2.00 1.00 -0.50 0.20 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.90 1.00 0.30 2.00 1.00 1.00 2.00 0.00 0.90 2.00 1.50 -0.90 2.00 1.10 -0.50 0.30 + -0.50 -0.80 -2.60 2.00 -0.80 0.20 2.00 -0.80 -1.90 2.00 -0.90 -1.90 2.00 0.30 -1.50 0.30 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.10 0.90 -0.90 2.00 0.80 1.50 2.00 0.50 -0.20 2.00 0.80 -1.00 2.00 1.50 -0.60 1.10 + -0.30 -1.50 -1.50 2.00 -1.60 -0.50 2.00 -1.50 -0.90 2.00 -0.60 -4.50 2.00 -0.50 -4.10 -0.50 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 0.80 0.00 -0.80 2.00 0.00 0.00 2.00 -1.00 -0.10 2.00 0.50 -1.90 2.00 0.00 -1.50 -0.70 + -0.70 -1.90 -1.90 2.00 -2.00 -0.90 2.00 -1.90 -1.30 2.00 -1.00 -4.90 2.00 -0.90 -4.50 -0.90 + 1.50 0.20 0.30 2.00 0.20 0.20 2.00 -0.70 0.90 2.00 1.10 -0.90 2.00 0.30 -0.50 -0.50 + 0.50 1.30 -0.20 2.00 0.60 2.20 2.00 2.00 0.00 2.00 1.10 -0.10 2.00 2.00 0.90 1.40 + 1.10 1.00 0.70 2.00 1.10 1.90 2.00 1.10 -1.00 2.00 0.80 -1.60 2.00 1.10 -0.10 0.30 + 0.40 0.70 -0.50 2.00 0.50 0.70 2.00 0.50 -0.70 2.00 -0.20 -0.60 2.00 1.00 0.60 1.40 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.10 1.00 -0.40 2.00 1.50 1.30 2.00 1.20 -0.70 2.00 0.90 -1.60 2.00 1.20 0.00 0.30 + 1.70 1.00 1.10 2.00 1.50 1.30 2.00 1.20 -0.60 2.00 1.50 -0.60 2.00 1.20 1.00 0.30 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.80 1.10 1.20 2.00 1.50 1.40 2.00 1.20 1.20 2.00 1.50 -0.50 2.00 1.20 1.00 0.30 + -0.30 -0.70 -1.70 2.00 0.10 0.70 2.00 0.40 -1.60 2.00 -0.90 -1.60 2.00 0.40 0.30 0.50 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.00 0.90 0.00 2.00 1.40 1.80 2.00 1.70 0.00 2.00 0.80 -0.70 2.00 1.70 0.90 1.20 + -0.50 -1.50 -1.30 2.00 -0.60 -0.20 2.00 -0.10 -0.60 2.00 -0.60 -4.10 2.00 -0.30 -2.40 0.10 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 0.70 0.00 0.20 2.00 0.50 0.30 2.00 0.20 0.20 2.00 0.50 -1.60 2.00 1.70 0.00 0.10 + 0.10 -1.90 -0.90 2.00 -0.70 -0.30 2.00 -0.70 -0.80 2.00 -1.00 -4.40 2.00 -0.70 -3.00 -1.00 + 1.50 -0.20 0.90 2.00 0.00 -0.10 2.00 0.40 0.90 2.00 1.10 -1.00 2.00 0.20 0.60 0.60 + 2.10 1.90 0.90 2.00 2.00 2.40 2.00 2.40 0.90 2.00 1.40 0.70 2.00 2.40 1.70 2.00 + 1.80 1.60 0.60 2.00 1.70 1.50 2.00 1.50 0.60 2.00 1.10 -0.60 2.00 1.50 0.40 0.70 + 0.70 0.50 -0.50 2.00 0.60 1.40 2.00 1.40 -0.50 2.00 0.00 0.10 2.00 1.40 1.10 1.50 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.90 1.60 0.60 2.00 1.70 1.60 2.00 1.60 0.60 2.00 1.20 -0.50 2.00 1.60 0.40 0.80 + 2.50 1.60 1.60 2.00 1.70 1.60 2.00 1.60 1.60 2.00 1.80 0.50 2.00 1.60 1.40 0.80 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.50 1.70 1.70 2.00 1.80 1.60 2.00 1.60 1.70 2.00 1.80 0.50 2.00 1.60 1.50 0.80 + 0.10 -0.10 -1.10 2.00 0.00 0.80 2.00 0.80 -1.10 2.00 -0.60 -0.50 2.00 0.80 0.50 0.80 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.80 1.50 0.50 2.00 1.60 2.10 2.00 2.10 0.50 2.00 1.10 0.40 2.00 2.10 1.30 1.70 + 0.40 -0.90 -0.10 2.00 -0.80 0.10 2.00 0.10 -0.10 2.00 -0.30 -3.10 2.00 0.10 -2.10 0.10 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.50 0.60 0.70 2.00 0.70 0.60 2.00 0.60 0.70 2.00 0.80 -0.50 2.00 0.60 0.50 -0.20 + 0.00 -1.30 -0.50 2.00 -1.20 -0.30 2.00 -0.30 -0.50 2.00 -0.70 -3.50 2.00 -0.30 -2.50 -0.30 + 2.10 0.90 1.70 2.00 1.00 0.80 2.00 0.80 1.70 2.00 1.40 0.50 2.00 0.80 1.50 0.00 + 2.10 1.70 1.10 2.00 2.10 2.70 2.00 2.70 1.10 2.00 1.50 0.30 2.00 2.40 1.60 2.30 + 1.80 1.40 0.80 2.00 1.80 1.80 2.00 1.80 0.80 2.00 1.20 -1.00 2.00 1.50 0.30 1.00 + 0.70 0.30 -0.30 2.00 0.70 1.70 2.00 1.70 -0.30 2.00 0.10 -0.30 2.00 1.40 1.00 1.70 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.90 1.40 0.80 2.00 1.90 1.90 2.00 1.90 0.80 2.00 1.20 -0.90 2.00 1.60 0.30 1.00 + 2.50 1.40 1.80 2.00 1.90 1.90 2.00 1.90 1.80 2.00 1.80 0.10 2.00 1.60 1.30 1.00 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.50 1.50 1.90 2.00 1.90 1.90 2.00 1.90 1.90 2.00 1.90 0.10 2.00 1.60 1.40 1.10 + 0.10 -0.30 -0.90 2.00 0.10 1.10 2.00 1.10 -0.90 2.00 -0.50 -0.90 2.00 0.80 0.40 1.10 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.80 1.30 0.70 2.00 1.80 2.40 2.00 2.40 0.70 2.00 1.10 0.00 2.00 2.10 1.20 1.90 + 0.40 -1.10 0.10 2.00 -0.60 0.40 2.00 0.40 0.10 2.00 -0.30 -3.50 2.00 0.10 -2.20 0.30 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.50 0.40 0.90 2.00 0.90 0.90 2.00 0.90 0.90 2.00 0.80 -0.90 2.00 0.60 0.40 0.00 + 0.00 -1.50 -0.30 2.00 -1.00 0.00 2.00 0.00 -0.30 2.00 -0.70 -3.90 2.00 -0.30 -2.60 -0.10 + 2.10 0.70 1.90 2.00 1.10 1.10 2.00 1.10 1.90 2.00 1.50 0.10 2.00 0.80 1.40 0.30 + 2.10 1.90 0.90 2.00 2.00 2.40 2.00 2.40 0.90 2.00 1.40 0.70 2.00 2.40 1.70 2.00 + 1.80 1.60 0.60 2.00 1.70 1.50 2.00 1.50 0.60 2.00 1.10 -0.60 2.00 1.50 0.40 0.70 + 0.70 0.50 -0.50 2.00 0.60 1.40 2.00 1.40 -0.50 2.00 0.00 0.10 2.00 1.40 1.10 1.50 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.90 1.60 0.60 2.00 1.70 1.60 2.00 1.60 0.60 2.00 1.20 -0.50 2.00 1.60 0.40 0.80 + 2.50 1.60 1.60 2.00 1.70 1.60 2.00 1.60 1.60 2.00 1.80 0.50 2.00 1.60 1.40 0.80 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.50 1.70 1.70 2.00 1.80 1.60 2.00 1.60 1.70 2.00 1.80 0.50 2.00 1.60 1.50 0.80 + 0.10 -0.10 -1.10 2.00 0.00 0.80 2.00 0.80 -1.10 2.00 -0.60 -0.50 2.00 0.80 0.50 0.80 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.80 1.50 0.50 2.00 1.60 2.10 2.00 2.10 0.50 2.00 1.10 0.40 2.00 2.10 1.30 1.70 + 0.40 -0.90 -0.10 2.00 -0.80 0.10 2.00 0.10 -0.10 2.00 -0.30 -3.10 2.00 0.10 -2.10 0.10 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.50 0.60 0.70 2.00 0.70 0.60 2.00 0.60 0.70 2.00 0.80 -0.50 2.00 0.60 0.50 -0.20 + 0.00 -1.30 -0.50 2.00 -1.20 -0.30 2.00 -0.30 -0.50 2.00 -0.70 -3.50 2.00 -0.30 -2.50 -0.30 + 2.10 0.90 1.70 2.00 1.00 0.80 2.00 0.80 1.70 2.00 1.40 0.50 2.00 0.80 1.50 0.00 + 2.80 2.30 1.70 2.00 2.80 3.40 2.00 3.40 1.70 2.00 2.10 1.00 2.00 3.10 2.20 2.90 + 2.80 2.30 1.70 2.00 2.80 2.80 2.00 2.80 1.70 2.00 2.10 0.00 2.00 2.50 1.20 1.90 + 1.70 1.30 0.70 2.00 1.70 2.70 2.00 2.70 0.70 2.00 1.10 0.70 2.00 2.40 2.00 2.70 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.30 1.90 1.30 2.00 2.30 2.30 2.00 2.30 1.30 2.00 1.70 -0.50 2.00 2.00 0.80 1.50 + 3.40 2.30 2.70 2.00 2.80 2.80 2.00 2.80 2.70 2.00 2.70 1.00 2.00 2.50 2.20 1.90 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.10 2.00 2.40 2.00 2.50 2.50 2.00 2.50 2.40 2.00 2.40 0.70 2.00 2.20 1.90 1.60 + 1.70 1.30 0.70 2.00 1.70 2.70 2.00 2.70 0.70 2.00 1.10 0.70 2.00 2.40 2.00 2.70 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.10 1.70 1.10 2.00 2.10 2.70 2.00 2.70 1.10 2.00 1.50 0.30 2.00 2.40 1.60 2.30 + 2.20 0.80 2.00 2.00 1.20 2.20 2.00 2.20 2.00 2.00 1.60 -1.60 2.00 1.90 -0.30 2.20 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.40 2.30 2.70 2.00 2.80 2.80 2.00 2.80 2.70 2.00 2.70 1.00 2.00 2.50 2.20 1.90 + 1.00 -0.50 0.70 2.00 0.00 1.00 2.00 1.00 0.70 2.00 0.30 -2.90 2.00 0.70 -1.60 0.90 + 2.90 1.50 2.70 2.00 1.90 1.90 2.00 1.90 2.70 2.00 2.30 0.90 2.00 1.60 2.20 1.10 + 2.10 1.90 0.10 2.00 1.80 2.50 2.00 1.50 0.70 2.00 1.80 0.00 2.00 2.50 0.40 2.10 + 2.10 1.90 0.10 2.00 1.80 1.90 2.00 0.90 0.70 2.00 1.80 -1.00 2.00 1.90 -0.60 1.10 + 1.10 0.80 -0.90 2.00 0.80 1.80 2.00 0.90 -0.30 2.00 0.70 -0.30 2.00 1.90 0.10 1.90 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.70 1.40 -0.30 2.00 1.40 1.40 2.00 0.40 0.30 2.00 1.30 -1.50 2.00 1.50 -1.10 0.70 + 2.70 1.90 1.10 2.00 1.80 1.90 2.00 0.90 1.70 2.00 2.40 0.00 2.00 1.90 0.40 1.10 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.40 1.60 0.80 2.00 1.50 1.60 2.00 0.60 1.40 2.00 2.10 -0.30 2.00 1.60 0.10 0.80 + 1.10 0.80 -0.90 2.00 0.80 1.80 2.00 0.90 -0.30 2.00 0.70 -0.30 2.00 1.90 0.10 1.90 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.50 1.20 -0.50 2.00 1.20 1.80 2.00 0.80 0.10 2.00 1.10 -0.70 2.00 1.90 -0.30 1.50 + 1.60 0.30 0.40 2.00 0.30 1.30 2.00 0.40 1.00 2.00 1.20 -2.60 2.00 1.40 -2.20 1.40 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.70 1.90 1.10 2.00 1.80 1.90 2.00 0.90 1.70 2.00 2.40 0.00 2.00 1.90 0.40 1.10 + 0.30 -0.90 -0.90 2.00 -1.00 0.10 2.00 -0.90 -0.30 2.00 0.00 -3.90 2.00 0.10 -3.50 0.10 + 2.30 1.00 1.10 2.00 1.00 1.00 2.00 0.00 1.70 2.00 1.90 -0.10 2.00 1.10 0.30 0.30 + 2.00 1.90 1.00 2.00 2.40 2.80 2.00 2.70 1.00 2.00 1.80 0.30 2.00 2.70 1.80 2.20 + 2.00 1.90 1.00 2.00 2.40 2.20 2.00 2.10 1.00 2.00 1.80 -0.70 2.00 2.10 0.80 1.20 + 1.00 0.90 0.00 2.00 1.30 2.20 2.00 2.00 0.00 2.00 0.70 0.10 2.00 2.00 1.60 1.90 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.60 1.50 0.60 2.00 1.90 1.80 2.00 1.60 0.60 2.00 1.30 -1.10 2.00 1.60 0.40 0.70 + 2.60 1.90 2.00 2.00 2.40 2.20 2.00 2.10 2.00 2.00 2.40 0.30 2.00 2.10 1.80 1.20 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.30 1.60 1.70 2.00 2.10 1.90 2.00 1.80 1.70 2.00 2.10 0.00 2.00 1.80 1.50 0.90 + 1.00 0.90 0.00 2.00 1.30 2.20 2.00 2.00 0.00 2.00 0.70 0.10 2.00 2.00 1.60 1.90 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.40 1.30 0.40 2.00 1.70 2.20 2.00 2.00 0.40 2.00 1.10 -0.30 2.00 2.00 1.20 1.50 + 1.50 0.40 1.30 2.00 0.80 1.70 2.00 1.50 1.30 2.00 1.20 -2.20 2.00 1.50 -0.70 1.50 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.60 1.90 2.00 2.00 2.40 2.20 2.00 2.10 2.00 2.00 2.40 0.30 2.00 2.10 1.80 1.20 + 0.20 -0.90 0.00 2.00 -0.40 0.40 2.00 0.30 0.00 2.00 0.00 -3.50 2.00 0.30 -2.00 0.20 + 2.20 1.10 2.00 2.00 1.50 1.40 2.00 1.20 2.00 2.00 1.90 0.30 2.00 1.20 1.80 0.30 + 2.80 2.50 1.50 2.00 2.60 3.10 2.00 3.10 1.50 2.00 2.10 1.30 2.00 3.10 2.30 2.70 + 2.80 2.50 1.50 2.00 2.60 2.50 2.00 2.50 1.50 2.00 2.10 0.30 2.00 2.50 1.30 1.70 + 1.70 1.50 0.50 2.00 1.60 2.40 2.00 2.40 0.50 2.00 1.00 1.10 2.00 2.40 2.10 2.40 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.30 2.10 1.10 2.00 2.20 2.00 2.00 2.00 1.10 2.00 1.60 -0.10 2.00 2.00 0.90 1.20 + 3.40 2.50 2.50 2.00 2.60 2.50 2.00 2.50 2.50 2.00 2.70 1.30 2.00 2.50 2.30 1.70 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.10 2.20 2.20 2.00 2.30 2.20 2.00 2.20 2.20 2.00 2.40 1.00 2.00 2.20 2.00 1.40 + 1.70 1.50 0.50 2.00 1.60 2.40 2.00 2.40 0.50 2.00 1.00 1.10 2.00 2.40 2.10 2.40 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.10 1.90 0.90 2.00 2.00 2.40 2.00 2.40 0.90 2.00 1.40 0.70 2.00 2.40 1.70 2.00 + 2.20 1.00 1.80 2.00 1.10 1.90 2.00 1.90 1.80 2.00 1.50 -1.20 2.00 1.90 -0.20 1.90 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.40 2.50 2.50 2.00 2.60 2.50 2.00 2.50 2.50 2.00 2.70 1.30 2.00 2.50 2.30 1.70 + 1.00 -0.30 0.50 2.00 -0.20 0.70 2.00 0.70 0.50 2.00 0.30 -2.50 2.00 0.70 -1.50 0.70 + 2.90 1.70 2.50 2.00 1.80 1.60 2.00 1.60 2.50 2.00 2.20 1.30 2.00 1.60 2.30 0.80 + 2.80 2.30 1.70 2.00 2.80 3.40 2.00 3.40 1.70 2.00 2.10 1.00 2.00 3.10 2.20 2.90 + 2.80 2.30 1.70 2.00 2.80 2.80 2.00 2.80 1.70 2.00 2.10 0.00 2.00 2.50 1.20 1.90 + 1.70 1.30 0.70 2.00 1.70 2.70 2.00 2.70 0.70 2.00 1.10 0.70 2.00 2.40 2.00 2.70 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.30 1.90 1.30 2.00 2.30 2.30 2.00 2.30 1.30 2.00 1.70 -0.50 2.00 2.00 0.80 1.50 + 3.40 2.30 2.70 2.00 2.80 2.80 2.00 2.80 2.70 2.00 2.70 1.00 2.00 2.50 2.20 1.90 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.10 2.00 2.40 2.00 2.50 2.50 2.00 2.50 2.40 2.00 2.40 0.70 2.00 2.20 1.90 1.60 + 1.70 1.30 0.70 2.00 1.70 2.70 2.00 2.70 0.70 2.00 1.10 0.70 2.00 2.40 2.00 2.70 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.10 1.70 1.10 2.00 2.10 2.70 2.00 2.70 1.10 2.00 1.50 0.30 2.00 2.40 1.60 2.30 + 2.20 0.80 2.00 2.00 1.20 2.20 2.00 2.20 2.00 2.00 1.60 -1.60 2.00 1.90 -0.30 2.20 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.40 2.30 2.70 2.00 2.80 2.80 2.00 2.80 2.70 2.00 2.70 1.00 2.00 2.50 2.20 1.90 + 1.00 -0.50 0.70 2.00 0.00 1.00 2.00 1.00 0.70 2.00 0.30 -2.90 2.00 0.70 -1.60 0.90 + 2.90 1.50 2.70 2.00 1.90 1.90 2.00 1.90 2.70 2.00 2.30 0.90 2.00 1.60 2.20 1.10 + 2.80 2.50 1.50 2.00 2.60 3.10 2.00 3.10 1.50 2.00 2.10 1.30 2.00 3.10 2.30 2.70 + 2.80 2.50 1.50 2.00 2.60 2.50 2.00 2.50 1.50 2.00 2.10 0.30 2.00 2.50 1.30 1.70 + 1.70 1.50 0.50 2.00 1.60 2.40 2.00 2.40 0.50 2.00 1.00 1.10 2.00 2.40 2.10 2.40 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.30 2.10 1.10 2.00 2.20 2.00 2.00 2.00 1.10 2.00 1.60 -0.10 2.00 2.00 0.90 1.20 + 3.40 2.50 2.50 2.00 2.60 2.50 2.00 2.50 2.50 2.00 2.70 1.30 2.00 2.50 2.30 1.70 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.10 2.20 2.20 2.00 2.30 2.20 2.00 2.20 2.20 2.00 2.40 1.00 2.00 2.20 2.00 1.40 + 1.70 1.50 0.50 2.00 1.60 2.40 2.00 2.40 0.50 2.00 1.00 1.10 2.00 2.40 2.10 2.40 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.10 1.90 0.90 2.00 2.00 2.40 2.00 2.40 0.90 2.00 1.40 0.70 2.00 2.40 1.70 2.00 + 2.20 1.00 1.80 2.00 1.10 1.90 2.00 1.90 1.80 2.00 1.50 -1.20 2.00 1.90 -0.20 1.90 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.40 2.50 2.50 2.00 2.60 2.50 2.00 2.50 2.50 2.00 2.70 1.30 2.00 2.50 2.30 1.70 + 1.00 -0.30 0.50 2.00 -0.20 0.70 2.00 0.70 0.50 2.00 0.30 -2.50 2.00 0.70 -1.50 0.70 + 2.90 1.70 2.50 2.00 1.80 1.60 2.00 1.60 2.50 2.00 2.20 1.30 2.00 1.60 2.30 0.80 + 2.80 2.30 1.70 2.00 2.80 3.40 2.00 3.40 1.70 2.00 2.10 1.00 2.00 3.10 2.20 2.90 + 2.60 2.20 1.60 2.00 2.60 2.60 2.00 2.60 1.60 2.00 2.00 -0.20 2.00 2.30 1.10 1.80 + 1.50 1.10 0.50 2.00 1.50 2.50 2.00 2.50 0.50 2.00 0.90 0.50 2.00 2.20 1.80 2.50 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.50 2.10 1.50 2.00 2.50 2.50 2.00 2.50 1.50 2.00 1.90 -0.30 2.00 2.20 1.00 1.70 + 3.10 2.00 2.40 2.00 2.50 2.50 2.00 2.50 2.40 2.00 2.40 0.70 2.00 2.20 1.90 1.60 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.10 2.00 2.40 2.00 2.50 2.50 2.00 2.50 2.40 2.00 2.40 0.70 2.00 2.20 1.90 1.60 + 1.50 1.10 0.50 2.00 1.50 2.50 2.00 2.50 0.50 2.00 0.90 0.50 2.00 2.20 1.80 2.50 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.10 1.60 1.00 2.00 2.10 2.70 2.00 2.70 1.00 2.00 1.40 0.30 2.00 2.40 1.50 2.20 + 2.30 0.90 2.10 2.00 1.30 2.30 2.00 2.30 2.10 2.00 1.70 -1.50 2.00 2.00 -0.20 2.30 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.10 2.00 2.40 2.00 2.50 2.50 2.00 2.50 2.40 2.00 2.40 0.70 2.00 2.20 1.90 1.60 + 1.30 -0.10 1.10 2.00 0.30 1.30 2.00 1.30 1.10 2.00 0.70 -2.50 2.00 1.00 -1.20 1.30 + 2.70 1.20 2.40 2.00 1.70 1.70 2.00 1.70 2.40 2.00 2.00 0.70 2.00 1.40 1.90 0.80 + 2.10 1.90 0.10 2.00 1.80 2.50 2.00 1.50 0.70 2.00 1.80 0.00 2.00 2.50 0.40 2.10 + 2.00 1.70 0.00 2.00 1.70 1.70 2.00 0.70 0.60 2.00 1.60 -1.20 2.00 1.80 -0.80 1.00 + 0.90 0.60 -1.10 2.00 0.60 1.60 2.00 0.70 -0.50 2.00 0.50 -0.50 2.00 1.70 -0.10 1.70 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.90 1.60 -0.10 2.00 1.60 1.60 2.00 0.60 0.50 2.00 1.50 -1.30 2.00 1.70 -0.90 0.90 + 2.40 1.60 0.80 2.00 1.50 1.60 2.00 0.60 1.40 2.00 2.10 -0.30 2.00 1.60 0.10 0.80 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.40 1.60 0.80 2.00 1.50 1.60 2.00 0.60 1.40 2.00 2.10 -0.30 2.00 1.60 0.10 0.80 + 0.90 0.60 -1.10 2.00 0.60 1.60 2.00 0.70 -0.50 2.00 0.50 -0.50 2.00 1.70 -0.10 1.70 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.40 1.20 -0.60 2.00 1.10 1.80 2.00 0.80 0.00 2.00 1.10 -0.70 2.00 1.80 -0.30 1.40 + 1.70 0.40 0.50 2.00 0.40 1.40 2.00 0.50 1.10 2.00 1.30 -2.50 2.00 1.50 -2.10 1.50 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.40 1.60 0.80 2.00 1.50 1.60 2.00 0.60 1.40 2.00 2.10 -0.30 2.00 1.60 0.10 0.80 + 0.70 -0.50 -0.50 2.00 -0.60 0.50 2.00 -0.50 0.10 2.00 0.40 -3.50 2.00 0.50 -3.10 0.50 + 2.00 0.80 0.80 2.00 0.70 0.80 2.00 -0.20 1.50 2.00 1.70 -0.30 2.00 0.80 0.10 0.00 + 2.00 1.90 1.00 2.00 2.40 2.80 2.00 2.70 1.00 2.00 1.80 0.30 2.00 2.70 1.80 2.20 + 1.90 1.80 0.90 2.00 2.20 2.10 2.00 1.90 0.90 2.00 1.60 -0.80 2.00 1.90 0.70 1.00 + 0.80 0.70 -0.20 2.00 1.10 2.00 2.00 1.80 -0.20 2.00 0.50 -0.10 2.00 1.80 1.40 1.80 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.80 1.70 0.80 2.00 2.10 2.00 2.00 1.80 0.80 2.00 1.50 -0.90 2.00 1.80 0.60 0.90 + 2.30 1.60 1.70 2.00 2.10 1.90 2.00 1.80 1.70 2.00 2.10 0.00 2.00 1.80 1.50 0.90 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.30 1.60 1.70 2.00 2.10 1.90 2.00 1.80 1.70 2.00 2.10 0.00 2.00 1.80 1.50 0.90 + 0.80 0.70 -0.20 2.00 1.10 2.00 2.00 1.80 -0.20 2.00 0.50 -0.10 2.00 1.80 1.40 1.80 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.30 1.20 0.30 2.00 1.70 2.10 2.00 2.00 0.30 2.00 1.10 -0.40 2.00 2.00 1.10 1.50 + 1.60 0.50 1.40 2.00 0.90 1.80 2.00 1.60 1.40 2.00 1.30 -2.10 2.00 1.60 -0.60 1.60 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.30 1.60 1.70 2.00 2.10 1.90 2.00 1.80 1.70 2.00 2.10 0.00 2.00 1.80 1.50 0.90 + 0.60 -0.50 0.40 2.00 0.00 0.80 2.00 0.70 0.40 2.00 0.40 -3.10 2.00 0.70 -1.60 0.60 + 1.90 0.80 1.80 2.00 1.30 1.10 2.00 1.00 1.80 2.00 1.70 0.00 2.00 1.00 1.60 0.10 + 2.80 2.50 1.50 2.00 2.60 3.10 2.00 3.10 1.50 2.00 2.10 1.30 2.00 3.10 2.30 2.70 + 2.60 2.40 1.40 2.00 2.50 2.30 2.00 2.30 1.40 2.00 1.90 0.20 2.00 2.30 1.20 1.50 + 1.50 1.30 0.30 2.00 1.40 2.20 2.00 2.20 0.30 2.00 0.80 0.90 2.00 2.20 1.90 2.20 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.50 2.30 1.30 2.00 2.40 2.20 2.00 2.20 1.30 2.00 1.80 0.10 2.00 2.20 1.10 1.40 + 3.10 2.20 2.20 2.00 2.30 2.20 2.00 2.20 2.20 2.00 2.40 1.00 2.00 2.20 2.00 1.40 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.10 2.20 2.20 2.00 2.30 2.20 2.00 2.20 2.20 2.00 2.40 1.00 2.00 2.20 2.00 1.40 + 1.50 1.30 0.30 2.00 1.40 2.20 2.00 2.20 0.30 2.00 0.80 0.90 2.00 2.20 1.90 2.20 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.10 1.80 0.80 2.00 1.90 2.40 2.00 2.40 0.80 2.00 1.40 0.70 2.00 2.40 1.60 2.00 + 2.30 1.10 1.90 2.00 1.20 2.00 2.00 2.00 1.90 2.00 1.60 -1.10 2.00 2.00 -0.10 2.00 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.10 2.20 2.20 2.00 2.30 2.20 2.00 2.20 2.20 2.00 2.40 1.00 2.00 2.20 2.00 1.40 + 1.30 0.10 0.90 2.00 0.20 1.00 2.00 1.00 0.90 2.00 0.70 -2.10 2.00 1.00 -1.10 1.10 + 2.70 1.40 2.20 2.00 1.50 1.40 2.00 1.40 2.20 2.00 2.00 1.10 2.00 1.40 2.00 0.60 + 2.80 2.30 1.70 2.00 2.80 3.40 2.00 3.40 1.70 2.00 2.10 1.00 2.00 3.10 2.20 2.90 + 2.60 2.20 1.60 2.00 2.60 2.60 2.00 2.60 1.60 2.00 2.00 -0.20 2.00 2.30 1.10 1.80 + 1.50 1.10 0.50 2.00 1.50 2.50 2.00 2.50 0.50 2.00 0.90 0.50 2.00 2.20 1.80 2.50 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.50 2.10 1.50 2.00 2.50 2.50 2.00 2.50 1.50 2.00 1.90 -0.30 2.00 2.20 1.00 1.70 + 3.10 2.00 2.40 2.00 2.50 2.50 2.00 2.50 2.40 2.00 2.40 0.70 2.00 2.20 1.90 1.60 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.10 2.00 2.40 2.00 2.50 2.50 2.00 2.50 2.40 2.00 2.40 0.70 2.00 2.20 1.90 1.60 + 1.50 1.10 0.50 2.00 1.50 2.50 2.00 2.50 0.50 2.00 0.90 0.50 2.00 2.20 1.80 2.50 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.10 1.60 1.00 2.00 2.10 2.70 2.00 2.70 1.00 2.00 1.40 0.30 2.00 2.40 1.50 2.20 + 2.30 0.90 2.10 2.00 1.30 2.30 2.00 2.30 2.10 2.00 1.70 -1.50 2.00 2.00 -0.20 2.30 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.10 2.00 2.40 2.00 2.50 2.50 2.00 2.50 2.40 2.00 2.40 0.70 2.00 2.20 1.90 1.60 + 1.30 -0.10 1.10 2.00 0.30 1.30 2.00 1.30 1.10 2.00 0.70 -2.50 2.00 1.00 -1.20 1.30 + 2.70 1.20 2.40 2.00 1.70 1.70 2.00 1.70 2.40 2.00 2.00 0.70 2.00 1.40 1.90 0.80 + 2.80 2.50 1.50 2.00 2.60 3.10 2.00 3.10 1.50 2.00 2.10 1.30 2.00 3.10 2.30 2.70 + 2.60 2.40 1.40 2.00 2.50 2.30 2.00 2.30 1.40 2.00 1.90 0.20 2.00 2.30 1.20 1.50 + 1.50 1.30 0.30 2.00 1.40 2.20 2.00 2.20 0.30 2.00 0.80 0.90 2.00 2.20 1.90 2.20 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.50 2.30 1.30 2.00 2.40 2.20 2.00 2.20 1.30 2.00 1.80 0.10 2.00 2.20 1.10 1.40 + 3.10 2.20 2.20 2.00 2.30 2.20 2.00 2.20 2.20 2.00 2.40 1.00 2.00 2.20 2.00 1.40 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.10 2.20 2.20 2.00 2.30 2.20 2.00 2.20 2.20 2.00 2.40 1.00 2.00 2.20 2.00 1.40 + 1.50 1.30 0.30 2.00 1.40 2.20 2.00 2.20 0.30 2.00 0.80 0.90 2.00 2.20 1.90 2.20 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.10 1.80 0.80 2.00 1.90 2.40 2.00 2.40 0.80 2.00 1.40 0.70 2.00 2.40 1.60 2.00 + 2.30 1.10 1.90 2.00 1.20 2.00 2.00 2.00 1.90 2.00 1.60 -1.10 2.00 2.00 -0.10 2.00 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.10 2.20 2.20 2.00 2.30 2.20 2.00 2.20 2.20 2.00 2.40 1.00 2.00 2.20 2.00 1.40 + 1.30 0.10 0.90 2.00 0.20 1.00 2.00 1.00 0.90 2.00 0.70 -2.10 2.00 1.00 -1.10 1.10 + 2.70 1.40 2.20 2.00 1.50 1.40 2.00 1.40 2.20 2.00 2.00 1.10 2.00 1.40 2.00 0.60 + 2.80 2.30 1.70 2.00 2.80 3.40 2.00 3.40 1.70 2.00 2.10 1.00 2.00 3.10 2.20 2.90 + 2.80 2.30 1.70 2.00 2.80 2.80 2.00 2.80 1.70 2.00 2.10 0.00 2.00 2.50 1.20 1.90 + 1.70 1.30 0.70 2.00 1.70 2.70 2.00 2.70 0.70 2.00 1.10 0.70 2.00 2.40 2.00 2.70 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.30 1.90 1.30 2.00 2.30 2.30 2.00 2.30 1.30 2.00 1.70 -0.50 2.00 2.00 0.80 1.50 + 3.40 2.30 2.70 2.00 2.80 2.80 2.00 2.80 2.70 2.00 2.70 1.00 2.00 2.50 2.20 1.90 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.10 2.00 2.40 2.00 2.50 2.50 2.00 2.50 2.40 2.00 2.40 0.70 2.00 2.20 1.90 1.60 + 1.70 1.30 0.70 2.00 1.70 2.70 2.00 2.70 0.70 2.00 1.10 0.70 2.00 2.40 2.00 2.70 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.10 1.70 1.10 2.00 2.10 2.70 2.00 2.70 1.10 2.00 1.50 0.30 2.00 2.40 1.60 2.30 + 2.20 0.80 2.00 2.00 1.20 2.20 2.00 2.20 2.00 2.00 1.60 -1.60 2.00 1.90 -0.30 2.20 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.40 2.30 2.70 2.00 2.80 2.80 2.00 2.80 2.70 2.00 2.70 1.00 2.00 2.50 2.20 1.90 + 1.00 -0.50 0.70 2.00 0.00 1.00 2.00 1.00 0.70 2.00 0.30 -2.90 2.00 0.70 -1.60 0.90 + 2.90 1.50 2.70 2.00 1.90 1.90 2.00 1.90 2.70 2.00 2.30 0.90 2.00 1.60 2.20 1.10 + 2.10 1.90 0.10 2.00 1.80 2.50 2.00 1.50 0.70 2.00 1.80 0.00 2.00 2.50 0.40 2.10 + 2.10 1.90 0.10 2.00 1.80 1.90 2.00 0.90 0.70 2.00 1.80 -1.00 2.00 1.90 -0.60 1.10 + 1.10 0.80 -0.90 2.00 0.80 1.80 2.00 0.90 -0.30 2.00 0.70 -0.30 2.00 1.90 0.10 1.90 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.70 1.40 -0.30 2.00 1.40 1.40 2.00 0.40 0.30 2.00 1.30 -1.50 2.00 1.50 -1.10 0.70 + 2.70 1.90 1.10 2.00 1.80 1.90 2.00 0.90 1.70 2.00 2.40 0.00 2.00 1.90 0.40 1.10 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.40 1.60 0.80 2.00 1.50 1.60 2.00 0.60 1.40 2.00 2.10 -0.30 2.00 1.60 0.10 0.80 + 1.10 0.80 -0.90 2.00 0.80 1.80 2.00 0.90 -0.30 2.00 0.70 -0.30 2.00 1.90 0.10 1.90 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.50 1.20 -0.50 2.00 1.20 1.80 2.00 0.80 0.10 2.00 1.10 -0.70 2.00 1.90 -0.30 1.50 + 1.60 0.30 0.40 2.00 0.30 1.30 2.00 0.40 1.00 2.00 1.20 -2.60 2.00 1.40 -2.20 1.40 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.70 1.90 1.10 2.00 1.80 1.90 2.00 0.90 1.70 2.00 2.40 0.00 2.00 1.90 0.40 1.10 + 0.30 -0.90 -0.90 2.00 -1.00 0.10 2.00 -0.90 -0.30 2.00 0.00 -3.90 2.00 0.10 -3.50 0.10 + 2.30 1.00 1.10 2.00 1.00 1.00 2.00 0.00 1.70 2.00 1.90 -0.10 2.00 1.10 0.30 0.30 + 2.00 1.90 1.00 2.00 2.40 2.80 2.00 2.70 1.00 2.00 1.80 0.30 2.00 2.70 1.80 2.20 + 2.00 1.90 1.00 2.00 2.40 2.20 2.00 2.10 1.00 2.00 1.80 -0.70 2.00 2.10 0.80 1.20 + 1.00 0.90 0.00 2.00 1.30 2.20 2.00 2.00 0.00 2.00 0.70 0.10 2.00 2.00 1.60 1.90 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.60 1.50 0.60 2.00 1.90 1.80 2.00 1.60 0.60 2.00 1.30 -1.10 2.00 1.60 0.40 0.70 + 2.60 1.90 2.00 2.00 2.40 2.20 2.00 2.10 2.00 2.00 2.40 0.30 2.00 2.10 1.80 1.20 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.30 1.60 1.70 2.00 2.10 1.90 2.00 1.80 1.70 2.00 2.10 0.00 2.00 1.80 1.50 0.90 + 1.00 0.90 0.00 2.00 1.30 2.20 2.00 2.00 0.00 2.00 0.70 0.10 2.00 2.00 1.60 1.90 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 1.40 1.30 0.40 2.00 1.70 2.20 2.00 2.00 0.40 2.00 1.10 -0.30 2.00 2.00 1.20 1.50 + 1.50 0.40 1.30 2.00 0.80 1.70 2.00 1.50 1.30 2.00 1.20 -2.20 2.00 1.50 -0.70 1.50 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.60 1.90 2.00 2.00 2.40 2.20 2.00 2.10 2.00 2.00 2.40 0.30 2.00 2.10 1.80 1.20 + 0.20 -0.90 0.00 2.00 -0.40 0.40 2.00 0.30 0.00 2.00 0.00 -3.50 2.00 0.30 -2.00 0.20 + 2.20 1.10 2.00 2.00 1.50 1.40 2.00 1.20 2.00 2.00 1.90 0.30 2.00 1.20 1.80 0.30 + 2.80 2.50 1.50 2.00 2.60 3.10 2.00 3.10 1.50 2.00 2.10 1.30 2.00 3.10 2.30 2.70 + 2.80 2.50 1.50 2.00 2.60 2.50 2.00 2.50 1.50 2.00 2.10 0.30 2.00 2.50 1.30 1.70 + 1.70 1.50 0.50 2.00 1.60 2.40 2.00 2.40 0.50 2.00 1.00 1.10 2.00 2.40 2.10 2.40 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.30 2.10 1.10 2.00 2.20 2.00 2.00 2.00 1.10 2.00 1.60 -0.10 2.00 2.00 0.90 1.20 + 3.40 2.50 2.50 2.00 2.60 2.50 2.00 2.50 2.50 2.00 2.70 1.30 2.00 2.50 2.30 1.70 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.10 2.20 2.20 2.00 2.30 2.20 2.00 2.20 2.20 2.00 2.40 1.00 2.00 2.20 2.00 1.40 + 1.70 1.50 0.50 2.00 1.60 2.40 2.00 2.40 0.50 2.00 1.00 1.10 2.00 2.40 2.10 2.40 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.10 1.90 0.90 2.00 2.00 2.40 2.00 2.40 0.90 2.00 1.40 0.70 2.00 2.40 1.70 2.00 + 2.20 1.00 1.80 2.00 1.10 1.90 2.00 1.90 1.80 2.00 1.50 -1.20 2.00 1.90 -0.20 1.90 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.40 2.50 2.50 2.00 2.60 2.50 2.00 2.50 2.50 2.00 2.70 1.30 2.00 2.50 2.30 1.70 + 1.00 -0.30 0.50 2.00 -0.20 0.70 2.00 0.70 0.50 2.00 0.30 -2.50 2.00 0.70 -1.50 0.70 + 2.90 1.70 2.50 2.00 1.80 1.60 2.00 1.60 2.50 2.00 2.20 1.30 2.00 1.60 2.30 0.80 + 2.80 2.30 1.70 2.00 2.80 3.40 2.00 3.40 1.70 2.00 2.10 1.00 2.00 3.10 2.20 2.90 + 2.80 2.30 1.70 2.00 2.80 2.80 2.00 2.80 1.70 2.00 2.10 0.00 2.00 2.50 1.20 1.90 + 1.70 1.30 0.70 2.00 1.70 2.70 2.00 2.70 0.70 2.00 1.10 0.70 2.00 2.40 2.00 2.70 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.30 1.90 1.30 2.00 2.30 2.30 2.00 2.30 1.30 2.00 1.70 -0.50 2.00 2.00 0.80 1.50 + 3.40 2.30 2.70 2.00 2.80 2.80 2.00 2.80 2.70 2.00 2.70 1.00 2.00 2.50 2.20 1.90 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.10 2.00 2.40 2.00 2.50 2.50 2.00 2.50 2.40 2.00 2.40 0.70 2.00 2.20 1.90 1.60 + 1.70 1.30 0.70 2.00 1.70 2.70 2.00 2.70 0.70 2.00 1.10 0.70 2.00 2.40 2.00 2.70 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.10 1.70 1.10 2.00 2.10 2.70 2.00 2.70 1.10 2.00 1.50 0.30 2.00 2.40 1.60 2.30 + 2.20 0.80 2.00 2.00 1.20 2.20 2.00 2.20 2.00 2.00 1.60 -1.60 2.00 1.90 -0.30 2.20 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.40 2.30 2.70 2.00 2.80 2.80 2.00 2.80 2.70 2.00 2.70 1.00 2.00 2.50 2.20 1.90 + 1.00 -0.50 0.70 2.00 0.00 1.00 2.00 1.00 0.70 2.00 0.30 -2.90 2.00 0.70 -1.60 0.90 + 2.90 1.50 2.70 2.00 1.90 1.90 2.00 1.90 2.70 2.00 2.30 0.90 2.00 1.60 2.20 1.10 + 2.80 2.50 1.50 2.00 2.60 3.10 2.00 3.10 1.50 2.00 2.10 1.30 2.00 3.10 2.30 2.70 + 2.80 2.50 1.50 2.00 2.60 2.50 2.00 2.50 1.50 2.00 2.10 0.30 2.00 2.50 1.30 1.70 + 1.70 1.50 0.50 2.00 1.60 2.40 2.00 2.40 0.50 2.00 1.00 1.10 2.00 2.40 2.10 2.40 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.30 2.10 1.10 2.00 2.20 2.00 2.00 2.00 1.10 2.00 1.60 -0.10 2.00 2.00 0.90 1.20 + 3.40 2.50 2.50 2.00 2.60 2.50 2.00 2.50 2.50 2.00 2.70 1.30 2.00 2.50 2.30 1.70 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.10 2.20 2.20 2.00 2.30 2.20 2.00 2.20 2.20 2.00 2.40 1.00 2.00 2.20 2.00 1.40 + 1.70 1.50 0.50 2.00 1.60 2.40 2.00 2.40 0.50 2.00 1.00 1.10 2.00 2.40 2.10 2.40 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 2.10 1.90 0.90 2.00 2.00 2.40 2.00 2.40 0.90 2.00 1.40 0.70 2.00 2.40 1.70 2.00 + 2.20 1.00 1.80 2.00 1.10 1.90 2.00 1.90 1.80 2.00 1.50 -1.20 2.00 1.90 -0.20 1.90 + 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 2.00 + 3.40 2.50 2.50 2.00 2.60 2.50 2.00 2.50 2.50 2.00 2.70 1.30 2.00 2.50 2.30 1.70 + 1.00 -0.30 0.50 2.00 -0.20 0.70 2.00 0.70 0.50 2.00 0.30 -2.50 2.00 0.70 -1.50 0.70 + 2.90 1.70 2.50 2.00 1.80 1.60 2.00 1.60 2.50 2.00 2.20 1.30 2.00 1.60 2.30 0.80 diff --git a/lib/dat/stack.dat b/lib/dat/stack.dat new file mode 100644 index 0000000..34bfeb2 --- /dev/null +++ b/lib/dat/stack.dat @@ -0,0 +1,69 @@ +Data Arangement: + + Y + ------------------ + (X) A C G U + ------------------ + 5' ==> 3' + AX + AY + 3' <== 5' + (A) . . . . + (C) . . . . + (G) . . . . + (U) -0.70 -0.10 -0.70 -0.10 + +-------------------------------- +STACKING ENERGIES : + + Y Y Y Y + ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + AX AX AX AX + AY CY GY UY + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + . . . . . . . . . . . . . . . -0.90 + . . . . . . . . . . . . . . -2.20 . + . . . . . . . . . . . . . -2.10 . -0.60 + . . . . . . . . . . . . -1.10 . -1.40 . + + Y Y Y Y + ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + CX CX CX CX + AY CY GY UY + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + . . . . . . . . . . . -2.10 . . . . + . . . . . . . . . . -3.30 . . . . . + . . . . . . . . . -2.40 . -1.40 . . . . + . . . . . . . . -2.10 . -2.10 . . . . . + + Y Y Y Y + ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + GX GX GX GX + AY CY GY UY + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + . . . . . . . -2.40 . . . . . . . -1.30 + . . . . . . -3.40 . . . . . . . -2.50 . + . . . . . -3.30 . -1.50 . . . . . -2.10 . -0.50 + . . . . -2.20 . -2.50 . . . . . -1.40 . 1.30 . + + Y Y Y Y + ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + UX UX UX UX + AY CY GY UY + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + . . . -1.30 . . . . . . . -1.00 . . . . + . . -2.40 . . . . . . . -1.50 . . . . . + . -2.10 . -1.00 . . . . . -1.40 . 0.30 . . . . + -0.90 . -1.30 . . . . . -0.60 . -0.50 . . . . . diff --git a/lib/dat/stack.lop.dat b/lib/dat/stack.lop.dat new file mode 100644 index 0000000..a02f4b1 --- /dev/null +++ b/lib/dat/stack.lop.dat @@ -0,0 +1,16 @@ + . . . . . . . . . . . . . . . -0.90 + . . . . . . . . . . . . . . -2.20 . + . . . . . . . . . . . . . -2.10 . -0.60 + . . . . . . . . . . . . -1.10 . -1.40 . + . . . . . . . . . . . -2.10 . . . . + . . . . . . . . . . -3.30 . . . . . + . . . . . . . . . -2.40 . -1.40 . . . . + . . . . . . . . -2.10 . -2.10 . . . . . + . . . . . . . -2.40 . . . . . . . -1.30 + . . . . . . -3.40 . . . . . . . -2.50 . + . . . . . -3.30 . -1.50 . . . . . -2.10 . -0.50 + . . . . -2.20 . -2.50 . . . . . -1.40 . 1.30 . + . . . -1.30 . . . . . . . -1.00 . . . . + . . -2.40 . . . . . . . -1.50 . . . . . + . -2.10 . -1.00 . . . . . -1.40 . 0.30 . . . . + -0.90 . -1.30 . . . . . -0.60 . -0.50 . . . . . diff --git a/lib/dat/temp.lop.dat b/lib/dat/temp.lop.dat new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/lib/dat/temp.lop.dat @@ -0,0 +1 @@ + diff --git a/lib/dat/tloop.dat b/lib/dat/tloop.dat new file mode 100644 index 0000000..ad64bf4 --- /dev/null +++ b/lib/dat/tloop.dat @@ -0,0 +1,32 @@ + Seq Energy + ------------- + GGGGAC -3.00 + GGUGAC -3.00 + CGAAAG -3.00 + GGAGAC -3.00 + CGCAAG -3.00 + GGAAAC -3.00 + CGGAAG -3.00 + CUUCGG -3.00 + CGUGAG -3.00 + CGAAGG -2.50 + CUACGG -2.50 + GGCAAC -2.50 + CGCGAG -2.50 + UGAGAG -2.50 + CGAGAG -2.00 + AGAAAU -2.00 + CGUAAG -2.00 + CUAACG -2.00 + UGAAAG -2.00 + GGAAGC -1.50 + GGGAAC -1.50 + UGAAAA -1.50 + AGCAAU -1.50 + AGUAAU -1.50 + CGGGAG -1.50 + AGUGAU -1.50 + GGCGAC -1.50 + GGGAGC -1.50 + GUGAAC -1.50 + UGGAAA -1.50 diff --git a/lib/dat/tloop.lop.dat b/lib/dat/tloop.lop.dat new file mode 100644 index 0000000..96cf16d --- /dev/null +++ b/lib/dat/tloop.lop.dat @@ -0,0 +1,30 @@ + GGGGAC -3.00 + GGUGAC -3.00 + CGAAAG -3.00 + GGAGAC -3.00 + CGCAAG -3.00 + GGAAAC -3.00 + CGGAAG -3.00 + CUUCGG -3.00 + CGUGAG -3.00 + CGAAGG -2.50 + CUACGG -2.50 + GGCAAC -2.50 + CGCGAG -2.50 + UGAGAG -2.50 + CGAGAG -2.00 + AGAAAU -2.00 + CGUAAG -2.00 + CUAACG -2.00 + UGAAAG -2.00 + GGAAGC -1.50 + GGGAAC -1.50 + UGAAAA -1.50 + AGCAAU -1.50 + AGUAAU -1.50 + CGGGAG -1.50 + AGUGAU -1.50 + GGCGAC -1.50 + GGGAGC -1.50 + GUGAAC -1.50 + UGGAAA -1.50 diff --git a/lib/dat/triloop.dat b/lib/dat/triloop.dat new file mode 100644 index 0000000..75c3bfc --- /dev/null +++ b/lib/dat/triloop.dat @@ -0,0 +1,2 @@ + Seq Energy + ------------- diff --git a/lib/dat/triloop.lop.dat b/lib/dat/triloop.lop.dat new file mode 100644 index 0000000..e69de29 diff --git a/lib/dat/tstack.dat b/lib/dat/tstack.dat new file mode 100644 index 0000000..646c101 --- /dev/null +++ b/lib/dat/tstack.dat @@ -0,0 +1,69 @@ +Data Arangement: + + Y + ------------------ + (X) A C G U + ------------------ + 5' ==> 3' + AX + AY + 3' <== 5' + (A) . . . . + (C) . . . . + (G) . . . . + (U) -0.70 -0.10 -0.70 -0.10 + +-------------------------------- +STACKING ENERGIES : TERMINAL MISMATCHES AND BASE-PAIRS + + Y Y Y Y + ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + AX AX AX AX + AY CY GY UY + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + . . . -1.00 . . . -1.00 . . . -2.20 -0.80 -1.00 -0.80 . + . . -1.50 . . . -1.50 . . . -2.70 . -0.60 -0.70 . -0.70 + . -1.50 . -1.00 . -1.50 . -1.00 . -2.70 . -2.20 -0.80 . -0.80 . + -1.00 . -1.50 . -1.00 . -1.50 . -2.20 . -2.70 . . -0.80 . -0.80 + + Y Y Y Y + ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + CX CX CX CX + AY CY GY UY + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + . . . -1.00 . . . -1.00 -1.50 -1.50 -1.40 . . . . -1.00 + . . -1.50 . . . -1.50 . -1.00 -1.10 . -0.80 . . -1.50 . + . -1.50 . -1.00 . -1.50 . -1.00 -1.40 . -1.60 . . -1.50 . -1.00 + -1.00 . -1.50 . -1.00 . -1.50 . . -1.40 . -1.20 -1.00 . -1.50 . + + Y Y Y Y + ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + GX GX GX GX + AY CY GY UY + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + . . . -2.20 -1.10 -1.50 -1.30 . . . . -1.00 -0.30 -1.00 -0.80 . + . . -2.70 . -1.10 -0.70 . -0.50 . . -1.50 . -0.60 -0.70 . -0.70 + . -2.70 . -2.20 -1.60 . -1.40 . . -1.50 . -1.00 -0.60 . -0.80 . + -2.20 . -2.70 . . -1.00 . -0.70 -1.00 . -1.50 . . -0.80 . -0.80 + + Y Y Y Y + ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + UX UX UX UX + AY CY GY UY + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + -1.00 -0.80 -1.10 . . . . -1.00 -1.00 -0.80 -1.10 . . . . -2.00 + -0.70 -0.60 . -0.50 . . -1.50 . -0.70 -0.60 . -0.50 . . -2.50 . + -1.10 . -1.20 . . -1.50 . -1.00 -0.50 . -0.80 -0.80 . -2.50 . -2.00 + . -0.60 . -0.50 -1.00 . -1.50 . . -0.60 -1.10 -0.50 -2.00 . -2.50 . diff --git a/lib/dat/tstackcoax.dat b/lib/dat/tstackcoax.dat new file mode 100644 index 0000000..03a8815 --- /dev/null +++ b/lib/dat/tstackcoax.dat @@ -0,0 +1,69 @@ +Data Arangement: + + Y + ------------------ + (X) A C G U + ------------------ + 5' ==> 3' + AX + AY + 3' <== 5' + (A) . . . . + (C) . . . . + (G) . . . . + (U) -0.70 -0.10 -0.70 -0.10 + +-------------------------------- +STACKING ENERGIES : COAXIAL STACKING + + Y Y Y Y + ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + AX AX AX AX + AY CY GY UY + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + . . . -1.00 . . . -0.70 . . . -1.10 -0.80 -1.00 -0.80 -0.40 + . . -1.10 . . . -1.10 . . . -1.60 . -0.60 -0.70 -1.70 -0.70 + . -1.50 . -1.00 . -1.00 . -0.70 . -1.40 . -0.50 -0.80 -1.60 -0.80 -0.10 + -0.80 . -0.30 . -0.60 . -0.60 . -0.80 . -0.60 . -0.60 -0.80 -0.90 -0.80 + + Y Y Y Y + ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + CX CX CX CX + AY CY GY UY + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + . . . -0.80 . . . -0.60 -1.50 -1.50 -1.40 -1.60 . . . -0.60 + . . -1.50 . . . -0.70 . -1.00 -1.10 -2.80 -0.80 . . -1.00 . + . -1.50 . -0.80 . -1.10 . -0.60 -1.40 -1.90 -1.60 -0.90 . -1.40 . -0.60 + -1.00 . -1.00 . -0.70 . -0.70 . -1.60 -1.40 -1.60 -1.20 -0.80 . -0.80 . + + Y Y Y Y + ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + GX GX GX GX + AY CY GY UY + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + . . . -1.10 -1.10 -1.50 -1.30 -1.90 . . . -1.20 -0.30 -1.00 -0.80 -0.80 + . . -1.30 . -1.10 -0.70 -2.90 -0.50 . . -1.40 . -0.60 -0.70 -2.00 -0.70 + . -1.40 . -1.10 -1.60 -2.80 -1.40 -1.00 . -1.60 . -0.80 -0.60 -1.60 -0.80 0.00 + -0.80 . -0.80 . -1.70 -1.00 -2.00 -0.70 -0.80 . -0.80 . -0.90 -0.80 1.80 -0.80 + + Y Y Y Y + ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + UX UX UX UX + AY CY GY UY + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + -1.00 -0.80 -1.10 -0.80 . . . -0.50 -1.00 -0.80 -1.10 -0.50 . . . -0.50 + -0.70 -0.60 -1.90 -0.50 . . -0.50 . -0.70 -0.60 -1.00 -0.50 . . -0.70 . + -1.10 -1.60 -1.20 -0.50 . -0.80 . -0.50 -0.50 -0.90 -0.80 0.80 . -1.20 . -0.50 + -0.40 -0.60 -0.80 -0.50 -0.70 . -0.70 . -0.10 -0.60 -0.00 -0.50 -0.80 . -0.80 . diff --git a/lib/dat/tstackh.dat b/lib/dat/tstackh.dat new file mode 100644 index 0000000..0166064 --- /dev/null +++ b/lib/dat/tstackh.dat @@ -0,0 +1,70 @@ +Data Arangement: + + Y + ------------------ + (X) A C G U + ------------------ + 5' ==> 3' + AX + AY + 3' <== 5' + (A) . . . . + (C) . . . . + (G) . . . . + (U) -0.70 -0.10 -0.70 -0.10 + +-------------------------------- +STACKING ENERGIES : TERMINAL MISMATCHES AND BASE-PAIRS + + Y Y Y Y + ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + AX AX AX AX + AY CY GY UY + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + . . . . . . . . . . . . -0.30 -0.50 -0.30 -0.30 + . . . . . . . . . . . . -0.10 -0.20 -1.50 -0.20 + . . . . . . . . . . . . -1.10 -1.20 -0.20 0.20 + . . . . . . . . . . . . -0.30 -0.30 -0.60 -1.10 + + Y Y Y Y + ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + CX CX CX CX + AY CY GY UY + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + . . . . . . . . -1.50 -1.50 -1.40 -1.80 . . . . + . . . . . . . . -1.00 -0.90 -2.90 -0.80 . . . . + . . . . . . . . -2.20 -2.00 -1.60 -1.10 . . . . + . . . . . . . . -1.70 -1.40 -1.80 -2.00 . . . . + + Y Y Y Y + ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + GX GX GX GX + AY CY GY UY + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + . . . . -1.10 -1.50 -1.30 -2.10 . . . . 0.20 -0.50 -0.30 -0.30 + . . . . -1.10 -0.70 -2.40 -0.50 . . . . -0.10 -0.20 -1.50 -0.20 + . . . . -2.40 -2.90 -1.40 -1.20 . . . . -0.90 -1.10 -0.30 0.00 + . . . . -1.90 -1.00 -2.20 -1.50 . . . . -0.30 -0.30 -0.40 -1.10 + + Y Y Y Y + ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + UX UX UX UX + AY CY GY UY + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + -0.50 -0.30 -0.60 -0.50 . . . . -0.50 -0.30 -0.60 -0.50 . . . . + -0.20 -0.10 -1.20 -0.00 . . . . -0.20 -0.10 -1.70 0.00 . . . . + -1.40 -1.20 -0.70 -0.20 . . . . -0.80 -1.20 -0.30 -0.70 . . . . + -0.30 -0.10 -0.50 -0.80 . . . . -0.60 -0.10 -0.60 -0.80 . . . . + diff --git a/lib/dat/tstackh.lop.dat b/lib/dat/tstackh.lop.dat new file mode 100644 index 0000000..3d9ab3e --- /dev/null +++ b/lib/dat/tstackh.lop.dat @@ -0,0 +1,16 @@ + . . . . . . . . . . . . -0.30 -0.50 -0.30 -0.30 + . . . . . . . . . . . . -0.10 -0.20 -1.50 -0.20 + . . . . . . . . . . . . -1.10 -1.20 -0.20 0.20 + . . . . . . . . . . . . -0.30 -0.30 -0.60 -1.10 + . . . . . . . . -1.50 -1.50 -1.40 -1.80 . . . . + . . . . . . . . -1.00 -0.90 -2.90 -0.80 . . . . + . . . . . . . . -2.20 -2.00 -1.60 -1.10 . . . . + . . . . . . . . -1.70 -1.40 -1.80 -2.00 . . . . + . . . . -1.10 -1.50 -1.30 -2.10 . . . . 0.20 -0.50 -0.30 -0.30 + . . . . -1.10 -0.70 -2.40 -0.50 . . . . -0.10 -0.20 -1.50 -0.20 + . . . . -2.40 -2.90 -1.40 -1.20 . . . . -0.90 -1.10 -0.30 0.00 + . . . . -1.90 -1.00 -2.20 -1.50 . . . . -0.30 -0.30 -0.40 -1.10 + -0.50 -0.30 -0.60 -0.50 . . . . -0.50 -0.30 -0.60 -0.50 . . . . + -0.20 -0.10 -1.20 -0.00 . . . . -0.20 -0.10 -1.70 0.00 . . . . + -1.40 -1.20 -0.70 -0.20 . . . . -0.80 -1.20 -0.30 -0.70 . . . . + -0.30 -0.10 -0.50 -0.80 . . . . -0.60 -0.10 -0.60 -0.80 . . . . diff --git a/lib/dat/tstacki.dat b/lib/dat/tstacki.dat new file mode 100644 index 0000000..3fe262a --- /dev/null +++ b/lib/dat/tstacki.dat @@ -0,0 +1,70 @@ +Data Arangement: + + Y + ------------------ + (X) A C G U + ------------------ + 5' ==> 3' + AX + AY + 3' <== 5' + (A) . . . . + (C) . . . . + (G) . . . . + (U) -0.70 -0.10 -0.70 -0.10 + +-------------------------------- +STACKING ENERGIES : TERMINAL MISMATCHES AND BASE-PAIRS + + Y Y Y Y + ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + AX AX AX AX + AY CY GY UY + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + . . . . . . . . . . . . 0.70 0.70 -0.40 0.70 + . . . . . . . . . . . . 0.70 0.70 0.70 0.70 + . . . . . . . . . . . . -0.40 0.70 0.70 0.70 + . . . . . . . . . . . . 0.70 0.70 0.70 0.00 + + Y Y Y Y + ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + CX CX CX CX + AY CY GY UY + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + . . . . . . . . -0.00 -0.00 -1.10 -0.00 . . . . + . . . . . . . . -0.00 -0.00 -0.00 -0.00 . . . . + . . . . . . . . -1.10 -0.00 -0.00 -0.00 . . . . + . . . . . . . . -0.00 -0.00 -0.00 -0.70 . . . . + + Y Y Y Y + ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + GX GX GX GX + AY CY GY UY + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + . . . . -0.00 -0.00 -1.10 -0.00 . . . . 0.70 0.70 -0.40 0.70 + . . . . -0.00 -0.00 -0.00 -0.00 . . . . 0.70 0.70 0.70 0.70 + . . . . -1.10 -0.00 -0.00 -0.00 . . . . -0.40 0.70 0.70 0.70 + . . . . -0.00 -0.00 -0.00 -0.70 . . . . 0.70 0.70 0.70 0.00 + + Y Y Y Y + ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + UX UX UX UX + AY CY GY UY + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + 0.70 0.70 -0.40 0.70 . . . . 0.70 0.70 -0.40 0.70 . . . . + 0.70 0.70 0.70 0.70 . . . . 0.70 0.70 0.70 0.70 . . . . + -0.40 0.70 0.70 0.70 . . . . -0.40 0.70 0.70 0.70 . . . . + 0.70 0.70 0.70 0.00 . . . . 0.70 0.70 0.70 0.00 . . . . + diff --git a/lib/dat/tstacki.lop.dat b/lib/dat/tstacki.lop.dat new file mode 100644 index 0000000..a1d0a96 --- /dev/null +++ b/lib/dat/tstacki.lop.dat @@ -0,0 +1,16 @@ + . . . . . . . . . . . . 0.70 0.70 -0.40 0.70 + . . . . . . . . . . . . 0.70 0.70 0.70 0.70 + . . . . . . . . . . . . -0.40 0.70 0.70 0.70 + . . . . . . . . . . . . 0.70 0.70 0.70 0.00 + . . . . . . . . -0.00 -0.00 -1.10 -0.00 . . . . + . . . . . . . . -0.00 -0.00 -0.00 -0.00 . . . . + . . . . . . . . -1.10 -0.00 -0.00 -0.00 . . . . + . . . . . . . . -0.00 -0.00 -0.00 -0.70 . . . . + . . . . -0.00 -0.00 -1.10 -0.00 . . . . 0.70 0.70 -0.40 0.70 + . . . . -0.00 -0.00 -0.00 -0.00 . . . . 0.70 0.70 0.70 0.70 + . . . . -1.10 -0.00 -0.00 -0.00 . . . . -0.40 0.70 0.70 0.70 + . . . . -0.00 -0.00 -0.00 -0.70 . . . . 0.70 0.70 0.70 0.00 + 0.70 0.70 -0.40 0.70 . . . . 0.70 0.70 -0.40 0.70 . . . . + 0.70 0.70 0.70 0.70 . . . . 0.70 0.70 0.70 0.70 . . . . + -0.40 0.70 0.70 0.70 . . . . -0.40 0.70 0.70 0.70 . . . . + 0.70 0.70 0.70 0.00 . . . . 0.70 0.70 0.70 0.00 . . . . diff --git a/lib/dat/tstackm.dat b/lib/dat/tstackm.dat new file mode 100644 index 0000000..289ea88 --- /dev/null +++ b/lib/dat/tstackm.dat @@ -0,0 +1,70 @@ +Data Arangement: + + Y + ------------------ + (X) A C G U + ------------------ + 5' ==> 3' + AX + AY + 3' <== 5' + (A) . . . . + (C) . . . . + (G) . . . . + (U) -0.70 -0.10 -0.70 -0.10 + +-------------------------------- +STACKING ENERGIES : TERMINAL MISMATCHES AND BASE-PAIRS + + Y Y Y Y + ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + AX AX AX AX + AY CY GY UY + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + . . . -1.00 . . . -1.00 . . . -2.20 -0.80 -1.00 -0.80 -0.90 + . . -1.50 . . . -1.50 . . . -2.70 . -0.60 -0.70 -2.20 -0.70 + . -1.50 . -1.00 . -1.50 . -1.00 . -2.70 . -2.20 -0.80 -2.10 -0.80 -0.80 + -1.00 . -1.50 . -1.00 . -1.50 . -2.20 . -2.70 . -1.10 -0.80 -1.10 -0.80 + + Y Y Y Y + ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + CX CX CX CX + AY CY GY UY + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + . . . -1.00 . . . -1.00 -1.70 -1.70 -1.70 -1.70 . . . -1.00 + . . -1.50 . . . -1.50 . -1.00 -1.10 -3.30 -0.80 . . -1.50 . + . -1.50 . -1.00 . -1.50 . -1.00 -1.70 -2.40 -1.70 -1.70 . -1.50 . -1.00 + -1.00 . -1.50 . -1.00 . -1.50 . -1.60 -1.40 -1.60 -1.20 -1.00 . -1.50 . + + Y Y Y Y + ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + GX GX GX GX + AY CY GY UY + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + . . . -2.20 -1.10 -1.50 -1.30 -1.90 . . . -1.00 -0.80 -1.00 -0.80 -1.30 + . . -2.70 . -1.10 -0.70 -3.40 -0.50 . . -1.50 . -0.60 -0.70 -2.50 -0.70 + . -2.70 . -2.20 -1.60 -3.30 -1.40 -1.30 . -1.50 . -1.00 -0.80 -2.10 -0.80 -0.80 + -2.20 . -2.70 . -1.70 -1.00 -2.00 -0.70 -1.00 . -1.50 . -1.40 -0.80 1.30 -0.80 + + Y Y Y Y + ------------------ ------------------ ------------------ ------------------ + A C G U A C G U A C G U A C G U + ------------------ ------------------ ------------------ ------------------ + 5' --> 3' 5' --> 3' 5' --> 3' 5' --> 3' + UX UX UX UX + AY CY GY UY + 3' <-- 5' 3' <-- 5' 3' <-- 5' 3' <-- 5' + -1.00 -0.80 -1.10 -1.30 . . . -1.00 -1.00 -0.80 -1.10 -1.00 . . . -2.00 + -0.70 -0.60 -2.40 -0.50 . . -1.50 . -0.70 -0.60 -1.50 -0.50 . . -2.50 . + -1.10 -2.10 -1.20 -1.00 . -1.50 . -1.00 -0.70 -1.40 -0.80 0.30 . -2.50 . -2.00 + -0.90 -0.60 -1.40 -0.50 -1.00 . -1.50 . -0.50 -0.60 -0.50 -0.50 -2.00 . -2.50 . + diff --git a/license.txt b/license.txt new file mode 100644 index 0000000..ed4f01c --- /dev/null +++ b/license.txt @@ -0,0 +1,41 @@ +Copyrights (C) 2010 Jerome Waldispuhl +All right reserved. + +This program is granted free of charge for research and education +purposes. However you must obtain a license from the author to use it +for commercial purposes. For commercial use contact: + +Jerome Waldispuhl +School of Computer Science +McGill University +Montreal, QC, Canada +E-mail: jeromew@cs.mcgill.ca + +Scientific results produced using the software provided shall +acknowledge the use of RNAmutants. Please cite as: + +J. Waldispuhl, S. Devadas, B. Berger and P. Clote, +Efficient Algorithms for Exploring the Mutation Landscape of an RNA molecule, +to appear in PLoS Computational Biology + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: +* Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this +list of conditions and the following disclaimer in the documentation and/or other +materials provided with the distribution. +* Neither the name of the author nor the names of its contributors may be used to +endorse or promote products derived from this software without specific prior +written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/readme.txt b/readme.txt new file mode 100644 index 0000000..918ac1a --- /dev/null +++ b/readme.txt @@ -0,0 +1 @@ +Et ben c'etait pas si difficile ;) diff --git a/scripts/fixedGCSampling.py b/scripts/fixedGCSampling.py new file mode 100644 index 0000000..ccfbe09 --- /dev/null +++ b/scripts/fixedGCSampling.py @@ -0,0 +1,283 @@ +#!/usr/bin/python +import sys +import os +import numpy +import random +import math +import re + +DEBUG = False + +NUM_SAMPLES = 10000 +GC_WEIGHT = 1.0 +TARGET_GC = 0.5 +LIMIT_MUTS = sys.maxint +SAMPLES_HEADER = ">> Sampling " +SAMPLES_NEW_MUTS_HEADER = "> sampling " +# Indicate the location of RNAmutants here +path_to_RNAmutants = "." + +COMMAND_LINE = "%s/RNAmutants -l %s/lib/ -M %s -C -f %s -m %s --sample-file %s > %s" + + +def buildSampleFile(path, n, num=NUM_SAMPLES,kmin=0,kmax=sys.maxint): + sfile = open(path,"w") + for i in range(n+1): + if kmin<=i<=kmax: + sfile.write("%s\t%s\n"%(i,num)) + sfile.close() + return path + +def buildInputFile(path,seq,mutMask=None,structConstraints=None): + if mutMask is None: + mutMask = "o"*len(seq) + if structConstraints is None: + structConstraints = "?"*len(seq) + sfile = open(path,"w") + sfile.write("%s\n"%(seq)) + sfile.write("%s\n"%(mutMask)) + sfile.write("%s\n"%(structConstraints)) + sfile.close() + return path + +def buildWeightFile(path,gcWeight=1.0): + sfile = open(path,"w") + bases = ['A','C','G','U'] + for r in bases: + for c in bases: + coeff = 1.0 + if r in ['C','G']: + coeff /= gcWeight + if c in ['C','G']: + coeff *= gcWeight + sfile.write("%s "%coeff) + sfile.write("\n") + sfile.close() + return path + + +def runRNAMutants(seq,mutMask=None,structConstraints=None,gcWeight=GC_WEIGHT,numSamples=NUM_SAMPLES,kmin=0,kmax=sys.maxint): + inputPath = "test.faa" + samplePath = "samples.txt" + outputPath = "out-%.2f.txt"%gcWeight + weightPath = "weights.txt" + kmax = min(kmax,len(seq)) + buildInputFile(inputPath,seq,mutMask,structConstraints) + buildSampleFile(samplePath,len(seq),numSamples,kmin,kmax) + buildWeightFile(weightPath,gcWeight) + cmd = COMMAND_LINE%(path_to_RNAmutants,path_to_RNAmutants,weightPath,inputPath,kmax,samplePath,outputPath) + os.system(cmd) + results = parseSampleSet(outputPath,kmin,kmax) + return results + +def parseSampleSet(path,kmin,kmax): + result = {} + currentSeq = "" + inSampling = False + seqLine = True + muts = 0 + mutre = re.compile(r"""(\d+)""",re.VERBOSE) + try: + for l in open(path): + if l.startswith(SAMPLES_HEADER): + inSampling = True + elif inSampling: + if l.startswith(SAMPLES_NEW_MUTS_HEADER): + m = mutre.findall(l) + muts = int(m[1]) + else: + if seqLine: + s = l[:-1].strip() + data = s.split() + currentSeq = data[0] + energy = float(data[1][1:-1]) + else: + str = l[:-1].strip() + if muts not in result: + result[muts] = [] + result[muts].append((currentSeq,str,energy)) + seqLine = not seqLine + except Exception, e: + print e,l + return result + +def countGC(seq): + totGC = 0 + for c in seq: + if c in ['G','C','g','c']: + totGC += 1 + return totGC + +def analyzeGCResults(results): + freqs = {} + for muts in results: + totLength = 0 + totGC = 0 + for (seq,str,energy) in results[muts]: + totGC += countGC(seq) + totLength += len(seq) + freqs[muts] = float(totGC)/float(totLength) + return freqs + +def addFilteredSampleSet(samples,finalSamples,lowerBound=-sys.maxint,upperBound=+sys.maxint,kmin=0,kmax=sys.maxint): + for muts in samples: + if kmin<=muts<=kmax: + if muts not in finalSamples: + finalSamples[muts] = [] + for (seq,str,energy) in samples[muts]: + if lowerBound <= countGC(seq) <= upperBound: + finalSamples[muts].append((seq,str,energy)) + +MAGIC_RATIO = 3 + +def displayExps(finalSamples,weightsToFreqs,kmin,kmax): + weights = weightsToFreqs.keys() + weights.sort() + for muts in finalSamples: + if kmin<=muts<=kmax: + s = "" + for w in weights: + s += "%s.2f->%.2f "%(w,weightsToFreqs[w][muts]) + print " B[%s]=%s\t[%.2f-%.2f]\t%s"%(muts,len(finalSamples[muts]),weightsToFreqs[weights[0]][muts],weightsToFreqs[weights[-1]][muts],s) + +def checkBucketsFull(finalSamples,targetNumSamples,initSeq,lowerBoundGC,upperBoundGC,kmin,kmax): + result = True + for muts in finalSamples: + if (len(finalSamples[muts]) < targetNumSamples) and (kmin<=muts<=kmax) and isBucketFillable(initSeq,muts,lowerBoundGC,upperBoundGC): + result = False + return result + +def isBucketFillable(seq,muts,lbGC,ubGC): + lbMuts = countGC(seq)-muts + ubMuts = countGC(seq)+muts + overlap = not ( (lbMuts<=ubMutsexps[-1][0]: + if DEBUG: print " Greater than greatest" + return exps[-1][1]*2.0 + # Targetted GC frequency 'squeezed' between two values, find them and go dichotomically + if DEBUG: print " exps" + for i in range(len(exps)-1): + if DEBUG: print " Greater than greatest" + (numGCLow,wLow) = exps[i] + (numGCHigh,wHigh) = exps[i+1] + if numGCLow <= targetGC <= numGCHigh: + return (wLow+wHigh)/2.0 + return None + + +def fillBuckets(seq,targetGC,numSamples, tolerance = 0.0, kmin=0,kmax=sys.maxint): + """Samples [numSamples] elements within each class of mutations (buckets) for + a sequence [seq] having a proportion [targetGC] of GC. A [tolerance] can be specified, + in which case the targetted proportion is (targetGC-tolerance,targetGC+tolerance) + """ + finalSamples = {} + n = len(seq) + lowerBoundGC = math.floor(n*(targetGC-tolerance)) + upperBoundGC = math.floor(n*(targetGC+tolerance)) + w = 1.0 + bucketsFull = False + weightToFreqs = {} + displayWarningUnfillableBuckets(seq,lowerBoundGC,upperBoundGC,kmin,kmax) + while not bucketsFull: + samples = runRNAMutants(seq,None,None,w,MAGIC_RATIO*numSamples,kmin,kmax) + weightToFreqs[w] = analyzeGCResults(samples) + addFilteredSampleSet(samples,finalSamples,lowerBoundGC,upperBoundGC,kmin,kmax) + bucketsFull = checkBucketsFull(finalSamples,numSamples,seq,lowerBoundGC,upperBoundGC,kmin,kmax) + displayExps(finalSamples,weightToFreqs,kmin,kmax) + if (not bucketsFull): + wb = w + w = newWeight(seq,w,finalSamples,targetGC,numSamples,weightToFreqs,lowerBoundGC,upperBoundGC,kmin,kmax) + print "New weight:\n %.3f \t ->\t %.3f"%(wb,w) + return finalSamples + +def printSamples(samples,kmin,kmax): + for i in samples: + if kmin<=i<=kmax: + print "> Sampled %s sequence(s) and secondary structure(s) with %s mutations"%(len(samples[i]),i) + for (seq,str,E) in samples[i]: + print " %s\t%s"%(seq,E) + print " %s"%str + +def printUsage(cmd): + print """\nCalls RNAMutants repeatedly to estimate suitable weights.\n +Usage: %s seq [opts] +Options: + -n - Samples n structures each time + -g - Targets a given C+G-content x (0 - Allows for a relative tolerance y on C+G-content + -k n1 n2 - Only fills buckets from n1 to n2 + """ % (cmd) + sys.exit(1) + + +if __name__ == '__main__': + if len(sys.argv)==1: + printUsage(sys.argv[0]); + sys.exit(1); + seq = sys.argv[1] + i = 2 + numSamples = NUM_SAMPLES + gcWeight = GC_WEIGHT + targetGC = TARGET_GC + tolerance = 0.0 + kmin = 0 + kmax = sys.maxint + while i +#include +#include +#include +#include +#include +#include +#include +#include "reader_energy_params.h" +#include "energy_functions.h" +#include "RNAmutants.h" +#include "util.h" +#include "sampling.h" +#include "mfe_backtrack.h" +#include "energy_params_tables.h" +#include "constraints.h" +#include "hybrid.h" + +#define NO_DEBUG_SAMPLING +#define LEFT_CHECK 0 +#define RIGHT_CHECK 26 + +/* various variables */ + +const double __infinity__ = DBL_MAX; + +/* declared in turner_functions.c */ + +extern double __temperature; +extern double __RT__; + +/* variables used in verbose mode */ + +unsigned long long int total_memory = 0; +time_t starting_time = 0; +time_t starting_algo_time = 0; + +/* internal loop lookup table (mutants motifs) */ + +unsigned int *****loop_tab; +unsigned int *****stack_tab; + +/* sequence constraints (structure constraints are declared in a separate file) */ + +int *cst_tape=NULL; +int **cst_segment=NULL; + +/* special modes */ +static int warning_flag=0; +int number_of_sample=0; +int framesize=0; +double cutpoint=0; +int include_intermolecular_interactions=1; + +/* dangle flag (used in zuker_functions.c) */ +int dangle_used = 1; + +/* Version */ + +void version() { + printf("RNAmutants version 2.0.1 (01/03/2012)\n"); + printf("Copyrights (C) 2011 Jerome Waldispuhl\n\n"); + printf("Academic version - may not be used by or for commercial organizations!\n\n"); + printf("For commercial use contact:\n\n"); + printf("Jerome Waldispuhl\n"); + printf("School of Computer Science\n"); + printf("McGill University\n"); + printf("Montreal, QC, CANADA\n"); + printf("E-mail: jeromew@cs.mcgill.ca\n\n"); + printf("THIS SOFTWARE COMES WITH ABSOLUTELY NO WARRANTY! USE AT YOUR OWN RISK!\n"); + exit(EXIT_SUCCESS); +} + +/* Usage */ + +void usage(const char *softname) { + fprintf(stdout,"Usage : %s [COMMANDS]\n",softname); + fprintf(stdout,"COMMANDS (base):\n"); + fprintf(stdout,"--file\t\t[-f] \t\tSet input sequence from fasta file .\n"); + fprintf(stdout,"--string\t[-s] \t\tSet input sequence from string.\n"); + fprintf(stdout,"--library\t[-l] \tEnergy paramaters library path.\n"); + fprintf(stdout,"--constraints\t[-C]\t\t\tUse sequence and structure contraints stored in input file.\n"); + fprintf(stdout,"--hybrid\t[-H]\t\t\tActivate the RNA duplex version and define the cutpoint.\n"); + + fprintf(stdout,"COMMANDS (model):\n"); + fprintf(stdout,"--mutations\t[-m] \t\tSet the maximal number of mutations.\n"); + fprintf(stdout,"--sample-number\t[-n] \t\tSet the number of samples.\n"); + fprintf(stdout,"--sample-file\t[-N] \t\tSet the parametric sampling command.\n"); + fprintf(stdout,"--bias\t\t[-M] \t\tMutational bias (4x4 matrix).\n"); + + fprintf(stdout,"COMMANDS (energy):\n"); + fprintf(stdout,"--turner99\t\t\t\tUse 1999 Turner's nearest neighbor energy model.\n"); + fprintf(stdout,"\t\t\t\t\tAvailable only for a temperature of 37C.\n"); + fprintf(stdout,"--energy-model\t[-e] \tUse energy parameters stored in .\n"); + fprintf(stdout,"--temperature\t[-t] \t\tSet the temperature of energy parameters.\n"); + fprintf(stdout,"\t\t\t\t\tMust range from 0 to 100. Default is 37.\n"); + fprintf(stdout,"--absolute-temperature\t[-T] \tFormal temperature in Kelvin degrees.\n"); + + fprintf(stdout,"COMMANDS (utils):\n"); + fprintf(stdout,"--job-id\t[-J] \t\tReport job ID in error messages.\n"); + fprintf(stdout,"--help\t\t[-h]\t\t\tDisplay this menu.\n"); + fprintf(stdout,"--verbose\t[-v]\t\t\tEnable verbose mode.\n"); + fprintf(stdout,"--version\t[-V]\t\t\tShow version.\n"); + fprintf(stdout,"--warning\t[-w]\t\t\tEnable all warning.\n"); + + fprintf(stdout,"COMMANDS (output):\n"); + fprintf(stdout,"--Z-output\t[-0] \t\tSet the output file for the partition function values.\n"); + fprintf(stdout,"--mfe-output\t[-1] \t\tSet the output file for the superoptimal mutants.\n"); + fprintf(stdout,"--sample-output\t[-2] \t\tSet the output file for the samples.\n"); + fprintf(stdout,"--sample-stats\t\t\t\tOutput statistics computed on sample set.\n"); + exit(EXIT_SUCCESS); +} + +/* require by lexer */ + +int yywrap () { + return 1; +} + +/**********************************************************************************/ +/*** utilities ***/ +/**********************************************************************************/ + +/*** counter for tri and tetraloop ***/ + +int init_triloop_cmpt_table() { + int ii,jj,cmpt = 0; + double tab[10] = {0,0,0,0,0,0,0,0,0,0}; + double val; + + for (ii=0;ii<1024;ii++) { + if ((val=refTableTriLoop[ii])) { + jj=0; + while (tab[jj]) { + if (val==tab[jj]) break; /* value already found */ + jj++; + if ((jj==10)||(jj>cmpt)) { + fprintf(stderr,"%s:line %d: index out of bound.\n",__FILE__,__LINE__); + exit(EXIT_FAILURE); + } + } + if (!tab[jj]) { tab[jj]=val; cmpt++; } + } + } + + triloop_cmpt_table = (double *)xmalloc((2*cmpt)*sizeof(double)); + triloop_weight_table = (double *)xmalloc((2*cmpt)*sizeof(double)); + memset(triloop_cmpt_table,0,(2*cmpt)*sizeof(double)); + memset(triloop_weight_table,0,(2*cmpt)*sizeof(double)); + for (ii=0;iicmpt)) { + fprintf(stderr,"%s:line %d: index out of bound.\n",__FILE__,__LINE__); + exit(EXIT_FAILURE); + } + } + if (!tab[jj]) { tab[jj]=val; cmpt++; } + } + } + + tetraloop_cmpt_table = (double *)xmalloc((2*cmpt)*sizeof(double)); + tetraloop_weight_table = (double *)xmalloc((2*cmpt)*sizeof(double)); + memset(tetraloop_cmpt_table,0,(2*cmpt)*sizeof(double)); + memset(tetraloop_weight_table,0,(2*cmpt)*sizeof(double)); + for (ii=0;ii': + is_comment = 1; + continue; + case '\r': + case '\n': + buffer[index]='\0'; + if ((canbe_seq)&&(!canbe_ss)&&(!canbe_mut)) { + if (strlen(buffer)>0) { + init_input_tape_from_string(buffer); + seq_setup=1; + } + } + else if ((!canbe_seq)&&(canbe_ss)&&(!canbe_mut)) { /* structure contraints */ + if (rna_len==index) { + if (!cst_flag) { + fprintf(stderr,"WARNING: Structure constraints ignored. Please use --constraints.%s\n", getJobID()); + for (ii=0;ii0)) { + fprintf(stderr,"Corrupted input file %s.%s\n",filename,getJobID()); + exit(EXIT_FAILURE); + } + canbe_seq = 1; + canbe_ss = 1; + canbe_mut = 1; + is_comment = 0; + memset(buffer,0,max_sequence_size*sizeof(char)); + buffer[0]='\0'; + index=0; + continue; + case 'A': + case 'a': + case 'C': + case 'c': + case 'G': + case 'g': + case 'U': + case 'u': + case 'T': + case 't': + buffer[index]=toupper(carac); + index++; + canbe_mut=0; + canbe_ss=0; + continue; + case '&': + case '+': + if ((canbe_seq)&&(!canbe_ss)&&(!canbe_mut)) { + buffer[index]=carac; + index++; + } + else if ((cst_flag)&&((int)(cutpoint)!=index-1)) { + fprintf(stderr,"ERROR: Corrupted input. Cut point mislocated.%s\n",getJobID()); + } + continue; + case '(': + case ')': + case '.': + case '?': + buffer[index]=carac; + index++; + canbe_seq=0; + canbe_mut=0; + continue; + case 'o': + case 'O': + case 'x': + case 'X': + buffer[index]=carac; + index++; + canbe_seq=0; + canbe_ss=0; + continue; + default: + break; + } + + if (index>=max_sequence_size) { + fprintf(stderr,"Error: input exceed storage limit.%s\n",getJobID()); + } + } + + /* last check in case of file does not end with a breakline */ + + if (index) { + buffer[index]='\0'; + if ((canbe_seq)&&(!canbe_ss)&&(!canbe_mut)) { + if (strlen(buffer)>0) { + init_input_tape_from_string(buffer); + seq_setup=1; + } + } + else if ((!canbe_seq)&&(canbe_ss)&&(!canbe_mut)) { /* structure contraints */ + if (rna_len==index) { + if (!cst_flag) { + fprintf(stderr,"WARNING: Structure constraints ignored. Please use --constraints.%s\n", getJobID()); + for (ii=0;ii0)) { + fprintf(stderr,"Corrupted input file %s.%s\n",filename,getJobID()); + exit(EXIT_FAILURE); + } + canbe_seq = 1; + canbe_ss = 1; + canbe_mut = 1; + is_comment = 0; + memset(buffer,0,max_sequence_size*sizeof(char)); + buffer[0]='\0'; + index=0; + } + + /* check empty sequence */ + if ((!rna_len)||(!seq_setup)) { + fprintf(stderr,"\nCannot find input sequence: Abort.%s\n\n", getJobID()); + usage("RNAmutants"); + } + + /* check and complete all assignments are done */ + + if (!ss_setup) { + if (cst_flag) { + fprintf(stderr,"WARNING: Cannot find structure constraints. Ignored. %s\n", getJobID()); + } + for (ii=0;ii15)) { + fprintf(stderr,"WARNING: Corrupted file %s. Ignored.%s\n",filename,getJobID()); + /** reset table **/ + for (ii=0;ii<4;ii++) { + for (jj=0;jj<4;jj++) { + mutbias[ii][jj]=1.0; + } + } + free(buffer); + return 0; + } + + /* proceed */ + + bias = atof(buffer); + if (bias>=0) { + mutbias[list_aa_index[irow]][list_aa_index[icol]] = bias; + } + else { + fprintf(stderr,"ERROR: Corrupted mutation weigth %s. Ignored.%s\n",buffer,getJobID()); + /** reset table **/ + for (ii=0;ii<4;ii++) { + for (jj=0;jj<4;jj++) { + mutbias[ii][jj]=1.0; + } + } + free(buffer); + return -1; + } + +#if 0 + printf("M[%d,%d] <- %e (%d).\n",list_aa_index[irow],list_aa_index[icol],(double)(bias),index); +#endif + index++; + irow = index / 4; + icol = index % 4; + bias=-1.0; + + } + + if (index!=16) { + fprintf(stderr,"WARNING: Incomplete mutation weight matrix in file \"%s\". Ignored.%s\n",filename,getJobID()); + /** reset table **/ + for (ii=0;ii<4;ii++) { + for (jj=0;jj<4;jj++) { + mutbias[ii][jj]=1.0; + } + } + free(buffer); + return 0; + } + + fclose(fp); + free(buffer); + + return 1; + +} + +/** build the list of possible configurations **/ + +unsigned int **build_generic_loop_list(int ileft, int iright, int nb_mutations) { + int mutation_index[4] = {0,0,0,0}; + int ii,ind_ext=0,ind_int=0; + int *liste_unbp_nt[2]; + int nb_mut_ext,nb_mut_int; + int left_index_ext=char2index(ileft); + int right_index_ext=char2index(iright); + int left_index_int=char2index(ileft+1); + int right_index_int=char2index(iright-1); + int nt_left_ext,nt_right_ext,nt_left_int,nt_right_int; + unsigned int hcode_config=0; + unsigned int **list_of_config; + int ii_list_of_config[3]={0,0,0}; + int all_config[5][7][4] = {{{0},{-1}},{{1},{2},{3},{4},{-1}},{{1,2},{1,3},{1,4},{2,3},{2,4},{3,4},{-1,-1}}, + {{1,2,3},{1,2,4},{1,3,4},{2,3,4},{-1,-1,-1}},{{1,2,3,4},{-1,-1,-1,-1}}}; + int i_config; + + /** allocate memory **/ + + list_of_config=(unsigned int **)xmalloc(3*sizeof(unsigned int *)); + for(ii=0;ii<3;ii++) { + list_of_config[ii]=(unsigned int *)xmalloc((int)(genereMutant(4,nb_mutations)+1.0)*sizeof(unsigned int)); + } + + /* enum configurations */ + + i_config=0; + while (all_config[nb_mutations][i_config][0]>=0) { /* enumerate possible distribution of mutation sites */ + + /* init index mutation arrays */ + + mutation_index[0]=mutation_index[1]=mutation_index[2]=mutation_index[3]=0; + for (ii=0;iicutpoint)) { + if (include_intermolecular_interactions) { + tab_motifs[ii][jj] = build_generic_loop_list(ii,jj,nb_mutations); + } + + } + else if (jj-ii>=__hairpin_min_length__+3){ + tab_motifs[ii][jj] = build_generic_loop_list(ii,jj,nb_mutations); + } + + } + else if (jj-ii>=__hairpin_min_length__+3){ + tab_motifs[ii][jj] = build_generic_loop_list(ii,jj,nb_mutations); + } + } + } + + return tab_motifs; + +} + + +/******* 1x1, 1x2, 2x1 and 2x2 internal loop cases ******/ + +int build_special_loop_list_for_given_config(unsigned int *list_of_config, int tabindex, int ileft, int iright, int nt_loop_left, int nt_loop_right, int nb_mutations,int *config) { + int size_motif = nt_loop_left + nt_loop_right + 4; + int mutation_index[8] = {0,0,0,0,0,0,0,0}; + int ii,ind_close=0,ind_open=0, okconfig=0; + int *liste_left_unbp_nt[2]; + int *liste_right_unbp_nt[2]; + int nb_mut_close,nb_mut_open; + int left_index_close=char2index(ileft-1); + int right_index_close=char2index(iright-1); + int left_index_open=char2index(ileft+nt_loop_left); + int right_index_open=char2index(iright-nt_loop_right-2); + int nt_left_close,nt_right_close,nt_left_open,nt_right_open; + unsigned int hcode_config=0; + int shift, nt_lloop[2],nt_rloop[2],cmpt_lloop[2],cmpt_rloop[2],i_lloop,i_rloop; + int ii_list_of_config=tabindex; + + /* init_arrays */ + + for (ii=0;ii=0;ii--) { + hcode_config |= (nt_lloop[ii])< %u\n", + nt_left_close,nt_lloop[0],nt_lloop[1],nt_left_open,nt_right_open, + nt_rloop[1],nt_rloop[0],nt_right_close,hcode_config); +#endif + + list_of_config[ii_list_of_config] = hcode_config; + ii_list_of_config++; + + /**************************************/ + } + } + } + else { + cmpt_rloop[i_rloop]=0; + i_rloop--; + } + } + } + } + } + else { + cmpt_lloop[i_lloop]=0; + i_lloop--; + } + } + } + + /* update opening base pair */ + + nt_left_open = bp_mutation[nb_mut_open][left_index_open][right_index_open][ind_open][0]; + nt_right_open = bp_mutation[nb_mut_open][left_index_open][right_index_open][ind_open][1]; + ind_open++; + + } + + /* update closing base pair */ + + nt_left_close = bp_mutation[nb_mut_close][left_index_close][right_index_close][ind_close][0]; + nt_right_close = bp_mutation[nb_mut_close][left_index_close][right_index_close][ind_close][1]; + ind_close++; + } + + /* end of list flag */ + list_of_config[ii_list_of_config] = 0; + + return ii_list_of_config; + +} + +unsigned int ****enum_all_special_internal_loops(int nb_mutations) { + unsigned int ****tab_config; + int ii,jj,cc,min_gap; + static int size_tab = 9*sizeof(int), first_call = 1; + static int *tab; + + if (cutpoint) { min_gap = 0; } + else { min_gap = __hairpin_min_length__; } + + if (first_call) { + tab = (int *)xmalloc(size_tab); + first_call = 0; + } + +#if 0 + printf("start %d\n",nb_mutations); +#endif + + /** 0:1x1, 1:1x2, 2:2x1, 3:2x2 **/ + tab_config=(unsigned int ****)xmalloc(4*sizeof(unsigned int ***)); + + for (cc=0;cc<4;cc++) { + int index = 0; + int lleft,lright,size_motif,**index_free=NULL; + int max_value_1st; + + memset(tab,0,size_tab); + lleft=1+(cc>>1); + lright=1+(cc&1); + size_motif = 4 + lleft + lright; + max_value_1st = size_motif - nb_mutations + 1; + + /* we dont really need to optimize ii and jj */ + + tab_config[cc]=(unsigned int ***)xmalloc(rna_len*sizeof(unsigned int **)); + index_free=(int **)xmalloc(rna_len*sizeof(int *)); + + for (ii=0;ii=min_gap+size_motif-2) { + tab_config[cc][ii][jj]=(unsigned int *)xmalloc((int)(genereMutant(size_motif,nb_mutations)+1)*sizeof(unsigned int)); + } + else { + tab_config[cc][ii][jj]=(unsigned int *)xmalloc(sizeof(unsigned int)); + } + + tab_config[cc][ii][jj][0] = 0; /* STOP signal: this config cannot be reached */ + index_free[ii][jj]=0; /* counter for the first available index */ + + } + } + + /* do NOT fill the table if number of mutations is too high */ + + if (size_motif>=nb_mutations) { + + if (nb_mutations) { + while(tab[0]<=max_value_1st) { + + if (tab[index]>size_motif) { + tab[index]=0; + index--; + } + else { + if (index>=nb_mutations) { + for (ii=0;ii<=rna_len-size_motif-min_gap;ii++) { + for (jj=ii+size_motif+min_gap-1;jj=0)&&(newK<=nt2mut)) { + if ((__hairpin_min_length__<=ll)||(ll<=__hairpin_max_length__)) { + /* check cst */ + if (!(((cst_tape[ii])&&(kronecker(ii,xx)))|| + ((cst_tape[jj])&&(kronecker(jj,yy)))|| + ((cst_tape[ii+1])&&(kronecker(ii+1,uu)))|| + ((cst_tape[jj-1])&&(kronecker(jj-1,vv))))) { + + n_total = n_partial = 0; + + if (ll==3) { /** triloop **/ + triloop_counter(newK,ii,jj,xx,uu,vv,yy); + for (ind=0;ind0) { + Zs[kk][ii][jj][xx][yy].pf += hairpin_base_energy * exp(-(bonus/__RT__)) * n_partial; + //Zs[kk][ii][jj][xx][yy].pfGC += hairpin_base_energy * exp(-(bonus/__RT__)) * n_partial; + Zs[kk][ii][jj][xx][yy].mfe = minimum_double(Zs[kk][ii][jj][xx][yy].mfe,mfe_hairpin_base_energy + bonus); + } + } + } + else if (ll==4) { /** tetraloop **/ + tetraloop_counter(newK,ii,jj,xx,uu,vv,yy); + n_total = 0; + for (ind=0;ind0) { + Zs[kk][ii][jj][xx][yy].pf += hairpin_base_energy * exp(-(bonus/__RT__)) * n_partial; + Zs[kk][ii][jj][xx][yy].mfe = minimum_double(Zs[kk][ii][jj][xx][yy].mfe,mfe_hairpin_base_energy + bonus); + } + } + } + + /*** other cases ***/ +#ifdef OLD_GGG_HAIRPIN + n_partial = 0; + if((xx==INDEX_G)&&(uu==INDEX_G)&&(yy==INDEX_U)) { /*** GGG loop ***/ + if (kronecker(ii+2,INDEX_G)) { /*** 3rd nt needs to mutate in G ***/ + if ((newK)&&(!(cst_tape[ii+2]))&&(nt2mut>0)) { + n_partial = sequence_bias(ii+2,jj-1,newK-1) * bound_bias; + n_total += n_partial; + if (n_partial>0) { + Zs[kk][ii][jj][xx][yy].pf += hairpin_base_energy * exp(-(ggg_hairpin_bonus/__RT__)) * n_partial; + Zs[kk][ii][jj][xx][yy].mfe = minimum_double(Zs[kk][ii][jj][xx][yy].mfe,mfe_hairpin_base_energy + ggg_hairpin_bonus); + } + } + } + else { /*** already a GGG loop ***/ + if (nt2mut>0) { + n_partial = sequence_bias(ii+2,jj-1,newK) * bound_bias; + n_total += n_partial; + if (n_partial>0) { + Zs[kk][ii][jj][xx][yy].pf += hairpin_base_energy * exp(-(ggg_hairpin_bonus/__RT__)) * n_partial; + Zs[kk][ii][jj][xx][yy].mfe = minimum_double(Zs[kk][ii][jj][xx][yy].mfe,mfe_hairpin_base_energy + ggg_hairpin_bonus); + } + } + } + } +#endif + + /*** generic cases ***/ + + n_remaining = sequence_bias(ii+2,jj-2,newK) * bound_bias - n_total; + Zs[kk][ii][jj][xx][yy].pf += hairpin_base_energy * n_remaining; + Zs[kk][ii][jj][xx][yy].mfe = minimum_double(Zs[kk][ii][jj][xx][yy].mfe,mfe_hairpin_base_energy); + + /* update associated tables */ + Zes[kk][ii][jj][xx][yy].pf = Zms[kk][ii][jj][xx][yy].pf = Zs[kk][ii][jj][xx][yy].pf; + Zes[kk][ii][jj][xx][yy].mfe = Zms[kk][ii][jj][xx][yy].mfe = Zs[kk][ii][jj][xx][yy].mfe; + + } + } + } + } + } + } + } + } + } + } + } + } +} + + +/*******************************************************************************/ +/* */ +/* Mutant algorithm for computing of the boltzmann distribution */ +/* */ +/*******************************************************************************/ + +void RNAmutants_algorithm(int verbose) { + + int len, ii, jj, newii, newjj, rr, kk, xx, yy, nn, uu, vv, aa, bb, cc, dd, ee, ll, global_max_bp,newK,nb_free_nt,nt2mut; + unsigned int *list_config, *list_config_close, *list_config_open; + int cloop,nb_mut_motif,nb_nt,nb_max_mut,ii_list,ii_list_open,ii_list_close,config,config_close,config_open; + int nb_max_mut_unk_loop,nb_mut_unk_loop,nb_max_mut_close_bp,nb_mut_close_bp,nb_max_mut_open_bp,nb_mut_open_bp; + int nb_max_mut_in_bulge, nb_mut_in_bulge, size_bulge,nb_mut_inside_boundary,min_rr,max_rr; + double cmpt_mutants; + clock_t start=0, current=0; + double cpu_time_used; + + long totCount = ((rna_len-(__hairpin_min_length__+3))*(rna_len-(__hairpin_min_length__+2))/2)*((max_mutations)*(max_mutations-1))/2; + long curCount = 0; + +#ifdef DEBUG_SAMPLING + double debug,pdebug; +#endif + + if (verbose) { + start = clock(); + current = start; + } + + for (kk=0;kk=0) { + Zes[kk][ii][jj][xx][yy].pf += Zs[newK][ii][jj-1][xx][uu].pf * nucleotide_bias(jj,yy); + Zes[kk][ii][jj][xx][yy].mfe = minimum_double(Zes[kk][ii][jj][xx][yy].mfe,Zs[newK][ii][jj-1][xx][uu].mfe); + Zms[kk][ii][jj][xx][yy].pf += boltzmannExtendMultiLoop(1) * Zs[newK][ii][jj-1][xx][uu].pf * nucleotide_bias(jj,yy); + Zms[kk][ii][jj][xx][yy].mfe = minimum_double(Zms[kk][ii][jj][xx][yy].mfe,EExtendMultiLoop(1) + Zs[newK][ii][jj-1][xx][uu].mfe); + /* FIXME: final delete + Ze[kk][ii][jj][xx][yy].pf += Ze[newK][ii][jj-1][xx][uu].pf * nucleotide_bias(jj,yy); + Ze[kk][ii][jj][xx][yy].mfe = minimum_double(Ze[kk][ii][jj][xx][yy].mfe,Ze[newK][ii][jj-1][xx][uu].mfe); + Zm[kk][ii][jj][xx][yy].pf += boltzmannExtendMultiLoop(1) * Zm[newK][ii][jj-1][xx][uu].pf * nucleotide_bias(jj,yy); + Zm[kk][ii][jj][xx][yy].mfe = minimum_double(Zm[kk][ii][jj][xx][yy].mfe,EExtendMultiLoop(1) + Zm[newK][ii][jj-1][xx][uu].mfe); + */ + } + } + } + + /* left */ + if (!((cst_tape[ii])&&(kronecker(ii,xx)))) { + for (uu=0;uu<4;uu++) { + newK = kk - kronecker(ii,xx); + if (newK>=0) { + /* FIXME: Ze & Zm as above */ + Zes[kk][ii][jj][xx][yy].pf += Zs[newK][ii+1][jj][uu][yy].pf * boltzmann_penalty_close_helix(uu,yy) * nucleotide_bias(ii,xx); + Zes[kk][ii][jj][xx][yy].mfe = minimum_double(Zes[kk][ii][jj][xx][yy].mfe,Zs[newK][ii+1][jj][uu][yy].mfe + penalty_close_helix(uu,yy)); + Zms[kk][ii][jj][xx][yy].pf += Zs[newK][ii+1][jj][uu][yy].pf * boltzmann_penalty_close_helix(uu,yy) * nucleotide_bias(ii,xx) * boltzmannExtendMultiLoop(1); + Zms[kk][ii][jj][xx][yy].mfe = minimum_double(Zms[kk][ii][jj][xx][yy].mfe,Zs[newK][ii+1][jj][uu][yy].mfe + penalty_close_helix(uu,yy) + EExtendMultiLoop(1)); + } + } + } + } + } + } + + /* GENERAL CASE */ + + for (len=__hairpin_min_length__+4;len<=rna_len;len++) { /* len is the number of nucleic acids in the subsequence */ + /* minimum length is the minimal size for stack since hairpins have already been computed. */ + + global_max_bp = (len-__hairpin_min_length__)/2; + + for (ii=0;ii<=rna_len-len;ii++) { /* ii is the index of the first nucleic acid of the subsequence (indices start at 0) */ + jj=ii+len-1; /* jj is the index of the last nucleic acid of the subsequence */ + curCount += kk; + + if (verbose) fprintf(stderr,"\r%4.1f%% ",(double)(100.0*curCount)/(double)totCount);fflush(stderr); + +#ifdef DEBUG_SAMPLING + debug = pdebug = 0; + if ((ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) { + for (xx=0;xx<4;xx++) { + for (yy=0;yy<4;yy++) { + if (validBasePair(xx,yy)) { /* special case when xx and yy base pair */ + debug += Zs[kk][ii][jj][xx][yy].pf; + } + } + } + printf("hairpin: %e\n",debug); + pdebug = debug; + } +#endif + + if (is_basepair(ii,jj)) { /* NEW: check base pair to improve design performances */ + + /* lookup stacks */ + + nb_max_mut=minimum(4-cst_tape[ii]-cst_tape[ii+1]-cst_tape[jj-1]-cst_tape[jj],kk); + + if ((len>=__hairpin_min_length__+4)&&(is_stack(ii,jj))){ /* lookup structure constraints */ + + for (nb_mut_motif=0;nb_mut_motif<=nb_max_mut;nb_mut_motif++) { + list_config = stack_tab[nb_mut_motif][ii][jj][0]; + ii_list = 0; + while ((config=list_config[ii_list])) { + xx=config>>6; + uu=(config>>4)&3; + vv=(config>>2)&3; + yy=config&3; + newK=kk-nb_mut_motif + kronecker(ii+1,uu) + kronecker(jj-1,vv); + Zs[kk][ii][jj][xx][yy].pf += boltzmannStack(xx,uu,vv,yy) * Zs[newK][ii+1][jj-1][uu][vv].pf * nucleotide_bias(ii,xx) * nucleotide_bias(jj,yy); + Zs[kk][ii][jj][xx][yy].mfe = minimum_double(Zs[kk][ii][jj][xx][yy].mfe, EStack(xx,uu,vv,yy) + Zs[newK][ii+1][jj-1][uu][vv].mfe); +#ifdef DEBUG_SAMPLING + if ((ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) debug += boltzmannStack(xx,uu,vv,yy) * Zs[newK][ii+1][jj-1][uu][vv].pf; +#endif + ii_list++; + } + } + } + +#ifdef DEBUG_SAMPLING + if ((ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) printf("stack: %e\n",debug-pdebug); + pdebug = debug; +#endif + + /* lookup special internal loops */ + for (cloop=0;cloop<4;cloop++) { + + nb_nt = 6 + (cloop>>1) + (cloop&1); /* number of nt in the internal loop */ + nb_max_mut=minimum(nb_nt,kk); + + for (nb_mut_motif=0;nb_mut_motif<=nb_max_mut;nb_mut_motif++) { + list_config = loop_tab[nb_mut_motif][cloop][ii][jj]; + ii_list = 0; + while ((config=list_config[ii_list])) { + switch (cloop) { + case 0: + if (!is_internal_loop(ii,ii+2,jj-2,jj)) break; /* lookup structure constraints */ + xx=config>>10; + aa=(config>>8)&3; + uu=(config>>6)&3; + vv=(config>>4)&3; + bb=(config>>2)&3; + yy=config&3; + newK = kk - nb_mut_motif + kronecker(ii+2,uu) + kronecker(jj-2,vv); + Zs[kk][ii][jj][xx][yy].pf += boltzmannInternal_1x1(xx,aa,uu,vv,bb,yy) * Zs[newK][ii+2][jj-2][uu][vv].pf * + nucleotide_bias(ii,xx) * nucleotide_bias(jj,yy) * nucleotide_bias(ii+1,aa) * nucleotide_bias(jj-1,bb); + Zs[kk][ii][jj][xx][yy].mfe = minimum_double(Zs[kk][ii][jj][xx][yy].mfe,EInternal_1x1(xx,aa,uu,vv,bb,yy) + Zs[newK][ii+2][jj-2][uu][vv].mfe); +#ifdef DEBUG_SAMPLING + if ((ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) debug += boltzmannInternal_1x1(xx,aa,uu,vv,bb,yy) * Zs[newK][ii+2][jj-2][uu][vv].pf; +#endif + break; + case 1: + if (!is_internal_loop(ii,ii+2,jj-3,jj)) break; /* lookup structure constraints */ + xx=config>>12; + aa=(config>>10)&3; + uu=(config>>8)&3; + vv=(config>>6)&3; + cc=(config>>4)&3; + bb=(config>>2)&3; + yy=config&3; + newK = kk - nb_mut_motif + kronecker(ii+2,uu) + kronecker(jj-3,vv); + Zs[kk][ii][jj][xx][yy].pf += boltzmannInternal_1x2(xx,aa,uu,vv,cc,bb,yy) * Zs[newK][ii+2][jj-3][uu][vv].pf * + nucleotide_bias(ii,xx) * nucleotide_bias(jj,yy) * nucleotide_bias(ii+1,aa) * nucleotide_bias(jj-2,cc) * nucleotide_bias(jj-1,bb); + Zs[kk][ii][jj][xx][yy].mfe = minimum_double(Zs[kk][ii][jj][xx][yy].mfe,EInternal_1x2(xx,aa,uu,vv,cc,bb,yy) + Zs[newK][ii+2][jj-3][uu][vv].mfe); +#ifdef DEBUG_SAMPLING + if ((ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) debug += boltzmannInternal_1x2(xx,aa,uu,vv,cc,bb,yy) * Zs[newK][ii+2][jj-3][uu][vv].pf; +#endif + break; + case 2: + if (!is_internal_loop(ii,ii+3,jj-2,jj)) break; /* lookup structure constraints */ + xx=config>>12; + aa=(config>>10)&3; + cc=(config>>8)&3; + uu=(config>>6)&3; + vv=(config>>4)&3; + bb=(config>>2)&3; + yy=config&3; + newK = kk - nb_mut_motif + kronecker(ii+3,uu) + kronecker(jj-2,vv); + Zs[kk][ii][jj][xx][yy].pf += boltzmannInternal_2x1(xx,aa,cc,uu,vv,bb,yy) * Zs[newK][ii+3][jj-2][uu][vv].pf * + nucleotide_bias(ii,xx) * nucleotide_bias(jj,yy) * nucleotide_bias(ii+1,aa) * nucleotide_bias(ii+2,cc) * nucleotide_bias(jj-1,bb); + Zs[kk][ii][jj][xx][yy].mfe = minimum_double(Zs[kk][ii][jj][xx][yy].mfe,EInternal_2x1(xx,aa,cc,uu,vv,bb,yy) + Zs[newK][ii+3][jj-2][uu][vv].mfe); +#ifdef DEBUG_SAMPLING + if ((ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) debug += boltzmannInternal_2x1(xx,aa,cc,uu,vv,bb,yy) * Zs[newK][ii+3][jj-2][uu][vv].pf; +#endif + break; + case 3: + if (!is_internal_loop(ii,ii+3,jj-3,jj)) break; /* lookup structure constraints */ + xx=config>>14; + aa=(config>>12)&3; + cc=(config>>10)&3; + uu=(config>>8)&3; + vv=(config>>6)&3; + dd=(config>>4)&3; + bb=(config>>2)&3; + yy=config&3; + newK = kk - nb_mut_motif + kronecker(ii+3,uu) + kronecker(jj-3,vv); + Zs[kk][ii][jj][xx][yy].pf += boltzmannInternal_2x2(xx,aa,cc,uu,vv,dd,bb,yy) * Zs[newK][ii+3][jj-3][uu][vv].pf * + nucleotide_bias(ii,xx) * nucleotide_bias(jj,yy) * nucleotide_bias(ii+1,aa) * nucleotide_bias(ii+2,cc) * nucleotide_bias(jj-2,dd) * nucleotide_bias(jj-1,bb); + Zs[kk][ii][jj][xx][yy].mfe = minimum_double(Zs[kk][ii][jj][xx][yy].mfe,EInternal_2x2(xx,aa,cc,uu,vv,dd,bb,yy) + Zs[newK][ii+3][jj-3][uu][vv].mfe); +#ifdef DEBUG_SAMPLING + if ((ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) debug += boltzmannInternal_2x2(xx,aa,cc,uu,vv,dd,bb,yy) * Zs[newK][ii+3][jj-3][uu][vv].pf; +#endif + break; + } + ii_list++; + } + } + } + +#ifdef DEBUG_SAMPLING + if ((ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) printf("special cases: %e\n",debug-pdebug); + pdebug = debug; +#endif + + /** 1xn and nx1 internal loops **/ + + nb_free_nt = minimum(__max_size_bulge__,len - __hairpin_min_length__ - 7); + + /** enumerate **/ + + for (nn=1;nn<=nb_free_nt;nn++) { /* number of undefined nucleotides in internal loop */ + + nb_max_mut_close_bp=minimum(4,kk); + + for (nb_mut_close_bp=0;nb_mut_close_bp<=nb_max_mut_close_bp;nb_mut_close_bp++) { + + list_config_close = stack_tab[nb_mut_close_bp][ii][jj][1]; + ii_list_close = 0; + + while ((config_close=list_config_close[ii_list_close])) { + + xx=config_close>>6; + aa=(config_close>>4)&3; + bb=(config_close>>2)&3; + yy=config_close&3; + + /** 1xn **/ + + if (is_internal_loop(ii,ii+2,jj-3-nn,jj)) { /* lookup structure constraints */ + + nt2mut=nn-cst_segment[jj-1-nn][nn-1]; + nb_max_mut_unk_loop = minimum(nt2mut,kk-nb_mut_close_bp); /* to be adjusted later */ + + for (nb_mut_unk_loop=0;nb_mut_unk_loop<=nb_max_mut_unk_loop;nb_mut_unk_loop++) { /* number of mutations in unknown part of loops */ + + /** dont forget to add kronecker because mutation on single loop is be counted twice **/ + nb_max_mut_open_bp=minimum(4,kk-nb_mut_unk_loop-nb_mut_close_bp+kronecker(ii+1,aa)); + + for (nb_mut_open_bp=0;nb_mut_open_bp<=nb_max_mut_open_bp;nb_mut_open_bp++) { + + list_config_open = stack_tab[nb_mut_open_bp][ii+1][jj-2-nn][2]; + ii_list_open = 0; + while ((config_open=list_config_open[ii_list_open])) { + + cc=(config_open>>6)&3; + +#if DEEP_DEBUG + if (kk==0) { + printf("--------------------------------\n"); + printf("Close: %d-%d\n",xx,yy); + printf("Close: %d %d\n",aa,bb); + printf("Open: %d %d\n",(config_open>>6)&3,(config_open>>0)&3); + printf("Open: %d-%d\n",(config_open>>4)&3,(config_open>>2)&3); + } +#endif + + if (aa==cc) { + + uu=(config_open>>4)&3; + vv=(config_open>>2)&3; + dd=config_open&3; + + newK = kk - nb_mut_close_bp - nb_mut_open_bp - nb_mut_unk_loop + kronecker(ii+1,aa) + kronecker(ii+2,uu) + kronecker(jj-3-nn,vv); + + if (newK>=0) { + + /* cmpt_mutants = genereMutant(nt2mut,nb_mut_unk_loop); */ + cmpt_mutants = sequence_bias(jj-1-nn,jj-2,nb_mut_unk_loop); + + if (cmpt_mutants>0) { + Zs[kk][ii][jj][xx][yy].pf += boltzmannInternal_generic(xx,aa,cc,uu,vv,dd,bb,yy,1,nn+2) * + Zs[newK][ii+2][jj-3-nn][uu][vv].pf * cmpt_mutants * nucleotide_bias(ii,xx) * nucleotide_bias(ii+1,aa) * + nucleotide_bias(jj-2-nn,dd) * nucleotide_bias(jj-1,bb) * nucleotide_bias(jj,yy); + Zs[kk][ii][jj][xx][yy].mfe = minimum_double(Zs[kk][ii][jj][xx][yy].mfe, + EInternal_generic(xx,aa,cc,uu,vv,dd,bb,yy,1,nn+2) + Zs[newK][ii+2][jj-3-nn][uu][vv].mfe); +#ifdef DEBUG_SAMPLING + if ((ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) debug += boltzmannInternal_generic(xx,aa,cc,uu,vv,dd,bb,yy,1,nn+2) * + Zs[newK][ii+2][jj-3-nn][uu][vv].pf * cmpt_mutants; +#endif + } + } + } + ii_list_open++; + } + } + } + } + + /** nx1 **/ + + if (is_internal_loop(ii,ii+3+nn,jj-2,jj)) { /* lookup structure constraints */ + + nt2mut=nn-cst_segment[ii+2][nn-1]; + nb_max_mut_unk_loop = minimum(nt2mut,kk-nb_mut_close_bp); /* to be adjusted later */ + + for (nb_mut_unk_loop=0;nb_mut_unk_loop<=nb_max_mut_unk_loop;nb_mut_unk_loop++) { /* number of mutations in unknown part of loops */ + + /** dont forget to add kronecker because mutation on single loop is be counted twice **/ + nb_max_mut_open_bp=minimum(4,kk-nb_mut_unk_loop-nb_mut_close_bp+kronecker(jj-1,bb)); + + for (nb_mut_open_bp=0;nb_mut_open_bp<=nb_max_mut_open_bp;nb_mut_open_bp++) { + + list_config_open = stack_tab[nb_mut_open_bp][ii+2+nn][jj-1][2]; + ii_list_open = 0; + while ((config_open=list_config_open[ii_list_open])) { + + dd=config_open&3; + + if (bb==dd) { + + cc=(config_open>>6)&3; + uu=(config_open>>4)&3; + vv=(config_open>>2)&3; + + newK = kk - nb_mut_close_bp - nb_mut_open_bp - nb_mut_unk_loop + kronecker(jj-1,bb) + kronecker(ii+3+nn,uu) + kronecker(jj-2,vv); + if (newK>=0) { + + /* cmpt_mutants = genereMutant(nt2mut,nb_mut_unk_loop); */ + cmpt_mutants = sequence_bias(ii+2,ii+nn+1,nb_mut_unk_loop); + + if (cmpt_mutants>0) { + Zs[kk][ii][jj][xx][yy].pf += boltzmannInternal_generic(xx,aa,cc,uu,vv,dd,bb,yy,nn+2,1) * + Zs[newK][ii+3+nn][jj-2][uu][vv].pf * cmpt_mutants * nucleotide_bias(ii,xx) * nucleotide_bias(ii+1,aa) * + nucleotide_bias(ii+2+nn,cc) * nucleotide_bias(jj-1,bb) * nucleotide_bias(jj,yy); + Zs[kk][ii][jj][xx][yy].mfe = minimum_double(Zs[kk][ii][jj][xx][yy].mfe, + EInternal_generic(xx,aa,cc,uu,vv,dd,bb,yy,nn+2,1) + Zs[newK][ii+3+nn][jj-2][uu][vv].mfe); +#ifdef DEBUG_SAMPLING + if ((ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) debug += boltzmannInternal_generic(xx,aa,cc,uu,vv,dd,bb,yy,nn+2,1) * + Zs[newK][ii+3+nn][jj-2][uu][vv].pf * cmpt_mutants * nucleotide_bias(ii,xx) * nucleotide_bias(ii+1,aa) * + nucleotide_bias(ii+2+nn,cc) * nucleotide_bias(jj-1,bb) * nucleotide_bias(jj,yy); +#endif + } + } + } + ii_list_open++; + } + } + } + } + ii_list_close++; + } + } + } + +#ifdef DEBUG_SAMPLING + if ((ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) printf("1xn & nx1: %e\n",debug-pdebug); + pdebug = debug; +#endif + /** mxn internal loops (m+n>4) **/ + + nb_free_nt = minimum(2*__max_size_bulge__,len - __hairpin_min_length__ - 8); + + /** lookup closing pair first because it's more expensive **/ + nb_max_mut_close_bp=minimum(4-cst_tape[ii]-cst_tape[ii+1]-cst_tape[jj-1]-cst_tape[jj],kk); + + for (nb_mut_close_bp=0;nb_mut_close_bp<=nb_max_mut_close_bp;nb_mut_close_bp++) { + + list_config_close = stack_tab[nb_mut_close_bp][ii][jj][1]; + ii_list_close = 0; + + while ((config_close=list_config_close[ii_list_close])) { + + xx=config_close>>6; + aa=(config_close>>4)&3; + bb=(config_close>>2)&3; + yy=config_close&3; + + for (nn=1;nn<=nb_free_nt;nn++) { /* number of undefined nucleotides in internal loop */ + + min_rr = maximum(0,nn-__max_size_bulge__); + max_rr = minimum(nn,__max_size_bulge__); + + for (rr=min_rr;rr<=max_rr;rr++) { + ll=nn-rr; + + if (!is_internal_loop(ii,ii+3+ll,jj-3-rr,jj)) continue; /* lookup structure constraints */ + + nt2mut=nn; + if (ll>0) { nt2mut -= cst_segment[ii+2][ll-1]; } + if (rr>0) { nt2mut -= cst_segment[jj-1-rr][rr-1]; } + nb_max_mut_unk_loop = minimum(nt2mut,kk-nb_mut_close_bp); + + for (nb_mut_unk_loop=0;nb_mut_unk_loop<=nb_max_mut_unk_loop;nb_mut_unk_loop++) { /* number of mutations in unknown part of loops */ + + nb_max_mut_open_bp=minimum(4-cst_tape[ii+2+ll]-cst_tape[ii+3+ll]-cst_tape[jj-2-rr]-cst_tape[jj-3-rr],kk-nb_mut_unk_loop-nb_mut_close_bp); + + for (nb_mut_open_bp=0;nb_mut_open_bp<=nb_max_mut_open_bp;nb_mut_open_bp++) { + list_config_open = stack_tab[nb_mut_open_bp][ii+2+ll][jj-2-rr][2]; + ii_list_open = 0; + while ((config_open=list_config_open[ii_list_open])) { + + cc=(config_open>>6)&3; + uu=(config_open>>4)&3; + vv=(config_open>>2)&3; + dd=config_open&3; + + newK = kk - nb_mut_close_bp - nb_mut_open_bp - nb_mut_unk_loop + kronecker(ii+3+ll,uu) + kronecker(jj-3-rr,vv); + if (newK>=0) { + +#if 0 + if (kk==0) { + printf("kk=%d,newK=%d,close=%d,open=%d,unk=%d,ll=%d,rr=%d at %d,%d to %d,%d\n", + kk,newK,nb_mut_close_bp,nb_mut_open_bp,nb_mut_unk_loop,ll,rr,ii,jj,ii+3+ll,jj-3-rr); + } +#endif + + /* cmpt_mutants = genereMutant(nt2mut,nb_mut_unk_loop); */ + cmpt_mutants = sequence_bias(ii+2,ii+1+ll,nb_mut_unk_loop) + sequence_bias(jj-1-rr,jj-2,nb_mut_unk_loop) + + sequence_bias(ii+2,jj-2,nb_mut_unk_loop) + - sequence_bias(ii+2,jj-2-rr,nb_mut_unk_loop) - sequence_bias(ii+2+ll,jj-2,nb_mut_unk_loop) + + sequence_bias(ii+2+ll,jj-2-rr,nb_mut_unk_loop); + + if (cmpt_mutants>0) { + Zs[kk][ii][jj][xx][yy].pf += boltzmannInternal_generic(xx,aa,cc,uu,vv,dd,bb,yy,ll+2,rr+2) * + Zs[newK][ii+3+ll][jj-3-rr][uu][vv].pf * cmpt_mutants * nucleotide_bias(ii,xx) * nucleotide_bias(ii+1,aa) * + nucleotide_bias(ii+2+ll,cc) * nucleotide_bias(jj-2-rr,dd) * nucleotide_bias(jj-1,bb) * nucleotide_bias(jj,yy); + Zs[kk][ii][jj][xx][yy].mfe = minimum_double(Zs[kk][ii][jj][xx][yy].mfe, + EInternal_generic(xx,aa,cc,uu,vv,dd,bb,yy,ll+2,rr+2) + Zs[newK][ii+3+ll][jj-3-rr][uu][vv].mfe); +#ifdef DEBUG_SAMPLING + if ((ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) { + debug += boltzmannInternal_generic(xx,aa,cc,uu,vv,dd,bb,yy,ll+2,rr+2) + * Zs[newK][ii+3+ll][jj-3-rr][uu][vv].pf * cmpt_mutants + * nucleotide_bias(ii,xx) * nucleotide_bias(ii+1,aa) + * nucleotide_bias(ii+2+ll,cc) * nucleotide_bias(jj-2-rr,dd) + * nucleotide_bias(jj-1,bb) * nucleotide_bias(jj,yy); + } +#endif + } + } + ii_list_open++; + } + } + } + } + } + ii_list_close++; + } + } + + } + +#ifdef DEBUG_SAMPLING + if ((ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) printf("generic loop: %e\n",debug-pdebug); + pdebug = debug; +#endif + + for (xx=0;xx<4;xx++) { + + if (kronecker(ii,xx) && cst_tape[ii]) continue; + + for (yy=0;yy<4;yy++) { + + if (kronecker(jj,yy) && cst_tape[jj]) continue; + + /* lookup bulge & multi-loop WARNING: THIS SECTION HAS NOT BEEN OPTIMIZED */ + + /* bulges */ + + if (validBasePair(xx,yy) && is_basepair(ii,jj)) { /* special case when xx and yy base pair */ + + nb_mut_inside_boundary = kk - kronecker(ii,xx) - kronecker(jj,yy); + + if (nb_mut_inside_boundary>=0) { + + if (len > __hairpin_min_length__ +4) { /* min length required for a stack */ + + for (uu=0;uu<4;uu++) { + + for (vv=0;vv<4;vv++) { + + if (validBasePair(uu,vv)) { + + nb_free_nt = minimum(__max_size_bulge__,len - __hairpin_min_length__ - 4); + + /* bulge */ + + for (size_bulge=1;size_bulge<=nb_free_nt;size_bulge++) { /* size of the bulge */ + + /* we need to distinguish the bulge because the asymetry of constraints */ + + /* bulge on the left */ + + newii = ii+1+size_bulge; + newjj = jj-1; + + if (is_internal_loop(ii,newii,newjj,jj)) { /* lookup structure constraints */ + + if (!(kronecker(newii,uu) && cst_tape[newii])|| + !(kronecker(newjj,vv) && cst_tape[newjj])) { + + nt2mut=size_bulge-cst_segment[ii+1][size_bulge-1]; + nb_max_mut_in_bulge = minimum(nt2mut,nb_mut_inside_boundary); + + for (nb_mut_in_bulge=0;nb_mut_in_bulge<=nb_max_mut_in_bulge;nb_mut_in_bulge++) { /* number of mutations in bulge */ + newK = nb_mut_inside_boundary - nb_mut_in_bulge; + if (newK>=0) { + if (Zs[newK][newii][newjj][uu][vv].pf) { + + /* cmpt_mutants = genereMutant(nt2mut,nb_mut_in_bulge); */ + cmpt_mutants = sequence_bias(ii+1,ii+size_bulge,nb_mut_in_bulge); + + if (cmpt_mutants>0) { + Zs[kk][ii][jj][xx][yy].pf += boltzmannBulge(xx,uu,vv,yy,size_bulge) * + Zs[newK][newii][newjj][uu][vv].pf * cmpt_mutants * nucleotide_bias(ii,xx) * nucleotide_bias(jj,yy); + Zs[kk][ii][jj][xx][yy].mfe = minimum_double(Zs[kk][ii][jj][xx][yy].mfe, + EBulge(xx,uu,vv,yy,size_bulge) + Zs[newK][newii][newjj][uu][vv].mfe); +#ifdef DEBUG_SAMPLING + if ((ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) debug += boltzmannBulge(xx,uu,vv,yy,size_bulge) * + Zs[newK][newii][newjj][uu][vv].pf * cmpt_mutants; +#endif + } + } + } + } + } + } + + /* bulge on the right */ + + newii = ii+1; + newjj = jj-1-size_bulge; + + if (is_internal_loop(ii,newii,newjj,jj)) { /* lookup structure constraints */ + + if (!(kronecker(newii,uu) && cst_tape[newii])|| + !(kronecker(newjj,vv) && cst_tape[newjj])) { + + nt2mut=size_bulge-cst_segment[jj-size_bulge][size_bulge-1]; + nb_max_mut_in_bulge = minimum(nt2mut,nb_mut_inside_boundary); + + for (nb_mut_in_bulge=0;nb_mut_in_bulge<=nb_max_mut_in_bulge;nb_mut_in_bulge++) { /* number of mutations in bulge */ + newK = nb_mut_inside_boundary - nb_mut_in_bulge; + if (newK>=0) { + if (Zs[newK][newii][newjj][uu][vv].pf) { + + /* cmpt_mutants = genereMutant(nt2mut,nb_mut_in_bulge); */ + cmpt_mutants = sequence_bias(jj-size_bulge,jj-1,nb_mut_in_bulge); + + if (cmpt_mutants>0) { + Zs[kk][ii][jj][xx][yy].pf += boltzmannBulge(xx,uu,vv,yy,size_bulge) * + Zs[newK][newii][newjj][uu][vv].pf * cmpt_mutants * nucleotide_bias(ii,xx) * nucleotide_bias(jj,yy); + Zs[kk][ii][jj][xx][yy].mfe = minimum_double(Zs[kk][ii][jj][xx][yy].mfe, + EBulge(xx,uu,vv,yy,size_bulge) + Zs[newK][newii][newjj][uu][vv].mfe); +#ifdef DEBUG_SAMPLING + if ((ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) debug += boltzmannBulge(xx,uu,vv,yy,size_bulge) * + Zs[newK][newii][newjj][uu][vv].pf * cmpt_mutants; +#endif + } + } + } + } + } + } + } + } + + /* close multi-loop*/ + + if ((ii=(rr-ii-1)) { /* lookup structure constraints */ + + if ((!((cst_tape[ii])&&(kronecker(ii,xx))))&&(validBasePair(uu,yy))) { + + if (rr-ii>1) { + + nt2mut = rr-ii-1 - cst_segment[ii+1][rr-ii-2]; + newK = minimum(nt2mut,nb_mut_inside_boundary); + + for (ee=0;ee<=newK;ee++) { + + /* cmpt_mutants = genereMutant(nt2mut,ee); */ + cmpt_mutants = sequence_bias(ii+1,rr-1,ee) * nucleotide_bias(ii,xx); + + if (cmpt_mutants > 0) { + Zes[kk][ii][jj][xx][yy].pf += Zs[nb_mut_inside_boundary-ee][rr][jj][uu][yy].pf * boltzmann_penalty_close_helix(uu,yy) * cmpt_mutants; + Zes[kk][ii][jj][xx][yy].mfe = minimum_double(Zes[kk][ii][jj][xx][yy].mfe, + Zs[nb_mut_inside_boundary-ee][rr][jj][uu][yy].mfe + penalty_close_helix(uu,yy)); + Zms[kk][ii][jj][xx][yy].pf += Zs[nb_mut_inside_boundary-ee][rr][jj][uu][yy].pf * boltzmann_penalty_close_helix(uu,yy) * cmpt_mutants * boltzmannExtendMultiLoop(rr-ii); + Zms[kk][ii][jj][xx][yy].mfe = minimum_double(Zms[kk][ii][jj][xx][yy].mfe, + Zs[nb_mut_inside_boundary-ee][rr][jj][uu][yy].mfe + penalty_close_helix(uu,yy) + EExtendMultiLoop(rr-ii)); + } + } + } + else { + newK = kk - kronecker(ii,xx); + if (newK>=0) { + Zes[kk][ii][jj][xx][yy].pf += Zs[newK][rr][jj][uu][yy].pf * boltzmann_penalty_close_helix(uu,yy) * nucleotide_bias(ii,xx); + Zes[kk][ii][jj][xx][yy].mfe = minimum_double(Zes[kk][ii][jj][xx][yy].mfe,Zs[newK][rr][jj][uu][yy].mfe + penalty_close_helix(uu,yy)); + Zms[kk][ii][jj][xx][yy].pf += Zs[newK][rr][jj][uu][yy].pf * boltzmann_penalty_close_helix(uu,yy) * nucleotide_bias(ii,xx) * boltzmannExtendMultiLoop(1); + Zms[kk][ii][jj][xx][yy].mfe = minimum_double(Zms[kk][ii][jj][xx][yy].mfe,Zs[newK][rr][jj][uu][yy].mfe + penalty_close_helix(uu,yy) + EExtendMultiLoop(1)); + } + } + } + } + + if (rr-ii>__hairpin_min_length__+1) { + for (vv=0;vv<4;vv++) { + if (validBasePair(vv,yy)) { + for (ee=0;ee<=kk;ee++) { + + /* more than 2 helices */ + Zm[kk][ii][jj][xx][yy].pf += Zm[ee][ii][rr-1][xx][uu].pf * Zs[kk-ee][rr][jj][vv][yy].pf * boltzmann_penalty_close_helix(vv,yy) * boltzmannAddStemInMultiLoop(1); + Zm[kk][ii][jj][xx][yy].mfe = minimum_double(Zm[kk][ii][jj][xx][yy].mfe, + Zm[ee][ii][rr-1][xx][uu].mfe + Zs[kk-ee][rr][jj][vv][yy].mfe + penalty_close_helix(vv,yy) + EAddStemInMultiLoop(1)); + Ze[kk][ii][jj][xx][yy].pf += Ze[ee][ii][rr-1][xx][uu].pf * Zs[kk-ee][rr][jj][vv][yy].pf * boltzmann_penalty_close_helix(vv,yy); + Ze[kk][ii][jj][xx][yy].mfe = minimum_double(Ze[kk][ii][jj][xx][yy].mfe, + Ze[ee][ii][rr-1][xx][uu].mfe + Zs[kk-ee][rr][jj][vv][yy].mfe + penalty_close_helix(vv,yy)); + /* exactly 2 helices */ + Zm[kk][ii][jj][xx][yy].pf += Zms[ee][ii][rr-1][xx][uu].pf * Zs[kk-ee][rr][jj][vv][yy].pf * boltzmann_penalty_close_helix(vv,yy) * boltzmannAddStemInMultiLoop(2); + Zm[kk][ii][jj][xx][yy].mfe = minimum_double(Zm[kk][ii][jj][xx][yy].mfe, + Zms[ee][ii][rr-1][xx][uu].mfe + Zs[kk-ee][rr][jj][vv][yy].mfe + penalty_close_helix(vv,yy) + EAddStemInMultiLoop(2)); + Ze[kk][ii][jj][xx][yy].pf += Zes[ee][ii][rr-1][xx][uu].pf * Zs[kk-ee][rr][jj][vv][yy].pf * boltzmann_penalty_close_helix(vv,yy); + Ze[kk][ii][jj][xx][yy].mfe = minimum_double(Ze[kk][ii][jj][xx][yy].mfe, + Zes[ee][ii][rr-1][xx][uu].mfe + Zs[kk-ee][rr][jj][vv][yy].mfe + penalty_close_helix(vv,yy)); + } + } + } + } + } + } + + /* extend all tables with an unpaired nucleotide on right side */ + + if (single_strand_length(jj)>0) { /* lookup structure constraints */ + + if (len>__hairpin_min_length__+2) { /* minimum length required */ + if (!((cst_tape[jj])&&(kronecker(jj,yy)))) { + for (uu=0;uu<4;uu++) { + /* right */ + newK = kk - kronecker(jj,yy); + if (newK>=0) { + Zes[kk][ii][jj][xx][yy].pf += Zes[newK][ii][jj-1][xx][uu].pf * nucleotide_bias(jj,yy); + Zes[kk][ii][jj][xx][yy].mfe = minimum_double(Zes[kk][ii][jj][xx][yy].mfe,Zes[newK][ii][jj-1][xx][uu].mfe); + Ze[kk][ii][jj][xx][yy].pf += Ze[newK][ii][jj-1][xx][uu].pf * nucleotide_bias(jj,yy); + Ze[kk][ii][jj][xx][yy].mfe = minimum_double(Ze[kk][ii][jj][xx][yy].mfe,Ze[newK][ii][jj-1][xx][uu].mfe); + Zms[kk][ii][jj][xx][yy].pf += boltzmannExtendMultiLoop(1) * Zms[newK][ii][jj-1][xx][uu].pf * nucleotide_bias(jj,yy); + Zms[kk][ii][jj][xx][yy].mfe = minimum_double(Zms[kk][ii][jj][xx][yy].mfe,EExtendMultiLoop(1) + Zms[newK][ii][jj-1][xx][uu].mfe); + Zm[kk][ii][jj][xx][yy].pf += boltzmannExtendMultiLoop(1) * Zm[newK][ii][jj-1][xx][uu].pf * nucleotide_bias(jj,yy); + Zm[kk][ii][jj][xx][yy].mfe = minimum_double(Zm[kk][ii][jj][xx][yy].mfe,EExtendMultiLoop(1) + Zm[newK][ii][jj-1][xx][uu].mfe); + } + } + } + } + } + } + } + +#ifdef DEBUG_SAMPLING + if ((ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) printf("bulge & multi: %e\n",debug-pdebug); + pdebug = debug; +#endif + } + } + + + if (verbose) { + current = clock(); + cpu_time_used = ((double) (current - start)) / CLOCKS_PER_SEC; + printf(">%d\t%g\n",kk,cpu_time_used); + } + + } + + fprintf(stderr,"\r \r");fflush(stderr); +#ifdef INFO + printf("\n"); +#endif + +} + + +/*********************************************************************/ +/* */ +/* Main */ +/* */ +/*********************************************************************/ + +int main(int argc, char **argv) { + + int param_temperature=37; /* define as integer as in mfold */ + char *samplefile=NULL,*param_temperature_as_string = strdup("37"); + double formal_temperature=0.0; /* used in Boltzmann computation */ + const char *input_filename=NULL, *mutation_matrix_filename=NULL; + const char *input_string=NULL; + static int verbose_flag=0, mfold3_flag=1,input_string_flag=0,input_file_flag=0,sample_output_stats_flag=0,hybrid_flag=0,cst_flag=0; + char *input_param_directory=NULL, *library_path=strdup("lib"); + char *partition_function_output_filename=NULL, *mfe_output_filename=NULL, *sample_output_filename=NULL; + int *compatible_neighbors,compatible_neighbors_flag=0; + + static struct option long_options[] = + { + {"file", required_argument, 0, 'f'}, + {"string", required_argument, 0, 's'}, + {"constraints",no_argument, 0, 'C'}, + {"turner99", no_argument, &mfold3_flag, 1}, + {"mutations",required_argument, 0, 'm'}, + {"sample-number",required_argument, 0, 'n'}, + {"sample-file",required_argument, 0, 'N'}, + {"sample-stats",no_argument, &sample_output_stats_flag, 1}, + {"Z-output",required_argument, 0, '0'}, + {"mfe-output",required_argument, 0, '1'}, + {"sample-output",required_argument, 0, '2'}, + {"temperature",required_argument, 0, 't'}, + {"absolute-temperature",required_argument, 0, 'T'}, + {"help", no_argument, 0, 'h'}, + {"version", no_argument, 0, 'V'}, + {"warning", no_argument, 0, 'w'}, + {"verbose", no_argument, 0, 'v'}, + {"energy-model",required_argument, 0, 'e'}, + {"library",required_argument, 0, 'l'}, + {"hybrid",no_argument, 0, 'H'}, + {"job-id", required_argument, 0, 'J'}, + {"bias", required_argument, 0, 'M'}, + {0, 0, 0, 0} + }; + + /* parse line command */ + + while (1) { + + /* getopt_long stores the option index here. */ + int c, option_index = 0; + + c = getopt_long (argc, argv, "f:s:l:CHm:n:N:M:e:t:T:hJ:vVw0:1:2:", long_options, &option_index); + + /* Detect the end of the options. */ + if (c == -1) + break; + + switch (c) { + case 'f': + input_filename=strdup(optarg); + input_file_flag = 1; + break; + case 's': + input_string=strdup(optarg); + input_string_flag = 1; + break; + case 'C': + cst_flag=1; + break; + case 'm': + max_mutations = atoi(optarg)+1; + if (max_mutations<1) { + fprintf(stderr,"WARNING: Corrupted number of mutations. Ignored. %s\n", getJobID()); + max_mutations=0; + } + break; + case 'M': + mutation_matrix_filename = strdup(optarg); + break; + case 'n': + number_of_sample = atoi(optarg); + break; + case 'N': + samplefile = strdup(optarg); + break; + case '0': + partition_function_output_filename = strdup(optarg); + break; + case '1': + mfe_output_filename = strdup(optarg); + break; + case '2': + sample_output_filename = strdup(optarg); + break; + case 'h': + usage(argv[0]); + case 'v': + verbose_flag = 1; + break; + case 'V': + version(); + case 't': + param_temperature = atoi(optarg); + param_temperature_as_string = strdup(optarg); + mfold3_flag=0; /* remove mfold3 flag */ + break; + case 'T': + formal_temperature = atof(optarg); + break; + case 'e': + input_param_directory = strdup(optarg); + break; + case 'l': + library_path = strdup(optarg); + break; + case 'x': + cutpoint = atoi(optarg); + break; + case 'H': + hybrid_flag = 1; + break; + case 'J': + setJobID(optarg); + break; + } + } + + /* check if argv[optind] is valid */ + + if ((warning_flag)&&(optind != (argc))) { + int iargv; + fprintf(stderr,"WARNING: invalid syntax. Following argument(s) are ignored: "); + for (iargv=optind;iargv 100)) { + if (param_temperature < 0) { + param_temperature = 0; + } + if (param_temperature > 100) { + param_temperature = 100; + } + if (warning_flag) { + fprintf(stderr,"WARNING: Temperature out of range. Value must range between 0 and 100. Updated to %dC.%s\n",param_temperature,getJobID()); + } + } + + if (formal_temperature < 0) { + formal_temperature = 0.0; + if (warning_flag) { + fprintf(stderr,"WARNING: Negative formal temperature is not supported. Value updated to %fK.%s\n",formal_temperature,getJobID()); + } + } + + /* print info on system precision */ + + if (verbose_flag) { + printf("> system features : epsilon=%e, max. value=%e, precision=%d digit\n", + DBL_EPSILON, DBL_MAX, DBL_DIG); + } + + /* read the data and store then in tables */ + + { + char basename[200], filename[200]; + + if (verbose_flag) { + printf("> read parameter files defined for %s Celsius degrees\n",param_temperature_as_string); + } + + /* build path to the directory where files are stored */ + + basename[0] = '\0'; + if (input_param_directory) { + if ((library_path)&&(warning_flag)) { + fprintf(stderr,"WARNING: Library path directory not used.%s\n",getJobID()); + } + strcat(&basename[0],input_param_directory); + param_temperature_as_string = strdup("dat"); + } + else { + if (library_path) { + strcat(&basename[0],library_path); + strcat(&basename[0],"/"); + strcat(&basename[0],param_temperature_as_string); + } + else { + strcat(&basename[0],"./"); + strcat(&basename[0],param_temperature_as_string); + } + } + + strcat(&basename[0],"/"); + + /* read each parameter files */ + + /* asint1x2 */ + memcpy(&filename[0],&basename[0],200*sizeof(char)); + strcat(&filename[0],"asint1x2.lop."); + strcat(&filename[0],param_temperature_as_string); + readAsint1x2(filename); + + /* dangle */ + memcpy(&filename[0],&basename[0],200*sizeof(char)); + strcat(&filename[0],"dangle.lop."); + strcat(&filename[0],param_temperature_as_string); + readDangle(filename); + + /* loop */ + memcpy(&filename[0],&basename[0],200*sizeof(char)); + strcat(&filename[0],"loop.lop."); + strcat(&filename[0],param_temperature_as_string); + readLoop(filename); + + /* miscloop */ + memcpy(&filename[0],&basename[0],200*sizeof(char)); + strcat(&filename[0],"miscloop.lop."); + strcat(&filename[0],param_temperature_as_string); + readMiscLoop(filename); + + /* stack */ + memcpy(&filename[0],&basename[0],200*sizeof(char)); + strcat(&filename[0],"stack.lop."); + strcat(&filename[0],param_temperature_as_string); + readStack(filename); + + /* sint2 */ + memcpy(&filename[0],&basename[0],200*sizeof(char)); + strcat(&filename[0],"sint2.lop."); + strcat(&filename[0],param_temperature_as_string); + readSint2(filename); + + /* sint4 */ + memcpy(&filename[0],&basename[0],200*sizeof(char)); + strcat(&filename[0],"sint4.lop."); + strcat(&filename[0],param_temperature_as_string); + readSint4(filename); + + /* tloop */ + memcpy(&filename[0],&basename[0],200*sizeof(char)); + strcat(&filename[0],"tloop.lop."); + strcat(&filename[0],param_temperature_as_string); + readTetraLoop(filename); + + /* triloop */ + memcpy(&filename[0],&basename[0],200*sizeof(char)); + strcat(&filename[0],"triloop.lop."); + strcat(&filename[0],param_temperature_as_string); + readTriLoop(filename); + + /* tsatcki */ + memcpy(&filename[0],&basename[0],200*sizeof(char)); + strcat(&filename[0],"tstacki.lop."); + strcat(&filename[0],param_temperature_as_string); + readTstacki(filename); + + /* tstackh */ + memcpy(&filename[0],&basename[0],200*sizeof(char)); + strcat(&filename[0],"tstackh.lop."); + strcat(&filename[0],param_temperature_as_string); + readTstackh(filename); + + } + + /* update formal temperature */ + + { + if (formal_temperature) { + if (__temperature != formal_temperature) { + __temperature = formal_temperature; + } + } + else { + __temperature = (double)(param_temperature) + 273.0; + } + + + if (verbose_flag) { + printf("> formal temperature set to %.2f Kelvin degrees\n",__temperature); + } + + /* update Boltzmann parameters */ + + __RT__ = (double)(__temperature * GAS_CONSTANT)/1000.0; /* RT in kCal */ + + } + + /* init dynamic table and check it */ + + if (verbose_flag) { + starting_time = time(0); + printf("> allocating memory for dynamic tables.\n"); + } + + /* init input tape */ + + if (!(input_file_flag || input_string_flag)) { + fprintf(stderr,"Error: Input not provided.%s\n",getJobID()); + exit(EXIT_FAILURE); + } + else if (input_file_flag && input_string_flag) { + fprintf(stderr,"Error: Dual input are not allowed.%s\n",getJobID()); + exit(EXIT_FAILURE); + } + + if (input_file_flag) { + init_input_tape_from_file(input_filename,cst_flag); + } + else { + init_input_tape_from_string(input_string); + } + + if (rna_len<1) { + fprintf(stderr,"Error: Invalid input sequence.%s\n",getJobID()); + exit(EXIT_FAILURE); + } + + /* init input tape */ + + if (mutation_matrix_filename) { + init_mutation_matrix_from_file(mutation_matrix_filename); + } + + /* set maximal number of mutations to maximum value if not set */ + if (!max_mutations) { + if (cst_flag) { max_mutations = cmpt_open_mutations() + 1; } + else { max_mutations = rna_len + 1; } + } + else { + if (cst_flag) { + int max_mutations_open = cmpt_open_mutations() + 1; + if (max_mutations>max_mutations_open) { + fprintf(stderr,"WARNING: Maximal number of mutations cannot exceed the number of mutation sites. Value set to %d.%s\n",max_mutations_open-1,getJobID()); + max_mutations = max_mutations_open; + } + } + else if (max_mutations>rna_len+1) { + fprintf(stderr,"WARNING: Maximal number of mutations cannot exceed sequence length. Ignored.%s\n",getJobID()); + max_mutations = rna_len + 1; + } + } + + + /* check cutpoint */ + + if (hybrid_flag) { + if (!cutpoint) { + if (warning_flag) { + fprintf(stderr,"WARNING: Missing cutpoint betwween sequences. Hybrid mode ignored.%s\n",getJobID()); + } + hybrid_flag=0; + } + } + else { + if (cutpoint) { + if (verbose_flag) { + /* printf("> cutpoint used without hybridization mode."); */ + fprintf(stderr,"WARNING: cutpoint used out of hybrid mode. Ignored.%s\n",getJobID()); + } + cutpoint=0; + include_intermolecular_interactions=0; + } + } + + /* init arrays */ + if (hybrid_flag) { + init_Mutant_arrays_hybrid(); + } + else { + init_Mutant_arrays(); + } + + /* init table for tri and tetraloop counting */ + init_triloop_cmpt_table(); + init_tetraloop_cmpt_table(); + + if (verbose_flag) { + printf("> allocated memory in dynamic tables : %Ld bytes\n",total_memory); + printf("> time used for memory allocation : %ld secondes\n",time(0)-starting_time); + starting_time = time(0); + } + + /* precompute internal loop tables */ + + { + int nb_mut,max_nb_mut; + + max_nb_mut=minimum(9,max_mutations); + loop_tab = (unsigned int *****)xmalloc(max_nb_mut*sizeof(unsigned int ****)); + for (nb_mut=0;nb_mut time used for internal loop tables : %ld secondes\n",time(0)-starting_time); + printf("> sequence length : %d nt.\n",rna_len); + starting_algo_time = time(0); + } + + /* compute Boltzmann partition function */ + + /* init dynamic tables with hairpins */ + + if (hybrid_flag) { + precomputeHairpin_hybrid(cutpoint,include_intermolecular_interactions); + } + else { + precomputeHairpin(); + } + + /* Main algorithm */ + + if (hybrid_flag) { + RNAmutants_algorithm_hybrid(verbose_flag); + } + else { + RNAmutants_algorithm(verbose_flag); + } + + /* completed display results */ + + if (verbose_flag) { + printf("> time used for computation : %ld secondes\n",time(0)-starting_algo_time); + printf("> total time used : %ld secondes\n",time(0)-starting_time); + } + + + { + int uu,vv,kk,iLast=rna_len-1; + double boltzmann_distribution_simple[max_mutations], boltzmann_distribution_multi[max_mutations]; + double mfe_v[max_mutations]; + + compatible_neighbors = (int *)xmalloc((rna_len+1)*sizeof(int)); + memset(compatible_neighbors,0,(rna_len+1)*sizeof(int)); + + if (!ss_constraint_is_non_empty()) { /* add empty structure iff constraints allow it */ + for(kk=0;kkDBL_EPSILON) { + boltzmann_distribution_simple[kk] += Zes[kk][0][iLast][uu][vv].pf; + } + mfe_v[kk] = minimum_double(mfe_v[kk],Zes[kk][0][iLast][uu][vv].mfe); + if (Ze[kk][0][iLast][uu][vv].pf>DBL_EPSILON) { + boltzmann_distribution_multi[kk] += Ze[kk][0][iLast][uu][vv].pf; + } + mfe_v[kk] = minimum_double(mfe_v[kk],Ze[kk][0][iLast][uu][vv].mfe); + } + } + } + + /* check precision before printing */ + + if (DBL_DIG != 15) { + fprintf(stderr,"WARNING: printf format might not be suited to double precision.%s\n",getJobID()); + } + + /* print results */ + +#ifdef DETAILED + for(kk=0;kk> Superoptimal structure(s):\n"); + for(kk=0;kk %d-superoptimal structure\n",kk); + printf("None: no secondary structure satisfy the constraints.\n"); + } + else { + compatible_neighbors_flag = 1; + compatible_neighbors[kk]=1; + startBacktrackKSuperOptimal(kk,mfe_v[kk]); + } + } + + } + + /* Sampling */ + + if (number_of_sample) { + printf(">> Sampling %d mutants:\n",number_of_sample); + basicSamplingEngine(number_of_sample,sample_output_stats_flag,warning_flag,compatible_neighbors_flag); + } + + if (samplefile) { + printf(">> Sampling mutants from file %s:\n",samplefile); + sampleFromFile(samplefile,sample_output_stats_flag,warning_flag,compatible_neighbors); + } + + +#ifdef CLEAN_DYNAMIC_TABLE + + { + int ileft,iright,uu,vv,kk; + for(kk=0;kkDBL_EPSILON)) { + Zs[kk][ileft][iright][uu][vv].pf=0.0; + } + if (!(Zms[kk][ileft][iright][uu][vv].pf>DBL_EPSILON)) { + Zms[kk][ileft][iright][uu][vv].pf=0.0; + } + if (!(Zm[kk][ileft][iright][uu][vv].pf>DBL_EPSILON)) { + Zm[kk][ileft][iright][uu][vv].pf=0.0; + } + if (!(Zes[kk][ileft][iright][uu][vv].pf>DBL_EPSILON)) { + Zes[kk][ileft][iright][uu][vv].pf=0.0; + } + if (!(Ze[kk][ileft][iright][uu][vv].pf>DBL_EPSILON)) { + Ze[kk][ileft][iright][uu][vv].pf=0.0; + } +#ifdef DANGLE_ARRAY + if (!(ZdangN[kk][ileft][iright][uu][vv].pf>DBL_EPSILON)) { + ZdangN[kk][ileft][iright][uu][vv].pf=0.0; + } + if (!(ZdangB[kk][ileft][iright][uu][vv].pf>DBL_EPSILON)) { + ZdangB[kk][ileft][iright][uu][vv].pf=0.0; + } + if (!(ZdangL[kk][ileft][iright][uu][vv].pf>DBL_EPSILON)) { + ZdangL[kk][ileft][iright][uu][vv].pf=0.0; + } + if (!(ZdangR[kk][ileft][iright][uu][vv].pf>DBL_EPSILON)) { + ZdangR[kk][ileft][iright][uu][vv].pf=0.0; + } +#endif + } + } + } + } + } + } + +#endif + + + return EXIT_SUCCESS; + +} + diff --git a/src/RNAmutants.h b/src/RNAmutants.h new file mode 100644 index 0000000..fef10ec --- /dev/null +++ b/src/RNAmutants.h @@ -0,0 +1,196 @@ +/* global variables */ + +int rna_len = 0; /* length of the arn*/ +char *input_tape; +int max_mutations = 0; /* has to be set to number of mutations + 1 */ + +/* structural constraint */ + +const int __hairpin_min_length__ = 3; /* the minimal length of a hairpin loop */ +const int __hairpin_max_length__ = 60; /* the minimal length of a hairpin loop */ +const int __vis_range__ = 4; /* range of visibility */ +const int __max_size_bulge__ = 30; /* maximal size of bulge in loop */ +const int max_sequence_size = 10000; + +/* global variables */ + +struct Zcell { + double pf; + //double pfGC; + double mfe; +}; + +struct Zcell *****Zms; +struct Zcell *****Zes; +struct Zcell *****Zs; +struct Zcell *****Zm; +struct Zcell *****Ze; +struct Zcell *****ZdangN; +struct Zcell *****ZdangB; +struct Zcell *****ZdangL; +struct Zcell *****ZdangR; + +/** table size values **/ + +int nb_value_triloop_table; +double *triloop_cmpt_table; +double *triloop_weight_table; +int nb_value_tetraloop_table; +double *tetraloop_cmpt_table; +double *tetraloop_weight_table; + +/**** functions to declare ****/ + +int build_special_loop_list_for_given_config(unsigned int *list_of_config, int tabindex, int ileft, int iright, int nt_loop_left, int nt_loop_right, int nb_mutations,int *config); + +/*********************/ + +#define INDEX_A 0 +#define INDEX_C 1 +#define INDEX_G 2 +#define INDEX_U 3 +#define INDEX_GHOST 4 +#define INDEX_STOP -1 + +double mutbias[4][4] = {{1.0, 1.0, 1.0, 1.0},{1.0, 1.0, 1.0, 1.0},{1.0, 1.0, 1.0, 1.0},{1.0, 1.0, 1.0, 1.0}}; + +int uncst_mutation[2][4][4] = { +{{INDEX_A,INDEX_STOP},{INDEX_C,INDEX_STOP},{INDEX_G,INDEX_STOP},{INDEX_U,INDEX_STOP}}, +{{INDEX_C,INDEX_G,INDEX_U,INDEX_STOP},{INDEX_A,INDEX_G,INDEX_U,INDEX_STOP}, +{INDEX_A,INDEX_C,INDEX_U,INDEX_STOP},{INDEX_A,INDEX_C,INDEX_G,INDEX_STOP}} +}; + +/* 0: mutations, 1: right mutation, 2: left mutation, 3: mutation on both sides */ +int bp_mutation[4][4][4][5][2] = + /* A-A */ + {{{{{INDEX_STOP,INDEX_STOP}}, + /* A-C */ + {{INDEX_STOP,INDEX_STOP}}, + /* A-G */ + {{INDEX_STOP,INDEX_STOP}}, + /* A-U */ + {{INDEX_A,INDEX_U},{INDEX_STOP,INDEX_STOP}}}, + /* C-A */ + {{{INDEX_STOP,INDEX_STOP}}, + /* C-C */ + {{INDEX_STOP,INDEX_STOP}}, + /* C-G */ + {{INDEX_C,INDEX_G},{INDEX_STOP,INDEX_STOP}}, + /* C-U */ + {{INDEX_STOP,INDEX_STOP}}}, + /* G-A */ + {{{INDEX_STOP,INDEX_STOP}}, + /* G-C */ + {{INDEX_G,INDEX_C},{INDEX_STOP,INDEX_STOP}}, + /* G-G */ + {{INDEX_STOP,INDEX_STOP}}, + /* G-U */ + {{INDEX_G,INDEX_U},{INDEX_STOP,INDEX_STOP}}}, + /* U-A */ + {{{INDEX_U,INDEX_A},{INDEX_STOP,INDEX_STOP}}, + /* U-C */ + {{INDEX_STOP,INDEX_STOP}}, + /* U-G */ + {{INDEX_U,INDEX_G},{INDEX_STOP,INDEX_STOP}}, + /* U-U */ + {{INDEX_STOP,INDEX_STOP}}}}, + /*********** 1 mutation on the right *************/ + /* A-A with 1 mutation */ + {{{{INDEX_A,INDEX_U},{INDEX_STOP,INDEX_STOP}}, + /* A-C with 1 mutation */ + {{INDEX_A,INDEX_U},{INDEX_STOP,INDEX_STOP}}, + /* A-G with 1 mutation */ + {{INDEX_A,INDEX_U},{INDEX_STOP,INDEX_STOP}}, + /* A-U with 1 mutation */ + {{INDEX_STOP,INDEX_STOP}}}, + /* C-A with 1 mutation */ + {{{INDEX_C,INDEX_G},{INDEX_STOP,INDEX_STOP}}, + /* C-C with 1 mutation */ + {{INDEX_C,INDEX_G},{INDEX_STOP,INDEX_STOP}}, + /* C-G with 1 mutation */ + {{INDEX_STOP,INDEX_STOP}}, + /* C-U with 1 mutation */ + {{INDEX_C,INDEX_G},{INDEX_STOP,INDEX_STOP}}}, + /* G-A with 1 mutation */ + {{{INDEX_G,INDEX_C},{INDEX_G,INDEX_U},{INDEX_STOP,INDEX_STOP}}, + /* G-C with 1 mutation */ + {{INDEX_G,INDEX_U},{INDEX_STOP,INDEX_STOP}}, + /* G-G with 1 mutation */ + {{INDEX_G,INDEX_C},{INDEX_G,INDEX_U},{INDEX_STOP,INDEX_STOP}}, + /* G-U with 1 mutation */ + {{INDEX_G,INDEX_C},{INDEX_STOP,INDEX_STOP}}}, + /* U-A with 1 mutation */ + {{{INDEX_U,INDEX_G},{INDEX_STOP,INDEX_STOP}}, + /* U-C with 1 mutation */ + {{INDEX_U,INDEX_A},{INDEX_U,INDEX_G},{INDEX_STOP,INDEX_STOP}}, + /* U-G with 1 mutation */ + {{INDEX_U,INDEX_A},{INDEX_STOP,INDEX_STOP}}, + /* U-U with 1 mutation */ + {{INDEX_U,INDEX_A},{INDEX_U,INDEX_G},{INDEX_STOP,INDEX_STOP}}}}, + /*********** 1 mutation on left *************/ + /* A-A with 1 mutation */ + {{{{INDEX_U,INDEX_A},{INDEX_STOP,INDEX_STOP}}, + /* A-C with 1 mutation */ + {{INDEX_G,INDEX_C},{INDEX_STOP,INDEX_STOP}}, + /* A-G with 1 mutation */ + {{INDEX_C,INDEX_G},{INDEX_U,INDEX_G},{INDEX_STOP,INDEX_STOP}}, + /* A-U with 1 mutation */ + {{INDEX_G,INDEX_U},{INDEX_STOP,INDEX_STOP}}}, + /* C-A with 1 mutation */ + {{{INDEX_U,INDEX_A},{INDEX_STOP,INDEX_STOP}}, + /* C-C with 1 mutation */ + {{INDEX_G,INDEX_C},{INDEX_STOP,INDEX_STOP}}, + /* C-G with 1 mutation */ + {{INDEX_U,INDEX_G},{INDEX_STOP,INDEX_STOP}}, + /* C-U with 1 mutation */ + {{INDEX_A,INDEX_U},{INDEX_G,INDEX_U},{INDEX_STOP,INDEX_STOP}}}, + /* G-A with 1 mutation */ + {{{INDEX_U,INDEX_A},{INDEX_STOP,INDEX_STOP}}, + /* G-C with 1 mutation */ + {{INDEX_STOP,INDEX_STOP}}, + /* G-G with 1 mutation */ + {{INDEX_C,INDEX_G},{INDEX_U,INDEX_G},{INDEX_STOP,INDEX_STOP}}, + /* G-U with 1 mutation */ + {{INDEX_A,INDEX_U},{INDEX_STOP,INDEX_STOP}}}, + /* U-A with 1 mutation */ + {{{INDEX_STOP,INDEX_STOP}}, + /* U-C with 1 mutation */ + {{INDEX_G,INDEX_C},{INDEX_STOP,INDEX_STOP}}, + /* U-G with 1 mutation */ + {{INDEX_C,INDEX_G},{INDEX_STOP,INDEX_STOP}}, + /* U-U with 1 mutation */ + {{INDEX_A,INDEX_U},{INDEX_G,INDEX_U},{INDEX_STOP,INDEX_STOP}}}}, + /*********** 2 mutations *************/ + /* A-A with 2 mutations */ + {{{{INDEX_C,INDEX_G},{INDEX_G,INDEX_C},{INDEX_G,INDEX_U},{INDEX_U,INDEX_G},{INDEX_STOP,INDEX_STOP}}, + /* A-C with 2 mutations */ + {{INDEX_C,INDEX_G},{INDEX_G,INDEX_U},{INDEX_U,INDEX_A},{INDEX_U,INDEX_G},{INDEX_STOP,INDEX_STOP}}, + /* A-G with 2 mutations */ + {{INDEX_G,INDEX_C},{INDEX_G,INDEX_U},{INDEX_U,INDEX_A},{INDEX_STOP,INDEX_STOP}}, + /* A-U with 2 mutations */ + {{INDEX_C,INDEX_G},{INDEX_G,INDEX_C},{INDEX_U,INDEX_A},{INDEX_U,INDEX_G},{INDEX_STOP,INDEX_STOP}}}, + /* C-A with 2 mutations */ + {{{INDEX_A,INDEX_U},{INDEX_G,INDEX_C},{INDEX_G,INDEX_U},{INDEX_U,INDEX_G},{INDEX_STOP,INDEX_STOP}}, + /* C-C with 2 mutations */ + {{INDEX_A,INDEX_U},{INDEX_G,INDEX_U},{INDEX_U,INDEX_A},{INDEX_U,INDEX_G},{INDEX_STOP,INDEX_STOP}}, + /* C-G with 2 mutations */ + {{INDEX_A,INDEX_U},{INDEX_G,INDEX_C},{INDEX_G,INDEX_U},{INDEX_U,INDEX_A},{INDEX_STOP,INDEX_STOP}}, + /* C-U with 2 mutations */ + {{INDEX_G,INDEX_C},{INDEX_U,INDEX_A},{INDEX_U,INDEX_G},{INDEX_STOP,INDEX_STOP}}}, + /* G-A with 2 mutations */ + {{{INDEX_A,INDEX_U},{INDEX_C,INDEX_G},{INDEX_U,INDEX_G},{INDEX_STOP,INDEX_STOP}}, + /* G-C with 2 mutations */ + {{INDEX_A,INDEX_U},{INDEX_C,INDEX_G},{INDEX_U,INDEX_A},{INDEX_U,INDEX_G},{INDEX_STOP,INDEX_STOP}}, + /* G-G with 2 mutations */ + {{INDEX_A,INDEX_U},{INDEX_U,INDEX_A},{INDEX_STOP,INDEX_STOP}}, + /* G-U with 2 mutations */ + {{INDEX_C,INDEX_G},{INDEX_U,INDEX_A},{INDEX_U,INDEX_G},{INDEX_STOP,INDEX_STOP}}}, + /* U-A with 2 mutations */ + {{{INDEX_A,INDEX_U},{INDEX_C,INDEX_G},{INDEX_G,INDEX_U},{INDEX_G,INDEX_C},{INDEX_STOP,INDEX_STOP}}, + /* U-C with 2 mutations */ + {{INDEX_A,INDEX_U},{INDEX_C,INDEX_G},{INDEX_G,INDEX_U},{INDEX_STOP,INDEX_STOP}}, + /* U-G with 2 mutations */ + {{INDEX_A,INDEX_U},{INDEX_G,INDEX_C},{INDEX_G,INDEX_U},{INDEX_STOP,INDEX_STOP}}, + /* U-U with 2 mutations */ + {{INDEX_C,INDEX_G},{INDEX_G,INDEX_C},{INDEX_STOP,INDEX_STOP}}}}}; + diff --git a/src/constraints.c b/src/constraints.c new file mode 100644 index 0000000..593bfea --- /dev/null +++ b/src/constraints.c @@ -0,0 +1,287 @@ +/* + * constraints.c + * + * + * Created by Jerome Waldispuhl on 27/07/2010. + * Copyright 2010 McGill. All rights reserved. + * + */ + +#include +#include +#include +#include "util.h" +#include "constraints.h" +#include "energy_params_tables.h" + +/* from RNAmutants.h */ + +extern const int __hairpin_min_length__; +extern const int __hairpin_max_length__; +extern int rna_len; +extern double cutpoint; +#define INDEX_A 0 +#define INDEX_C 1 +#define INDEX_G 2 +#define INDEX_U 3 +#define INDEX_STOP -1 + +/* structure constraints tables */ + +int *ss_cst; +int *single_strand_cst; /* Unpaired nt before or at this index */ +int is_non_empty=0; /* boolean used to determine if the structure can be empty */ + +/* sequence constraints are declared in RNAmutants.c */ +extern int *cst_tape; +extern int **cst_segment; + +/* predicats */ + +int ss_constraint_is_non_empty() { + return is_non_empty; +} + +int is_hairpin(int i, int j) { + if ((i=j-i-1)) { + return 1; + } + else { + return 0; + } +} + +int is_basepair(int i, int j) { + if ((ss_cst[i]==j)||((ss_cst[i]<0)&&(ss_cst[j]<0))) { + return 1; + } + return 0; +} + +int is_stack(int i, int j) { + if ((i1)||(j-n>1)))&& + ((ss_cst[i]==j)||((ss_cst[i]<0)&&(ss_cst[j]<0)))&& + ((ss_cst[m]==n)||((ss_cst[m]<0)&&(ss_cst[n]<0)))&& + (single_strand_cst[m-1]>=(m-i-1))&&(single_strand_cst[j-1]>=(j-n-1))) { + return 1; + } + else { + return 0; + } +} + +int single_strand_length(int ii) { + return single_strand_cst[ii]; +} + + +int is_triloop(int ii, int jj, char **ss_sample) { + + if (jj-ii==4) { + int hcode = + (convert2index(ss_sample[0][ii])<<8) | + (convert2index(ss_sample[0][ii+1])<<6) | + (convert2index(ss_sample[0][ii+2])<<4) | + (convert2index(ss_sample[0][ii+3])<<2) | + convert2index(ss_sample[0][ii+4]); + if (refTableTriLoop[hcode]) { return 1; } + } + + return 0; +} + +int is_tetraloop(int ii, int jj, char **ss_sample) { + + if (jj-ii==5) { + int hcode = + (convert2index(ss_sample[0][ii])<<10) | + (convert2index(ss_sample[0][ii+1])<<8) | + (convert2index(ss_sample[0][ii+2])<<6) | + (convert2index(ss_sample[0][ii+3])<<4) | + (convert2index(ss_sample[0][ii+4])<<2) | + convert2index(ss_sample[0][ii+5]); + if (refTableTetraLoop[hcode]) { return 1; } + } + + + return 0; +} + +int is_ggg_hairpin(int ii, int jj, char **ss_sample) { + + if ((convert2index(ss_sample[0][ii])==INDEX_G)&& + (convert2index(ss_sample[0][ii+1])==INDEX_G)&& + (convert2index(ss_sample[0][ii+2])==INDEX_G)&& + (convert2index(ss_sample[0][jj])==INDEX_U)) { + return 1; + } + return 0; +} + + +/* fill table functions */ + +void init_structure_cst_tables(int length_seq) { + int ii; + + ss_cst = xmalloc(length_seq * sizeof(int)); + single_strand_cst = xmalloc(length_seq * sizeof(int)); + + for (ii=0;ii0) { + single_strand_cst[ii] = single_strand_cst[ii-1] + 1; + } + else { + single_strand_cst[0] = 1; + } + break; + case '(': + stack[head] = ii; + head++; + single_strand_cst[ii] = 0; + prevbp='('; + break; + case ')': + openbp = stack[head-1]; + closebp = ii; + head--; + if (((prevbp==')')&&(cutpoint==0))|| + ((prevbp=='(')&&((closebp-openbp-1)>=__hairpin_min_length__)&&((closebp-openbp-1)<=__hairpin_max_length__))|| + ((cutpoint>0)&&(((openbpcutpoint))))) { + ss_cst[openbp] = closebp; + ss_cst[closebp] = openbp; + single_strand_cst[ii] = 0; + is_non_empty = 1; + } + else { + fprintf(stderr,"WARNING: Corrupted structure constraints. Minimum or maximum hairpin length requirement is not satisfied. Please, update structure constraints. %s\n",getJobID()); + exit(EXIT_SUCCESS); + } + prevbp=')'; + break; + default: + fprintf(stderr,"WARNING: Corrupted structure constraints. Constraints ignored. %s\n",getJobID()); + clean_structure_cst_tables(strlen(buffer)); + return; + } + + ii++; + } + +#if 0 + for (ii=0;ii +#include +#include +#include "energy_functions.h" +#include "energy_params_tables.h" +#include "util.h" + +/* For using Nussinov-Jacobson energy model you need to recompile the whole program. */ +/* You need before to declare a preprocessor variable such that: */ +/* */ +/* #define NUSSINOV_JACOBSON */ + +//#define NUSSINOV_JACOBSON + +/* physical constants */ + +/* formal temperature used in Boltzmann function */ +/* other constants defined in zuker_functions.h */ + +double __temperature=310.15; /* 37 Celsius degrees in Kelvin (273.15 + 37 = 310.15) */ + +double __RT__ = (double)(DEFAULT_TEMPERATURE * GAS_CONSTANT)/1000.0; /* RT in kCal */ + /* Constant values are declared in zuker_function.h */ + +/* By default GAIL rule and C loop are not used even if they are declared in the parameter files */ +/* If you want to use then you need to declare the macro: */ +/* */ +/* #define C_LOOP_ALLOWED */ +/* #define GAIL_RULE_ALLOWED */ +/* */ +/* and then recompile the software. Obviously, these rules will be used if and only they are */ +/* specified in the parameter files! */ + + +/* PLEASE, for safety do not declare or edit anything after this line */ + +#define INDEX_A 0 +#define INDEX_C 1 +#define INDEX_G 2 +#define INDEX_U 3 +#define INDEX_STOP -1 + +/* global variables */ + +/* from RNAmutants.h */ +extern char *input_tape; +extern int rna_len; +extern const int __hairpin_min_length__; +extern const int __hairpin_max_length__; +extern int dangle_used; +extern int uncst_mutation[2][4][4]; +extern int nb_value_triloop_table; +extern double *triloop_cmpt_table; +extern double *triloop_weight_table; +extern int nb_value_tetraloop_table; +extern double *tetraloop_cmpt_table; +extern double *tetraloop_weight_table; +extern int *cst_tape; + +/* routines used in this files */ + +inline int min3_int(int a, int b, int c) { + if (c3) { + misStacking = tstackh[xx][yy][uu][vv]; + } + else { + misStacking = penalty_close_helix(xx,yy); + } + + /* return value of the Boltzmann contribution */ + + return exp(- (baseEnergy + misStacking) / __RT__); + +#endif +} + +double EHairpin(int xx, int uu, int vv, int yy, int len) { +#ifdef NUSSINOV_JACOBSON + return 0.0; +#else + double baseEnergy=0, misStacking = 0; + + /* base energy computed from length */ + + if (len<=30) { + baseEnergy = hairpin[len]; + + /* dont use bonus for tri, tetra loop or GGG loop yet */ + + } + else { + baseEnergy = hairpin[30] + param_large_loop * log((double)(len)/30); + } + + /* misStacking energy */ + + if (len>3) { + misStacking = tstackh[xx][yy][uu][vv]; + } + else { + misStacking = penalty_close_helix(xx,yy); + } + + /* return value of the Boltzmann contribution */ + + return baseEnergy + misStacking; + +#endif +} + +/** special function for tri and tetra loop **/ + +/** return the number if ggg loop **/ + +double ggg_loop_counter(int nb_mut, int ileft, int iright, int lnt, int int_lnt, int int_rnt, int rnt) { + double cmpt = 0; + int unklen=iright-ileft-4; /* length of unknown region of the hairpin -1 for the G at 3rd position */ + int nb_mut_unk; + return 0.0; + if (nb_mut<0) { + fprintf(stderr,"WARNING:%s:line %d: invalid call of GGG loop cmpt.%s\n",__FILE__,__LINE__,getJobID()); + return 0.0; /** cancel this config **/ + } + + if ((lnt!=INDEX_G)||(int_lnt!=INDEX_G)||(rnt!=INDEX_U)) return 1.0; + + /* number of mutations in unknown region */ + + nb_mut_unk = nb_mut - kronecker(ileft+2,INDEX_G); + + if (nb_mut_unk>unklen) { + fprintf(stderr,"WARNING:%s:line %d: invalid call of GGG loop cmpt.%s\n",__FILE__,__LINE__,getJobID()); + return 0.0; /** cancel this config **/ + } + + if (nb_mut_unk<0) return 0.0; /* cannot build a ggg loop */ + + if (unklen) { + cmpt = genereMutant(nb_mut_unk,unklen); /* number of config */ + } + else { + cmpt = 1.0; + } + + return cmpt; +} + +/* the mutation constraint does not need to check because this function is called with nb_mut==1 iff cst_tape==0 */ +/* fill a table such that triloop_cmpt_table[2*ii] store the triloop bonus and triloop_cmpt_table[2*ii+1] the number/weight of configurations */ +/* WARNING: not optimized */ + + +int triloop_counter(int nb_mut, int ileft, int iright, int lnt, int int_lnt, int int_rnt, int rnt) { +#ifdef NUSSINOV_JACOBSON + return 1.0; +#else + int hcode, ilist=0,nt; + int *list_nt=NULL; + int ii, cmpt = 0; + double val; + + if ((nb_mut<0)||(nb_mut>1)) { + fprintf(stderr,"WARNING:%s:line %d: invalid call of triloop bonus.%s\n",__FILE__,__LINE__,getJobID()); + return 0.0; /** cancel this config **/ + } + + /* reset counter */ + for (ii=0;ii2)) { + fprintf(stderr,"WARNING:%s:line %d: invalid call of tetraloop bonus.%s\n",__FILE__,__LINE__,getJobID()); + return 0.0; /** cancel this config **/ + } + + /* reset counter */ + for (ii=0;ii 1 */ + bonus = penalty_close_helix(xx,yy) + penalty_close_helix(uu,vv); + } + } + else { /* generic computation of penalty if size greater than 30 */ + + baseEnergy = bulge[30] + param_large_loop * log((double)(len)/30); + + /* non-GC closing base pair penalties must be added if size > 1 */ + bonus = penalty_close_helix(xx,yy) + penalty_close_helix(uu,vv); + } + + return exp(-(baseEnergy + bonus)/__RT__); +#endif +} + +double EBulge(int xx, int uu, int vv, int yy, int len) { +#ifdef NUSSINOV_JACOBSON + return 0.0; +#else + double baseEnergy=0, bonus=0; + + /* base energy computed from length */ + + if (len<=30) { + baseEnergy = bulge[len]; + + /* bonus */ + + if (len==1) { + bonus=stack[xx][yy][uu][vv]; + + } + else { /* non-GC closing base pair penalties must be added if size > 1 */ + bonus = penalty_close_helix(xx,yy) + penalty_close_helix(uu,vv); + } + } + else { /* generic computation of penalty if size greater than 30 */ + + baseEnergy = bulge[30] + param_large_loop * log((double)(len)/30); + + /* non-GC closing base pair penalties must be added if size > 1 */ + bonus = penalty_close_helix(xx,yy) + penalty_close_helix(uu,vv); + } + + return baseEnergy + bonus; +#endif +} + +/*********************** generic internal loop **********************/ + +double boltzmannInternal_generic(int xx, int aa, int cc, int uu, int vv, int dd, int bb, int yy, int llen, int rlen) { +#ifdef NUSSINOV_JACOBSON + return 1.0; +#else + + int len=llen+rlen,lenDiff; + double baseEnergy,misStacking,asymetry=0.0; + + /* size dependant penalty */ + + if (len<=30) { + baseEnergy = internal[len]; + } + else { + baseEnergy = internal[30] + param_large_loop * log((double)(len)/30); + } + + /* misstacking energy */ + + /* general case */ + misStacking = tstacki[xx][yy][aa][bb] + tstacki[vv][uu][dd][cc]; + + lenDiff = abs(llen-rlen); + if (lenDiff>0) { + asymetry = min_double(max_correction_asym_internal_loop, + lenDiff * array_ninio_internal_loop[min3_int(4,llen,rlen)]); + } + + return exp(- (baseEnergy + misStacking + asymetry) / __RT__); + +#endif +} + +double EInternal_generic(int xx, int aa, int cc, int uu, int vv, int dd, int bb, int yy, int llen, int rlen) { +#ifdef NUSSINOV_JACOBSON + return 0.0; +#else + + int len=llen+rlen,lenDiff; + double baseEnergy,misStacking,asymetry=0.0; + + /* size dependant penalty */ + + if (len<=30) { + baseEnergy = internal[len]; + } + else { + baseEnergy = internal[30] + param_large_loop * log((double)(len)/30); + } + + /* misstacking energy */ + + /* general case */ + misStacking = tstacki[xx][yy][aa][bb] + tstacki[vv][uu][dd][cc]; + + lenDiff = abs(llen-rlen); + if (lenDiff>0) { + asymetry = min_double(max_correction_asym_internal_loop, + lenDiff * array_ninio_internal_loop[min3_int(4,llen,rlen)]); + } + + return baseEnergy + misStacking + asymetry; + +#endif +} + +/*******************************************************************************************/ + +double boltzmannInternal_1x1(int xx, int aa, int uu, int vv, int bb, int yy) { +#ifdef NUSSINOV_JACOBSON + return 1.0; +#else + return exp(- sint2[xx][yy][uu][vv][aa][bb] / __RT__); +#endif +} + +double EInternal_1x1(int xx, int aa, int uu, int vv, int bb, int yy) { +#ifdef NUSSINOV_JACOBSON + return 0.0; +#else + return sint2[xx][yy][uu][vv][aa][bb]; +#endif +} + +/********/ + +double boltzmannInternal_1x2(int xx, int aa, int uu, int vv, int cc, int bb, int yy) { +#ifdef NUSSINOV_JACOBSON + return 1.0; +#else + return exp(- asint1x2[xx][yy][uu][vv][aa][bb][cc] / __RT__); +#endif +} + +double EInternal_1x2(int xx, int aa, int uu, int vv, int cc, int bb, int yy) { +#ifdef NUSSINOV_JACOBSON + return 0.0; +#else + return asint1x2[xx][yy][uu][vv][aa][bb][cc]; +#endif +} + +/********/ + +double boltzmannInternal_2x1(int xx, int aa, int cc, int uu, int vv, int bb, int yy) { +#ifdef NUSSINOV_JACOBSON + return 1.0; +#else + return exp(- asint1x2[vv][uu][yy][xx][bb][cc][aa] / __RT__); +#endif +} + +double EInternal_2x1(int xx, int aa, int cc, int uu, int vv, int bb, int yy) { +#ifdef NUSSINOV_JACOBSON + return 0.0; +#else + return asint1x2[vv][uu][yy][xx][bb][cc][aa]; +#endif +} + +/********/ + +double boltzmannInternal_2x2(int xx, int aa, int cc, int uu, int vv, int dd, int bb, int yy) { +#ifdef NUSSINOV_JACOBSON + return 1.0; +#else + return exp(- sint4[xx][yy][uu][vv][aa][cc][dd][bb] / __RT__); +#endif +} + +double EInternal_2x2(int xx, int aa, int cc, int uu, int vv, int dd, int bb, int yy) { +#ifdef NUSSINOV_JACOBSON + return 0.0; +#else + return sint4[xx][yy][uu][vv][aa][cc][dd][bb]; +#endif +} + +/********/ + +double boltzmannAddStemInMultiLoop(int nb) { +#ifdef NUSSINOV_JACOBSON + return 1.0; +#else + static int first_call_boltzmannAddStemInMultiLoop = 1,ii; + static double addStemTab[20]; + + if (first_call_boltzmannAddStemInMultiLoop) { + first_call_boltzmannAddStemInMultiLoop = 0; + + addStemTab[0]=1.0; + for (ii=1;ii<10;ii++) { + addStemTab[ii] = exp(- ((ii) * helix_penalty_multi_loop) / __RT__); + } + } + + if (nb < 20) { + return addStemTab[nb]; + } + else { + return exp(- (nb * helix_penalty_multi_loop) / __RT__); + } +#endif +} + +double EAddStemInMultiLoop(int nb) { +#ifdef NUSSINOV_JACOBSON + return 0.0; +#else + static int first_call_boltzmannAddStemInMultiLoop_mfe = 1,ii; + static double addStemTab_mfe[20]; + + if (first_call_boltzmannAddStemInMultiLoop_mfe) { + first_call_boltzmannAddStemInMultiLoop_mfe = 0; + + addStemTab_mfe[0]=1.0; + for (ii=1;ii<10;ii++) { + addStemTab_mfe[ii] = ii * helix_penalty_multi_loop; + } + } + + if (nb < 20) { + return addStemTab_mfe[nb]; + } + else { + return nb * helix_penalty_multi_loop; + } +#endif +} + +/********/ + +double boltzmannExtendMultiLoop(int len) { +#ifdef NUSSINOV_JACOBSON + return 1.0; +#else + static int first_call_boltzmannExtendMultiLoop = 1,ii; + static double extendTab[20]; + + if (first_call_boltzmannExtendMultiLoop) { + first_call_boltzmannExtendMultiLoop = 0; + + extendTab[0] = 1.0; + for (ii=1;ii<20;ii++) { + extendTab[ii] = exp(- ((ii) * free_base_penalty_multi_loop) / __RT__); + } + } + + if (len < 20) { + return extendTab[len]; + } + else { + return exp(- (len * free_base_penalty_multi_loop) / __RT__); + } +#endif +} + +double EExtendMultiLoop(int len) { +#ifdef NUSSINOV_JACOBSON + return 0.0; +#else + static int first_call_boltzmannExtendMultiLoop_mfe = 1,ii; + static double extendTab_mfe[20]; + + if (first_call_boltzmannExtendMultiLoop_mfe) { + first_call_boltzmannExtendMultiLoop_mfe = 0; + + extendTab_mfe[0] = 1.0; + for (ii=1;ii<20;ii++) { + extendTab_mfe[ii] = ii * free_base_penalty_multi_loop; + } + } + + if (len < 20) { + return extendTab_mfe[len]; + } + else { + return len * free_base_penalty_multi_loop; + } +#endif +} + +/********/ + +double boltzmannEndMultiLoop() { +#ifdef NUSSINOV_JACOBSON + return 1.0; +#else + static int first_call_boltzmannEndMultiLoop = 1; + static double endValue; + + if (first_call_boltzmannEndMultiLoop) { + first_call_boltzmannEndMultiLoop = 0; + endValue = exp(- (offset_multi_loop + helix_penalty_multi_loop) / __RT__); + } + + return endValue; +#endif +} + +double EEndMultiLoop() { +#ifdef NUSSINOV_JACOBSON + return 0.0; +#else + static int first_call_boltzmannEndMultiLoop_mfe = 1; + static double endValue_mfe; + + if (first_call_boltzmannEndMultiLoop_mfe) { + first_call_boltzmannEndMultiLoop_mfe = 0; + endValue_mfe = offset_multi_loop + helix_penalty_multi_loop; + } + + return endValue_mfe; +#endif +} + diff --git a/src/energy_functions.h b/src/energy_functions.h new file mode 100644 index 0000000..9617c6b --- /dev/null +++ b/src/energy_functions.h @@ -0,0 +1,40 @@ + +/* physical values */ + +#define DEFAULT_TEMPERATURE 310.0 /* 37 Celsius degres (273.15 + 37 = 310.15)*/ + +#define GAS_CONSTANT 1.9872 +#define JOULE_GAS_CONSTANT 8.314472 + +double penalty_close_helix(int,int); +double boltzmann_penalty_close_helix(int,int); +double ggg_counter(int, int, int, int, int, int, int); +int triloop_counter(int, int, int, int, int, int, int); +int tetraloop_counter(int, int, int, int, int, int, int); +double boltzmannStack(int, int, int, int); +double boltzmannBulge(int, int, int, int, int); +double boltzmannHairpin(int, int, int, int, int); +double boltzmannInternal_generic(int, int, int, int, int, int, int, int, int, int); +double boltzmannInternal_1x1(int, int, int, int, int, int); +double boltzmannInternal_1x2(int, int, int, int, int, int, int); +double boltzmannInternal_2x1(int, int, int, int, int, int, int); +double boltzmannInternal_2x2(int, int, int, int, int, int, int, int); +double boltzmannAddStemInMultiLoop(int); +double boltzmannExtendMultiLoop(int); +double boltzmannEndMultiLoop(); +/*****/ +double EStack(int, int, int, int); +double EBulge(int, int, int, int, int); +double EHairpin(int, int, int, int, int); +double EInternal_generic(int, int, int, int, int, int, int, int, int, int); +double EInternal_1x1(int, int, int, int, int, int); +double EInternal_1x2(int, int, int, int, int, int, int); +double EInternal_2x1(int, int, int, int, int, int, int); +double EInternal_2x2(int, int, int, int, int, int, int, int); +double EAddStemInMultiLoop(int); +double EExtendMultiLoop(int); +double EEndMultiLoop(); +/*****/ +double ggg_bonus(int, int, int, int, int, int, int); +double triloop_bonus(int, int, int, int, int, int, int); +double tetraloop_bonus(int, int, int, int, int, int, int); diff --git a/src/energy_params_tables.h b/src/energy_params_tables.h new file mode 100644 index 0000000..f0141d3 --- /dev/null +++ b/src/energy_params_tables.h @@ -0,0 +1,140 @@ + +/* dangle array store the data of dangle file of mfold */ +/* index 1: position of the nt 0:up, 1:down */ +/* index 2: upper nt index (X) */ +/* index 3: lower nt index (Y) */ +/* index 3: nt index (Z) */ +/* example : XZ */ +/* Y */ + + double dangle[2][4][4][4]; + +/* sint2 array store the data of sint2 file of mfold */ +/* sint2[i][j][k][l][x][y] */ +/* X */ +/* I K */ +/* J L */ +/* Y */ + + double sint2[4][4][4][4][4][4]; + +/* asint1x2 array store the data of asint1x2 file of mfold */ +/* asint1x2[i][j][k][l][x][y][z] */ +/* 5' ===> 3' */ +/* X */ +/* I K */ +/* J L */ +/* YZ */ +/* 5' ===> 3' */ + + double asint1x2[4][4][4][4][4][4][4]; + +/* sint4 array store the data of sint4 file of mfold */ +/* sint4[i][j][k][l][u][v][x][y] */ +/* UV */ +/* I K */ +/* J L */ +/* XY */ + + double sint4[4][4][4][4][4][4][4][4]; + +/* dangle array store the data of tstacki file of mfold */ +/* tstacki[i][j][k][l] */ +/* 5' ===> 3' */ +/* I K */ +/* J L */ +/* 3' <=== 5' */ + + double tstacki[4][4][4][4]; + +/* dangle array store the data of tstackh file of mfold */ +/* tstackh[i][j][k][l] */ +/* 5' ===> 3' */ +/* I K */ +/* J L */ +/* 3' <=== 5' */ + + double tstackh[4][4][4][4]; + +/* dangle array store the data of stack file of mfold */ +/* stack[i][j][k][l] */ +/* 5' ===> 3' */ +/* I K */ +/* J L */ +/* 3' <=== 5' */ + + double stack[4][4][4][4]; + +/* arrays store the data of loop file of mfold */ +/* index are for the length of the loop */ +/* size is not converted. Thus 0 index is empty */ + +double bulge[31]; +double internal[31]; +double hairpin[31]; + +/* listTetraLoop store the data of tloop file of mfold */ + +typedef struct tetraLoop{ + char motif[6]; + int hcode; /* int representation */ + double bonus; + struct tetraLoop *next; +} *TetraLoop; + +TetraLoop listTetraLoop; +double refTableTetraLoop[4096]; /* this array is used to have a direct acces to the values of listTretraLoop */ + +/* listTriLoop store the data of tloop file of mfold */ + +typedef struct triLoop{ + char motif[5]; + int hcode; /* int representation */ + double bonus; + struct triLoop *next; +} *TriLoop; + +TriLoop listTriLoop; +double refTableTriLoop[1024]; /* this array is used to have a direct acces to the values of listTretraLoop */ + +/* differents parameters used for loops */ + +/* for all */ + double param_large_loop; + +/* internal loop*/ + double max_correction_asym_internal_loop; + double array_ninio_internal_loop[5]; + +/* multi-loop */ + double offset_multi_loop; + double free_base_penalty_multi_loop; + double helix_penalty_multi_loop; + +/* efn2 multi-loop */ + double offset_efn2_multi_loop; + double free_base_penalty_efn2_multi_loop; + double helix_penalty_efn2_multi_loop; + +/* other */ + double au_penalty; + double ggg_hairpin_bonus; + double c_hairpin_slope; + double c_hairpin_intersect; + double c_hairpin_3; + double inter_molecular_init_energy; + int gail_rule; + +/* functions used */ + +void readDangle(const char *filename); +void readSint2(const char *filename); +void readSint4(const char *filename); +void readAsint1x2(const char *filename); +void readTstacki(const char *filename); +void readTstackh(const char *filename); +void readStack(const char *filename); +void readLoop(const char *filename); +int readTetraLoop(const char *filename); +int readTriLoop(const char *filename); +void readMiscLoop(const char *filename); diff --git a/src/hybrid.c b/src/hybrid.c new file mode 100644 index 0000000..5d51d0b --- /dev/null +++ b/src/hybrid.c @@ -0,0 +1,1280 @@ +#include +#include +#include +#include +#include +#include +#include +#include "energy_functions.h" +#include "constraints.h" +#include "util.h" + +#define INDEX_A 0 +#define INDEX_C 1 +#define INDEX_G 2 +#define INDEX_U 3 +#define INDEX_STOP -1 + + +#define NO_DEBUG_MFE +#define NO_DEBUG_SAMPLING +#define K_CHECK 0 +#define LEFT_CHECK 16 +#define RIGHT_CHECK 20 + +extern const double __infinity__; + +/* sequence constraints (structure constraints are declared in a separate file) */ + +extern int *cst_tape; +extern int **cst_segment; + +/* hairpin parameters */ +extern double au_penalty; +extern double ggg_hairpin_bonus; +extern double c_hairpin_slope; +extern double c_hairpin_intersect; +extern double c_hairpin_3; + +/** table size values **/ + +extern int nb_value_triloop_table; +extern double *triloop_cmpt_table; +extern int nb_value_tetraloop_table; +extern double *tetraloop_cmpt_table; +extern double *triloop_weight_table; +extern double *tetraloop_weight_table; + +/* global variables */ + +struct Zcell { + double pf; + double mfe; +}; + +extern struct Zcell *****Zms; +extern struct Zcell *****Zes; +extern struct Zcell *****Zs; +extern struct Zcell *****Zm; +extern struct Zcell *****Ze; +extern const int __hairpin_min_length__; /* the minimal length of a hairpin loop */ +extern const int __hairpin_max_length__; /* the minimal length of a hairpin loop */ +extern const int __vis_range__; /* range of visibility */ +extern const int __max_size_bulge__; /* maximal size of bulge in loop */ +extern int rna_len; /* length of the arn*/ +extern char *input_tape; +extern int max_mutations; +extern int print_warning; +extern int dangle_used; +extern double __RT__; +extern double cutpoint; +extern int include_intermolecular_interactions; +extern double inter_molecular_init_energy; + +/* internal loop lookup table */ + +extern unsigned int *****loop_tab; +extern unsigned int *****stack_tab; + +/*** add-on for main algo ***/ + +/**** new variables ****/ + +double mfe_hybrid_initialization_energy = 0; +double pf_hybrid_initialization_energy = 1.0; + +/************** update functions ****************/ + +void update_init_hybrid_param(double value) { + + mfe_hybrid_initialization_energy = value; + pf_hybrid_initialization_energy = exp(-value/__RT__); + +} + +/*********************************************************************/ +/* */ +/* auxiliar functions */ +/* */ +/*********************************************************************/ + +/* init function used for Mutant algorithm */ + +void init_Mutant_arrays_hybrid() { /* data structure can be optimized */ + int nn,ii,jj,kk,ll,local_len; + + Zs=(struct Zcell *****)xmalloc(max_mutations*sizeof(struct Zcell ****)); + Zes=(struct Zcell *****)xmalloc(max_mutations*sizeof(struct Zcell *****)); + Zms=(struct Zcell *****)xmalloc(max_mutations*sizeof(struct Zcell ****)); + Zm=(struct Zcell *****)xmalloc(max_mutations*sizeof(struct Zcell ****)); + Ze=(struct Zcell *****)xmalloc(max_mutations*sizeof(struct Zcell ****)); + + for (nn=0;nn=jj)|| + (((jj=cutpoint))&&(local_len < __hairpin_min_length__))) { /* do not allocate memory for unexpected subsequences */ + Zs[nn][ii][jj]=0; + Zes[nn][ii][jj]=0; + Zms[nn][ii][jj]=0; + Zm[nn][ii][jj]=0; + Ze[nn][ii][jj]=0; + continue; + } + + Zs[nn][ii][jj]=(struct Zcell **)xmalloc(4*sizeof(struct Zcell *)); + Zes[nn][ii][jj]=(struct Zcell **)xmalloc(4*sizeof(struct Zcell *)); + Zms[nn][ii][jj]=(struct Zcell **)xmalloc(4*sizeof(struct Zcell *)); + Zm[nn][ii][jj]=(struct Zcell **)xmalloc(4*sizeof(struct Zcell *)); + Ze[nn][ii][jj]=(struct Zcell **)xmalloc(4*sizeof(struct Zcell *)); + + /* allocate memory for the visiblity fields */ + + for (kk=0;kk<4;kk++) { + + Zs[nn][ii][jj][kk]=(struct Zcell *)xmalloc(4*sizeof(struct Zcell)); + Zes[nn][ii][jj][kk]=(struct Zcell *)xmalloc(4*sizeof(struct Zcell)); + Zms[nn][ii][jj][kk]=(struct Zcell *)xmalloc(4*sizeof(struct Zcell)); + Zm[nn][ii][jj][kk]=(struct Zcell *)xmalloc(4*sizeof(struct Zcell)); + Ze[nn][ii][jj][kk]=(struct Zcell *)xmalloc(4*sizeof(struct Zcell)); + + for (ll=0;ll<4;ll++) { + Zs[nn][ii][jj][kk][ll].pf=0.0; + Zs[nn][ii][jj][kk][ll].mfe=__infinity__; + Zes[nn][ii][jj][kk][ll].pf=0.0; + Zes[nn][ii][jj][kk][ll].mfe=__infinity__; + Zms[nn][ii][jj][kk][ll].pf=0.0; + Zms[nn][ii][jj][kk][ll].mfe=__infinity__; + Zm[nn][ii][jj][kk][ll].pf=0.0; + Zm[nn][ii][jj][kk][ll].mfe=__infinity__; + Ze[nn][ii][jj][kk][ll].pf=0.0; + Ze[nn][ii][jj][kk][ll].mfe=__infinity__; + } + } + } + } + } +} + +/*************** precompute hairpin contribution (can also be integrate in main algo) ********************/ + +void precomputeHairpin_hybrid(int cutoff, int include_intermolecular_interactions) { + int kk,ii,jj,xx,yy,uu,vv,ll,maxii,newK,nt2mut,ind; + double bonus,n_total,n_partial,n_remaining; + double hairpin_base_energy,mfe_hairpin_base_energy,bound_bias; + + update_init_hybrid_param(inter_molecular_init_energy); + + for (kk=0;kkcutpoint)) { + int last1,first2,ncst1=0,ncst2=0; + last1 = (int)(cutpoint); + first2 = (int)(cutpoint)+1; + if (iifirst2) { + ncst2 = cst_segment[first2][jj-first2-1]; + } + nt2mut = ll - ncst1 - ncst2; + } + else if ((ll>=__hairpin_min_length__)&&(ll<=__hairpin_max_length__)) { + nt2mut = ll-2 - cst_segment[ii+2][ll-3]; + } + else { + continue; + } + + for (xx=0;xx<4;xx++) { + for (yy=0;yy<4;yy++) { + if (validBasePair(xx,yy)) { /* special case when xx and yy base pair */ + + /**** enumerate all interior base pair cases ****/ + + Zs[kk][ii][jj][xx][yy].pf = 0.0; + Zs[kk][ii][jj][xx][yy].mfe = __infinity__; + + if ((iicutpoint)) { /* (ii,jj) is an intermolecular interaction */ + + if (include_intermolecular_interactions) { + + newK=kk-kronecker(ii,xx)-kronecker(jj,yy); + + if ((newK>=0)&&(newK<=nt2mut)) { + /* check cst */ + if (!(((cst_tape[ii])&&(kronecker(ii,xx)))|| + ((cst_tape[jj])&&(kronecker(jj,yy))))) { + + /*** generic cases (interior bases uu and vv are still considered for further extensions) ***/ + + /* n_remaining = genereMutant(nt2mut,newK); */ + if (jj-ii>1) { + n_remaining = sequence_bias(ii+1,jj-1,newK) * nucleotide_bias(ii,xx) * nucleotide_bias(jj,yy); + } + else { + n_remaining = nucleotide_bias(ii,xx) * nucleotide_bias(jj,yy); + } + + Zs[kk][ii][jj][xx][yy].pf += pf_hybrid_initialization_energy * n_remaining; + Zs[kk][ii][jj][xx][yy].mfe = minimum_double(Zs[kk][ii][jj][xx][yy].mfe, mfe_hybrid_initialization_energy); + } + } + } + } + else { /* (ii,jj) is an hairpin. length check has already been done */ + + for (uu=0;uu<4;uu++) { + for (vv=0;vv<4;vv++) { + + hairpin_base_energy = boltzmannHairpin(xx,uu,vv,yy,ll); + mfe_hairpin_base_energy = EHairpin(xx,uu,vv,yy,ll); + newK=kk-kronecker(ii,xx)-kronecker(ii+1,uu)-kronecker(jj-1,vv)-kronecker(jj,yy); + bound_bias = nucleotide_bias(ii,xx) * nucleotide_bias(ii+1,uu) * nucleotide_bias(jj-1,vv) * nucleotide_bias(jj,yy); + + if ((newK>=0)&&(newK<=nt2mut)) { + if ((__hairpin_min_length__<=ll)||(ll<=__hairpin_max_length__)) { + /* check cst */ + if (!(((cst_tape[ii])&&(kronecker(ii,xx)))|| + ((cst_tape[jj])&&(kronecker(jj,yy)))|| + ((cst_tape[ii+1])&&(kronecker(ii+1,uu)))|| + ((cst_tape[jj-1])&&(kronecker(jj-1,vv))))) { + + n_total = n_partial = 0; + + if (ll==3) { /** triloop **/ + triloop_counter(newK,ii,jj,xx,uu,vv,yy); + for (ind=0;ind0) { + Zs[kk][ii][jj][xx][yy].pf += hairpin_base_energy * exp(-(bonus/__RT__)) * n_partial; + Zs[kk][ii][jj][xx][yy].mfe = minimum_double(Zs[kk][ii][jj][xx][yy].mfe,mfe_hairpin_base_energy + bonus); + } + } + } + else if (ll==4) { /** tetraloop **/ + tetraloop_counter(newK,ii,jj,xx,uu,vv,yy); + n_total = 0; + for (ind=0;ind0) { + Zs[kk][ii][jj][xx][yy].pf += hairpin_base_energy * exp(-(bonus/__RT__)) * n_partial; + Zs[kk][ii][jj][xx][yy].mfe = minimum_double(Zs[kk][ii][jj][xx][yy].mfe,mfe_hairpin_base_energy + bonus); + } + } + } + + /*** other cases ***/ +#ifdef OLD_GGG_HAIRPIN + n_partial = 0; + if((xx==INDEX_G)&&(uu==INDEX_G)&&(yy==INDEX_U)) { /*** GGG loop ***/ + if (kronecker(ii+2,INDEX_G)) { /*** 3rd nt needs to mutate ***/ + if ((newK)&&(!(cst_tape[ii+2]))&&(nt2mut>0)) { + /* n_partial = genereMutant(nt2mut-1,newK-1); */ + n_partial = sequence_bias(ii+2,jj-1,newK-1) * bound_bias; + n_total += n_partial; + if (n_partial>0) { + Zs[kk][ii][jj][xx][yy].pf += hairpin_base_energy * exp(-(ggg_hairpin_bonus/__RT__)) * n_partial; + Zs[kk][ii][jj][xx][yy].mfe = minimum_double(Zs[kk][ii][jj][xx][yy].mfe,mfe_hairpin_base_energy + ggg_hairpin_bonus); + } + } + } + else { /*** already a GGG loop ***/ + if (nt2mut>0) { + /* n_partial = genereMutant(nt2mut-1,newK); */ + n_partial = sequence_bias(ii+2,jj-1,newK) * bound_bias; + n_total += n_partial; + if (n_partial>0) { + Zs[kk][ii][jj][xx][yy].pf += hairpin_base_energy * exp(-(ggg_hairpin_bonus/__RT__)) * n_partial; + Zs[kk][ii][jj][xx][yy].mfe = minimum_double(Zs[kk][ii][jj][xx][yy].mfe,mfe_hairpin_base_energy + ggg_hairpin_bonus); + } + } + } + } +#endif + /*** generic cases ***/ + + /* n_remaining = genereMutant(nt2mut,newK) - n_total; */ + n_remaining = sequence_bias(ii+2,jj-2,newK) * bound_bias - n_total; + Zs[kk][ii][jj][xx][yy].pf += hairpin_base_energy * n_remaining; + Zs[kk][ii][jj][xx][yy].mfe = minimum_double(Zs[kk][ii][jj][xx][yy].mfe,mfe_hairpin_base_energy); + + /* initialize related arrays */ + + Zms[kk][ii][jj][xx][yy].pf = Zes[kk][ii][jj][xx][yy].pf = Zs[kk][ii][jj][xx][yy].pf * boltzmann_penalty_close_helix(xx,yy); + Zms[kk][ii][jj][xx][yy].mfe = Zes[kk][ii][jj][xx][yy].mfe = Zs[kk][ii][jj][xx][yy].mfe + penalty_close_helix(xx,yy); + + } + } + } + } + } + } + } + } + } + } + } + } + } +} + + +/*******************************************************************************/ +/* */ +/* Mutant algorithm for computing of the boltzmann distribution */ +/* */ +/*******************************************************************************/ + +void RNAmutants_algorithm_hybrid(int verbose) { + + int len, ii, jj, newii, newjj, rr, kk, xx, yy, nn, uu, vv, aa, bb, cc, dd, ee, ll, global_max_bp,newK,nb_free_nt,nt2mut; + unsigned int *list_config, *list_config_close, *list_config_open; + int cloop,nb_mut_motif,nb_nt,nb_max_mut,ii_list,ii_list_open,ii_list_close,config,config_close,config_open; + int nb_max_mut_unk_loop,nb_mut_unk_loop,nb_max_mut_close_bp,nb_mut_close_bp,nb_max_mut_open_bp,nb_mut_open_bp; + int nb_max_mut_in_bulge, nb_mut_in_bulge, size_bulge,nb_mut_inside_boundary,min_rr,max_rr; + double cmpt_mutants; + clock_t start=0, current=0; + double cpu_time_used; + int leftmostseq2,rightmostseq1; + int valid_index, min_gap; + int cut_left = (int)(cutpoint); + int cut_right = (int)(cutpoint)+1; + + rightmostseq1=(int)(cutpoint-0.5); + leftmostseq2=(int)(cutpoint+0.5); + +#ifdef DEBUG_SAMPLING + double debug,pdebug; +#endif + + if (verbose) { + start = clock(); + current = start; + } + + for (kk=0;kkcutpoint)) continue; /* only intramolecular interactions */ + + for (xx=0;xx<4;xx++) { + + if (kronecker(ii,xx) && cst_tape[ii]) continue; + + for (yy=0;yy<4;yy++) { + + if (kronecker(jj,yy) && cst_tape[jj]) continue; + + /* right */ + if (!((cst_tape[jj])&&(kronecker(jj,yy)))) { + for (uu=0;uu<4;uu++) { + newK = kk - kronecker(jj,yy); + if (newK>=0) { + + Zes[kk][ii][jj][xx][yy].pf += Zes[newK][ii][jj-1][xx][uu].pf * nucleotide_bias(jj,yy); + Zes[kk][ii][jj][xx][yy].mfe = minimum_double(Zes[kk][ii][jj][xx][yy].mfe,Zes[newK][ii][jj-1][xx][uu].mfe); + Ze[kk][ii][jj][xx][yy].pf += Ze[newK][ii][jj-1][xx][uu].pf * nucleotide_bias(jj,yy); + Ze[kk][ii][jj][xx][yy].mfe = minimum_double(Ze[kk][ii][jj][xx][yy].mfe,Ze[newK][ii][jj-1][xx][uu].mfe); + Zms[kk][ii][jj][xx][yy].pf += boltzmannExtendMultiLoop(1) * Zms[newK][ii][jj-1][xx][uu].pf * nucleotide_bias(jj,yy); + Zms[kk][ii][jj][xx][yy].mfe = minimum_double(Zms[kk][ii][jj][xx][yy].mfe,EExtendMultiLoop(1) + Zms[newK][ii][jj-1][xx][uu].mfe); + Zm[kk][ii][jj][xx][yy].pf += boltzmannExtendMultiLoop(1) * Zm[newK][ii][jj-1][xx][uu].pf * nucleotide_bias(jj,yy); + Zm[kk][ii][jj][xx][yy].mfe = minimum_double(Zm[kk][ii][jj][xx][yy].mfe,EExtendMultiLoop(1) + Zm[newK][ii][jj-1][xx][uu].mfe); + } + } + } + + /* left */ + if (!((cst_tape[ii])&&(kronecker(ii,xx)))) { + for (uu=0;uu<4;uu++) { + newK = kk - kronecker(ii,xx); + if (newK>=0) { + Zes[kk][ii][jj][xx][yy].pf += Zs[newK][ii+1][jj][uu][yy].pf * boltzmann_penalty_close_helix(uu,yy) * nucleotide_bias(ii,xx); + Zes[kk][ii][jj][xx][yy].mfe = minimum_double(Zes[kk][ii][jj][xx][yy].mfe,Zs[newK][ii+1][jj][uu][yy].mfe + penalty_close_helix(uu,yy)); + Zms[kk][ii][jj][xx][yy].pf += Zs[newK][ii+1][jj][uu][yy].pf * boltzmann_penalty_close_helix(uu,yy) * nucleotide_bias(ii,xx) * boltzmannExtendMultiLoop(1); + Zms[kk][ii][jj][xx][yy].mfe = minimum_double(Zms[kk][ii][jj][xx][yy].mfe,Zs[newK][ii+1][jj][uu][yy].mfe + penalty_close_helix(uu,yy) + EExtendMultiLoop(1)); + } + } + } + } + } + } + + /* GENERAL CASE */ + + for (len=4;len<=rna_len;len++) { /* the number of nucleic acids in the subsequence */ + + global_max_bp = (len-__hairpin_min_length__)/2; + + for (ii=0;ii<=rna_len-len;ii++) { /* ii is the index of the first nucleic acid of the subsequence (indices start at 0) */ + jj=ii+len-1; /* jj is the index of the last nucleic acid of the subsequence */ + + if (((jj=cutpoint))&&(len<__hairpin_min_length__+4)) continue; /* remove short intramolecular interactions */ + +#ifdef DEBUG_SAMPLING + debug = pdebug = 0; + if ((ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) { + for (xx=0;xx<4;xx++) { + for (yy=0;yy<4;yy++) { + if (validBasePair(xx,yy)) { /* special case when xx and yy base pair */ + debug += Zs[kk][ii][jj][xx][yy].pf; + } + } + } + printf("hairpin: %e\n",debug); + pdebug = debug; + } +#endif + + + /* Add potential secondary structure in intermolecular hairpins. This has not been done by precomputation b/c Ze was not available */ + + + if (is_basepair(ii,jj)){ /* lookup structure constraints */ + if ((ii=__hairpin_min_length__+2) { + valid_index_left=1; + } + if (jj-leftmostseq2>=__hairpin_min_length__+2) { + valid_index_right=1; + } + + for(xx=0;xx<4;xx++) { + for(yy=0;yy<4;yy++) { + if (validBasePair(xx,yy)) { + int nb_mut_in_internal_region = kk - kronecker(ii,xx) - kronecker(jj,yy); + int nmut_left,nmut_right; + double pf_left,pf_right,mfe_right,mfe_left; + + + if (nb_mut_in_internal_region>=0) { + + for (nmut_left=0;nmut_left<=nb_mut_in_internal_region;nmut_left++) { + + nmut_right=nb_mut_in_internal_region-nmut_left; + + pf_left = sequence_bias(ii+1,cut_left,nmut_left) * nucleotide_bias(ii,xx); + mfe_left = 0.0; + pf_right = sequence_bias(cut_right,jj-1,nmut_right) * nucleotide_bias(jj,yy); + mfe_right = 0.0; + + for(uu=0;uu<4;uu++) { + for(vv=0;vv<4;vv++) { + if (valid_index_left) { + pf_left+=Zes[nmut_left][ii+1][rightmostseq1][uu][vv].pf+Ze[nmut_left][ii+1][rightmostseq1][uu][vv].pf; + mfe_left=minimum_double(Zes[nmut_left][ii+1][rightmostseq1][uu][vv].mfe,mfe_left); + mfe_left=minimum_double(Ze[nmut_left][ii+1][rightmostseq1][uu][vv].mfe,mfe_left); + } + if (valid_index_right) { + pf_right+=Zes[nmut_right][leftmostseq2][jj-1][uu][vv].pf+Ze[nmut_right][leftmostseq2][jj-1][uu][vv].pf; + mfe_right=minimum_double(Zes[nmut_right][leftmostseq2][jj-1][uu][vv].mfe,mfe_right); + mfe_right=minimum_double(Zes[nmut_right][leftmostseq2][jj-1][uu][vv].mfe,mfe_right); + } + } + } + + if ((mfe_left!=0.0)||(mfe_right!=0.0)) { /* cannot efficiently use pf value b/c of bias */ + Zs[kk][ii][jj][xx][yy].pf += pf_left * pf_right * pf_hybrid_initialization_energy * nucleotide_bias(ii,xx) * nucleotide_bias(jj,yy); + Zs[kk][ii][jj][xx][yy].mfe = minimum_double(mfe_left+mfe_right+mfe_hybrid_initialization_energy,Zs[kk][ii][jj][xx][yy].mfe); +#ifdef DEBUG_MFE + if ((kk==K_CHECK)&&(ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) printf("hairpin:(%d,%d)(%d,%d): %e\n",xx,yy,uu,vv,mfe_left+mfe_right+mfe_hybrid_initialization_energy); +#endif + } + } + } + } + } + } + } + } + + /* lookup stacks */ + + nb_max_mut=minimum(4-cst_tape[ii]-cst_tape[ii+1]-cst_tape[jj-1]-cst_tape[jj],kk); + + if (is_stack(ii,jj)){ /* lookup structure constraints */ + + valid_index=0; + + if ((jj=cutpoint)) { + if (len>=__hairpin_min_length__+4) { + valid_index=1; + } + } + else if ((ii>6; + uu=(config>>4)&3; + vv=(config>>2)&3; + yy=config&3; + newK=kk-nb_mut_motif + kronecker(ii+1,uu) + kronecker(jj-1,vv); + Zs[kk][ii][jj][xx][yy].pf += boltzmannStack(xx,uu,vv,yy) * Zs[newK][ii+1][jj-1][uu][vv].pf * nucleotide_bias(ii,xx) * nucleotide_bias(jj,yy); + Zs[kk][ii][jj][xx][yy].mfe = minimum_double(Zs[kk][ii][jj][xx][yy].mfe, EStack(xx,uu,vv,yy) + Zs[newK][ii+1][jj-1][uu][vv].mfe); +#ifdef DEBUG_SAMPLING + if ((ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) debug += boltzmannStack(xx,uu,vv,yy) * Zs[newK][ii+1][jj-1][uu][vv].pf; +#endif +#ifdef DEBUG_MFE + if ((kk==K_CHECK)&&(ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) printf("stack:(%d,%d)(%d,%d): %e\n",xx,yy,uu,vv,EStack(xx,uu,vv,yy) + Zs[newK][ii+1][jj-1][uu][vv].mfe); +#endif + ii_list++; + } + } + } + } +#ifdef DEBUG_SAMPLING + if ((ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) printf("stack: %e\n",debug-pdebug); + pdebug = debug; +#endif + + /* lookup special internal loops */ + for (cloop=0;cloop<4;cloop++) { + + nb_nt = 6 + (cloop>>1) + (cloop&1); /* number of nt in the internal loop */ + nb_max_mut=minimum(nb_nt,kk); + + for (nb_mut_motif=0;nb_mut_motif<=nb_max_mut;nb_mut_motif++) { + list_config = loop_tab[nb_mut_motif][cloop][ii][jj]; + ii_list = 0; + + while ((config=list_config[ii_list])) { + + switch (cloop) { + case 0: + newii=ii+2; + newjj=jj-2; + if (!is_internal_loop(ii,newii,newjj,jj)) break; /* lookup structure constraints */ + if (((newiicutpoint))||((len>=__hairpin_min_length__+6)&&((newjj=cutpoint)))) { /* constrain loop to respect cutpoint */ + xx=config>>10; + aa=(config>>8)&3; + uu=(config>>6)&3; + vv=(config>>4)&3; + bb=(config>>2)&3; + yy=config&3; + newK = kk - nb_mut_motif + kronecker(ii+2,uu) + kronecker(jj-2,vv); + Zs[kk][ii][jj][xx][yy].pf += boltzmannInternal_1x1(xx,aa,uu,vv,bb,yy) * Zs[newK][ii+2][jj-2][uu][vv].pf * nucleotide_bias(ii,xx) * nucleotide_bias(ii+1,aa) * nucleotide_bias(jj-1,bb) * nucleotide_bias(jj,yy); + Zs[kk][ii][jj][xx][yy].mfe = minimum_double(Zs[kk][ii][jj][xx][yy].mfe,EInternal_1x1(xx,aa,uu,vv,bb,yy) + Zs[newK][ii+2][jj-2][uu][vv].mfe); + +#ifdef DEBUG_SAMPLING + if ((ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) debug += boltzmannInternal_1x1(xx,aa,uu,vv,bb,yy) * Zs[newK][ii+2][jj-2][uu][vv].pf; +#endif +#ifdef DEBUG_MFE + if ((kk==K_CHECK)&&(ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) printf("1x1:(%d,%d)(%d,%d): %e\n",xx,yy,uu,vv,EInternal_1x1(xx,aa,uu,vv,bb,yy) + Zs[newK][ii+2][jj-2][uu][vv].mfe); +#endif + } + break; + case 1: + newii=ii+2; + newjj=jj-3; + if (!is_internal_loop(ii,newii,newjj,jj)) break; /* lookup structure constraints */ + if (((newiicutpoint))||((len>=__hairpin_min_length__+7)&&((newjj=cutpoint)))) { /* constrain loop to respect cutpoint */ + xx=config>>12; + aa=(config>>10)&3; + uu=(config>>8)&3; + vv=(config>>6)&3; + cc=(config>>4)&3; + bb=(config>>2)&3; + yy=config&3; + newK = kk - nb_mut_motif + kronecker(ii+2,uu) + kronecker(jj-3,vv); + Zs[kk][ii][jj][xx][yy].pf += boltzmannInternal_1x2(xx,aa,uu,vv,cc,bb,yy) * Zs[newK][ii+2][jj-3][uu][vv].pf * nucleotide_bias(ii,xx) * nucleotide_bias(ii+1,aa) * nucleotide_bias(jj-2,cc) * nucleotide_bias(jj-1,bb) * nucleotide_bias(jj,yy); + Zs[kk][ii][jj][xx][yy].mfe = minimum_double(Zs[kk][ii][jj][xx][yy].mfe,EInternal_1x2(xx,aa,uu,vv,cc,bb,yy) + Zs[newK][ii+2][jj-3][uu][vv].mfe); +#ifdef DEBUG_SAMPLING + if ((ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) debug += boltzmannInternal_1x2(xx,aa,uu,vv,cc,bb,yy) * Zs[newK][ii+2][jj-3][uu][vv].pf; +#endif +#ifdef DEBUG_MFE + if ((kk==K_CHECK)&&(ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) printf("1x2:(%d,%d)(%d,%d): %e\n",xx,yy,uu,vv,EInternal_1x2(xx,aa,uu,vv,cc,bb,yy) + Zs[newK][ii+2][jj-3][uu][vv].mfe); +#endif + } + break; + case 2: + newii=ii+3; + newjj=jj-2; + if (!is_internal_loop(ii,newii,newjj,jj)) break; /* lookup structure constraints */ + if (((newiicutpoint))||((len>=__hairpin_min_length__+7)&&((newjj=cutpoint)))) { /* constrain loop to respect cutpoint */ + xx=config>>12; + aa=(config>>10)&3; + cc=(config>>8)&3; + uu=(config>>6)&3; + vv=(config>>4)&3; + bb=(config>>2)&3; + yy=config&3; + newK = kk - nb_mut_motif + kronecker(ii+3,uu) + kronecker(jj-2,vv); + Zs[kk][ii][jj][xx][yy].pf += boltzmannInternal_2x1(xx,aa,cc,uu,vv,bb,yy) * Zs[newK][ii+3][jj-2][uu][vv].pf * nucleotide_bias(ii,xx) * nucleotide_bias(ii+1,aa) * nucleotide_bias(ii+2,cc) * nucleotide_bias(jj-1,bb) * nucleotide_bias(jj,yy); + Zs[kk][ii][jj][xx][yy].mfe = minimum_double(Zs[kk][ii][jj][xx][yy].mfe,EInternal_2x1(xx,aa,cc,uu,vv,bb,yy) + Zs[newK][ii+3][jj-2][uu][vv].mfe); +#ifdef DEBUG_SAMPLING + if ((ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) debug += boltzmannInternal_2x1(xx,aa,cc,uu,vv,bb,yy) * Zs[newK][ii+3][jj-2][uu][vv].pf; +#endif +#ifdef DEBUG_MFE + if ((kk==K_CHECK)&&(ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) printf("2x1:(%d,%d)(%d,%d): %e\n",xx,yy,uu,vv,EInternal_2x1(xx,aa,cc,uu,vv,bb,yy) + Zs[newK][ii+3][jj-2][uu][vv].mfe); +#endif + } + break; + case 3: + newii=ii+3; + newjj=jj-3; + if (!is_internal_loop(ii,newii,newjj,jj)) break; /* lookup structure constraints */ + if (((newiicutpoint))||((len>=__hairpin_min_length__+8)&&((newjj=cutpoint)))) { /* constrain loop to respect cutpoint */ + xx=config>>14; + aa=(config>>12)&3; + cc=(config>>10)&3; + uu=(config>>8)&3; + vv=(config>>6)&3; + dd=(config>>4)&3; + bb=(config>>2)&3; + yy=config&3; + newK = kk - nb_mut_motif + kronecker(ii+3,uu) + kronecker(jj-3,vv); + Zs[kk][ii][jj][xx][yy].pf += boltzmannInternal_2x2(xx,aa,cc,uu,vv,dd,bb,yy) * Zs[newK][ii+3][jj-3][uu][vv].pf * nucleotide_bias(ii,xx) * nucleotide_bias(ii+1,aa) * nucleotide_bias(ii+2,cc) * nucleotide_bias(jj-2,dd) * nucleotide_bias(jj-1,bb) * nucleotide_bias(jj,yy); + Zs[kk][ii][jj][xx][yy].mfe = minimum_double(Zs[kk][ii][jj][xx][yy].mfe,EInternal_2x2(xx,aa,cc,uu,vv,dd,bb,yy) + Zs[newK][ii+3][jj-3][uu][vv].mfe); +#ifdef DEBUG_SAMPLING + if ((ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) debug += boltzmannInternal_2x2(xx,aa,cc,uu,vv,dd,bb,yy) * Zs[newK][ii+3][jj-3][uu][vv].pf; +#endif +#ifdef DEBUG_MFE + if ((kk==K_CHECK)&&(ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) printf("2x2:(%d,%d)(%d,%d): %e\n",xx,yy,uu,vv,EInternal_2x2(xx,aa,cc,uu,vv,dd,bb,yy) + Zs[newK][ii+3][jj-3][uu][vv].mfe); +#endif + } + break; + } + ii_list++; + } + } + } + +#ifdef DEBUG_SAMPLING + if ((ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) printf("special cases: %e\n",debug-pdebug); + pdebug = debug; +#endif + + /** 1xn and nx1 internal loops **/ + + /* partial check further requirement will be conducted later */ + valid_index=1; + if ((ii>6; + aa=(config_close>>4)&3; + bb=(config_close>>2)&3; + yy=config_close&3; + + /** 1xn **/ + + newii=ii+2; + newjj=jj-3-nn; + + if (is_internal_loop(ii,newii,newjj,jj)) { /* lookup structure constraints */ + + if (((newiicutpoint))||((len>=__hairpin_min_length__+7+nn)&&((newjj=cutpoint)))) { + + nt2mut=nn-cst_segment[jj-1-nn][nn-1]; + nb_max_mut_unk_loop = minimum(nt2mut,kk-nb_mut_close_bp); /* to be adjusted later */ + + for (nb_mut_unk_loop=0;nb_mut_unk_loop<=nb_max_mut_unk_loop;nb_mut_unk_loop++) { /* number of mutations in unknown part of loops */ + + /** dont forget to add kronecker because mutation on single loop is be counted twice **/ + nb_max_mut_open_bp=minimum(4,kk-nb_mut_unk_loop-nb_mut_close_bp+kronecker(ii+1,aa)); + + for (nb_mut_open_bp=0;nb_mut_open_bp<=nb_max_mut_open_bp;nb_mut_open_bp++) { + + list_config_open = stack_tab[nb_mut_open_bp][ii+1][jj-2-nn][2]; + ii_list_open = 0; + while ((config_open=list_config_open[ii_list_open])) { + + cc=(config_open>>6)&3; + +#if 0 + if (kk==2) { + printf("--------------------------------\n"); + printf("Close: %d-%d\n",xx,yy); + printf("Close: %d %d\n",aa,bb); + printf("Open: %d %d\n",(config_open>>6)&3,(config_open>>0)&3); + printf("Open: %d-%d\n",(config_open>>4)&3,(config_open>>2)&3); + } +#endif + + if (aa==cc) { + + uu=(config_open>>4)&3; + vv=(config_open>>2)&3; + dd=config_open&3; + + newK = kk - nb_mut_close_bp - nb_mut_open_bp - nb_mut_unk_loop + kronecker(ii+1,aa) + kronecker(ii+2,uu) + kronecker(jj-3-nn,vv); + + if (newK>=0) { + + /* cmpt_mutants = genereMutant(nt2mut,nb_mut_unk_loop); */ + cmpt_mutants = sequence_bias(jj-1-nn,jj-2,nb_mut_unk_loop); + + if (cmpt_mutants>0) { + Zs[kk][ii][jj][xx][yy].pf += boltzmannInternal_generic(xx,aa,cc,uu,vv,dd,bb,yy,1,nn+2) * Zs[newK][ii+2][jj-3-nn][uu][vv].pf + * cmpt_mutants * nucleotide_bias(ii,xx) * nucleotide_bias(ii+1,aa) * nucleotide_bias(jj-2-nn,dd) * nucleotide_bias(jj-1,bb) + * nucleotide_bias(jj,yy); + Zs[kk][ii][jj][xx][yy].mfe = minimum_double(Zs[kk][ii][jj][xx][yy].mfe,EInternal_generic(xx,aa,cc,uu,vv,dd,bb,yy,1,nn+2) + + Zs[newK][ii+2][jj-3-nn][uu][vv].mfe); +#ifdef DEBUG_SAMPLING + if ((ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) debug += boltzmannInternal_generic(xx,aa,cc,uu,vv,dd,bb,yy,1,nn+2) * + Zs[newK][ii+2][jj-3-nn][uu][vv].pf * cmpt_mutants; +#endif +#ifdef DEBUG_MFE + if ((kk==K_CHECK)&&(ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) printf("1xn:(%d,%d)(%d,%d): %e\n",xx,yy,uu,vv,EInternal_generic(xx,aa,cc,uu,vv,dd,bb,yy,1,nn+2) + Zs[newK][ii+2][jj-3-nn][uu][vv].mfe); +#endif + } + } + } + ii_list_open++; + } + } + } + } + } + + + /** nx1 **/ + + newii=ii+3+nn; + newjj=jj-2; + + if (is_internal_loop(ii,newii,newjj,jj)) { /* lookup structure constraints */ + + if (((newiicutpoint))||((len>=__hairpin_min_length__+7+nn)&&((newjj=cutpoint)))) { + + nt2mut=nn-cst_segment[ii+2][nn-1]; + nb_max_mut_unk_loop = minimum(nt2mut,kk-nb_mut_close_bp); /* to be adjusted later */ + + for (nb_mut_unk_loop=0;nb_mut_unk_loop<=nb_max_mut_unk_loop;nb_mut_unk_loop++) { /* number of mutations in unknown part of loops */ + + /** dont forget to add kronecker because mutation on single loop is be counted twice **/ + nb_max_mut_open_bp=minimum(4,kk-nb_mut_unk_loop-nb_mut_close_bp+kronecker(jj-1,bb)); + + for (nb_mut_open_bp=0;nb_mut_open_bp<=nb_max_mut_open_bp;nb_mut_open_bp++) { + + list_config_open = stack_tab[nb_mut_open_bp][ii+2+nn][jj-1][2]; + ii_list_open = 0; + while ((config_open=list_config_open[ii_list_open])) { + + dd=config_open&3; + + if (bb==dd) { + + cc=(config_open>>6)&3; + uu=(config_open>>4)&3; + vv=(config_open>>2)&3; + + newK = kk - nb_mut_close_bp - nb_mut_open_bp - nb_mut_unk_loop + kronecker(jj-1,bb) + kronecker(ii+3+nn,uu) + kronecker(jj-2,vv); + if (newK>=0) { + + /* cmpt_mutants = genereMutant(nt2mut,nb_mut_unk_loop); */ + cmpt_mutants = sequence_bias(ii+2,ii+nn+1,nb_mut_unk_loop); + + if (cmpt_mutants>0) { + Zs[kk][ii][jj][xx][yy].pf += boltzmannInternal_generic(xx,aa,cc,uu,vv,dd,bb,yy,nn+2,1) * + Zs[newK][ii+3+nn][jj-2][uu][vv].pf * cmpt_mutants * nucleotide_bias(ii,xx) * nucleotide_bias(ii+1,aa) * + nucleotide_bias(ii+2+nn,cc) * nucleotide_bias(jj-1,bb) * nucleotide_bias(jj,yy); + Zs[kk][ii][jj][xx][yy].mfe = minimum_double(Zs[kk][ii][jj][xx][yy].mfe,EInternal_generic(xx,aa,cc,uu,vv,dd,bb,yy,nn+2,1) + + Zs[newK][ii+3+nn][jj-2][uu][vv].mfe); +#ifdef DEBUG_SAMPLING + if ((ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) debug += boltzmannInternal_generic(xx,aa,cc,uu,vv,dd,bb,yy,nn+2,1) * + Zs[newK][ii+3+nn][jj-2][uu][vv].pf * cmpt_mutants; +#endif +#ifdef DEBUG_MFE + if ((kk==K_CHECK)&&(ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) printf("nx1:(%d,%d)(%d,%d): %e\n",xx,yy,uu,vv,EInternal_generic(xx,aa,cc,uu,vv,dd,bb,yy,nn+2,1) + Zs[newK][ii+3+nn][jj-2][uu][vv].mfe); +#endif + } + } + } + ii_list_open++; + } + } + } + } + } + ii_list_close++; + } + } + } + } + +#ifdef DEBUG_SAMPLING + if ((ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) printf("1xn & nx1: %e\n",debug-pdebug); + pdebug = debug; +#endif + + /** mxn internal loops (m+n>4) **/ + + valid_index=1; + + if ((iicutpoint)) { + nb_free_nt = minimum(2*__max_size_bulge__,len - 8); + if ((ii+3>cutpoint)||(jj-3>6; + aa=(config_close>>4)&3; + bb=(config_close>>2)&3; + yy=config_close&3; + + for (nn=1;nn<=nb_free_nt;nn++) { /* number of undefined nucleotides in internal loop */ + + min_rr = maximum(0,nn-__max_size_bulge__); + max_rr = minimum(nn,__max_size_bulge__); + + for (rr=min_rr;rr<=max_rr;rr++) { + ll=nn-rr; + + newii=ii+3+ll; + newjj=jj-3-rr; + + if (!is_internal_loop(ii,newii,newjj,jj)) continue; /* lookup structure constraints */ + + if (((newiicutpoint))||((len>=__hairpin_min_length__+8+nn)&&((newjj=cutpoint)))) { /* check that loop respects cutpoint */ + + + nt2mut=nn; + if (ll>0) { nt2mut -= cst_segment[ii+2][ll-1]; } + if (rr>0) { nt2mut -= cst_segment[jj-1-rr][rr-1]; } + nb_max_mut_unk_loop = minimum(nt2mut,kk-nb_mut_close_bp); + + for (nb_mut_unk_loop=0;nb_mut_unk_loop<=nb_max_mut_unk_loop;nb_mut_unk_loop++) { /* number of mutations in unknown part of loops */ + + nb_max_mut_open_bp=minimum(4-cst_tape[ii+2+ll]-cst_tape[ii+3+ll]-cst_tape[jj-2-rr]-cst_tape[jj-3-rr],kk-nb_mut_unk_loop-nb_mut_close_bp); + + for (nb_mut_open_bp=0;nb_mut_open_bp<=nb_max_mut_open_bp;nb_mut_open_bp++) { + list_config_open = stack_tab[nb_mut_open_bp][ii+2+ll][jj-2-rr][2]; + ii_list_open = 0; + while ((config_open=list_config_open[ii_list_open])) { + + cc=(config_open>>6)&3; + uu=(config_open>>4)&3; + vv=(config_open>>2)&3; + dd=config_open&3; + + newK = kk - nb_mut_close_bp - nb_mut_open_bp - nb_mut_unk_loop + kronecker(ii+3+ll,uu) + kronecker(jj-3-rr,vv); + if (newK>=0) { + +#if 0 + if (kk==0) { + printf("kk=%d,newK=%d,close=%d,open=%d,unk=%d,ll=%d,rr=%d at %d,%d to %d,%d\n", + kk,newK,nb_mut_close_bp,nb_mut_open_bp,nb_mut_unk_loop,ll,rr,ii,jj,ii+3+ll,jj-3-rr); + } +#endif + + /* cmpt_mutants = genereMutant(nt2mut,nb_mut_unk_loop); */ + cmpt_mutants = sequence_bias(ii+2,ii+1+ll,nb_mut_unk_loop) + sequence_bias(jj-1-rr,jj-2,nb_mut_unk_loop) + + sequence_bias(ii+2,jj-2,nb_mut_unk_loop) + - sequence_bias(ii+2,jj-2-rr,nb_mut_unk_loop) - sequence_bias(ii+2+ll,jj-2,nb_mut_unk_loop) + + sequence_bias(ii+2+ll,jj-2-rr,nb_mut_unk_loop); + + if (cmpt_mutants>0) { + Zs[kk][ii][jj][xx][yy].pf += boltzmannInternal_generic(xx,aa,cc,uu,vv,dd,bb,yy,ll+2,rr+2) * + Zs[newK][ii+3+ll][jj-3-rr][uu][vv].pf * cmpt_mutants * nucleotide_bias(ii,xx) * nucleotide_bias(ii+1,aa) * + nucleotide_bias(ii+2+ll,cc) * nucleotide_bias(jj-2-rr,dd) * nucleotide_bias(jj-1,bb) * nucleotide_bias(jj,yy); + Zs[kk][ii][jj][xx][yy].mfe = minimum_double(Zs[kk][ii][jj][xx][yy].mfe,EInternal_generic(xx,aa,cc,uu,vv,dd,bb,yy,ll+2,rr+2) + + Zs[newK][ii+3+ll][jj-3-rr][uu][vv].mfe); +#ifdef DEBUG_SAMPLING + if ((ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) debug += boltzmannInternal_generic(xx,aa,cc,uu,vv,dd,bb,yy,ll+2,rr+2) * + Zs[newK][ii+3+ll][jj-3-rr][uu][vv].pf * cmpt_mutants; +#endif +#ifdef DEBUG_MFE + if ((kk==K_CHECK)&&(ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) printf("mxn:(%d,%d)(%d,%d):[%d,%d]: %e\n",xx,yy,uu,vv,ii+3+ll,jj-3-rr,EInternal_generic(xx,aa,cc,uu,vv,dd,bb,yy,ll+2,rr+2) + Zs[newK][ii+3+ll][jj-3-rr][uu][vv].mfe); +#endif + } + } + ii_list_open++; + } + } + } + } + } + } + ii_list_close++; + } + } + } + +#ifdef DEBUG_SAMPLING + if ((ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) printf("generic loop: %e\n",debug-pdebug); + pdebug = debug; +#endif + + for (xx=0;xx<4;xx++) { + + if (kronecker(ii,xx) && cst_tape[ii]) continue; + + for (yy=0;yy<4;yy++) { + + if (kronecker(jj,yy) && cst_tape[jj]) continue; + + /* lookup bulge & multi-loop WARNING: THIS SECTION HAS NOT BEEN OPTIMIZED */ + + /* bulges */ + + if (validBasePair(xx,yy)) { /* special case when xx and yy base pair */ + + nb_mut_inside_boundary = kk - kronecker(ii,xx) - kronecker(jj,yy); + + if (nb_mut_inside_boundary>=0) { + + if ((len > __hairpin_min_length__ +4)||((len > 4)&&(iicutpoint))) { /* min length required for a stack (complete check is completed later) */ + + for (uu=0;uu<4;uu++) { + + for (vv=0;vv<4;vv++) { + + if (validBasePair(uu,vv)) { + + if ((ii=__hairpin_min_length__+4+size_bulge)&&((newjj=cutpoint)))) { /* check that loop respects cutpoint */ + + if (is_internal_loop(ii,newii,newjj,jj)) { /* lookup structure constraints */ + + if (!(kronecker(newii,uu) && cst_tape[newii])|| + !(kronecker(newjj,vv) && cst_tape[newjj])) { + + nt2mut=size_bulge-cst_segment[ii+1][size_bulge-1]; + nb_max_mut_in_bulge = minimum(nt2mut,nb_mut_inside_boundary); + + for (nb_mut_in_bulge=0;nb_mut_in_bulge<=nb_max_mut_in_bulge;nb_mut_in_bulge++) { /* number of mutations in bulge */ + newK = nb_mut_inside_boundary - nb_mut_in_bulge; + if (newK>=0) { + if (Zs[newK][newii][newjj][uu][vv].pf) { + + /* cmpt_mutants = genereMutant(nt2mut,nb_mut_in_bulge); */ + cmpt_mutants = sequence_bias(ii+1,ii+size_bulge,nb_mut_in_bulge); + + if (cmpt_mutants>0) { + Zs[kk][ii][jj][xx][yy].pf += boltzmannBulge(xx,uu,vv,yy,size_bulge) * + Zs[newK][newii][newjj][uu][vv].pf * cmpt_mutants * nucleotide_bias(ii,xx) * nucleotide_bias(jj,yy); + Zs[kk][ii][jj][xx][yy].mfe = minimum_double(Zs[kk][ii][jj][xx][yy].mfe,EBulge(xx,uu,vv,yy,size_bulge) + Zs[newK][newii][newjj][uu][vv].mfe); +#ifdef DEBUG_SAMPLING + if ((ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) debug += boltzmannBulge(xx,uu,vv,yy,size_bulge) * + Zs[newK][newii][newjj][uu][vv].pf * cmpt_mutants; +#endif +#ifdef DEBUG_MFE + if ((kk==K_CHECK)&&(ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) printf("bulgeL:(%d,%d)(%d,%d): %e\n",xx,yy,uu,vv,EBulge(xx,uu,vv,yy,size_bulge) + Zs[newK][newii][newjj][uu][vv].mfe); +#endif + } + } + } + } + } + } + } + + /* bulge on the right */ + + newii = ii+1; + newjj = jj-1-size_bulge; + + if (((newii=__hairpin_min_length__+4+size_bulge)&&((newjj=cutpoint)))) { /* check that loop respects cutpoint */ + + if (is_internal_loop(ii,newii,newjj,jj)) { /* lookup structure constraints */ + + if (!(kronecker(newii,uu) && cst_tape[newii])|| + !(kronecker(newjj,vv) && cst_tape[newjj])) { + + nt2mut=size_bulge-cst_segment[jj-size_bulge][size_bulge-1]; + nb_max_mut_in_bulge = minimum(nt2mut,nb_mut_inside_boundary); + + for (nb_mut_in_bulge=0;nb_mut_in_bulge<=nb_max_mut_in_bulge;nb_mut_in_bulge++) { /* number of mutations in bulge */ + newK = nb_mut_inside_boundary - nb_mut_in_bulge; + if (newK>=0) { + if (Zs[newK][newii][newjj][uu][vv].pf) { + + /* cmpt_mutants = genereMutant(nt2mut,nb_mut_in_bulge); */ + cmpt_mutants = sequence_bias(jj-size_bulge,jj-1,nb_mut_in_bulge); + + if (cmpt_mutants>0) { + Zs[kk][ii][jj][xx][yy].pf += boltzmannBulge(xx,uu,vv,yy,size_bulge) * + Zs[newK][newii][newjj][uu][vv].pf * cmpt_mutants * nucleotide_bias(ii,xx) * nucleotide_bias(jj,yy); + Zs[kk][ii][jj][xx][yy].mfe = minimum_double(Zs[kk][ii][jj][xx][yy].mfe, EBulge(xx,uu,vv,yy,size_bulge) + Zs[newK][newii][newjj][uu][vv].mfe); +#ifdef DEBUG_SAMPLING + if ((ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) debug += boltzmannBulge(xx,uu,vv,yy,size_bulge) * + Zs[newK][newii][newjj][uu][vv].pf * cmpt_mutants; +#endif +#ifdef DEBUG_MFE + if ((kk==K_CHECK)&&(ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) printf("bulgeR:(%d,%d)(%d,%d): %e\n",xx,yy,uu,vv,EBulge(xx,uu,vv,yy,size_bulge) + Zs[newK][newii][newjj][uu][vv].mfe); +#endif + } + } + } + } + } + } + } + } + } + + /* close multi-loop*/ + + if ((ii=(rr-ii-1)) { /* lookup structure constraints */ + + if ((!((cst_tape[ii])&&(kronecker(ii,xx))))&&(validBasePair(uu,yy))) { + + if ((jj-rr>__hairpin_min_length__)||((rr1) { + + nt2mut = rr-ii-1 - cst_segment[ii+1][rr-ii-2]; + newK = minimum(nt2mut,nb_mut_inside_boundary); + + for (ee=0;ee<=newK;ee++) { + + /* cmpt_mutants = genereMutant(nt2mut,ee); */ + cmpt_mutants = sequence_bias(ii+1,rr-1,ee) * nucleotide_bias(ii,xx); + + if (cmpt_mutants > 0) { + Zes[kk][ii][jj][xx][yy].pf += Zs[nb_mut_inside_boundary-ee][rr][jj][uu][yy].pf * boltzmann_penalty_close_helix(uu,yy) * cmpt_mutants; + Zes[kk][ii][jj][xx][yy].mfe = minimum_double(Zes[kk][ii][jj][xx][yy].mfe, + Zs[nb_mut_inside_boundary-ee][rr][jj][uu][yy].mfe + penalty_close_helix(uu,yy)); + Zms[kk][ii][jj][xx][yy].pf += Zs[nb_mut_inside_boundary-ee][rr][jj][uu][yy].pf * boltzmann_penalty_close_helix(uu,yy) * cmpt_mutants * boltzmannExtendMultiLoop(rr-ii); + Zms[kk][ii][jj][xx][yy].mfe = minimum_double(Zms[kk][ii][jj][xx][yy].mfe, + Zs[nb_mut_inside_boundary-ee][rr][jj][uu][yy].mfe + penalty_close_helix(uu,yy) + EExtendMultiLoop(rr-ii)); + } + } + } + else { + newK = kk - kronecker(ii,xx); + if (newK>=0) { + Zes[kk][ii][jj][xx][yy].pf += Zs[newK][rr][jj][uu][yy].pf * boltzmann_penalty_close_helix(uu,yy) * nucleotide_bias(ii,xx); + Zes[kk][ii][jj][xx][yy].mfe = minimum_double(Zes[kk][ii][jj][xx][yy].mfe,Zs[newK][rr][jj][uu][yy].mfe + penalty_close_helix(uu,yy)); + Zms[kk][ii][jj][xx][yy].pf += Zs[newK][rr][jj][uu][yy].pf * boltzmann_penalty_close_helix(uu,yy) * nucleotide_bias(ii,xx) * boltzmannExtendMultiLoop(1); + Zms[kk][ii][jj][xx][yy].mfe = minimum_double(Zms[kk][ii][jj][xx][yy].mfe,Zs[newK][rr][jj][uu][yy].mfe + penalty_close_helix(uu,yy) + EExtendMultiLoop(1)); + } + } + } + } + } + + if (((rr-ii>__hairpin_min_length__+1)||((ii__hairpin_min_length__)||((rr0) { /* lookup structure constraints */ + + if ((iimin_gap+2) { /* minimum length required */ + if (!((cst_tape[jj])&&(kronecker(jj,yy)))) { + for (uu=0;uu<4;uu++) { + /* right */ + newK = kk - kronecker(jj,yy); + if (newK>=0) { + Zes[kk][ii][jj][xx][yy].pf += Zes[newK][ii][jj-1][xx][uu].pf * nucleotide_bias(jj,yy); + Zes[kk][ii][jj][xx][yy].mfe = minimum_double(Zes[kk][ii][jj][xx][yy].mfe,Zes[newK][ii][jj-1][xx][uu].mfe); + Ze[kk][ii][jj][xx][yy].pf += Ze[newK][ii][jj-1][xx][uu].pf * nucleotide_bias(jj,yy); + Ze[kk][ii][jj][xx][yy].mfe = minimum_double(Ze[kk][ii][jj][xx][yy].mfe,Ze[newK][ii][jj-1][xx][uu].mfe); + Zms[kk][ii][jj][xx][yy].pf += boltzmannExtendMultiLoop(1) * Zms[newK][ii][jj-1][xx][uu].pf * nucleotide_bias(jj,yy); + Zms[kk][ii][jj][xx][yy].mfe = minimum_double(Zms[kk][ii][jj][xx][yy].mfe,EExtendMultiLoop(1) + Zms[newK][ii][jj-1][xx][uu].mfe); + Zm[kk][ii][jj][xx][yy].pf += boltzmannExtendMultiLoop(1) * Zm[newK][ii][jj-1][xx][uu].pf * nucleotide_bias(jj,yy); + Zm[kk][ii][jj][xx][yy].mfe = minimum_double(Zm[kk][ii][jj][xx][yy].mfe,EExtendMultiLoop(1) + Zm[newK][ii][jj-1][xx][uu].mfe); + } + } + } + } + } + } + } + +#ifdef DEBUG_SAMPLING + if ((ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) printf("bulge & multi: %e\n",debug-pdebug); + pdebug = debug; +#endif + } + } + + if (verbose) { + current = clock(); + cpu_time_used = ((double) (current - start)) / CLOCKS_PER_SEC; + printf(">%d\t%g\n",kk,cpu_time_used); + } + + } + +#ifdef INFO + printf("\n"); +#endif + +} + + diff --git a/src/hybrid.h b/src/hybrid.h new file mode 100644 index 0000000..32e28f1 --- /dev/null +++ b/src/hybrid.h @@ -0,0 +1,4 @@ +void init_Mutant_arrays_hybrid(); +void update_init_hybrid_param(double value); +void precomputeHairpin_hybrid(int cutoff, int include_intermolecular_interactions); +void RNAmutants_algorithm_hybrid(int verbose); diff --git a/src/mfe_backtrack.c b/src/mfe_backtrack.c new file mode 100644 index 0000000..e6a9303 --- /dev/null +++ b/src/mfe_backtrack.c @@ -0,0 +1,1595 @@ +#include +#include +#include +#include +#include +#include "reader_energy_params.h" +#include "energy_functions.h" +#include "util.h" +#include "mfe_backtrack.h" +#include "energy_params_tables.h" +#include "sampling.h" +#include "constraints.h" + +/* declared in turner_functions.c */ + +extern double __temperature; +extern double __RT__; + +/* in RNAmutants.h */ + +#define INDEX_A 0 +#define INDEX_C 1 +#define INDEX_G 2 +#define INDEX_U 3 +#define INDEX_STOP -1 + +/* global variables */ + +struct Zcell { + double pf; + double mfe; +}; + +extern struct Zcell *****Zms; +extern struct Zcell *****Zes; +extern struct Zcell *****Zs; +extern struct Zcell *****Zm; +extern struct Zcell *****Ze; +extern const int __hairpin_min_length__; /* the minimal length of a hairpin loop */ +extern const int __hairpin_max_length__; /* the minimal length of a hairpin loop */ +extern const int __vis_range__; /* range of visibility */ +extern const int __max_size_bulge__; /* maximal size of bulge in loop */ +extern int rna_len; /* length of the arn*/ +extern char *input_tape; +extern int max_mutations; +extern int print_warning; +extern int dangle_used; +extern unsigned int *****loop_tab; +extern unsigned int *****stack_tab; +extern int *cst_tape; +extern int **cst_segment; +extern int nb_value_triloop_table; +extern double *triloop_cmpt_table; +extern int nb_value_tetraloop_table; +extern double *tetraloop_cmpt_table; +extern int uncst_mutation[2][4][4]; + +#define NO_TRACEBACK +#define NO_DEBUG_SAMPLING +#define NO_DEBUG_MFE +#define LEFT_CHECK 7 +#define RIGHT_CHECK 26 + + +const double __backtrack_double_precision__ = 0.01; + +inline int are_equal(double a, double b) { + + if (fabs(b-a)<__backtrack_double_precision__ ) { + return 1; + } + return 0; +} + +/**** variables for hybrid ****/ + +extern double mfe_hybrid_initialization_energy; +extern double pf_hybrid_initialization_energy; +extern int include_intermolecular_interactions; +extern double cutpoint; + +/***********************************************************************************************/ +/* sampling random mutation in a segment */ +/***********************************************************************************************/ + + +void mfe_fill_random_mutations(int nb_mutations, int i, int j, char **ss_sample) { + int nt, ilist, *nt_list; + double va,anchor; + +#ifdef TRACEBACK + fprintf(stderr,"fill mfe random: mut=%d, ii=%d, jj=%d: %s\n",nb_mutations,i,j,getJobID()); + fflush(stderr); +#endif + + /* check */ + + if (j-i+1nb_mutations) { /* there is still some non-mutated positions */ + if (j-i>0) { anchor += sequence_bias(i+1,j,nb_mutations) * nucleotide_bias(i,char2index(i)); } /* end is not reached */ + else { anchor += nucleotide_bias(i,char2index(i)); } /* last nucleotide */ + if (va<=anchor) { + ss_sample[0][i]=input_tape[i]; + ss_sample[1][i]='.'; + mfe_fill_random_mutations(nb_mutations, i+1, j, ss_sample); + return; + } + } + + if ((nb_mutations>0)&&(!cst_tape[i])) { /* mutations at position i */ + ilist=0; + nt_list = uncst_mutation[1][char2index(i)]; + while ((nt=nt_list[ilist])!=INDEX_STOP) { + if (j-i>0) { anchor += nucleotide_bias(i,nt) * sequence_bias(i+1,j,nb_mutations-1); } + else { anchor += nucleotide_bias(i,nt); } + if (va<=anchor) { + ss_sample[0][i]=index2char(i,nt); + ss_sample[1][i]='.'; + mfe_fill_random_mutations(nb_mutations-1, i+1, j, ss_sample); + return; + } + ilist++; + } + } + + fprintf(stderr,"%s:line %d: sampling failed (i=%d,j=%d,k=%d,va=%e,anchor=%e,max=%f).%s\n",__FILE__,__LINE__,j,j,nb_mutations,va,anchor,sequence_bias(i,j,nb_mutations),getJobID()); + +#ifdef TRACEBACK + fprintf(stderr,"done%s\n",getJobID()); +#endif + +} + + +/***********************************************************************************************/ +/* sampling hairpins */ +/* */ +/* WARNING: We assume that there is no overlap between triloop, tetraloop and GGG loop bonuses */ +/* */ +/***********************************************************************************************/ + +void backtrack_triloop(int nb_mut_in_unk,int ii,int jj, int lnt, int uu, int vv, int rnt, char **ss_sample, double bonus_value) { + int ilist1,base_hcode,hcode; + int *nt_list1,nt1; + int ind_table,final_rank,current_rank; + + triloop_counter(nb_mut_in_unk,ii,jj,lnt,uu,vv,rnt); + ind_table=0; + while (triloop_cmpt_table[2*ind_table]!=bonus_value) { + ind_table++; + if (ind_table>=nb_value_triloop_table) { + fprintf(stderr,"%s:line %d: Cannot find bonus value %e into triloop table.%s\n",__FILE__,__LINE__,bonus_value,getJobID()); + exit(EXIT_FAILURE); + } + } + + /* rank of sample triloop */ + final_rank = (int)(random_va() * triloop_cmpt_table[2*ind_table+1]); + + base_hcode = (lnt<<8) | (uu<<6) | (vv<<2) | rnt; + ilist1=0; + nt_list1 = uncst_mutation[nb_mut_in_unk][char2index(ii+2)]; + current_rank = 0; + while ((nt1=nt_list1[ilist1])!=INDEX_STOP) { + hcode = base_hcode | (nt1<<4); + if (refTableTriLoop[hcode]==bonus_value) { + if (current_rank == final_rank) { + ss_sample[0][ii+2]=index2char(ii+2,nt1); + ss_sample[1][ii+2]='.'; + return; + } + else { + current_rank++; + } + } + ilist1++; + } + fprintf(stderr,"%s:line %d: Triloop sampling failed.%s\n",__FILE__,__LINE__,getJobID()); +} + +void backtrack_tetraloop(int nb_mut_in_unk,int ii,int jj, int lnt, int uu, int vv, int rnt, char **ss_sample, double bonus_value) { + int ilist1,ilist2,base_hcode,hcode; + int *nt_list1,nt1,*nt_list2,nt2; + int ind_table,final_rank,current_rank; + int tab_mut_remaining[3][2][2] = {{{0,0}},{{0,1},{1,0}},{{1,1}}}; + int kk,maxk; + + tetraloop_counter(nb_mut_in_unk,ii,jj,lnt,uu,vv,rnt); + ind_table=0; + while (tetraloop_cmpt_table[2*ind_table]!=bonus_value) { + ind_table++; + if (ind_table>=nb_value_tetraloop_table) { + fprintf(stderr,"%s:line %d: Cannot find bonus value %e into tetraloop table.%s\n",__FILE__,__LINE__,bonus_value,getJobID()); + exit(EXIT_FAILURE); + } + } + + /* rank of sample tetraloop */ + final_rank = (int)(random_va() * tetraloop_cmpt_table[2*ind_table+1]); + + + base_hcode = (lnt<<10) | (uu<<8) | (vv<<2) | rnt; + current_rank = 0; + + if (nb_mut_in_unk==1) { maxk=2; } + else { maxk=1; } + + for (kk=0;kk1)) { + fprintf(stderr,"%s:line %d:helix sampling for [%d,%d] with %d base pair failed.%s\n%e\n",__FILE__,__LINE__,ii,jj,nb_mut_remaining,getJobID(),mfe); + } + + if (((jj=cutpoint))&&(jj-ii-1 < __hairpin_min_length__)) { + fprintf(stderr,"%s:line %d:helix sampling failed... Hairpin threshold is not respected at position (%d,%d)%s\n",__FILE__,__LINE__,ii,jj,getJobID()); + } + + if ((cst_tape[ii])&&(kronecker(ii,lnt))) { + fprintf(stderr,"%s:line %d:%s: %d: helix sampling failed... index %d cannot mutate%s\n",__FILE__,__LINE__,__FILE__,__LINE__,ii,getJobID()); + return; + } + + if ((cst_tape[jj])&&(kronecker(jj,rnt))) { + fprintf(stderr,"%s:line %d: helix sampling failed... index %d cannot mutate%s\n",__FILE__,__LINE__,jj,getJobID()); + return; + } + + /* include base pairs */ + + ss_sample[0][ii]=index2char(ii,lnt); + ss_sample[0][jj]=index2char(jj,rnt); + + if ((iicutpoint)) { /* inter molecular hairpin */ + if (include_intermolecular_interactions) { + ss_sample[1][ii]='['; + ss_sample[1][jj]=']'; + } + else { + ss_sample[1][ii]='{'; + ss_sample[1][jj]='}'; + } + } + else { + ss_sample[1][ii]='('; + ss_sample[1][jj]=')'; + } + + /* length */ + + len = jj - ii + 1; + + /* number of mutation in external nucleotides */ + + nb_mut_ext_aa = kronecker(ii,lnt) + kronecker(jj,rnt); + nb_mut_inside_boundary = nb_mut_remaining - nb_mut_ext_aa; + + /*****************************************************************************************************/ + /** hairpin **/ + /*****************************************************************************************************/ + + if ((iicutpoint)) { /* inter molecular hairpin */ + + if (is_hairpin(ii,jj)) { + + if (include_intermolecular_interactions) { + newK = nb_mut_remaining-kronecker(ii,lnt)-kronecker(jj,rnt); + if (ii==5 && jj==10) printf(">>>>>>>> newK=%d\n",newK); + if (len>2) { + nt2mut = len-2 - cst_segment[ii+1][jj-ii-2]; + } + else { + nt2mut = 0; + } + + if ((newK>=0)||(newK<=nt2mut)) { /* check configurations */ + + int nmut_left,nmut_right; + double mfe_left,mfe_right; + int rightmostseq1=(int)(cutpoint-0.5); + int leftmostseq2=(int)(cutpoint+0.5); + int valid_index_left,valid_index_right,valid_index; + + /* single stranded intermolecular hairpin */ + + n_remaining = genereMutant(nt2mut,newK); + anchor = mfe_hybrid_initialization_energy; + + if ((n_remaining)&&(are_equal(mfe,anchor))) { + +#ifdef TRACEBACK + fprintf(stderr,"line %d: sample intermolecular hairpin: k=%d, i=%d, j=%d, mfe=%e, anchor=%e%s\n",__LINE__,newK,ii,jj,mfe,anchor,getJobID()); +#endif + if (len>2) { + mfe_fill_random_mutations(newK,ii+1, jj-1, ss_sample); + } + return; + } + + /* intermolecular hairpin with secondary structure */ + + valid_index_left=0; + valid_index_right=0; + valid_index=0; + + if (rightmostseq1-ii>=__hairpin_min_length__+2) { + valid_index_left=1; + valid_index=1; + } + if (jj-leftmostseq2>=__hairpin_min_length__+2) { + valid_index_right=1; + valid_index=1; + } + + if (valid_index) { + + for (nmut_left=0;nmut_left<=newK;nmut_left++) { + int ss,uu,vv,ww; + nmut_right=newK-nmut_left; + + for(uu=0;uu<4;uu++) { + for(ss=0;ss<4;ss++) { + mfe_left=0; + if (valid_index_left) { + mfe_left=minimum_double(Zes[nmut_left][ii+1][rightmostseq1][uu][ss].mfe,mfe_left); + mfe_left=minimum_double(Ze[nmut_left][ii+1][rightmostseq1][uu][ss].mfe,mfe_left); + } + for(ww=0;ww<4;ww++) { + for(vv=0;vv<4;vv++) { + mfe_right=0; + if (valid_index_right) { + mfe_right=minimum_double(Zes[nmut_right][leftmostseq2][jj-1][ww][vv].mfe,mfe_right); + mfe_right=minimum_double(Ze[nmut_right][leftmostseq2][jj-1][ww][vv].mfe,mfe_right); + } + + anchor=mfe_left+mfe_right+mfe_hybrid_initialization_energy; + + if (((mfe_left)||(mfe_right))&&(are_equal(mfe,anchor))) { + +#ifdef TRACEBACK + fprintf(stderr,"line %d: sample intermolecular hairpin: k=%d, i=%d, j=%d, u=%d, v=%d, mfe=%e, anchor=%e%s\n",__LINE__,newK,ii,jj,uu,vv,mfe,anchor,getJobID()); +#endif + if (valid_index_left) { + backtrackExteriorLoop(nmut_left,ii+1,rightmostseq1,uu,ss,ss_sample,mfe_left); + } + if (valid_index_right) { + backtrackExteriorLoop(nmut_right,leftmostseq2,jj-1,ww,vv,ss_sample,mfe_right); + } + return; + } + } + } + } + } + } + } + } + } + } + } + else { /* single strand hairpin */ + if (is_hairpin(ii,jj)) { + for (uu=0;uu<4;uu++) { + if (!((cst_tape[ii+1])&&(kronecker(ii+1,uu)))) { + for (vv=0;vv<4;vv++) { + if (!((cst_tape[jj-1])&&(kronecker(jj-1,vv)))) { + + base_hairpin_energy = EHairpin(lnt,uu,vv,rnt,len-2); + newK = nb_mut_remaining-kronecker(ii,lnt)-kronecker(ii+1,uu)-kronecker(jj-1,vv)-kronecker(jj,rnt); + nt2mut = len-4 - cst_segment[ii+2][jj-ii-4]; + + if ((newK<0)||(newK>nt2mut)) continue; /* check configurations */ + + n_total = n_partial = 0; + + if (len==5) { /*** triloop ***/ + triloop_counter(newK,ii,jj,lnt,uu,vv,rnt); + for (ind=0;ind__hairpin_max_length__)) { + fprintf(stderr,"Incoherency: Hairpin does not have the correct length!! (line %d)%s\n",__LINE__,getJobID()); + return; + } + ss_sample[0][ii+1]=index2char(ii+1,uu); + ss_sample[1][ii+1]='.'; + ss_sample[0][ii+2]=index2char(ii+2,INDEX_G); + ss_sample[1][ii+2]='.'; + ss_sample[0][jj-1]=index2char(jj-1,vv); + ss_sample[1][jj-1]='.'; + if (len>5) { /*** fill region if the size of the hairpin is more than 3 ***/ + mfe_fill_random_mutations(ggg_newK,ii+3, jj-2, ss_sample); + } + return; + } + } +#endif + + /*** generic case ***/ + + n_remaining = genereMutant(nt2mut,newK) - n_total; + anchor = base_hairpin_energy; + if ((n_remaining)&&(are_equal(mfe,anchor))) { + +#ifdef TRACEBACK + fprintf(stderr,"line %d: sample hairpin: k=%d, i=%d, j=%d, u=%d, v=%d, mfe=%e, anchor=%e%s\n",__LINE__,newK,ii,jj,uu,vv,mfe,anchor,getJobID()); +#endif + if ((len-2<__hairpin_min_length__)||(len-2>__hairpin_max_length__)) { + fprintf(stderr,"Incoherency: Hairpin does not have the correct length!! (line %d)%s\n",__LINE__,getJobID()); + return; + } + ss_sample[0][ii+1]=index2char(ii+1,uu); + ss_sample[1][ii+1]='.'; + ss_sample[0][jj-1]=index2char(jj-1,vv); + ss_sample[1][jj-1]='.'; + mfe_fill_random_mutations(newK,ii+2, jj-2, ss_sample); + return; + } + } + } + } + } + } + } + + /*****************************************************************************************************/ + /** Stacking pairs **/ + /*****************************************************************************************************/ + + nb_max_mut=minimum(4-cst_tape[ii]-cst_tape[ii+1]-cst_tape[jj-1]-cst_tape[jj],nb_mut_remaining); + + for (nb_mut_motif=nb_mut_ext_aa;nb_mut_motif<=nb_max_mut;nb_mut_motif++) { + list_config = stack_tab[nb_mut_motif][ii][jj][0]; + ii_list = 0; + while ((config=list_config[ii_list])) { + xx=config>>6; + yy=config&3; + + if ((lnt==xx)&&(rnt==yy)) { + uu=(config>>4)&3; + vv=(config>>2)&3; + /* we must add the cost of external nucleotides */ + newK=nb_mut_remaining-nb_mut_motif + kronecker(ii+1,uu) + kronecker(jj-1,vv); + if ((newK<0)||(newK>nb_mut_remaining)) { + fprintf(stderr,"Incoherency: newK CANNOT be negative!! (line %d)%s\n",__LINE__,getJobID()); + return; + } + anchor = EStack(lnt,uu,vv,rnt) + Zs[newK][ii+1][jj-1][uu][vv].mfe; +#ifdef DEBUG_SAMPLING + if ((ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) debug = EStack(lnt,uu,vv,rnt) + Zs[newK][ii+1][jj-1][uu][vv].mfe; +#endif + if (are_equal(mfe,anchor)) { +#ifdef TRACEBACK + fprintf(stderr,"line %d: sample stack: k=%d, i=%d, j=%d, u=%d, v=%d, mfe=%e, anchor=%e%s\n",__LINE__,newK,ii+1,jj-1,uu,vv,mfe,anchor,getJobID()); +#endif + backtrackHelix(newK,ii+1,jj-1,uu,vv,ss_sample,Zs[newK][ii+1][jj-1][uu][vv].mfe); + return; + } + } + ii_list++; + } + } + +#ifdef DEBUG_SAMPLING + if ((ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) printf("sample stack: %e\n",debug-pdebug); + pdebug = debug; +#endif + + /*****************************************************************************************************/ + /** bulge AND multi-loop **/ + /*****************************************************************************************************/ + + nb_mut_inside_boundary = nb_mut_remaining - kronecker(ii,lnt) - kronecker(jj,rnt); + + if (nb_mut_inside_boundary>=0) { + + if ((ii min_length) { /* min length required for a stack */ + + for (uu=0;uu<4;uu++) { + for (vv=0;vv<4;vv++) { + if (validBasePair(uu,vv)) { + + /* bulge */ + + for (size_bulge=1;size_bulge<=nb_free_nt;size_bulge++) { /* size of the bulge */ + + /* we do need to distinguish the bulge because the asymetry of constraints */ + + /* bulge on the left */ + + newii = ii+1+size_bulge; + newjj = jj-1; + if (((newii=__hairpin_min_length__+4+size_bulge)&&((newjj=cutpoint)))) { /* check that loop respects cutpoint */ + + if (!(kronecker(newii,uu) && cst_tape[newii])|| + !(kronecker(newjj,vv) && cst_tape[newjj])) { + + nt2mut=size_bulge-cst_segment[ii+1][size_bulge-1]; + nb_max_mut_in_bulge = minimum(nt2mut,nb_mut_inside_boundary); + + for (nb_mut_in_bulge=0;nb_mut_in_bulge<=nb_max_mut_in_bulge;nb_mut_in_bulge++) { /* number of mutations in bulge */ + newK = nb_mut_inside_boundary - nb_mut_in_bulge; + if (newK>=0) { + if ((Zs[newK][newii][newjj][uu][vv].pf)&&(genereMutant(nt2mut,nb_mut_in_bulge))) { + anchor = EBulge(lnt,uu,vv,rnt,size_bulge) + Zs[newK][newii][newjj][uu][vv].mfe; +#ifdef DEBUG_SAMPLING + if ((ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) debug = EBulge(lnt,uu,vv,rnt,size_bulge) + Zs[newK][newii][newjj][uu][vv].mfe; +#endif + if (are_equal(mfe,anchor)) { +#ifdef TRACEBACK + fprintf(stderr,"line %d: sample bulge: k=%d, i=%d, j=%d, u=%d, v=%d, mfe=%e, anchor=%e%s\n",__LINE__,newK,newii,newjj,uu,vv,mfe,anchor,getJobID()); +#endif + mfe_fill_random_mutations(nb_mut_in_bulge,ii+1,ii+size_bulge,ss_sample); + backtrackHelix(newK,newii,newjj,uu,vv,ss_sample,Zs[newK][ii+1+size_bulge][jj-1][uu][vv].mfe); + return; + } + } + } + } + } + + } + + /* bulge on the right */ + + newii = ii+1; + newjj = jj-1-size_bulge; + if (((newii=__hairpin_min_length__+4+size_bulge)&&((newjj=cutpoint)))) { /* check that loop respects cutpoint */ + + if (!(kronecker(newii,uu) && cst_tape[newii])|| + !(kronecker(newjj,vv) && cst_tape[newjj])) { + + nt2mut=size_bulge-cst_segment[jj-size_bulge][size_bulge-1]; + nb_max_mut_in_bulge = minimum(nt2mut,nb_mut_inside_boundary); + + for (nb_mut_in_bulge=0;nb_mut_in_bulge<=nb_max_mut_in_bulge;nb_mut_in_bulge++) { /* number of mutations in bulge */ + newK = nb_mut_inside_boundary - nb_mut_in_bulge; + if (newK>=0) { + if ((Zs[newK][newii][newjj][uu][vv].pf)&&(genereMutant(nt2mut,nb_mut_in_bulge))) { + anchor = EBulge(lnt,uu,vv,rnt,size_bulge) + Zs[newK][newii][newjj][uu][vv].mfe; +#ifdef DEBUG_SAMPLING + if ((ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) debug = EBulge(lnt,uu,vv,rnt,size_bulge) + + Zs[newK][newii][newjj][uu][vv].mfe; +#endif + if (are_equal(mfe,anchor)) { +#ifdef TRACEBACK + fprintf(stderr,"line %d: sample bulge: k=%d, i=%d, j=%d, u=%d, v=%d, mfe=%e, anchor=%e%s\n",__LINE__,newK,newii,newjj,uu,vv,mfe,anchor,getJobID()); +#endif + mfe_fill_random_mutations(nb_mut_in_bulge,jj-size_bulge,jj-1,ss_sample); + backtrackHelix(newK,ii+1,jj-1-size_bulge,uu,vv,ss_sample,Zs[newK][newii][newjj][uu][vv].mfe); + return; + } + } + } + } + } + } + } + } + + /* close multi-loop*/ + + anchor = EEndMultiLoop() + Zm[nb_mut_inside_boundary][ii+1][jj-1][uu][vv].mfe; +#ifdef DEBUG_SAMPLING + if ((ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) debug = EEndMultiLoop() + Zm[nb_mut_inside_boundary][ii+1][jj-1][uu][vv].mfe; +#endif + if (are_equal(mfe,anchor)) { +#ifdef TRACEBACK + fprintf(stderr,"line %d: sample multi-loop: k=%d, i=%d, j=%d, u=%d, v=%d, mfe=%e, anchor=%e%s\n",__LINE__,nb_mut_inside_boundary,ii+1,jj-1,uu,vv,mfe,anchor,getJobID()); +#endif + backtrackMultiLoop(nb_mut_inside_boundary,ii+1,jj-1,uu,vv,0,ss_sample,Zm[nb_mut_inside_boundary][ii+1][jj-1][uu][vv].mfe); + return; + } + } + } + } + } + +#ifdef DEBUG_SAMPLING + if ((ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) printf("sample bulge & multi: %e\n",debug-pdebug); + pdebug = debug; +#endif + + /*****************************************************************************************************/ + /** lookup special internal loops **/ + /*****************************************************************************************************/ + + for (cloop=0;cloop<4;cloop++) { + + nb_nt = 6 + (cloop>>1) + (cloop&1); /* number of nt in the internal loop */ + nb_max_mut=minimum(nb_nt,nb_mut_remaining); + + for (nb_mut_motif=0;nb_mut_motif<=nb_max_mut;nb_mut_motif++) { + list_config = loop_tab[nb_mut_motif][cloop][ii][jj]; + ii_list = 0; + while ((config=list_config[ii_list])) { + switch (cloop) { + case 0: + newii=ii+2; + newjj=jj-2; + if (((newiicutpoint))||((len>=__hairpin_min_length__+6)&&((newjj=cutpoint)))) { /* constrain loop to respect cutpoint */ + xx=config>>10; + yy=config&3; + if ((xx==lnt)&&(yy==rnt)) { + aa=(config>>8)&3; + uu=(config>>6)&3; + vv=(config>>4)&3; + bb=(config>>2)&3; + newK=nb_mut_remaining-nb_mut_motif + kronecker(ii+2,uu) + kronecker(jj-2,vv); + if ((newK<0)||(newK>nb_mut_remaining)) { + fprintf(stderr,"Incoherency: newK CANNOT be negative!! (line %d)%s\n",__LINE__,getJobID()); + return; + } + anchor = EInternal_1x1(lnt,aa,uu,vv,bb,rnt) + Zs[newK][ii+2][jj-2][uu][vv].mfe; +#ifdef DEBUG_SAMPLING + if ((ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) debug = EInternal_1x1(lnt,aa,uu,vv,bb,rnt) + Zs[newK][ii+2][jj-2][uu][vv].mfe; +#endif + if (are_equal(mfe,anchor)) { + ss_sample[0][ii+1] = index2char(ii+1,aa); + ss_sample[1][ii+1] = '.'; + ss_sample[0][jj-1] = index2char(jj-1,bb); + ss_sample[1][jj-1] = '.'; +#ifdef TRACEBACK + fprintf(stderr,"line %d: sample internal-loop: k=%d, i=%d, j=%d, u=%d, v=%d, mfe=%e, anchor=%e%s\n",__LINE__,newK,ii+2,jj-2,uu,vv,mfe,anchor,getJobID()); +#endif + backtrackHelix(newK,ii+2,jj-2,uu,vv,ss_sample,Zs[newK][ii+2][jj-2][uu][vv].mfe); + return; + } + } + } + break; + case 1: + newii=ii+2; + newjj=jj-3; + if (((newiicutpoint))||((len>=__hairpin_min_length__+7)&&((newjj=cutpoint)))) { /* constrain loop to respect cutpoint */ + xx=config>>12; + yy=config&3; + if ((xx==lnt)&&(yy==rnt)) { + aa=(config>>10)&3; + uu=(config>>8)&3; + vv=(config>>6)&3; + cc=(config>>4)&3; + bb=(config>>2)&3; + newK=nb_mut_remaining-nb_mut_motif + kronecker(ii+2,uu) + kronecker(jj-3,vv); + if ((newK<0)||(newK>nb_mut_remaining)) { + fprintf(stderr,"Incoherency: newK CANNOT be negative!! (line %d)%s\n",__LINE__,getJobID()); + return; + } + anchor = EInternal_1x2(lnt,aa,uu,vv,cc,bb,rnt) + Zs[newK][ii+2][jj-3][uu][vv].mfe; +#ifdef DEBUG_SAMPLING + if ((ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) debug = EInternal_1x2(lnt,aa,uu,vv,cc,bb,rnt) + Zs[newK][ii+2][jj-3][uu][vv].mfe; +#endif + if (are_equal(mfe,anchor)) { + ss_sample[0][ii+1] = index2char(ii+1,aa); + ss_sample[1][ii+1] = '.'; + ss_sample[0][jj-2] = index2char(jj-2,cc); + ss_sample[1][jj-2] = '.'; + ss_sample[0][jj-1] = index2char(jj-1,bb); + ss_sample[1][jj-1] = '.'; +#ifdef TRACEBACK + fprintf(stderr,"line %d: sample internal-loop: k=%d, i=%d, j=%d, u=%d, v=%d, mfe=%e, anchor=%e%s\n",__LINE__,newK,ii+2,jj-3,uu,vv,mfe,anchor,getJobID()); +#endif + backtrackHelix(newK,ii+2,jj-3,uu,vv,ss_sample,Zs[newK][ii+2][jj-3][uu][vv].mfe); + return; + } + } + } + break; + case 2: + newii=ii+3; + newjj=jj-2; + if (((newiicutpoint))||((len>=__hairpin_min_length__+7)&&((newjj=cutpoint)))) { /* constrain loop to respect cutpoint */ + xx=config>>12; + yy=config&3; + if ((xx==lnt)&&(yy==rnt)) { + aa=(config>>10)&3; + cc=(config>>8)&3; + uu=(config>>6)&3; + vv=(config>>4)&3; + bb=(config>>2)&3; + newK=nb_mut_remaining-nb_mut_motif + kronecker(ii+3,uu) + kronecker(jj-2,vv); + if ((newK<0)||(newK>nb_mut_remaining)) { + fprintf(stderr,"Incoherency: newK CANNOT be negative!! (line %d)%s\n",__LINE__,getJobID()); + return; + } + anchor = EInternal_2x1(lnt,aa,cc,uu,vv,bb,rnt) + Zs[newK][ii+3][jj-2][uu][vv].mfe; +#ifdef DEBUG_SAMPLING + if ((ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) debug = EInternal_2x1(lnt,aa,cc,uu,vv,bb,rnt) + Zs[newK][ii+3][jj-2][uu][vv].mfe; +#endif + if (are_equal(mfe,anchor)) { + ss_sample[0][ii+1] = index2char(ii+1,aa); + ss_sample[1][ii+1] = '.'; + ss_sample[0][ii+2] = index2char(ii+2,cc); + ss_sample[1][ii+2] = '.'; + ss_sample[0][jj-1] = index2char(jj-1,bb); + ss_sample[1][jj-1] = '.'; +#ifdef TRACEBACK + fprintf(stderr,"line %d: sample internal-loop: k=%d, i=%d, j=%d, u=%d, v=%d, mfe=%e, anchor=%e%s\n",__LINE__,newK,ii+3,jj-2,uu,vv,mfe,anchor,getJobID()); +#endif + backtrackHelix(newK,ii+3,jj-2,uu,vv,ss_sample,Zs[newK][ii+3][jj-2][uu][vv].mfe); + return; + } + } + } + break; + case 3: + newii=ii+3; + newjj=jj-3; + if (((newiicutpoint))||((len>=__hairpin_min_length__+8)&&((newjj=cutpoint)))) { /* constrain loop to respect cutpoint */ + xx=config>>14; + yy=config&3; + if ((xx==lnt)&&(yy==rnt)) { + aa=(config>>12)&3; + cc=(config>>10)&3; + uu=(config>>8)&3; + vv=(config>>6)&3; + dd=(config>>4)&3; + bb=(config>>2)&3; + newK=nb_mut_remaining-nb_mut_motif + kronecker(ii+3,uu) + kronecker(jj-3,vv); + if ((newK<0)||(newK>nb_mut_remaining)) { + fprintf(stderr,"Incoherency: newK CANNOT be negative!! (line %d)%s\n",__LINE__,getJobID()); + return; + } + anchor = EInternal_2x2(lnt,aa,cc,uu,vv,dd,bb,rnt) + Zs[newK][ii+3][jj-3][uu][vv].mfe; +#ifdef DEBUG_SAMPLING + if ((ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) debug = EInternal_2x2(lnt,aa,cc,uu,vv,dd,bb,rnt) + Zs[newK][ii+3][jj-3][uu][vv].mfe; +#endif + if (are_equal(mfe,anchor)) { + ss_sample[0][ii+1] = index2char(ii+1,aa); + ss_sample[1][ii+1] = '.'; + ss_sample[0][ii+2] = index2char(ii+2,cc); + ss_sample[1][ii+2] = '.'; + ss_sample[0][jj-2] = index2char(jj-2,dd); + ss_sample[1][jj-2] = '.'; + ss_sample[0][jj-1] = index2char(jj-1,bb); + ss_sample[1][jj-1] = '.'; +#ifdef TRACEBACK + fprintf(stderr,"line %d: sample internal-loop: k=%d, i=%d, j=%d, u=%d, v=%d, mfe=%e, anchor=%e%s\n",__LINE__,newK,ii+3,jj-3,uu,vv,mfe,anchor,getJobID()); +#endif + backtrackHelix(newK,ii+3,jj-3,uu,vv,ss_sample,Zs[newK][ii+3][jj-3][uu][vv].mfe); + return; + } + } + } + break; + } + ii_list++; + } + } + } + +#ifdef DEBUG_SAMPLING + if ((ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) printf("sample special: %e\n",debug-pdebug); + pdebug = debug; +#endif + + /*****************************************************************************************************/ + /** 1xn and nx1 internal loops **/ + /*****************************************************************************************************/ + + if ((ii>6; + yy=config_close&3; + + if ((xx==lnt)&&(yy==rnt)) { + aa=(config_close>>4)&3; + bb=(config_close>>2)&3; + + /** 1xn **/ + + newii=ii+2; + newjj=jj-3-nn; + + if (((newiicutpoint))||((len>=__hairpin_min_length__+7+nn)&&((newjj=cutpoint)))) { + + nt2mut=nn-cst_segment[jj-1-nn][nn-1]; + nb_max_mut_unk_loop = minimum(nt2mut,nb_mut_remaining-nb_mut_close_bp); /* to be adjusted later */ + + for (nb_mut_unk_loop=0;nb_mut_unk_loop<=nb_max_mut_unk_loop;nb_mut_unk_loop++) { /* number of mutations in unknown part of loops */ + + /** dont forget to add kronecker because mutation on single loop is be counted twice **/ + nb_max_mut_open_bp=minimum(4,nb_mut_remaining-nb_mut_unk_loop-nb_mut_close_bp+kronecker(ii+1,aa)); + + for (nb_mut_open_bp=0;nb_mut_open_bp<=nb_max_mut_open_bp;nb_mut_open_bp++) { + + list_config_open = stack_tab[nb_mut_open_bp][ii+1][jj-2-nn][2]; + + ii_list_open = 0; + while ((config_open=list_config_open[ii_list_open])) { + + cc=(config_open>>6)&3; + + if (aa==cc) { + + uu=(config_open>>4)&3; + vv=(config_open>>2)&3; + dd=config_open&3; + newK = nb_mut_remaining - nb_mut_close_bp - nb_mut_open_bp - nb_mut_unk_loop + kronecker(ii+1,aa) + kronecker(ii+2,uu) + kronecker(jj-3-nn,vv); + if ((newK<0)||(newK>nb_mut_remaining)) { + fprintf(stderr,"Incoherency: newK CANNOT be negative!! (line %d)%s\n",__LINE__,getJobID()); + return; + } + + anchor = EInternal_generic(lnt,aa,cc,uu,vv,dd,bb,rnt,1,nn+2) + Zs[newK][ii+2][jj-3-nn][uu][vv].mfe; + +#ifdef DEBUG_SAMPLING + if ((ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) debug += boltzmannInternal_generic(lnt,aa,cc,uu,vv,dd,bb,rnt,1,nn+2) * + Zs[newK][ii+2][jj-3-nn][uu][vv].pf * genereMutant(nt2mut,nb_mut_unk_loop); +#endif + if ((are_equal(mfe,anchor))&&(genereMutant(nt2mut,nb_mut_unk_loop))) { +#ifdef TRACEBACK + fprintf(stderr,"line %d: sample internal-loop: k=%d, i=%d, j=%d, u=%d, v=%d, mfe=%e, anchor=%e%s\n",__LINE__,newK,ii+2,jj-3-nn,uu,vv,mfe,anchor,getJobID()); +#endif + ss_sample[0][ii+1] = index2char(ii+1,aa); + ss_sample[1][ii+1] = '.'; + ss_sample[0][jj-2-nn] = index2char(jj-2-nn,dd); + ss_sample[1][jj-2-nn] = '.'; + ss_sample[0][jj-1] = index2char(jj-1,bb); + ss_sample[1][jj-1] = '.'; + mfe_fill_random_mutations(nb_mut_unk_loop,jj-1-nn,jj-2,ss_sample); + backtrackHelix(newK,ii+2,jj-3-nn,uu,vv,ss_sample,Zs[newK][ii+2][jj-3-nn][uu][vv].mfe); + return; + } + } + ii_list_open++; + } + } + } + } + + /** nx1 **/ + + newii=ii+3+nn; + newjj=jj-2; + + if (((newiicutpoint))||((len>=__hairpin_min_length__+7+nn)&&((newjj=cutpoint)))) { + + nt2mut=nn-cst_segment[ii+2][nn-1]; + nb_max_mut_unk_loop = minimum(nt2mut,nb_mut_remaining-nb_mut_close_bp); /* to be adjusted later */ + + for (nb_mut_unk_loop=0;nb_mut_unk_loop<=nb_max_mut_unk_loop;nb_mut_unk_loop++) { /* number of mutations in unknown part of loops */ + + /** dont forget to add kronecker because mutation on single loop is be counted twice **/ + nb_max_mut_open_bp=minimum(4,nb_mut_remaining-nb_mut_unk_loop-nb_mut_close_bp+kronecker(jj-1,bb)); + + for (nb_mut_open_bp=0;nb_mut_open_bp<=nb_max_mut_open_bp;nb_mut_open_bp++) { + + /** nx1 **/ + + list_config_open = stack_tab[nb_mut_open_bp][ii+2+nn][jj-1][2]; + ii_list_open = 0; + while ((config_open=list_config_open[ii_list_open])) { + + dd=config_open&3; + + if (bb==dd) { + + cc=(config_open>>6)&3; + uu=(config_open>>4)&3; + vv=(config_open>>2)&3; + + newK = nb_mut_remaining - nb_mut_close_bp - nb_mut_open_bp - nb_mut_unk_loop + kronecker(jj-1,bb) + kronecker(ii+3+nn,uu) + kronecker(jj-2,vv); + if ((newK<0)||(newK>nb_mut_remaining)) { + fprintf(stderr,"Incoherency: newK CANNOT be negative!! (line %d)%s\n",__LINE__,getJobID()); + return; + } + anchor = EInternal_generic(lnt,aa,cc,uu,vv,dd,bb,rnt,nn+2,1) + Zs[newK][ii+3+nn][jj-2][uu][vv].mfe; + +#ifdef DEBUG_SAMPLING + if ((ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) debug = EInternal_generic(lnt,aa,cc,uu,vv,dd,bb,rnt,1,nn+2) + Zs[newK][ii+3+nn][jj-2][uu][vv].mfe; +#endif + if ((are_equal(mfe,anchor))&&(genereMutant(nt2mut,nb_mut_unk_loop))) { +#ifdef TRACEBACK + fprintf(stderr,"line %d: sample internal-loop: k=%d, i=%d, j=%d, u=%d, v=%d, mfe=%e, anchor=%e%s\n",__LINE__,newK,ii+3+nn,jj-2,uu,vv,mfe,anchor,getJobID()); +#endif + ss_sample[0][ii+1] = index2char(ii+1,aa); + ss_sample[1][ii+1] = '.'; + ss_sample[0][ii+2+nn] = index2char(ii+2+nn,cc); + ss_sample[1][ii+2+nn] = '.'; + ss_sample[0][jj-1] = index2char(jj-1,bb); + ss_sample[1][jj-1] = '.'; + mfe_fill_random_mutations(nb_mut_unk_loop,ii+2,ii+1+nn,ss_sample); + backtrackHelix(newK,ii+3+nn,jj-2,uu,vv,ss_sample,Zs[newK][ii+3+nn][jj-2][uu][vv].mfe); + return; + } + } + ii_list_open++; + } + } + } + } + } + ii_list_close++; + } + } + } + +#ifdef DEBUG_SAMPLING + if ((ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) printf("sample 1xn & nx1: %e\n",debug-pdebug); + pdebug = debug; +#endif + + /*****************************************************************************************************/ + /** mxn internal loops (m+n>4) **/ + /*****************************************************************************************************/ + + if ((ii>6; + aa=(config_close>>4)&3; + bb=(config_close>>2)&3; + yy=config_close&3; + + if ((xx==lnt)&&(yy==rnt)) { + + for (nn=1;nn<=nb_free_nt;nn++) { /* number of undefined nucleotides in internal loop */ + + min_rr = maximum(0,nn-__max_size_bulge__); + max_rr = minimum(nn,__max_size_bulge__); + + for (rr=min_rr;rr<=max_rr;rr++) { + ll=nn-rr; + + newii=ii+3+ll; + newjj=jj-3-rr; + + if (((newiicutpoint))||((len>=__hairpin_min_length__+8+nn)&&((newjj=cutpoint)))) { /* check that loop respects cutpoint */ + + nt2mut=nn; + if (ll>0) { nt2mut -= cst_segment[ii+2][ll-1]; } + if (rr>0) { nt2mut -= cst_segment[jj-1-rr][rr-1]; } + + nb_max_mut_unk_loop = minimum(nt2mut,nb_mut_remaining-nb_mut_close_bp); + + for (nb_mut_unk_loop=0;nb_mut_unk_loop<=nb_max_mut_unk_loop;nb_mut_unk_loop++) { /* number of mutations in unknown part of loops */ + + nb_max_mut_open_bp=minimum(4-cst_tape[ii+2+ll]-cst_tape[ii+3+ll]-cst_tape[jj-2-rr]-cst_tape[jj-3-rr],nb_mut_remaining-nb_mut_unk_loop-nb_mut_close_bp); + + for (nb_mut_open_bp=0;nb_mut_open_bp<=nb_max_mut_open_bp;nb_mut_open_bp++) { + list_config_open = stack_tab[nb_mut_open_bp][ii+2+ll][jj-2-rr][2]; + ii_list_open = 0; + while ((config_open=list_config_open[ii_list_open])) { + + cc=(config_open>>6)&3; + uu=(config_open>>4)&3; + vv=(config_open>>2)&3; + dd=config_open&3; + + newK = nb_mut_remaining - nb_mut_close_bp - nb_mut_open_bp - nb_mut_unk_loop + kronecker(ii+3+ll,uu) + kronecker(jj-3-rr,vv); + if ((newK<0)||(newK>nb_mut_remaining)) { + fprintf(stderr,"Incoherency: newK CANNOT be negative!! (line %d)%s\n",__LINE__,getJobID()); + return; + } + + anchor = EInternal_generic(lnt,aa,cc,uu,vv,dd,bb,rnt,ll+2,rr+2) + Zs[newK][ii+3+ll][jj-3-rr][uu][vv].mfe; + +#ifdef DEBUG_SAMPLING + if ((ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) debug = EInternal_generic(lnt,aa,cc,uu,vv,dd,bb,rnt,ll+2,rr+2) + + Zs[newK][ii+3+ll][jj-3-rr][uu][vv].mfe; +#endif +#ifdef DEBUG_MFE + if ((ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) { + fprintf(stderr,"internal loop :(%d,%d,%d,%d,%d,%d,%d,%d):[%d,%d]:%e\n",lnt,aa,cc,uu,vv,dd,bb,rnt,ii+3+ll,jj-3-rr,EInternal_generic(lnt,aa,cc,uu,vv,dd,bb,rnt,ll+2,rr+2)+Zs[newK][ii+3+ll][jj-3-rr][uu][vv].mfe); + } +#endif + if ((are_equal(mfe,anchor))&&(genereMutant(nt2mut,nb_mut_unk_loop))) { + int mut_left, mut_right; +#ifdef TRACEBACK + fprintf(stderr,"line %d: sample internal-loop: k=%d, ll=%d, rr=%d, i=%d, j=%d, u=%d, v=%d, mfe=%e, anchor=%e%s\n",__LINE__,newK,ll,rr,ii+3+ll,jj-3-rr,uu,vv,mfe,anchor,getJobID()); +#endif + ss_sample[0][ii+1] = index2char(ii+1,aa); + ss_sample[1][ii+1] = '.'; + ss_sample[0][ii+2+ll] = index2char(ii+2+ll,cc); + ss_sample[1][ii+2+ll] = '.'; + ss_sample[0][jj-2-rr] = index2char(jj-2-rr,dd); + ss_sample[1][jj-2-rr] = '.'; + ss_sample[0][jj-1] = index2char(jj-1,bb); + ss_sample[1][jj-1] = '.'; + + /** partitioning the number of mutations in both loops **/ + mut_left = partition_mutations_uniform(ii+2, ii+1+ll, jj-1-rr, jj-2, nb_mut_unk_loop); + mut_right = nb_mut_unk_loop - mut_left; +#ifdef TRACEBACK + fprintf(stdout ,"mutations in loop: %d, left: %d, right: %d.%s\n", + nb_mut_unk_loop,mut_left,mut_right,getJobID()); +#endif + mfe_fill_random_mutations(mut_left,ii+2,ii+1+ll,ss_sample); + mfe_fill_random_mutations(mut_right,jj-1-rr,jj-2,ss_sample); + backtrackHelix(newK,ii+3+ll,jj-3-rr,uu,vv,ss_sample,Zs[newK][ii+3+ll][jj-3-rr][uu][vv].mfe); + return; + } + ii_list_open++; + } + } + } + } + } + } + } + ii_list_close++; + } + } + +#ifdef DEBUG_SAMPLING + if ((ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) printf("sample generic loop: %e\n",debug-pdebug); + pdebug = debug; +#endif + + /*****************************************************************************************************/ + /* check. this line should NOT be reachable */ + /*****************************************************************************************************/ + + fprintf(stderr,"helix backtracking failed... Might be due to numerical precision (i=%d, j=%d, nb_mut_remaining=%d, mfe=%e, partition number=%e)%s\n", + ii,jj,nb_mut_remaining,mfe,anchor,getJobID()); + +} + +/***********************************************************************************************/ +/* sample multi-loop */ +/***********************************************************************************************/ + +void backtrackMultiLoop(int nb_mut_remaining,int ii,int jj, int lnt, int rnt, int last_helix, char **ss_sample, double mfe) { + + int uu,vv,rr,ee,newK,err_bound,nb_mut_inside_boundary,nt2mut,min_gap; + double anchor; + +#ifdef TRACEBACK + fprintf(stderr,"MultiLoop backtrack: mut=%d, ii=%d, jj=%d, lnt=%d, rnt=%d, mfe=%f%s\n",nb_mut_remaining,ii,jj,lnt,rnt,mfe,getJobID()); +#endif + + /* sample a single helix */ + + anchor = Zs[nb_mut_remaining][ii][jj][lnt][rnt].mfe + penalty_close_helix(lnt,rnt); + if (are_equal(mfe,anchor)) { +#ifdef TRACEBACK + fprintf(stderr,"line %d: sample helix: k=%d, i=%d, j=%d, u=%d, v=%d, mfe=%e up2=%e, %e, %e%s\n", + __LINE__,nb_mut_remaining,ii,jj,lnt,rnt,mfe,Zs[nb_mut_remaining][ii][jj][lnt][rnt].mfe, + Zms[nb_mut_remaining][ii][jj][lnt][rnt].mfe,Zm[nb_mut_remaining][ii][jj][lnt][rnt].mfe, getJobID()); +#endif + backtrackHelix(nb_mut_remaining,ii,jj,lnt,rnt,ss_sample,Zs[nb_mut_remaining][ii][jj][lnt][rnt].mfe); + return; + } + + /* try intermediate pairings in order to build multi-loop */ + + nb_mut_inside_boundary = nb_mut_remaining - kronecker(ii,lnt); + + if ((ii__hairpin_min_length__)||((rr1) { + + nt2mut = rr-ii-1 - cst_segment[ii+1][rr-ii-2]; + err_bound = minimum(nt2mut,nb_mut_inside_boundary); + + for (ee=0;ee<=err_bound;ee++) { + + newK = nb_mut_remaining - kronecker(ii,lnt) - ee; + if ((newK<0)||(newK>nb_mut_remaining)) { + fprintf(stderr,"Incoherency: newK CANNOT be negative!! (line %d)%s\n",__LINE__,getJobID()); + return; + } + + anchor = Zs[newK][rr][jj][uu][rnt].mfe + penalty_close_helix(uu,rnt) + EExtendMultiLoop(rr-ii); + if ((are_equal(mfe,anchor))&&(genereMutant(nt2mut,ee))) { + ss_sample[0][ii]=index2char(ii,lnt); + ss_sample[1][ii]='.'; + mfe_fill_random_mutations(ee,ii+1,rr-1,ss_sample); +#ifdef TRACEBACK + fprintf(stderr,"line %d: sample helix: k=%d, i=%d, j=%d, u=%d, v=%d%s\n",__LINE__,newK,rr,jj,uu,rnt,getJobID()); +#endif + backtrackHelix(newK,rr,jj,uu,rnt,ss_sample,Zs[newK][rr][jj][uu][rnt].mfe); + return; + } + } + } + else { /* special case: only one residue on the left */ + newK = nb_mut_remaining - kronecker(ii,lnt); + if ((newK<0)||(newK>nb_mut_remaining)) { + fprintf(stderr,"Incoherency: newK CANNOT be negative!! (line %d)%s\n",__LINE__,getJobID()); + return; + } + anchor = Zs[newK][rr][jj][uu][rnt].mfe + penalty_close_helix(uu,rnt) + EExtendMultiLoop(1); + if (are_equal(mfe,anchor)) { + ss_sample[0][ii]=index2char(ii,lnt); + ss_sample[1][ii]='.'; +#ifdef TRACEBACK + fprintf(stderr,"line %d: sample helix: k=%d, i=%d, j=%d, u=%d, v=%d%s\n",__LINE__,newK,rr,jj,uu,rnt,getJobID()); +#endif + backtrackHelix(newK,rr,jj,uu,rnt,ss_sample,Zs[newK][rr][jj][uu][rnt].mfe); + return; + } + } + } + } + } + else { + + if (((rr-ii>__hairpin_min_length__+1)||((ii__hairpin_min_length__)||((rrnb_mut_remaining)) { + fprintf(stderr,"Incoherency: newK CANNOT be negative!! (line %d)%s\n",__LINE__,getJobID()); + return; + } + anchor = EExtendMultiLoop(1) + Zms[newK][ii][jj-1][lnt][uu].mfe; + if (are_equal(mfe,anchor)) { + ss_sample[0][jj]=index2char(jj,rnt); + ss_sample[1][jj]='.'; +#ifdef TRACEBACK + fprintf(stderr,"line %d: sample multi-loop: k=%d, i=%d, j=%d, u=%d, v=%d%s\n",__LINE__,newK,ii,jj-1,lnt,uu,getJobID()); +#endif + backtrackMultiLoop(newK,ii,jj-1,lnt,uu,last_helix,ss_sample,Zms[newK][ii][jj-1][lnt][uu].mfe); + return; + } + anchor = EExtendMultiLoop(1) + Zm[newK][ii][jj-1][lnt][uu].mfe; + if (are_equal(mfe,anchor)) { + ss_sample[0][jj]=index2char(jj,rnt); + ss_sample[1][jj]='.'; +#ifdef TRACEBACK + fprintf(stderr,"line %d: sample multi-loop: k=%d, i=%d, j=%d, u=%d, v=%d%s\n",__LINE__,newK,ii,jj-1,lnt,uu,getJobID()); +#endif + backtrackMultiLoop(newK,ii,jj-1,lnt,uu,last_helix,ss_sample,Zm[newK][ii][jj-1][lnt][uu].mfe); + return; + } + } + } + + /* check. this line should NOT be reachable */ + + fprintf(stderr,"Multi-loop bactracking failed... Might be due to numerical precision (i=%d, j=%d, nb_mut_remaining=%d, mfe=%f, partition number=%f)%s\n", + ii,jj,nb_mut_remaining,mfe,anchor,getJobID()); +} + +/******************************************************************************************************************/ + +void backtrackExteriorLoop(int nb_mut_remaining,int ii,int jj, int lnt, int rnt, char **ss_sample, double mfe) { + + int uu,vv,rr,ee,newK,err_bound,len=jj-ii+1,nb_mut_inside_boundary,nt2mut,min_gap; + double anchor; + +#ifdef TRACEBACK + fprintf(stderr,"Exterior helix bactracking: mut=%d, ii=%d, jj=%d, lnt=%d, rnt=%d, mfe=%f%s\n",nb_mut_remaining,ii,jj,lnt,rnt,mfe,getJobID()); +#endif + + /* sample a single helix */ + + anchor = Zs[nb_mut_remaining][ii][jj][lnt][rnt].mfe + penalty_close_helix(lnt,rnt); + if (are_equal(mfe,anchor)) { +#ifdef TRACEBACK + fprintf(stderr,"line %d: sample helix: k=%d, i=%d, j=%d, u=%d, v=%d%s\n",__LINE__,nb_mut_remaining,ii,jj,lnt,rnt,getJobID()); +#endif + backtrackHelix(nb_mut_remaining,ii,jj,lnt,rnt,ss_sample,Zs[nb_mut_remaining][ii][jj][lnt][rnt].mfe); + return; + } + + /* try intermediate pairings in order to build multi-loop */ + + + nb_mut_inside_boundary = nb_mut_remaining - kronecker(ii,lnt); + + if ((ii__hairpin_min_length__)||((rr1) { + + nt2mut = rr-ii-1 - cst_segment[ii+1][rr-ii-2]; + err_bound = minimum(nt2mut,nb_mut_inside_boundary); + + for (ee=0;ee<=err_bound;ee++) { + newK = nb_mut_remaining - kronecker(ii,lnt) - ee; + anchor = Zs[newK][rr][jj][uu][rnt].mfe + penalty_close_helix(uu,rnt); + if ((are_equal(mfe,anchor))&&(genereMutant(nt2mut,ee))) { + ss_sample[0][ii]=index2char(ii,lnt); + ss_sample[1][ii]='.'; + mfe_fill_random_mutations(ee,ii+1, rr, ss_sample); +#ifdef TRACEBACK + fprintf(stderr,"line %d: sample helix: k=%d, i=%d, j=%d, u=%d, v=%d%s\n",__LINE__,newK,rr,jj,uu,rnt,getJobID()); +#endif + backtrackHelix(newK,rr,jj,uu,rnt,ss_sample,Zs[newK][rr][jj][uu][rnt].mfe); + return; + } + } + } + else { /* special case: only one residue on the left */ + newK = nb_mut_remaining - kronecker(ii,lnt); + if ((newK<0)||(newK>nb_mut_remaining)) { + fprintf(stderr,"Incoherency: newK (=%d) CANNOT be negative or larger than %d!! (line %d)%s\n",newK,nb_mut_remaining,__LINE__,getJobID()); + return; + } + anchor = Zs[newK][rr][jj][uu][rnt].mfe + penalty_close_helix(uu,rnt); + if (are_equal(mfe,anchor)) { + ss_sample[0][ii]=index2char(ii,lnt); + ss_sample[1][ii]='.'; +#ifdef TRACEBACK + fprintf(stderr,"line %d: sample helix: k=%d, i=%d, j=%d, u=%d, v=%d%s\n",__LINE__,newK,rr,jj,uu,rnt,getJobID()); +#endif + backtrackHelix(newK,rr,jj,uu,rnt,ss_sample,Zs[newK][rr][jj][uu][rnt].mfe); + return; + } + } + } + } + + if (((rr-ii>__hairpin_min_length__+1)||((ii__hairpin_min_length__)||((rrmin_gap+2) { /* minimum length required */ + if (!((cst_tape[jj])&&(kronecker(jj,rnt)))) { + for (uu=0;uu<4;uu++) { + /* right */ + newK = nb_mut_remaining - kronecker(jj,rnt); + if ((newK<0)||(newK>nb_mut_remaining)) { + fprintf(stderr,"Incoherency: newK CANNOT be negative!! (line %d)%s\n",__LINE__,getJobID()); + return; + } + anchor = Zes[newK][ii][jj-1][lnt][uu].mfe; + if (are_equal(mfe,anchor)) { + ss_sample[0][jj]=index2char(jj,rnt); + ss_sample[1][jj]='.'; +#ifdef TRACEBACK + fprintf(stderr,"line %d: sample exterior loop: k=%d, i=%d, j=%d, u=%d, v=%d%s\n",__LINE__,newK,ii,jj-1,lnt,uu,getJobID()); +#endif + backtrackExteriorLoop(newK,ii,jj-1,lnt,uu,ss_sample,Zes[newK][ii][jj-1][lnt][uu].mfe); + return; + } + anchor = Ze[newK][ii][jj-1][lnt][uu].mfe; + if (are_equal(mfe,anchor)) { + ss_sample[0][jj]=index2char(jj,rnt); + ss_sample[1][jj]='.'; +#ifdef TRACEBACK + fprintf(stderr,"line %d: sample exterior loop: k=%d, i=%d, j=%d, u=%d, v=%d%s\n",__LINE__,newK,ii,jj-1,lnt,uu,getJobID()); +#endif + backtrackExteriorLoop(newK,ii,jj-1,lnt,uu,ss_sample,Ze[newK][ii][jj-1][lnt][uu].mfe); + return; + } + } + } + } + + /* check. this line should NOT be reachable */ + + fprintf(stderr,"Exterior loop bactracking failed... Might be due to numerical precision (i=%d, j=%d, nb_mut_remaining=%d, mfe=%f, partition number=%f)%s\n", + ii,jj,nb_mut_remaining,mfe,anchor,getJobID()); +} + +/****************************************************************************************************/ +/* start sampling a sequence (i,j) */ +/****************************************************************************************************/ + +void startBacktrackKSuperOptimal(int k, double mfe) { + char **ss_sample; + int uu,vv,xx=-1,yy=-1,iLast=rna_len-1; + char *buffer_seq1=NULL,*buffer_ss1=NULL; + int length_seq1=0; + + /* init array if cutpoint is used */ + + if (cutpoint) { + length_seq1=(int)(cutpoint+0.5); + buffer_seq1=(char *)xmalloc((length_seq1+1)*sizeof(char)); + buffer_ss1=(char *)xmalloc((length_seq1+1)*sizeof(char)); + } + + /* initialization */ + + ss_sample = (char **)xmalloc(2*sizeof(char *)); + ss_sample[0] = emptyRNAss(); + ss_sample[1] = emptyRNAss(); + + for (uu=0;uu<4;uu++) { + for (vv=0;vv<4;vv++) { +#if 0 + printf("uu=%d, vv=%d, mfe=%f, Zes=%f, Ze=%f\n",uu,vv,mfe,Zes[k][0][iLast][uu][vv].mfe,Ze[k][0][iLast][uu][vv].mfe); +#endif + if (are_equal(mfe,Zes[k][0][iLast][uu][vv].mfe)) { + xx = uu; + yy = vv; + } + if (are_equal(mfe,Ze[k][0][iLast][uu][vv].mfe)) { + xx = uu; + yy = vv; + } + } + } + + if ((xx<0)||(yy<0)) { + if (ss_constraint_is_non_empty()) { + fprintf(stderr,"Cannot initiate m.f.e. bactracking. Check constraints.%s\n",getJobID()); + return; + } + else { + mfe_fill_random_mutations(k, 0, rna_len-1, ss_sample); + if (cutpoint) { + strncpy(buffer_seq1,ss_sample[0],(length_seq1)*sizeof(char)); + strncpy(buffer_ss1,ss_sample[1],(length_seq1)*sizeof(char)); + buffer_seq1[length_seq1]='\0'; + buffer_ss1[length_seq1]='\0'; + printf("> %d-superoptimal structure\n",k); + printf("%s&%s\t(0.0)\n",buffer_seq1,ss_sample[0]+length_seq1); + printf("%s&%s\n",buffer_ss1,ss_sample[1]+length_seq1); + return; + } + else { + printf("> %d-superoptimal structure\n",k); + printf("%s\t(0.0)\n",ss_sample[0]); + printf("%s\n",ss_sample[1]); + return; + } + } + } + + /* backtrack */ + + printf("> %d-superoptimal structure\n",k); + backtrackExteriorLoop(k,0,iLast,xx,yy,ss_sample,mfe); + if (cutpoint) { + strncpy(buffer_seq1,ss_sample[0],(length_seq1)*sizeof(char)); + strncpy(buffer_ss1,ss_sample[1],(length_seq1)*sizeof(char)); + buffer_seq1[length_seq1]='\0'; + buffer_ss1[length_seq1]='\0'; + printf("%s&%s\t(%.2f)\n",buffer_seq1,ss_sample[0]+length_seq1,mfe); + printf("%s&%s\n",buffer_ss1,ss_sample[1]+length_seq1); + } + else { + printf("%s\t(%.2f)\n",ss_sample[0],mfe); + printf("%s\n",ss_sample[1]); + } + + /* free tables */ + + free(ss_sample[1]); + free(ss_sample[0]); + free(ss_sample); + + if (cutpoint) { + free(buffer_seq1); + free(buffer_ss1); + } + +} diff --git a/src/mfe_backtrack.h b/src/mfe_backtrack.h new file mode 100644 index 0000000..b2434f5 --- /dev/null +++ b/src/mfe_backtrack.h @@ -0,0 +1,6 @@ +int *mfe_uniform_random_config(int len, int nb_mutations); +void mfe_fill_random_mutations(int nb_mutations, int i, int j, char **ss_sample); +void backtrackHelix(int nb_mut_remaining,int ii,int jj, int lnt, int rnt, char **ss_sample, double mfe); +void backtrackMultiLoop(int nb_mut_remaining,int ii,int jj, int lnt, int rnt, int last_helix, char **ss_sample, double mfe); +void backtrackExteriorLoop(int nb_mut_remaining,int ii,int jj, int lnt, int rnt, char **ss_sample, double mfe); +void startBacktrackKSuperOptimal(int k, double mfe); diff --git a/src/reader_energy_params.c b/src/reader_energy_params.c new file mode 100644 index 0000000..9a7a887 --- /dev/null +++ b/src/reader_energy_params.c @@ -0,0 +1,1243 @@ +#include +#include +#include +#include /* for DBL_MAX */ +#include "reader_energy_params.h" +#include "util.h" + +#define INDEX_A 0 +#define INDEX_C 1 +#define INDEX_G 2 +#define INDEX_U 3 + +const int __size_buffer__=200; + +/* dangle array store the data of dangle file of mfold */ +/* index 1: position of the nt 0:up, 1:down */ +/* index 2: upper nt index (X) */ +/* index 3: lower nt index (Y) */ +/* index 3: extern nt index (Z) */ +/* 5' ==> 3' */ +/* XZ */ +/* Y */ +/* 5' <== 3' */ + +extern double dangle[2][4][4][4]; + +/* sint2 array store the data of sint2 file of mfold */ +/* sint2[i][j][k][l][x][y] */ +/* 5' ==> 3' */ +/* X */ +/* I K */ +/* J L */ +/* Y */ +/* 5' <== 3' */ + +extern double sint2[4][4][4][4][4][4]; + +/* asint1x2 array store the data of asint1x2 file of mfold */ +/* asint1x2[i][j][k][l][x][y][z] */ +/* 5' ===> 3' */ +/* X */ +/* I K */ +/* J L */ +/* YZ */ +/* 5' <=== 3' */ + +extern double asint1x2[4][4][4][4][4][4][4]; + +/* sint4 array store the data of sint4 file of mfold */ +/* sint4[i][j][k][l][u][v][x][y] */ +/* 5' ===> 3' */ +/* UV */ +/* I K */ +/* J L */ +/* YX */ +/* 5' <=== 3' */ + +extern double sint4[4][4][4][4][4][4][4][4]; + +/* dangle array store the data of tstacki file of mfold */ +/* tstacki[i][j][k][l] */ +/* 5' ===> 3' */ +/* I K */ +/* J L */ +/* 3' <=== 5' */ + +extern double tstacki[4][4][4][4]; + +/* dangle array store the data of tstackh file of mfold */ +/* tstackh[i][j][k][l] */ +/* 5' ===> 3' */ +/* I K */ +/* J L */ +/* 3' <=== 5' */ + +extern double tstackh[4][4][4][4]; + +/* dangle array store the data of stack file of mfold */ +/* stack[i][j][k][l] */ +/* 5' ===> 3' */ +/* I K */ +/* J L */ +/* 3' <=== 5' */ + +extern double stack[4][4][4][4]; + +/* arrays store the data of loop file of mfold */ +/* index are for the length of the loop */ +/* size is not converted. Thus 0 index is empty */ + +double bulge[31]; +double internal[31]; +double hairpin[31]; + +/* listTetraLoop store the data of tloop file of mfold */ + +typedef struct tetraLoop{ + char motif[6]; + int hcode; /* int representation */ + double bonus; + struct tetraLoop *next; +} *TetraLoop; + +extern TetraLoop listTetraLoop; +extern double refTableTetraLoop[444445]; /* this array is used to have a direct acces to the values of listTretraLoop */ + +/* listTriLoop store the data of tloop file of mfold */ + +typedef struct triLoop{ + char motif[5]; + int hcode; /* int representation */ + double bonus; + struct triLoop *next; +} *TriLoop; + +extern TriLoop listTriLoop; +extern double refTableTriLoop[44445]; /* this array is used to have a direct acces to the values of listTetraLoop */ + +/* differents parameters used for loops */ + +/* for all */ +extern double param_large_loop; + +/* internal loop*/ +extern double max_correction_asym_internal_loop; +extern double array_ninio_internal_loop[5]; + +/* multi-loop */ +extern double offset_multi_loop; +extern double free_base_penalty_multi_loop; +extern double helix_penalty_multi_loop; + +/* efn2 multi-loop */ +extern double offset_efn2_multi_loop; +extern double free_base_penalty_efn2_multi_loop; +extern double helix_penalty_efn2_multi_loop; + +/* other */ +extern double au_penalty; +extern double ggg_hairpin_bonus; +extern double c_hairpin_slope; +extern double c_hairpin_intersect; +extern double c_hairpin_3; +extern double inter_molecular_init_energy; +extern int gail_rule; + + +/*********************************************************************************************/ +/* */ +/* FUNCTIONS */ +/* */ +/*********************************************************************************************/ + + +/*********************************************************************************************/ +/* read dangle.bt file */ +/*********************************************************************************************/ + +void readDangle(const char *filename) { + + FILE *f_data; + char vs[4][50]; /* before evaluation, the fields must be checked (case of ".") */ + int nn,xx,yy,zz; + + if (!(f_data=fopen(filename,"r"))) { + fprintf(stderr,"Cannot open file %s%s\n",filename,getJobID()); + exit(EXIT_FAILURE); + } + + for (nn=0;nn<2;nn++) { + for (xx=0;xx<4;xx++) { + for (yy=0;yy<4;yy++) { + for (zz=0;zz<4;zz++) { + dangle[nn][xx][yy][zz] = -DBL_MAX; + } + } + } + } + + for (nn=0;nn<2;nn++) { + for (yy=0;yy<4;yy++) { + for (xx=0;xx<4;xx++) { + if (fscanf(f_data,"%s%s%s%s", + &vs[0][0],&vs[1][0],&vs[2][0],&vs[3][0]) != 4) + { /* read failed */ + fprintf(stderr,"dangle: Corrupted file at [n=%d,x=%d,y=%d]%s\n",nn,xx,yy,getJobID()); + exit(EXIT_FAILURE); + } + for (zz=0;zz<4;zz++) { + if (vs[zz][0] == '.') { + dangle[nn][xx][yy][zz] = DBL_MAX; + } + else { + dangle[nn][xx][yy][zz] = atof(&vs[zz][0]); + } + } + } + } + } + + { + char buff[20]; + if (fscanf(f_data,"%s",&buff[0])==1) { + fprintf(stderr,"dangle: Corrupted file (read %s at the expected EOF)%s\n",buff,getJobID()); + exit(EXIT_FAILURE); + } + } + + fclose(f_data); +} + + +/*********************************************************************************************/ +/* read sint2.bt file */ +/*********************************************************************************************/ + +void readSint2(const char *filename) { + + FILE *f_data; + char vs[4][20]; /* before evaluation, the fields must be checked (case of ".") */ + int ii,jj,kk,ll,xx,yy,indI,indJ,indK,indL,indX,indY; + + if (!(f_data=fopen(filename,"r"))) { + fprintf(stderr,"Cannot open file %s%s\n",filename,getJobID()); + exit(EXIT_FAILURE); + } + + + /* init table */ + + for(ii=0;ii<4;ii++) { + for(jj=0;jj<4;jj++) { + for(kk=0;kk<4;kk++) { + for(ll=0;ll<4;ll++) { + for(xx=0;xx<4;xx++) { + for(yy=0;yy<4;yy++) { + sint2[ii][jj][kk][ll][xx][yy]=-DBL_MAX; /* signal for an error in the main prog: should never be reach */ + } + } + } + } + } + } + + /* read and store data */ + + for (ii=0;ii<6;ii++) { + + switch(ii) { /* define I, J index */ + case 0: + indI = INDEX_A; + indJ = INDEX_U; + break; + case 1: + indI = INDEX_C; + indJ = INDEX_G; + break; + case 2: + indI = INDEX_G; + indJ = INDEX_C; + break; + case 3: + indI = INDEX_U; + indJ = INDEX_A; + break; + case 4: + indI = INDEX_G; + indJ = INDEX_U; + break; + case 5: + indI = INDEX_U; + indJ = INDEX_G; + break; + default: + fprintf(stderr,"sint2: Corrupted file%s\n",getJobID()); + exit(EXIT_FAILURE); + } + + for (indX=0;indX<4;indX++) { /* enumerate each line */ + + for (jj=0;jj<6;jj++) { /* cut each line in 6 fields (closing K,L basepairs) */ + + switch(jj) { /* define K, L index */ + case 0: + indK = INDEX_A; + indL = INDEX_U; + break; + case 1: + indK = INDEX_C; + indL = INDEX_G; + break; + case 2: + indK = INDEX_G; + indL = INDEX_C; + break; + case 3: + indK = INDEX_U; + indL = INDEX_A; + break; + case 4: + indK = INDEX_G; + indL = INDEX_U; + break; + case 5: + indK = INDEX_U; + indL = INDEX_G; + break; + default: + fprintf(stderr,"sint2: Corrupted file%s\n",getJobID()); + exit(EXIT_FAILURE); + } + + if (fscanf(f_data,"%s%s%s%s",&vs[0][0],&vs[1][0],&vs[2][0],&vs[3][0])!=4) { + fprintf(stderr,"sint2: Corrupted file%s\n",getJobID()); + exit(EXIT_FAILURE); + } + + for(indY=0;indY<4;indY++) { + if (vs[indY][0] == '.') { + sint2[indI][indJ][indK][indL][indX][indY] = DBL_MAX; + } + else { + sint2[indI][indJ][indK][indL][indX][indY] = atof(&vs[indY][0]); + } + } + } + } + } + + + { + char buff[20]; + if (fscanf(f_data,"%s",&buff[0])==1) { + fprintf(stderr,"sint2: Corrupted file (read %s at the expected EOF)%s\n",buff,getJobID()); + exit(EXIT_FAILURE); + } + } + + fclose(f_data); +} + +/*********************************************************************************************/ +/* read asint1x2.bt file */ +/*********************************************************************************************/ + +void readAsint1x2(const char *filename) { + + FILE *f_data; + char vs[4][20]; /* before evaluation, the fields must be checked (case of ".") */ + int ii,jj,kk,ll,xx,yy,zz,indI,indJ,indK,indL,indX,indY,indZ; + + + if (!(f_data=fopen(filename,"r"))) { + fprintf(stderr,"Cannot open file %s%s\n",filename,getJobID()); + exit(EXIT_FAILURE); + } + + + /* init table */ + + for(ii=0;ii<4;ii++) { + for(jj=0;jj<4;jj++) { + for(kk=0;kk<4;kk++) { + for(ll=0;ll<4;ll++) { + for(xx=0;xx<4;xx++) { + for(yy=0;yy<4;yy++) { + for(zz=0;zz<4;zz++) { + asint1x2[ii][jj][kk][ll][xx][yy][zz]=-DBL_MAX; /* signal for an error in the main prog: should never be reach */ + } + } + } + } + } + } + } + + /* read and store data */ + + for (ii=0;ii<6;ii++) { + + switch(ii) { /* define I, J index */ + case 0: + indI = INDEX_A; + indJ = INDEX_U; + break; + case 1: + indI = INDEX_C; + indJ = INDEX_G; + break; + case 2: + indI = INDEX_G; + indJ = INDEX_C; + break; + case 3: + indI = INDEX_U; + indJ = INDEX_A; + break; + case 4: + indI = INDEX_G; + indJ = INDEX_U; + break; + case 5: + indI = INDEX_U; + indJ = INDEX_G; + break; + default: + fprintf(stderr,"asint1x2: Corrupted file%s\n",getJobID()); + exit(EXIT_FAILURE); + } + + for (indZ=0;indZ<4;indZ++) { /* enumerate each line */ + + for (indX=0;indX<4;indX++) { /* enumerate each line */ + + for (jj=0;jj<6;jj++) { /* cut each line in 6 fields (closing K,L basepairs) */ + + switch(jj) { /* define K, L index */ + case 0: + indK = INDEX_A; + indL = INDEX_U; + break; + case 1: + indK = INDEX_C; + indL = INDEX_G; + break; + case 2: + indK = INDEX_G; + indL = INDEX_C; + break; + case 3: + indK = INDEX_U; + indL = INDEX_A; + break; + case 4: + indK = INDEX_G; + indL = INDEX_U; + break; + case 5: + indK = INDEX_U; + indL = INDEX_G; + break; + default: + fprintf(stderr,"asint1x2: Corrupted file%s\n",getJobID()); + exit(EXIT_FAILURE); + } + + if (fscanf(f_data,"%s%s%s%s",&vs[0][0],&vs[1][0],&vs[2][0],&vs[3][0])!=4) { + fprintf(stderr,"asint1x2: Corrupted file%s\n",getJobID()); + exit(EXIT_FAILURE); + } + + for(indY=0;indY<4;indY++) { + if (vs[indY][0] == '.') { + asint1x2[indI][indJ][indK][indL][indX][indY][indZ] = DBL_MAX; + } + else { + asint1x2[indI][indJ][indK][indL][indX][indY][indZ] = atof(&vs[indY][0]); + } + } + } + } + } + } + + + { + char buff[20]; + if (fscanf(f_data,"%s",&buff[0])==1) { + fprintf(stderr,"asint1x2: Corrupted file (read %s at the expected EOF)%s\n",buff,getJobID()); + exit(EXIT_FAILURE); + } + } + + + fclose(f_data); +} + +/*********************************************************************************************/ +/* read sint4.bt file */ +/*********************************************************************************************/ + + +void readSint4(const char *filename) { + + FILE *f_data; + char vs[100]; /* before evaluation, the fields must be checked (case of ".") */ + int ii,jj,kk,ll,uu,vv,xx,yy,indI,indJ,indK,indL; + + if (!(f_data=fopen(filename,"r"))) { + fprintf(stderr,"Cannot open file %s%s\n",filename,getJobID()); + exit(EXIT_FAILURE); + } + + + /* init table */ + + for(ii=0;ii<4;ii++) { + for(jj=0;jj<4;jj++) { + for(kk=0;kk<4;kk++) { + for(ll=0;ll<4;ll++) { + for(uu=0;uu<4;uu++) { + for(vv=0;vv<4;vv++) { + for(xx=0;xx<4;xx++) { + for(yy=0;yy<4;yy++) { + sint4[ii][jj][kk][ll][uu][vv][xx][yy]=-DBL_MAX; /* flag for an error in the main prog: -1 should never be used */ + } + } + } + } + } + } + } + } + + /* read and store data */ + + for (ii=0;ii<6;ii++) { + + switch(ii) { /* enumerate the left basepair */ + case 0: + indI = INDEX_A; + indJ = INDEX_U; + break; + case 1: + indI = INDEX_C; + indJ = INDEX_G; + break; + case 2: + indI = INDEX_G; + indJ = INDEX_C; + break; + case 3: + indI = INDEX_U; + indJ = INDEX_A; + break; + case 4: + indI = INDEX_G; + indJ = INDEX_U; + break; + case 5: + indI = INDEX_U; + indJ = INDEX_G; + break; + default: + fprintf(stderr,"sint4: Corrupted file%s\n",getJobID()); + exit(EXIT_FAILURE); + } + + for (jj=0;jj<6;jj++) { /* enumerate the right basepair */ + + switch(jj) { /* define K, L index */ + case 0: + indK = INDEX_A; + indL = INDEX_U; + break; + case 1: + indK = INDEX_C; + indL = INDEX_G; + break; + case 2: + indK = INDEX_G; + indL = INDEX_C; + break; + case 3: + indK = INDEX_U; + indL = INDEX_A; + break; + case 4: + indK = INDEX_G; + indL = INDEX_U; + break; + case 5: + indK = INDEX_U; + indL = INDEX_G; + break; + default: + fprintf(stderr,"sint4: Corrupted file%s\n",getJobID()); + exit(EXIT_FAILURE); + } + + /* now, we can store the block */ + + for(uu=0;uu<4;uu++){ + for(vv=0;vv<4;vv++){ /* enumerate lines of the block */ + for(xx=0;xx<4;xx++) { /* cut each line in 4 blocks */ + for(yy=0;yy<4;yy++) { + + if (fscanf(f_data,"%s",&vs[0])!=1) { + fprintf(stderr,"sint4: Corrupted file%s\n",getJobID()); + exit(EXIT_FAILURE); + } + + if (vs[0] == '.') { + sint4[indI][indJ][indK][indL][uu][xx][yy][vv] = DBL_MAX; + } + else { + sint4[indI][indJ][indK][indL][uu][xx][yy][vv] = atof(&vs[0]); + } + } + } + } + } + } + } + + + { + char buff[20]; + if (fscanf(f_data,"%s",&buff[0])==1) { + fprintf(stderr,"sint4: Corrupted file (read %s at the expected EOF)%s\n",buff,getJobID()); + exit(EXIT_FAILURE); + } + } + + fclose(f_data); + +} + +/*********************************************************************************************/ +/* read tstacki.bt file */ +/*********************************************************************************************/ + +void readTstacki(const char *filename) { + + FILE *f_data; + char vs[4][20]; /* before evaluation, the fields must be checked (case of ".") */ + int ii,jj,kk,ll; + + if (!(f_data=fopen(filename,"r"))) { + fprintf(stderr,"Cannot open file %s%s\n",filename,getJobID()); + exit(EXIT_FAILURE); + } + + + /* init table */ + + for(ii=0;ii<4;ii++) { + for(jj=0;jj<4;jj++) { + for(kk=0;kk<4;kk++) { + for(ll=0;ll<4;ll++) { + tstacki[ii][jj][kk][ll]=-DBL_MAX; /* signal for an error in the main prog: -1 should never be used */ + } + } + } + } + + /* read and store data */ + + for (ii=0;ii<4;ii++) { /* enumerate each block lines */ + for (kk=0;kk<4;kk++) { /* enumerate each line of the blocks */ + for (jj=0;jj<4;jj++) { /* cut each line in 4 fields */ + if (fscanf(f_data,"%s%s%s%s",&vs[0][0],&vs[1][0],&vs[2][0],&vs[3][0])!=4) { + fprintf(stderr,"tstacki: Corrupted file%s\n",getJobID()); + exit(EXIT_FAILURE); + } + + for(ll=0;ll<4;ll++) { + if (vs[ll][0] == '.') { + tstacki[ii][jj][kk][ll] = DBL_MAX; + } + else { + tstacki[ii][jj][kk][ll] = atof(&vs[ll][0]); + } + } + } + } + } + + + { + char buff[20]; + if (fscanf(f_data,"%s",&buff[0])==1) { + fprintf(stderr,"tstacki: Corrupted file (read %s at the expected EOF)%s\n",buff,getJobID()); + exit(EXIT_FAILURE); + } + } + + fclose(f_data); +} + +/*********************************************************************************************/ +/* read tstackh.bt file */ +/*********************************************************************************************/ + +void readTstackh(const char *filename) { + + FILE *f_data; + char vs[4][20]; /* before evaluation, the fields must be checked (case of ".") */ + int ii,jj,kk,ll; + + if (!(f_data=fopen(filename,"r"))) { + fprintf(stderr,"Cannot open file %s%s\n",filename,getJobID()); + exit(EXIT_FAILURE); + } + + + /* init table */ + + for(ii=0;ii<4;ii++) { + for(jj=0;jj<4;jj++) { + for(kk=0;kk<4;kk++) { + for(ll=0;ll<4;ll++) { + tstackh[ii][jj][kk][ll]=-DBL_MAX; /* signal for an error in the main prog: -1 should never be used */ + } + } + } + } + + /* read and store data */ + + for (ii=0;ii<4;ii++) { /* enumerate each block lines */ + for (kk=0;kk<4;kk++) { /* enumerate each line of the blocks */ + for (jj=0;jj<4;jj++) { /* cut each line in 4 fields */ + if (fscanf(f_data,"%s%s%s%s",&vs[0][0],&vs[1][0],&vs[2][0],&vs[3][0])!=4) { + fprintf(stderr,"tstackh: Corrupted file%s\n",getJobID()); + exit(EXIT_FAILURE); + } + + for(ll=0;ll<4;ll++) { + if (vs[ll][0] == '.') { + tstackh[ii][jj][kk][ll] = DBL_MAX; + } + else { + tstackh[ii][jj][kk][ll] = atof(&vs[ll][0]); + } + } + } + } + } + + + { + char buff[20]; + if (fscanf(f_data,"%s",&buff[0])==1) { + fprintf(stderr,"tstackh: Corrupted file (read %s at the expected EOF)%s\n",buff,getJobID()); + exit(EXIT_FAILURE); + } + } + + fclose(f_data); +} + + +/*********************************************************************************************/ +/* read stack.bt file */ +/*********************************************************************************************/ + +void readStack(const char *filename) { + + FILE *f_data; + char vs[4][20]; /* before evaluation, the fields must be checked (case of ".") */ + int ii,jj,kk,ll; + + if (!(f_data=fopen(filename,"r"))) { + fprintf(stderr,"Cannot open file %s%s\n",filename,getJobID()); + exit(EXIT_FAILURE); + } + + + /* init table */ + + for(ii=0;ii<4;ii++) { + for(jj=0;jj<4;jj++) { + for(kk=0;kk<4;kk++) { + for(ll=0;ll<4;ll++) { + stack[ii][jj][kk][ll]=-DBL_MAX; /* signal for an error in the main prog: -1 should never be used */ + } + } + } + } + + /* read and store data */ + + for (ii=0;ii<4;ii++) { /* enumerate each block lines */ + for (kk=0;kk<4;kk++) { /* enumerate each line of the blocks */ + for (jj=0;jj<4;jj++) { /* cut each line in 4 fields */ + if (fscanf(f_data,"%s%s%s%s",&vs[0][0],&vs[1][0],&vs[2][0],&vs[3][0])!=4) { + fprintf(stderr,"stack: Corrupted file%s\n",getJobID()); + exit(EXIT_FAILURE); + } + + for(ll=0;ll<4;ll++) { + if (vs[ll][0] == '.') { + stack[ii][jj][kk][ll] = DBL_MAX; + } + else { + stack[ii][jj][kk][ll] = atof(&vs[ll][0]); + } + } + } + } + } + + + { + char buff[20]; + if (fscanf(f_data,"%s",&buff[0])==1) { + fprintf(stderr,"stack: Corrupted file (read %s at the expected EOF)%s\n",buff,getJobID()); + exit(EXIT_FAILURE); + } + } + + fclose(f_data); +} + +/*********************************************************************************************/ +/* read loop.bt file */ +/*********************************************************************************************/ + +void readLoop(const char *filename) { + + FILE *f_data; + char *buffer; + char vs[3][20]; /* before evaluation, the fields must be checked (case of ".") */ + int ii,cmptLine,size; + + if (!(buffer=(char *)malloc(__size_buffer__ * sizeof(char)))) { + fprintf(stderr,"Cannot allocate memory to buffer%s\n",getJobID()); + exit(EXIT_FAILURE); + } + + + if (!(f_data=fopen(filename,"r"))) { + fprintf(stderr,"Cannot open file %s%s\n",filename,getJobID()); + exit(EXIT_FAILURE); + } + + /* init table in order to avoid double affectation */ + + bulge[0] = DBL_MAX; + internal[0] = DBL_MAX; + hairpin[0] = DBL_MAX; + + for (ii=1;ii<31;ii++) { + bulge[ii] = -1; + internal[ii] = -1; + hairpin[ii] = -1; + } + + cmptLine=0; + + while(fgets(buffer,__size_buffer__,f_data)) { + if (sscanf(buffer,"%d%s%s%s",&size,&vs[0][0],&vs[1][0],&vs[2][0]) != 4) + { /* read failed */ + fprintf(stderr,"loop: Corrupted file%s\n",getJobID()); + exit(EXIT_FAILURE); + } + + /* check the first field (length) */ + + if ((size<1)||(size>30)) { /* read fails */ + fprintf(stderr,"loop: Corrupted file (size)%s\n",getJobID()); + exit(EXIT_FAILURE); + } + + /* second field is for internal loop */ + + if (internal[size]!=-1) { /* read fails */ + fprintf(stderr,"loop: Corrupted file (internal loop)%s\n",getJobID()); + exit(EXIT_FAILURE); + } + + if (vs[0][0] == '.') { + internal[size] = DBL_MAX; + } + else { + internal[size] = atof(&vs[0][0]); + } + + /* third field is for bulge */ + + if (bulge[size]!=-1) { /* read fails */ + fprintf(stderr,"loop: Corrupted file (bulge)%s\n",getJobID()); + exit(EXIT_FAILURE); + } + + if (vs[1][0] == '.') { + bulge[size] = DBL_MAX; + } + else { + bulge[size] = atof(&vs[1][0]); + } + + /* fourth field is for hairpin */ + + if (hairpin[size]!=-1) { /* read fails */ + fprintf(stderr,"loop: Corrupted file (hairpin)%s\n",getJobID()); + exit(EXIT_FAILURE); + } + + if (vs[2][0] == '.') { + hairpin[size] = DBL_MAX; + } + else { + hairpin[size] = atof(&vs[2][0]); + } + + cmptLine++; + } + + if (cmptLine != 30) { + fprintf(stderr,"loop: Corrupted file (data)%s\n",getJobID()); + exit(EXIT_FAILURE); + } + + fclose(f_data); + free(buffer); +} + +/*********************************************************************************************/ +/* read tloop.bt file */ +/*********************************************************************************************/ + +int readTetraLoop(const char *filename) { + + FILE *f_data; + char *buffer; + char motif[20]; + int ii,cmptLine,tmp_hcode,nt_code; + float fv; + TetraLoop tmpCell = NULL; + + if (!(buffer=(char *)malloc(__size_buffer__ * sizeof(char)))) { + fprintf(stderr,"Cannot allocate memory to buffer%s\n",getJobID()); + exit(EXIT_FAILURE); + } + + if (!(f_data=fopen(filename,"r"))) { + fprintf(stderr,"Cannot open file %s%s\n",filename,getJobID()); + exit(EXIT_FAILURE); + } + + /* init table in order to avoid double affectation */ + + for (ii=0;ii<4096;ii++) { + refTableTetraLoop[ii] = 0; + } + + cmptLine=0; + + while(fgets(buffer,__size_buffer__,f_data)) { + if (sscanf(buffer,"%s%f",&motif[0],&fv) != 2) + { /* read failed */ + fprintf(stderr,"tloop: Corrupted file%s\n",getJobID()); + exit(EXIT_FAILURE); + } + + /* check the first field */ + + if (strlen(&motif[0])!=6) { /* read fails */ + fprintf(stderr,"tloop: Corrupted file (motif %s)%s\n",&motif[0],getJobID()); + exit(EXIT_FAILURE); + } + + /* int tmpCell or create a new cell */ + + if (tmpCell) { + tmpCell->next = (TetraLoop)malloc(sizeof(struct tetraLoop)); + tmpCell = tmpCell->next; + tmpCell->next = NULL; + } + else { + listTetraLoop = tmpCell = (TetraLoop)malloc(sizeof(struct tetraLoop)); + tmpCell->next = NULL; + } + + /* compute hcode */ + + tmp_hcode=0; + for (ii=0;ii<6;ii++) { + switch (motif[ii]) { + case 'A': + nt_code=0; + break; + case 'C': + nt_code=1; + break; + case 'G': + nt_code=2; + break; + case 'U': + nt_code=3; + break; + default: + fprintf(stderr,"tloop: Unexpected character %c%s\n",motif[ii],getJobID()); + exit(EXIT_FAILURE); + } + tmp_hcode = (tmp_hcode<<2) | nt_code; + } + + if (tmp_hcode>4095) { + fprintf(stderr,"readTetraLoop: corrupted data (bad hcode)%s\n",getJobID()); + exit(EXIT_FAILURE); + } + + /* fill cell */ + + memcpy(tmpCell->motif,&motif[0],6*sizeof(char)); + tmpCell->hcode = tmp_hcode; + tmpCell->bonus = (double)(fv); + + /* update quick acces table */ + + if(refTableTetraLoop[tmp_hcode]) { + fprintf(stderr,"readTetraLoop: corrupted data (entry conflict: %d)%s\n",tmp_hcode,getJobID()); + exit(EXIT_FAILURE); + } + + refTableTetraLoop[tmp_hcode] = tmpCell->bonus; + + cmptLine++; + } + + fclose(f_data); + free(buffer); + + return cmptLine; + +} + +/*********************************************************************************************/ +/* read triloop.bt file */ +/*********************************************************************************************/ + +int readTriLoop(const char *filename) { + + FILE *f_data; + char *buffer; + char motif[20]; + int ii,cmptLine,tmp_hcode,nt_code; + float fv; + TriLoop tmpCell = NULL; + + if (!(buffer=(char *)malloc(__size_buffer__ * sizeof(char)))) { + fprintf(stderr,"Cannot allocate memory to buffer%s\n",getJobID()); + exit(EXIT_FAILURE); + } + + if (!(f_data=fopen(filename,"r"))) { + fprintf(stderr,"Cannot open file %s%s\n",filename,getJobID()); + exit(EXIT_FAILURE); + } + + /* init table in order to avoid double affectation */ + + for (ii=0;ii<1024;ii++) { + refTableTriLoop[ii] = 0; + } + + cmptLine=0; + + while(fgets(buffer,__size_buffer__,f_data)) { + if (sscanf(buffer,"%s%f",&motif[0],&fv) != 2) + { /* read failed */ + fprintf(stderr,"triloop: Corrupted file%s\n",getJobID()); + exit(EXIT_FAILURE); + } + + /* check the first field */ + + if (strlen(&motif[0])!=5) { /* read fails */ + fprintf(stderr,"triloop: Corrupted file (motif %s)%s\n",&motif[0],getJobID()); + exit(EXIT_FAILURE); + } + + /* int tmpCell or create a new cell */ + + if (tmpCell) { + tmpCell->next = (TriLoop)malloc(sizeof(struct triLoop)); + tmpCell = tmpCell->next; + tmpCell->next = NULL; + } + else { + listTriLoop = tmpCell = (TriLoop)malloc(sizeof(struct triLoop)); + tmpCell->next = NULL; + } + + /* compute hcode */ + + tmp_hcode=0; + for (ii=0;ii<5;ii++) { + switch (motif[ii]) { + case 'A': + nt_code=0; + break; + case 'C': + nt_code=1; + break; + case 'G': + nt_code=2; + break; + case 'U': + nt_code=3; + break; + default: + fprintf(stderr,"triloop: Unexpected character %c%s\n",motif[ii],getJobID()); + exit(EXIT_FAILURE); + } + tmp_hcode = (tmp_hcode<<2) & nt_code; + } + + if (tmp_hcode>1023) { + fprintf(stderr,"readTriLoop: corrupted data (bad hcode)%s\n",getJobID()); + exit(EXIT_FAILURE); + } + + /* fill cell */ + + memcpy(tmpCell->motif,&motif[0],5*sizeof(char)); + tmpCell->hcode = tmp_hcode; + tmpCell->bonus = (double)(fv); + + /* update quick acces table */ + + if(refTableTriLoop[tmp_hcode]) { + fprintf(stderr,"readTriLoop: corrupted data (entry conflict)%s\n",getJobID()); + exit(EXIT_FAILURE); + } + + refTableTriLoop[tmp_hcode] = tmpCell->bonus; + + cmptLine++; + } + + fclose(f_data); + free(buffer); + + return cmptLine; + +} + +/*********************************************************************************************/ +/* read miscloop.bt file */ +/*********************************************************************************************/ + +void readMiscLoop(const char *filename) { + + FILE *f_data; + float fv1,fv2,fv3,fv4; + + if (!(f_data=fopen(filename,"r"))) { + fprintf(stderr,"Cannot open file %s%s\n",filename,getJobID()); + exit(EXIT_FAILURE); + } + + /* parameter for general formula (zuker use 1.9872 for gas constant) */ + + if (fscanf(f_data,"%f",&fv1) != 1) { /* read failed */ + fprintf(stderr,"miscloop: corrupted file (fgets 1)%s\n",getJobID()); + exit(EXIT_FAILURE); + } + param_large_loop = (double)(fv1); + + /* internal loop*/ + if (fscanf(f_data,"%f",&fv1) != 1) { /* read failed */ + fprintf(stderr,"miscloop: corrupted file (fgets 2)%s\n",getJobID()); + exit(EXIT_FAILURE); + } + max_correction_asym_internal_loop = (double)(fv1); + + + if (fscanf(f_data,"%f%f%f%f",&fv1,&fv2,&fv3,&fv4) != 4) { /* read failed */ + fprintf(stderr,"miscloop: corrupted file (fgets 3)%s\n",getJobID()); + exit(EXIT_FAILURE); + } + array_ninio_internal_loop[0] = 0.0; + array_ninio_internal_loop[1] = (double)(fv1); + array_ninio_internal_loop[2] = (double)(fv2); + array_ninio_internal_loop[3] = (double)(fv3); + array_ninio_internal_loop[4] = (double)(fv4); + + /* multi-loop */ + if (fscanf(f_data,"%f%f%f",&fv1,&fv2,&fv3) != 3) { /* read failed */ + fprintf(stderr,"miscloop: corrupted file (fgets 4)%s\n",getJobID()); + exit(EXIT_FAILURE); + } + offset_multi_loop = (double)(fv1); + free_base_penalty_multi_loop = (double)(fv2); + helix_penalty_multi_loop = (double)(fv3); + + /* efn2 multi-loop */ + if (fscanf(f_data,"%f%f%f",&fv1,&fv2,&fv3) != 3) { /* read failed */ + fprintf(stderr,"miscloop: corrupted file (fgets 5)%s\n",getJobID()); + exit(EXIT_FAILURE); + } + offset_efn2_multi_loop = (double)(fv1); + free_base_penalty_efn2_multi_loop = (double)(fv2); + helix_penalty_efn2_multi_loop = (double)(fv3); + + /* other */ + if (fscanf(f_data,"%f",&fv1) != 1) { /* read failed */ + fprintf(stderr,"miscloop: corrupted file (fgets 6)%s\n",getJobID()); + exit(EXIT_FAILURE); + } + au_penalty = (double)(fv1); + + + if (fscanf(f_data,"%f",&fv1) != 1) { /* read failed */ + fprintf(stderr,"miscloop: corrupted file (fgets 7)%s\n",getJobID()); + exit(EXIT_FAILURE); + } + ggg_hairpin_bonus = (double)(fv1); + + if (fscanf(f_data,"%f",&fv1) != 1) { /* read failed */ + fprintf(stderr,"miscloop: corrupted file (fgets 8)%s\n",getJobID()); + exit(EXIT_FAILURE); + } + c_hairpin_slope = (double)(fv1); + + if (fscanf(f_data,"%f",&fv1) != 1) { /* read failed */ + fprintf(stderr,"miscloop: corrupted file (fgets 9)%s\n",getJobID()); + exit(EXIT_FAILURE); + } + c_hairpin_intersect = (double)(fv1); + + if (fscanf(f_data,"%f",&fv1) != 1) { /* read failed */ + fprintf(stderr,"miscloop: corrupted file (fgets 10)%s\n",getJobID()); + exit(EXIT_FAILURE); + } + c_hairpin_3 = (double)(fv1); + + if (fscanf(f_data,"%f",&fv1) != 1) { /* read failed */ + fprintf(stderr,"miscloop: corrupted file (fgets 11)%s\n",getJobID()); + exit(EXIT_FAILURE); + } + inter_molecular_init_energy = (double)(fv1); + + + if (fscanf(f_data,"%d",&gail_rule) != 1) { /* read failed */ + fprintf(stderr,"miscloop: corrupted file (fgets 12)%s\n",getJobID()); + exit(EXIT_FAILURE); + } + + { /* final checking */ + char buff[20]; + if (fscanf(f_data,"%s",&buff[0])==1) { + fprintf(stderr,"miscloop: Corrupted file (read %s at the expected EOF)%s\n",buff,getJobID()); + exit(EXIT_FAILURE); + } + } + + fclose(f_data); +} diff --git a/src/reader_energy_params.h b/src/reader_energy_params.h new file mode 100644 index 0000000..9a54ef4 --- /dev/null +++ b/src/reader_energy_params.h @@ -0,0 +1,75 @@ + +/*********************************************************************************************/ +/* */ +/* FUNCTIONS */ +/* */ +/*********************************************************************************************/ + + +/*********************************************************************************************/ +/* read dangle.bt file */ +/*********************************************************************************************/ + +void readDangle(const char *filename); + +/*********************************************************************************************/ +/* read sint2.bt file */ +/*********************************************************************************************/ + +void readSint2(const char *filename); + + +/*********************************************************************************************/ +/* read asint1x2.bt file */ +/*********************************************************************************************/ + +void readAsint1x2(const char *filename); + +/*********************************************************************************************/ +/* read sint4.bt file */ +/*********************************************************************************************/ + + +void readSint4(const char *filename); + +/*********************************************************************************************/ +/* read tstacki.bt file */ +/*********************************************************************************************/ + +void readTstacki(const char *filename); + +/*********************************************************************************************/ +/* read tstackh.bt file */ +/*********************************************************************************************/ + +void readTstackh(const char *filename); + +/*********************************************************************************************/ +/* read stack.bt file */ +/*********************************************************************************************/ + +void readStack(const char *filename); + +/*********************************************************************************************/ +/* read loop.bt file */ +/*********************************************************************************************/ + +void readLoop(const char *filename); + +/*********************************************************************************************/ +/* read tloop.bt file */ +/*********************************************************************************************/ + +int readTetraLoop(const char *filename); + +/*********************************************************************************************/ +/* read triloop.bt file */ +/*********************************************************************************************/ + +int readTriLoop(const char *filename); + +/*********************************************************************************************/ +/* read miscloop.bt file */ +/*********************************************************************************************/ + +void readMiscLoop(const char *filename); diff --git a/src/sampling.c b/src/sampling.c new file mode 100644 index 0000000..6931035 --- /dev/null +++ b/src/sampling.c @@ -0,0 +1,2276 @@ +#include +#include +#include +#include +#include +#include "reader_energy_params.h" +#include "energy_functions.h" +#include "util.h" +#include "sampling.h" +#include "energy_params_tables.h" +#include "constraints.h" + +/* declared in turner_functions.c */ + +extern double __temperature; +extern double __RT__; + +/* in RNAmutants.h */ + +#define INDEX_A 0 +#define INDEX_C 1 +#define INDEX_G 2 +#define INDEX_U 3 +#define INDEX_STOP -1 + +/* global variables */ + +struct Zcell { + double pf; + double mfe; +}; + +extern struct Zcell *****Zms; +extern struct Zcell *****Zes; +extern struct Zcell *****Zs; +extern struct Zcell *****Zm; +extern struct Zcell *****Ze; +extern const int __hairpin_min_length__; /* the minimal length of a hairpin loop */ +extern const int __hairpin_max_length__; /* the minimal length of a hairpin loop */ +extern const int __vis_range__; /* range of visibility */ +extern const int __max_size_bulge__; /* maximal size of bulge in loop */ +extern int rna_len; /* length of the arn*/ +extern char *input_tape; +extern int max_mutations; +extern int print_warning; +extern int dangle_used; +extern unsigned int *****loop_tab; +extern unsigned int *****stack_tab; +extern int *cst_tape; +extern int **cst_segment; +extern int *ss_cst; +extern int *single_strand_cst; +extern int nb_value_triloop_table; +extern double *triloop_cmpt_table; +extern double *triloop_weight_table; +extern int nb_value_tetraloop_table; +extern double *tetraloop_cmpt_table; +extern double *tetraloop_weight_table; +extern int uncst_mutation[2][4][4]; +extern int *cst_tape; + +long int **bp_stat_table=NULL; +long int ***mutation_stat_table=NULL; + +/**** variables for hybrid ****/ + +extern double mfe_hybrid_initialization_energy; +extern double pf_hybrid_initialization_energy; +extern int include_intermolecular_interactions; +extern double cutpoint; + +#define NO_TRACEBACK +#define NO_DEBUG_SAMPLING +#define LEFT_CHECK 0 +#define RIGHT_CHECK 26 + +/***********************************************************************************************/ +/* fill statistical tables */ +/***********************************************************************************************/ + +int fill_stat_tables(char *seq,char *structure) { + int ii,openbp,closebp,ssa,nt; + int *tmp_bp_table=NULL, *heap=NULL, itop=0; + + /* build base pair table from structure */ + + tmp_bp_table=(int *)xmalloc(rna_len*sizeof(int)); + for (ii=0;ii base pair statistics computed from %d samples with %d mutations\n",nb_samples,nb_mutations); + for (ii=0;ii mutation statistics computed from %d samples with %d mutations\n",nb_samples,nb_mutations); + for (ii=0;iinb_mutations) { /* there is still some non-mutated positions */ + if (j-i>0) { anchor += sequence_bias(i+1,j,nb_mutations) * nucleotide_bias(i,char2index(i)); } /* end is not reached */ + else { anchor += nucleotide_bias(i,char2index(i)); } /* last nucleotide */ + if (va<=anchor) { + ss_sample[0][i]=writeNt_with_bias(i,1); + ss_sample[1][i]='.'; + fill_weighted_random_mutations(nb_mutations, i+1, j, ss_sample); + return; + } + } + + if ((nb_mutations>0)&&(!cst_tape[i])) { /* mutations at position i */ + ilist=0; + nt_list = uncst_mutation[1][char2index(i)]; + while ((nt=nt_list[ilist])!=INDEX_STOP) { + if (j-i>0) { anchor += nucleotide_bias(i,nt) * sequence_bias(i+1,j,nb_mutations-1); } + else { anchor += nucleotide_bias(i,nt); } + if (va<=anchor) { + ss_sample[0][i]=writeNt_with_bias(i,0); + ss_sample[1][i]='.'; + fill_weighted_random_mutations(nb_mutations-1, i+1, j, ss_sample); + return; + } + ilist++; + } + } + + fprintf(stderr,"%s:line %d: sampling failed (i=%d,j=%d,k=%d,va=%e,anchor=%e,max=%f).%s\n",__FILE__,__LINE__,j,j,nb_mutations,va,anchor,sequence_bias(i,j,nb_mutations),getJobID()); + +#ifdef TRACEBACK + fprintf(stdout ,"done%s\n",getJobID()); +#endif + +} + + +/***********************************************************************************************/ +/* sampling when (i,j) base pair */ +/***********************************************************************************************/ + +double samplingHelix(int nb_mut_remaining,int ii,int jj, int lnt, int rnt, char **ss_sample) { + + int cloop,nb_mut_motif,nb_nt,nb_max_mut,ii_list,ii_list_open,ii_list_close,config,config_close,config_open; + int nb_max_mut_unk_loop,nb_mut_unk_loop,nb_min_mut_close_bp,nb_max_mut_close_bp,nb_mut_close_bp,nb_max_mut_open_bp,nb_mut_open_bp; + int xx,aa,cc,uu,vv,dd,bb,yy,newK,nb_free_nt,len,nn,ll,rr,nb_mut_ext_aa,nb_max_mut_in_bulge; + int size_bulge,nb_mut_in_bulge,nb_mut_inside_boundary,nt2mut,min_rr,max_rr; + unsigned int *list_config, *list_config_close, *list_config_open; + double base_hairpin_energy,E_base_hairpin_energy,bonus,n_total,n_partial,n_remaining,weight,bound_bias; + int newii,newjj, ilist1=0, *list_nt1=NULL, ilist2=0, *list_nt2=NULL, maxk, nt1, nt2, kk, hcode, valid_random_hairpin; + double pf_ref_left, pf_ref_right, Esample, Esample1, Esample2; + int tab_mut_remaining[3][2][2] = {{{0,0}},{{0,1},{1,0}},{{1,1}}}; /* used for tetraloops */ + int min_length; + +#ifdef DEBUG_SAMPLING + double debug=0,pdebug=0; +#endif + +#ifdef TRACEBACK + fprintf(stdout ,"Helix sampling: mut=%d, ii=%d, jj=%d, lnt=%d, rnt=%d%s\n",nb_mut_remaining,ii,jj,lnt,rnt,getJobID()); +#endif + + /* In that case, s and b are necessarily equals to 0 */ + + double va = random_va() * Zs[nb_mut_remaining][ii][jj][lnt][rnt].pf; + +#ifdef DEBUG_SAMPLING + if ((ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) va = Zs[nb_mut_remaining][ii][jj][lnt][rnt].pf; +#endif + + /* initialization */ + + double anchor = 0.0; + + /* check */ + + if (!((ss_cst[ii]==jj)||((ss_cst[ii]<0)&&(ss_cst[jj]<0)))) { + fprintf(stderr,"%s:line %d:helix sampling for [%d,%d] with %d base pair failed. Structure constraints does not allow base pairing.%s\n",__FILE__,__LINE__,ii,jj,nb_mut_remaining,getJobID()); + } + + if (!Zs[nb_mut_remaining][ii][jj][lnt][rnt].pf) { + fprintf(stderr,"%s:line %d:helix sampling for [%d,%d] with %d base pair failed.%s\n",__FILE__,__LINE__,ii,jj,nb_mut_remaining,getJobID()); + } + + if (((jj=cutpoint))&&(jj-ii-1 < __hairpin_min_length__)) { + fprintf(stderr,"%s:line %d:helix sampling failed... Hairpin threshold is not respected at position (%d,%d)%s\n",__FILE__,__LINE__,ii,jj,getJobID()); + } + + if ((cst_tape[ii])&&(kronecker(ii,lnt))) { + fprintf(stderr,"%s:line %d:%s: %d: helix sampling failed... index %d cannot mutate%s\n",__FILE__,__LINE__,__FILE__,__LINE__,ii,getJobID()); + return 0; + } + + if ((cst_tape[jj])&&(kronecker(jj,rnt))) { + fprintf(stderr,"%s:line %d: helix sampling failed... index %d cannot mutate%s\n",__FILE__,__LINE__,jj,getJobID()); + return 0; + } + + /* include base pairs */ + + + ss_sample[0][ii]=index2char(ii,lnt); + ss_sample[0][jj]=index2char(jj,rnt); + + if ((iicutpoint)) { /* inter molecular hairpin */ + if (include_intermolecular_interactions) { + ss_sample[1][ii]='['; + ss_sample[1][jj]=']'; + } + else { + ss_sample[1][ii]='{'; + ss_sample[1][jj]='}'; + } + } + else { + ss_sample[1][ii]='('; + ss_sample[1][jj]=')'; + } + + /* length */ + + len = jj - ii + 1; + + /* number of mutation in external nucleotides */ + + nb_mut_ext_aa = kronecker(ii,lnt) + kronecker(jj,rnt); + nb_mut_inside_boundary = nb_mut_remaining - nb_mut_ext_aa; + + /*****************************************************************************************************/ + /** hairpin **/ + /*****************************************************************************************************/ + + if (is_hairpin(ii,jj)) { + if ((iicutpoint)) { /* inter molecular hairpin */ + if (include_intermolecular_interactions) { + newK = nb_mut_remaining-kronecker(ii,lnt)-kronecker(jj,rnt); + if (len>2) { + nt2mut = len-2 - cst_segment[ii+1][jj-ii-2]; + } + else { + nt2mut=0; + } + + if ((newK>=0)||(newK<=nt2mut)) { /* check configurations */ + + int nmut_left,nmut_right; + double pf_left,pf_right; + int rightmostseq1=(int)(cutpoint-0.5); + int leftmostseq2=(int)(cutpoint+0.5); + int valid_index_left,valid_index_right,valid_index; + + /* single stranded intermolecular hairpin */ + + /* n_remaining = genereMutant(nt2mut,newK); */ + if (jj-ii>1) { + n_remaining = sequence_bias(ii+1,jj-1,newK) * nucleotide_bias(ii,lnt) * nucleotide_bias(jj,rnt); + } + else { + n_remaining = nucleotide_bias(ii,lnt) * nucleotide_bias(jj,rnt); + } + anchor += n_remaining * pf_hybrid_initialization_energy; + + if ((n_remaining)&&(va<=anchor)) { + +#ifdef TRACEBACK + fprintf(stdout ,"line %d: sample hairpin: k=%d, i=%d, j=%d, va=%e, anchor=%e%s\n",__LINE__,newK,ii,jj,va,anchor,getJobID()); +#endif + if (len>2) { + fill_weighted_random_mutations(newK,ii+1, jj-1, ss_sample); + } + return mfe_hybrid_initialization_energy; + } + + /* intermolecular hairpin with secondary structure */ + + valid_index_left=0; + valid_index_right=0; + valid_index=0; + + if (rightmostseq1-ii>=__hairpin_min_length__+2) { + valid_index_left=1; + valid_index=1; + } + if (jj-leftmostseq2>=__hairpin_min_length__+2) { + valid_index_right=1; + valid_index=1; + } + + if (valid_index) { + + for (nmut_left=0;nmut_left<=newK;nmut_left++) { + int ss,uu,vv,ww; + nmut_right=newK-nmut_left; + + for(uu=0;uu<4;uu++) { + for(ss=0;ss<4;ss++) { + /* if: rightmostseq1 - ii < 3, then sequence_bias returns 0 */ + if (rightmostseq1 - ii >= 3) { + pf_ref_left = pf_left = sequence_bias(ii+2,rightmostseq1-1,nmut_left-kronecker(ii+1,uu)-kronecker(rightmostseq1,ss)) + * nucleotide_bias(ii+1,uu) * nucleotide_bias(rightmostseq1,ss); + } + else { + pf_ref_left = pf_left = nucleotide_bias(ii+1,uu) * nucleotide_bias(rightmostseq1,ss); + } + if (valid_index_left) { + pf_left+=Zes[nmut_left][ii+1][rightmostseq1][uu][ss].pf+Ze[nmut_left][ii+1][rightmostseq1][uu][ss].pf; + } + for(ww=0;ww<4;ww++) { + for(vv=0;vv<4;vv++) { + if (jj - leftmostseq2 >= 3) { + pf_ref_right = pf_right = sequence_bias(leftmostseq2+1,jj-2,nmut_right-kronecker(leftmostseq2,ww)-kronecker(jj-1,vv)) + * nucleotide_bias(leftmostseq2,ww) * nucleotide_bias(jj-1,vv); + } + else { + pf_ref_right = pf_right = nucleotide_bias(leftmostseq2,ww) * nucleotide_bias(jj-1,vv); + } + if (valid_index_right) { + pf_right+=Zes[nmut_right][leftmostseq2][jj-1][ww][vv].pf+Ze[nmut_right][leftmostseq2][jj-1][ww][vv].pf; + } + + if ((pf_left>pf_ref_left)||(pf_right>pf_ref_right)) { + + anchor += pf_left * pf_right * pf_hybrid_initialization_energy * nucleotide_bias(ii,lnt) * nucleotide_bias(jj,rnt); + + if (va<=anchor) { + +#ifdef TRACEBACK + fprintf(stdout ,"line %d: sample intermolecular hairpin: k=%d, i=%d, j=%d, u=%d, s=%d, w=%d, v=%d, va=%e, anchor=%e%s\n", __LINE__, newK, ii, jj, uu, ss, ww, vv, va, anchor,getJobID()); +#endif + + Esample1 = 0.0; + Esample2 = 0.0; + if (pf_left>pf_ref_left) { /* non empty secndary structure in left region */ + Esample1 = samplingExteriorLoop(nmut_left,ii+1,rightmostseq1,uu,ss,ss_sample); + } + else { /* empty secndary structure in left region */ + if (iipf_ref_right) { /* non empty secndary structure in left region */ + Esample2 = samplingExteriorLoop(nmut_right,leftmostseq2,jj-1,ww,vv,ss_sample); + } + else{ /* empty secndary structure in left region */ + if (leftmostseq2>jj) { + fill_weighted_random_mutations(nmut_right,leftmostseq2,jj-1, ss_sample); + } + } + return mfe_hybrid_initialization_energy + Esample1 + Esample2; + } + } + } + } + } + } + } + } + } + } + } + else { /* single strand hairpin & check contraints */ + + for (uu=0;uu<4;uu++) { + if (!((cst_tape[ii+1])&&(kronecker(ii+1,uu)))) { + for (vv=0;vv<4;vv++) { + if (!((cst_tape[jj-1])&&(kronecker(jj-1,vv)))) { + + base_hairpin_energy = boltzmannHairpin(lnt,uu,vv,rnt,len-2); + E_base_hairpin_energy = EHairpin(lnt,uu,vv,rnt,len-2); + newK = nb_mut_remaining-kronecker(ii,lnt)-kronecker(ii+1,uu)-kronecker(jj-1,vv)-kronecker(jj,rnt); + nt2mut = len-4 - cst_segment[ii+2][jj-ii-4]; + bound_bias = nucleotide_bias(ii,lnt) * nucleotide_bias(ii+1,uu) * nucleotide_bias(jj-1,vv) * nucleotide_bias(jj,rnt); + + if ((newK<0)||(newK>nt2mut)) continue; /* check configurations */ + + n_total = n_partial = 0; + + if (len==5) { /*** triloop ***/ + + /* assign new value */ + if ((newK==0)||(!cst_tape[ii+2])) { + ilist1=0; + list_nt1=uncst_mutation[newK][char2index(ii+2)]; + while ((nt1=list_nt1[ilist1])!=INDEX_STOP) { + hcode = (lnt<<8) | (uu<<6) | (nt1<<4) | (vv<<2) | rnt; + if ((bonus=refTableTriLoop[hcode])) { /* triloop exists if bonus exists */ + n_partial = bound_bias * nucleotide_bias(ii+2,nt1); + n_total += n_partial; + anchor += base_hairpin_energy * exp(-(bonus/__RT__)) * n_partial; + if (va<=anchor) { +#ifdef TRACEBACK + fprintf(stdout ,"line %d: sample triloop: k=%d, i=%d, j=%d, u=%d, nt1=%d, v=%d, va=%e, anchor=%e%s\n",__LINE__,newK,ii,jj,uu,nt1,vv,va,anchor,getJobID()); +#endif + ss_sample[0][ii+1]=index2char(ii+1,uu); + ss_sample[1][ii+1]='.'; + ss_sample[0][ii+2]=index2char(ii+2,nt1); + ss_sample[1][ii+2]='.'; + ss_sample[0][jj-1]=index2char(jj-1,vv); + ss_sample[1][jj-1]='.'; + return E_base_hairpin_energy + bonus; + } + } + ilist1++; + } + } + } + else if (len==6) { /*** tetraloop ***/ + + if (newK==1) { maxk=2; } /* used to decide the number of configurations to try */ + else { maxk=1; } + + for (kk=0;kk__hairpin_max_length__)) { + fprintf(stderr,"Incoherency: Hairpin does not have the correct length!! (line %d)%s\n",__LINE__,getJobID()); + return 0; + } + ss_sample[0][ii+1]=index2char(ii+1,uu); + ss_sample[1][ii+1]='.'; + ss_sample[0][ii+2]=index2char(ii+2,INDEX_G); + ss_sample[1][ii+2]='.'; + ss_sample[0][jj-1]=index2char(jj-1,vv); + ss_sample[1][jj-1]='.'; + if (len>5) { /*** fill region if the size of the hairpin is more than 3 ***/ + fill_weighted_random_mutations(ggg_newK,ii+3, jj-2, ss_sample); + } + return E_base_hairpin_energy + ggg_hairpin_bonus; + } + } +#endif + /*** generic case ***/ + /* n_remaining = genereMutant(nt2mut,newK) - n_total; */ + n_remaining = sequence_bias(ii+2,jj-2,newK) * bound_bias - n_total; + anchor += base_hairpin_energy * n_remaining; + if (va<=anchor) { +#ifdef TRACEBACK + fprintf(stdout ,"line %d: sample hairpin: k=%d, i=%d, j=%d, u=%d, v=%d, va=%e, anchor=%e%s\n",__LINE__,newK,ii,jj,uu,vv,va,anchor,getJobID()); +#endif + if ((len-2<__hairpin_min_length__)||(len-2>__hairpin_max_length__)) { + fprintf(stderr,"Incoherency: Hairpin does not have the correct length!! (line %d)%s\n",__LINE__,getJobID()); + return 0; + } + + /* filter tri- and tetra-loop (not rigorous) */ + valid_random_hairpin=0; + while (!valid_random_hairpin) { + + ss_sample[0][ii+1]=index2char(ii+1,uu); + ss_sample[1][ii+1]='.'; + ss_sample[0][jj-1]=index2char(jj-1,vv); + ss_sample[1][jj-1]='.'; + fill_weighted_random_mutations(newK,ii+2, jj-2, ss_sample); + +#ifdef WITH_GGG_HAIRPIN + if ((!is_triloop(ii,jj,ss_sample))&&(!is_tetraloop(ii,jj,ss_sample))&&(!is_ggg_hairpin(ii,jj,ss_sample))) { + valid_random_hairpin=1; + } +#else + if ((!is_triloop(ii,jj,ss_sample))&&(!is_tetraloop(ii,jj,ss_sample))) { + valid_random_hairpin=1; + } +#endif + } + return E_base_hairpin_energy; + + } + } + } + } + } + } + } + + /* a simple check to ensure we can insert a regular loop (assert minimal length requirements) */ + + if ((((ii=cutpoint)||(cutpoint>jj))&&(len<__hairpin_min_length__+2))) { + fprintf(stderr,"%s:%d: ERROR: Cannot sample a regular loop between index %d and %d.%s\n",__FILE__,__LINE__,ii,jj,getJobID()); + return 0; + } + + + /*****************************************************************************************************/ + /** Stacking pairs **/ + /*****************************************************************************************************/ + + if (is_stack(ii,jj)) { + + nb_max_mut=minimum(4-cst_tape[ii]-cst_tape[ii+1]-cst_tape[jj-1]-cst_tape[jj],nb_mut_remaining); + + for (nb_mut_motif=nb_mut_ext_aa;nb_mut_motif<=nb_max_mut;nb_mut_motif++) { + list_config = stack_tab[nb_mut_motif][ii][jj][0]; + ii_list = 0; + while ((config=list_config[ii_list])) { + xx=config>>6; + yy=config&3; + + if ((lnt==xx)&&(rnt==yy)) { + uu=(config>>4)&3; + vv=(config>>2)&3; + /* we must add the cost of external nucleotides */ + newK=nb_mut_remaining-nb_mut_motif + kronecker(ii+1,uu) + kronecker(jj-1,vv); + if ((newK<0)||(newK>nb_mut_remaining)) { + fprintf(stderr,"Incoherency: newK CANNOT be negative!! (line %d)%s\n",__LINE__,getJobID()); + return 0; + } + anchor += boltzmannStack(lnt,uu,vv,rnt) * Zs[newK][ii+1][jj-1][uu][vv].pf * nucleotide_bias(ii,lnt) * nucleotide_bias(jj,rnt); +#ifdef DEBUG_SAMPLING + if ((ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) debug += boltzmannStack(lnt,uu,vv,rnt) * Zs[newK][ii+1][jj-1][uu][vv].pf; +#endif + if (va<=anchor) { +#ifdef TRACEBACK + fprintf(stdout ,"line %d: sample stack: k=%d, i=%d, j=%d, u=%d, v=%d, va=%e, anchor=%e%s\n",__LINE__,newK,ii+1,jj-1,uu,vv,va,anchor,getJobID()); +#endif + Esample = samplingHelix(newK,ii+1,jj-1,uu,vv,ss_sample); + return EStack(lnt,uu,vv,rnt) + Esample; + } + } + ii_list++; + } + } + +#ifdef DEBUG_SAMPLING + if ((ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) printf("sample stack: %e\n",debug-pdebug); + pdebug = debug; +#endif + + } + + /*****************************************************************************************************/ + /** bulge AND multi-loop **/ + /*****************************************************************************************************/ + + nb_mut_inside_boundary = nb_mut_remaining - kronecker(ii,lnt) - kronecker(jj,rnt); + + if (nb_mut_inside_boundary>=0) { + + if ((ii min_length) { /* min length required for a stack */ + + for (uu=0;uu<4;uu++) { + + for (vv=0;vv<4;vv++) { + + if (validBasePair(uu,vv)) { + + /* bulge */ + + for (size_bulge=1;size_bulge<=nb_free_nt;size_bulge++) { /* size of the bulge */ + + /* we do need to distinguish the bulge because the asymetry of constraints */ + + /* bulge on the left */ + + newii = ii+1+size_bulge; + newjj = jj-1; + + if (((newii=__hairpin_min_length__+4+size_bulge)&&((newjj=cutpoint)))) { /* check that loop respects cutpoint */ + + if (is_internal_loop(ii,newii,newjj,jj)) { /* lookup structure constraints */ + + if (!(kronecker(newii,uu) && cst_tape[newii])|| + !(kronecker(newjj,vv) && cst_tape[newjj])) { + + nt2mut=size_bulge-cst_segment[ii+1][size_bulge-1]; + nb_max_mut_in_bulge = minimum(nt2mut,nb_mut_inside_boundary); + + for (nb_mut_in_bulge=0;nb_mut_in_bulge<=nb_max_mut_in_bulge;nb_mut_in_bulge++) { /* number of mutations in bulge */ + newK = nb_mut_inside_boundary - nb_mut_in_bulge; + if (newK>=0) { + if (Zs[newK][newii][newjj][uu][vv].pf) { + + /* weight = genereMutant(nt2mut,nb_mut_in_bulge) */ + weight = sequence_bias(ii+1,ii+size_bulge,nb_mut_in_bulge); + + anchor += boltzmannBulge(lnt,uu,vv,rnt,size_bulge) * Zs[newK][newii][newjj][uu][vv].pf * weight * nucleotide_bias(ii,lnt) * nucleotide_bias(jj,rnt); + +#ifdef DEBUG_SAMPLING + if ((ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) debug += boltzmannBulge(lnt,uu,vv,rnt,size_bulge) * + Zs[newK][newii][newjj][uu][vv].pf * genereMutant(nt2mut,nb_mut_in_bulge); +#endif + if (va<=anchor) { +#ifdef TRACEBACK + fprintf(stdout ,"line %d: sample bulge: k=%d, i=%d, j=%d, u=%d, v=%d, va=%e, anchor=%e%s\n",__LINE__,newK,newii,newjj,uu,vv,va,anchor,getJobID()); +#endif + fill_weighted_random_mutations(nb_mut_in_bulge,ii+1,ii+size_bulge,ss_sample); + Esample = samplingHelix(newK,newii,newjj,uu,vv,ss_sample); + return EBulge(lnt,uu,vv,rnt,size_bulge) + Esample; + } + } + } + } + } + } + } + + /* bulge on the right */ + + newii = ii+1; + newjj = jj-1-size_bulge; + + if (((newii=__hairpin_min_length__+4+size_bulge)&&((newjj=cutpoint)))) { /* check that loop respects cutpoint */ + + if (is_internal_loop(ii,newii,newjj,jj)) { /* lookup structure constraints */ + + if (!(kronecker(newii,uu) && cst_tape[newii])|| + !(kronecker(newjj,vv) && cst_tape[newjj])) { + + nt2mut=size_bulge-cst_segment[jj-size_bulge][size_bulge-1]; + nb_max_mut_in_bulge = minimum(nt2mut,nb_mut_inside_boundary); + + for (nb_mut_in_bulge=0;nb_mut_in_bulge<=nb_max_mut_in_bulge;nb_mut_in_bulge++) { /* number of mutations in bulge */ + newK = nb_mut_inside_boundary - nb_mut_in_bulge; + if (newK>=0) { + if (Zs[newK][newii][newjj][uu][vv].pf) { + + /* weight = genereMutant(nt2mut,nb_mut_in_bulge) */ + weight = sequence_bias(jj-size_bulge,jj-1,nb_mut_in_bulge); + + anchor += boltzmannBulge(lnt,uu,vv,rnt,size_bulge) * Zs[newK][newii][newjj][uu][vv].pf * weight * weight * nucleotide_bias(ii,lnt) * nucleotide_bias(jj,rnt); +#ifdef DEBUG_SAMPLING + if ((ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) debug += boltzmannBulge(lnt,uu,vv,rnt,size_bulge) * + Zs[newK][newii][newjj][uu][vv].pf * genereMutant(nt2mut,nb_mut_in_bulge); +#endif + if (va<=anchor) { +#ifdef TRACEBACK + fprintf(stdout ,"line %d: sample bulge: k=%d, i=%d, j=%d, u=%d, v=%d, va=%e, anchor=%e%s\n",__LINE__,newK,newii,newjj,uu,vv,va,anchor,getJobID()); +#endif + fill_weighted_random_mutations(nb_mut_in_bulge,jj-size_bulge,jj-1,ss_sample); + Esample = samplingHelix(newK,newii,newjj,uu,vv,ss_sample); + return EBulge(lnt,uu,vv,rnt,size_bulge) + Esample; + } + } + } + } + } + } + } + } + } + + /* close multi-loop*/ + + anchor += boltzmannEndMultiLoop() * Zm[nb_mut_inside_boundary][ii+1][jj-1][uu][vv].pf * nucleotide_bias(ii,lnt) * nucleotide_bias(jj,rnt); +#if 0 + if (Zm[nb_mut_inside_boundary][ii+1][jj-1][uu][vv].pf) + printf("%d,%d: %e (%e * %e)\n",ii,jj,Zs[nb_mut_remaining][ii][jj][lnt][rnt].pf,boltzmannEndMultiLoop(),Zm[nb_mut_inside_boundary][ii+1][jj-1][uu][vv].pf); +#endif + +#ifdef DEBUG_SAMPLING + if ((ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) debug += boltzmannEndMultiLoop() * Zm[nb_mut_inside_boundary][ii+1][jj-1][uu][vv].pf; +#endif + + if (va<=anchor) { +#ifdef TRACEBACK + fprintf(stdout ,"line %d: sample multi-loop: k=%d, i=%d, j=%d, u=%d, v=%d, va=%e, anchor=%e%s\n",__LINE__,nb_mut_inside_boundary,ii+1,jj-1,uu,vv,va,anchor,getJobID()); +#endif + Esample = samplingMultiLoop(nb_mut_inside_boundary,ii+1,jj-1,uu,vv,0,ss_sample); + return EEndMultiLoop() + Esample; + } + } + } + } + } + +#ifdef DEBUG_SAMPLING + if ((ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) printf("sample bulge & multi: %e\n",debug-pdebug); + pdebug = debug; +#endif + + /*****************************************************************************************************/ + /** lookup special internal loops **/ + /*****************************************************************************************************/ + + for (cloop=0;cloop<4;cloop++) { + + nb_nt = 6 + (cloop>>1) + (cloop&1); /* number of nt in the internal loop */ + nb_max_mut=minimum(nb_nt,nb_mut_remaining); + + for (nb_mut_motif=0;nb_mut_motif<=nb_max_mut;nb_mut_motif++) { + list_config = loop_tab[nb_mut_motif][cloop][ii][jj]; + ii_list = 0; + while ((config=list_config[ii_list])) { + switch (cloop) { + case 0: + newii=ii+2; + newjj=jj-2; + if (!is_internal_loop(ii,newii,newjj,jj)) break; /* lookup structure constraints */ + if (((newiicutpoint))||((len>=__hairpin_min_length__+6)&&((newjj=cutpoint)))) { /* constrain loop to respect cutpoint */ + xx=config>>10; + yy=config&3; + if ((xx==lnt)&&(yy==rnt)) { + aa=(config>>8)&3; + uu=(config>>6)&3; + vv=(config>>4)&3; + bb=(config>>2)&3; + newK=nb_mut_remaining-nb_mut_motif + kronecker(ii+2,uu) + kronecker(jj-2,vv); + if ((newK<0)||(newK>nb_mut_remaining)) { + fprintf(stderr,"Incoherency: newK CANNOT be negative!! (line %d)%s\n",__LINE__,getJobID()); + return 0; + } + anchor += boltzmannInternal_1x1(lnt,aa,uu,vv,bb,rnt) * Zs[newK][ii+2][jj-2][uu][vv].pf * nucleotide_bias(ii,lnt) * nucleotide_bias(ii+1,aa) * nucleotide_bias(jj-1,bb) * nucleotide_bias(jj,rnt); +#ifdef DEBUG_SAMPLING + if ((ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) debug += boltzmannInternal_1x1(lnt,aa,uu,vv,bb,rnt) * Zs[newK][ii+2][jj-2][uu][vv].pf; +#endif + if (va<=anchor) { + ss_sample[0][ii+1] = index2char(ii+1,aa); + ss_sample[1][ii+1] = '.'; + ss_sample[0][jj-1] = index2char(jj-1,bb); + ss_sample[1][jj-1] = '.'; +#ifdef TRACEBACK + fprintf(stdout ,"line %d: sample internal-loop: k=%d, i=%d, j=%d, u=%d, v=%d, va=%e, anchor=%e%s\n",__LINE__,newK,ii+2,jj-2,uu,vv,va,anchor,getJobID()); +#endif + Esample = samplingHelix(newK,ii+2,jj-2,uu,vv,ss_sample); + return EInternal_1x1(lnt,aa,uu,vv,bb,rnt) + Esample; + } + } + } + break; + case 1: + newii=ii+2; + newjj=jj-3; + if (!is_internal_loop(ii,newii,newjj,jj)) break; /* lookup structure constraints */ + if (((newiicutpoint))||((len>=__hairpin_min_length__+7)&&((newjj=cutpoint)))) { /* constrain loop to respect cutpoint */ + xx=config>>12; + yy=config&3; + if ((xx==lnt)&&(yy==rnt)) { + aa=(config>>10)&3; + uu=(config>>8)&3; + vv=(config>>6)&3; + cc=(config>>4)&3; + bb=(config>>2)&3; + newK=nb_mut_remaining-nb_mut_motif + kronecker(ii+2,uu) + kronecker(jj-3,vv); + if ((newK<0)||(newK>nb_mut_remaining)) { + fprintf(stderr,"Incoherency: newK CANNOT be negative!! (line %d)%s\n",__LINE__,getJobID()); + return 0; + } + anchor += boltzmannInternal_1x2(lnt,aa,uu,vv,cc,bb,rnt) * Zs[newK][ii+2][jj-3][uu][vv].pf * nucleotide_bias(ii,lnt) * nucleotide_bias(ii+1,aa) * nucleotide_bias(jj-2,cc) * nucleotide_bias(jj-1,bb) * nucleotide_bias(jj,rnt); +#ifdef DEBUG_SAMPLING + if ((ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) debug += boltzmannInternal_1x2(lnt,aa,uu,vv,cc,bb,rnt) * Zs[newK][ii+2][jj-3][uu][vv].pf; +#endif + if (va<=anchor) { + ss_sample[0][ii+1] = index2char(ii+1,aa); + ss_sample[1][ii+1] = '.'; + ss_sample[0][jj-2] = index2char(jj-2,cc); + ss_sample[1][jj-2] = '.'; + ss_sample[0][jj-1] = index2char(jj-1,bb); + ss_sample[1][jj-1] = '.'; +#ifdef TRACEBACK + fprintf(stdout ,"line %d: sample internal-loop: k=%d, i=%d, j=%d, u=%d, v=%d, va=%e, anchor=%e%s\n",__LINE__,newK,ii+2,jj-3,uu,vv,va,anchor,getJobID()); +#endif + Esample = samplingHelix(newK,ii+2,jj-3,uu,vv,ss_sample); + return EInternal_1x2(lnt,aa,uu,vv,cc,bb,rnt) + Esample; + } + } + } + break; + case 2: + newii=ii+3; + newjj=jj-2; + if (!is_internal_loop(ii,newii,newjj,jj)) break; /* lookup structure constraints */ + if (((newiicutpoint))||((len>=__hairpin_min_length__+7)&&((newjj=cutpoint)))) { /* constrain loop to respect cutpoint */ + xx=config>>12; + yy=config&3; + if ((xx==lnt)&&(yy==rnt)) { + aa=(config>>10)&3; + cc=(config>>8)&3; + uu=(config>>6)&3; + vv=(config>>4)&3; + bb=(config>>2)&3; + newK=nb_mut_remaining-nb_mut_motif + kronecker(ii+3,uu) + kronecker(jj-2,vv); + if ((newK<0)||(newK>nb_mut_remaining)) { + fprintf(stderr,"Incoherency: newK CANNOT be negative!! (line %d)%s\n",__LINE__,getJobID()); + return 0; + } + anchor += boltzmannInternal_2x1(lnt,aa,cc,uu,vv,bb,rnt) * Zs[newK][ii+3][jj-2][uu][vv].pf * nucleotide_bias(ii,lnt) * nucleotide_bias(ii+1,aa) * nucleotide_bias(ii+2,cc) * nucleotide_bias(jj-1,bb) * nucleotide_bias(jj,rnt); +#ifdef DEBUG_SAMPLING + if ((ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) debug += boltzmannInternal_2x1(lnt,aa,cc,uu,vv,bb,rnt) * Zs[newK][ii+3][jj-2][uu][vv].pf; +#endif + if (va<=anchor) { + ss_sample[0][ii+1] = index2char(ii+1,aa); + ss_sample[1][ii+1] = '.'; + ss_sample[0][ii+2] = index2char(ii+2,cc); + ss_sample[1][ii+2] = '.'; + ss_sample[0][jj-1] = index2char(jj-1,bb); + ss_sample[1][jj-1] = '.'; +#ifdef TRACEBACK + fprintf(stdout ,"line %d: sample internal-loop: k=%d, i=%d, j=%d, u=%d, v=%d, va=%e, anchor=%e%s\n",__LINE__,newK,ii+3,jj-2,uu,vv,va,anchor,getJobID()); +#endif + Esample = samplingHelix(newK,ii+3,jj-2,uu,vv,ss_sample); + return EInternal_2x1(lnt,aa,cc,uu,vv,bb,rnt) + Esample; + } + } + } + break; + case 3: + newii=ii+3; + newjj=jj-3; + if (!is_internal_loop(ii,newii,newjj,jj)) break; /* lookup structure constraints */ + if (((newiicutpoint))||((len>=__hairpin_min_length__+8)&&((newjj=cutpoint)))) { /* constrain loop to respect cutpoint */ + xx=config>>14; + yy=config&3; + if ((xx==lnt)&&(yy==rnt)) { + aa=(config>>12)&3; + cc=(config>>10)&3; + uu=(config>>8)&3; + vv=(config>>6)&3; + dd=(config>>4)&3; + bb=(config>>2)&3; + newK=nb_mut_remaining-nb_mut_motif + kronecker(ii+3,uu) + kronecker(jj-3,vv); + if ((newK<0)||(newK>nb_mut_remaining)) { + fprintf(stderr,"Incoherency: newK CANNOT be negative!! (line %d)%s\n",__LINE__,getJobID()); + return 0; + } + anchor += boltzmannInternal_2x2(lnt,aa,cc,uu,vv,dd,bb,rnt) * Zs[newK][ii+3][jj-3][uu][vv].pf * nucleotide_bias(ii,lnt) * nucleotide_bias(ii+1,aa) * nucleotide_bias(ii+2,cc) * nucleotide_bias(jj-2,dd) * nucleotide_bias(jj-1,bb) * nucleotide_bias(jj,rnt); +#ifdef DEBUG_SAMPLING + if ((ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) debug += boltzmannInternal_2x2(lnt,aa,cc,uu,vv,dd,bb,rnt) * Zs[newK][ii+3][jj-3][uu][vv].pf; +#endif + if (va<=anchor) { + ss_sample[0][ii+1] = index2char(ii+1,aa); + ss_sample[1][ii+1] = '.'; + ss_sample[0][ii+2] = index2char(ii+2,cc); + ss_sample[1][ii+2] = '.'; + ss_sample[0][jj-2] = index2char(jj-2,dd); + ss_sample[1][jj-2] = '.'; + ss_sample[0][jj-1] = index2char(jj-1,bb); + ss_sample[1][jj-1] = '.'; +#ifdef TRACEBACK + fprintf(stdout ,"line %d: sample internal-loop: k=%d, i=%d, j=%d, u=%d, v=%d, va=%e, anchor=%e%s\n",__LINE__,newK,ii+3,jj-3,uu,vv,va,anchor,getJobID()); +#endif + Esample = samplingHelix(newK,ii+3,jj-3,uu,vv,ss_sample); + return EInternal_2x2(lnt,aa,cc,uu,vv,dd,bb,rnt) + Esample; + } + } + } + break; + } + ii_list++; + } + } + } + + +#ifdef DEBUG_SAMPLING + if ((ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) printf("sample special: %e\n",debug-pdebug); + pdebug = debug; +#endif + + /*****************************************************************************************************/ + /** 1xn and nx1 internal loops **/ + /*****************************************************************************************************/ + + if ((ii>6; + yy=config_close&3; + + if ((xx==lnt)&&(yy==rnt)) { + aa=(config_close>>4)&3; + bb=(config_close>>2)&3; + + /** 1xn **/ + + newii=ii+2; + newjj=jj-3-nn; + + if (is_internal_loop(ii,newii,newjj,jj)) { /* lookup structure constraints */ + + if (((newiicutpoint))||((len>=__hairpin_min_length__+7+nn)&&((newjj=cutpoint)))) { + + nt2mut=nn-cst_segment[jj-1-nn][nn-1]; + nb_max_mut_unk_loop = minimum(nt2mut,nb_mut_remaining-nb_mut_close_bp); /* to be adjusted later */ + + for (nb_mut_unk_loop=0;nb_mut_unk_loop<=nb_max_mut_unk_loop;nb_mut_unk_loop++) { /* number of mutations in unknown part of loops */ + + /** dont forget to add kronecker because mutation on single loop is be counted twice **/ + nb_max_mut_open_bp=minimum(4,nb_mut_remaining-nb_mut_unk_loop-nb_mut_close_bp+kronecker(ii+1,aa)); + + for (nb_mut_open_bp=0;nb_mut_open_bp<=nb_max_mut_open_bp;nb_mut_open_bp++) { + + list_config_open = stack_tab[nb_mut_open_bp][ii+1][jj-2-nn][2]; + ii_list_open = 0; + while ((config_open=list_config_open[ii_list_open])) { + + cc=(config_open>>6)&3; + + if (aa==cc) { + + uu=(config_open>>4)&3; + vv=(config_open>>2)&3; + dd=config_open&3; + newK = nb_mut_remaining - nb_mut_close_bp - nb_mut_open_bp - nb_mut_unk_loop + kronecker(ii+1,aa) + kronecker(ii+2,uu) + kronecker(jj-3-nn,vv); + if ((newK<0)||(newK>nb_mut_remaining)) { + fprintf(stderr,"Incoherency: newK CANNOT be negative!! (line %d)%s\n",__LINE__,getJobID()); + return 0; + } + + /* weight = genereMutant(nt2mut,nb_mut_unk_loop) */ + weight = sequence_bias(jj-1-nn,jj-2,nb_mut_unk_loop); + + anchor += boltzmannInternal_generic(lnt,aa,cc,uu,vv,dd,bb,rnt,1,nn+2) * + Zs[newK][ii+2][jj-3-nn][uu][vv].pf * weight * nucleotide_bias(ii,lnt) * nucleotide_bias(ii+1,aa) * nucleotide_bias(jj-2-nn,dd) * nucleotide_bias(jj-1,bb) * nucleotide_bias(jj,rnt); + +#ifdef DEBUG_SAMPLING + if ((ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) debug += boltzmannInternal_generic(lnt,aa,cc,uu,vv,dd,bb,rnt,nn+2,1) * + Zs[newK][ii+2][jj-3-nn][uu][vv].pf * genereMutant(nt2mut,nb_mut_unk_loop); +#endif + if (va<=anchor) { +#ifdef TRACEBACK + fprintf(stdout ,"line %d: sample internal-loop: k=%d, i=%d, j=%d, u=%d, v=%d, va=%e, anchor=%e%s\n",__LINE__,newK,ii+2,jj-3-nn,uu,vv,va,anchor,getJobID()); +#endif + ss_sample[0][ii+1] = index2char(ii+1,aa); + ss_sample[1][ii+1] = '.'; + ss_sample[0][jj-2-nn] = index2char(jj-2-nn,dd); + ss_sample[1][jj-2-nn] = '.'; + ss_sample[0][jj-1] = index2char(jj-1,bb); + ss_sample[1][jj-1] = '.'; + fill_weighted_random_mutations(nb_mut_unk_loop,jj-1-nn,jj-2,ss_sample); + Esample = samplingHelix(newK,ii+2,jj-3-nn,uu,vv,ss_sample); + return EInternal_generic(lnt,aa,cc,uu,vv,dd,bb,rnt,1,nn+2) + Esample; + } + } + ii_list_open++; + } + } /* close nb_mut_open */ + } /* close nb_mut_unk_loop */ + } + } /* close check structure constraints */ + + /** nx1 **/ + + newii=ii+3+nn; + newjj=jj-2; + + if (is_internal_loop(ii,newii,newjj,jj)) { /* lookup structure constraints */ + + if (((newiicutpoint))||((len>=__hairpin_min_length__+7+nn)&&((newjj=cutpoint)))) { + + nt2mut=nn-cst_segment[ii+2][nn-1]; + nb_max_mut_unk_loop = minimum(nt2mut,nb_mut_remaining-nb_mut_close_bp); /* to be adjusted later */ + + for (nb_mut_unk_loop=0;nb_mut_unk_loop<=nb_max_mut_unk_loop;nb_mut_unk_loop++) { /* number of mutations in unknown part of loops */ + + /** dont forget to add kronecker because mutation on single loop is be counted twice **/ + nb_max_mut_open_bp=minimum(4,nb_mut_remaining-nb_mut_unk_loop-nb_mut_close_bp+kronecker(jj-1,bb)); + + for (nb_mut_open_bp=0;nb_mut_open_bp<=nb_max_mut_open_bp;nb_mut_open_bp++) { + + /** nx1 **/ + + list_config_open = stack_tab[nb_mut_open_bp][ii+2+nn][jj-1][2]; + ii_list_open = 0; + while ((config_open=list_config_open[ii_list_open])) { + + dd=config_open&3; + + if (bb==dd) { + + cc=(config_open>>6)&3; + uu=(config_open>>4)&3; + vv=(config_open>>2)&3; + + newK = nb_mut_remaining - nb_mut_close_bp - nb_mut_open_bp - nb_mut_unk_loop + kronecker(jj-1,bb) + kronecker(ii+3+nn,uu) + kronecker(jj-2,vv); + if ((newK<0)||(newK>nb_mut_remaining)) { + fprintf(stderr,"Incoherency: newK CANNOT be negative!! (line %d)%s\n",__LINE__,getJobID()); + return 0; + } + + /* weight = genereMutant(nt2mut,nb_mut_unk_loop) */ + weight = sequence_bias(ii+2,ii+1+nn,nb_mut_unk_loop); + + anchor += boltzmannInternal_generic(lnt,aa,cc,uu,vv,dd,bb,rnt,nn+2,1) * + Zs[newK][ii+3+nn][jj-2][uu][vv].pf * weight * nucleotide_bias(ii,lnt) * nucleotide_bias(ii+1,aa) * nucleotide_bias(ii+2+nn,cc) * nucleotide_bias(jj-1,bb) * nucleotide_bias(jj,rnt); + +#ifdef DEBUG_SAMPLING + if ((ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) debug += boltzmannInternal_generic(lnt,aa,cc,uu,vv,dd,bb,rnt,1,nn+2) * + Zs[newK][ii+3+nn][jj-2][uu][vv].pf * genereMutant(nt2mut,nb_mut_unk_loop); +#endif + if (va<=anchor) { +#ifdef TRACEBACK + fprintf(stdout ,"line %d: sample internal-loop: k=%d, i=%d, j=%d, u=%d, v=%d, va=%e, anchor=%e%s\n",__LINE__,newK,ii+3+nn,jj-2,uu,vv,va,anchor,getJobID()); +#endif + ss_sample[0][ii+1] = index2char(ii+1,aa); + ss_sample[1][ii+1] = '.'; + ss_sample[0][ii+2+nn] = index2char(ii+2+nn,cc); + ss_sample[1][ii+2+nn] = '.'; + ss_sample[0][jj-1] = index2char(jj-1,bb); + ss_sample[1][jj-1] = '.'; + fill_weighted_random_mutations(nb_mut_unk_loop,ii+2,ii+1+nn,ss_sample); + Esample = samplingHelix(newK,ii+3+nn,jj-2,uu,vv,ss_sample); + return EInternal_generic(lnt,aa,cc,uu,vv,dd,bb,rnt,nn+2,1) + Esample; + } + } + ii_list_open++; + } /* close config_open */ + } /* close nb_mut_open_bp */ + } /* close nb_mut_unk_loop */ + } + } /* close check structure constraints */ + } + ii_list_close++; + } + } + } + +#ifdef DEBUG_SAMPLING + if ((ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) printf("sample 1xn & nx1: %e\n",debug-pdebug); + pdebug = debug; +#endif + + /*****************************************************************************************************/ + /** mxn internal loops (m+n>4) **/ + /*****************************************************************************************************/ + + if ((ii>6; + aa=(config_close>>4)&3; + bb=(config_close>>2)&3; + yy=config_close&3; + + if ((xx==lnt)&&(yy==rnt)) { + + for (nn=1;nn<=nb_free_nt;nn++) { /* number of undefined nucleotides in internal loop */ + + min_rr = maximum(0,nn-__max_size_bulge__); + max_rr = minimum(nn,__max_size_bulge__); + + for (rr=min_rr;rr<=max_rr;rr++) { + + ll=nn-rr; + newii=ii+3+ll; + newjj=jj-3-rr; + + if (is_internal_loop(ii,newii,newjj,jj)) { /* lookup structure constraints */ + + if (((newiicutpoint))||((len>=__hairpin_min_length__+8+nn)&&((newjj=cutpoint)))) { /* check that loop respects cutpoint */ + + nt2mut=nn; + if (ll>0) { nt2mut -= cst_segment[ii+2][ll-1]; } + if (rr>0) { nt2mut -= cst_segment[jj-1-rr][rr-1]; } + + nb_max_mut_unk_loop = minimum(nt2mut,nb_mut_remaining-nb_mut_close_bp); + + for (nb_mut_unk_loop=0;nb_mut_unk_loop<=nb_max_mut_unk_loop;nb_mut_unk_loop++) { /* number of mutations in unknown part of loops */ + + nb_max_mut_open_bp=minimum(4-cst_tape[ii+2+ll]-cst_tape[ii+3+ll]-cst_tape[jj-2-rr]-cst_tape[jj-3-rr],nb_mut_remaining-nb_mut_unk_loop-nb_mut_close_bp); + + for (nb_mut_open_bp=0;nb_mut_open_bp<=nb_max_mut_open_bp;nb_mut_open_bp++) { + list_config_open = stack_tab[nb_mut_open_bp][ii+2+ll][jj-2-rr][2]; + ii_list_open = 0; + while ((config_open=list_config_open[ii_list_open])) { + + cc=(config_open>>6)&3; + uu=(config_open>>4)&3; + vv=(config_open>>2)&3; + dd=config_open&3; + + newK = nb_mut_remaining - nb_mut_close_bp - nb_mut_open_bp - nb_mut_unk_loop + kronecker(ii+3+ll,uu) + kronecker(jj-3-rr,vv); + if ((newK<0)||(newK>nb_mut_remaining)) { + fprintf(stderr,"Incoherency: newK CANNOT be negative!! (line %d)%s\n",__LINE__,getJobID()); + return 0; + } + + /* weight = genereMutant(nt2mut,nb_mut_unk_loop) */ + weight = sequence_bias(ii+2,ii+1+ll,nb_mut_unk_loop) + sequence_bias(jj-1-rr,jj-2,nb_mut_unk_loop) + + sequence_bias(ii+2,jj-2,nb_mut_unk_loop) + - sequence_bias(ii+2,jj-2-rr,nb_mut_unk_loop) - sequence_bias(ii+2+ll,jj-2,nb_mut_unk_loop) + + sequence_bias(ii+2+ll,jj-2-rr,nb_mut_unk_loop); + + anchor += boltzmannInternal_generic(lnt,aa,cc,uu,vv,dd,bb,rnt,ll+2,rr+2) + * Zs[newK][ii+3+ll][jj-3-rr][uu][vv].pf * weight + * nucleotide_bias(ii,lnt) * nucleotide_bias(ii+1,aa) + * nucleotide_bias(ii+2+ll,cc) * nucleotide_bias(jj-2-rr,dd) + * nucleotide_bias(jj-1,bb) * nucleotide_bias(jj,rnt); + +#ifdef DEBUG_SAMPLING + if ((ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) { + debug += boltzmannInternal_generic(lnt,aa,cc,uu,vv,dd,bb,rnt,ll+2,rr+2) + * Zs[newK][ii+3+ll][jj-3-rr][uu][vv].pf * weight * nucleotide_bias(ii,lnt) + * nucleotide_bias(ii+1,aa) * nucleotide_bias(ii+2+nn,cc) * nucleotide_bias(jj-2-rr,dd) + * nucleotide_bias(jj-1,bb) * nucleotide_bias(jj,rnt); + } +#endif + if (va<=anchor) { + int mut_left, mut_right; + +#ifdef TRACEBACK + fprintf(stdout ,"line %d: sample internal-loop: k=%d, ll=%d, rr=%d, newi=%d, newj=%d, oldi=%d, oldj=%d, u=%d, v=%d, va=%e, anchor=%e%s\n",__LINE__,newK,ll,rr,ii+3+ll,jj-3-rr,ii,jj,uu,vv,va,anchor,getJobID()); + fprintf(stdout,"mutations open=%d, close=%d [%d,%d]\n",nb_mut_open_bp,nb_mut_close_bp,nb_min_mut_close_bp,nb_max_mut_close_bp); +#endif + ss_sample[0][ii+1] = index2char(ii+1,aa); + ss_sample[1][ii+1] = '.'; + ss_sample[0][ii+2+ll] = index2char(ii+2+ll,cc); + ss_sample[1][ii+2+ll] = '.'; + ss_sample[0][jj-2-rr] = index2char(jj-2-rr,dd); + ss_sample[1][jj-2-rr] = '.'; + ss_sample[0][jj-1] = index2char(jj-1,bb); + ss_sample[1][jj-1] = '.'; + + /** partitioning the number of mutations in both loops **/ + mut_left = partition_mutations(ii+2, ii+1+ll, jj-1-rr, jj-2, nb_mut_unk_loop); + mut_right = nb_mut_unk_loop - mut_left; +#ifdef TRACEBACK + fprintf(stdout ,"mutations in loop: %d, left: %d, right: %d.%s\n", + nb_mut_unk_loop,mut_left,mut_right,getJobID()); +#endif + fill_weighted_random_mutations(mut_left,ii+2,ii+1+ll,ss_sample); + fill_weighted_random_mutations(mut_right,jj-1-rr,jj-2,ss_sample); + Esample = samplingHelix(newK,ii+3+ll,jj-3-rr,uu,vv,ss_sample); + return EInternal_generic(lnt,aa,cc,uu,vv,dd,bb,rnt,ll+2,rr+2) + Esample; + } + ii_list_open++; + } + } + } + + } + } + } + } + } + ii_list_close++; + } + } + +#ifdef DEBUG_SAMPLING + if ((ii==LEFT_CHECK)&&(jj==RIGHT_CHECK)) printf("sample generic loop: %e\n",debug-pdebug); + pdebug = debug; +#endif + + /*****************************************************************************************************/ + /* check. this line should NOT be reachable */ + /*****************************************************************************************************/ + + fprintf(stderr,"helix sampling failed... Might be due to numerical precision (i=%d, j=%d, nb_mut_remaining=%d, va=%e, partition number=%e)%s\n", + ii,jj,nb_mut_remaining,va,anchor,getJobID()); + fprintf(stderr,"%s\n%s\n",ss_sample[0],ss_sample[1]); + return 0; + +} + +/***********************************************************************************************/ +/* sample multi-loop */ +/***********************************************************************************************/ + +double samplingMultiLoop(int nb_mut_remaining,int ii,int jj, int lnt, int rnt, int last_helix, char **ss_sample) { + + int uu,vv,rr,ee,newK,err_bound,nb_mut_inside_boundary,nt2mut,min_gap; + + /* In that case, s and b are necessarily equals to 0 */ + + double va,weight,Esample,Esample1,Esample2; + + /* initialization */ + + double anchor = 0.0; + +#ifdef TRACEBACK + fprintf(stdout ,"MultiLoop sampling: mut=%d, ii=%d, jj=%d, lnt=%d, rnt=%d%s\n",nb_mut_remaining,ii,jj,lnt,rnt,getJobID()); +#endif + + if (last_helix) { + va = random_va() * Zms[nb_mut_remaining][ii][jj][lnt][rnt].pf; + } + else { + va = random_va() * Zm[nb_mut_remaining][ii][jj][lnt][rnt].pf; + } + + /* sample a single helix */ + + if (((ss_cst[ii]==jj)||((ss_cst[ii]<0)&&(ss_cst[jj]<0)))&&(ii=(rr-ii-1))&&((ss_cst[rr]==jj)||((ss_cst[rr]<0)&&(ss_cst[jj]<0)))) { /* sample the last helix */ + + if ((!((cst_tape[ii])&&(kronecker(ii,lnt))))&&(validBasePair(uu,rnt))) { + + if ((jj-rr>__hairpin_min_length__)||((rr1) { + + nt2mut = rr-ii-1 - cst_segment[ii+1][rr-ii-2]; + err_bound = minimum(nt2mut,nb_mut_inside_boundary); + + for (ee=0;ee<=err_bound;ee++) { + + newK = nb_mut_remaining - kronecker(ii,lnt) - ee; + if ((newK<0)||(newK>nb_mut_remaining)) { + fprintf(stderr,"Incoherency: newK CANNOT be negative!! (line %d)%s\n",__LINE__,getJobID()); + return 0; + } + /* weight = genereMutant(nt2mut,ee) */ + weight = sequence_bias(ii+1,rr-1,ee) * nucleotide_bias(ii,lnt); + anchor += Zs[newK][rr][jj][uu][rnt].pf * boltzmann_penalty_close_helix(uu,rnt) * weight * boltzmannExtendMultiLoop(rr-ii); + if (va<=anchor) { + ss_sample[0][ii]=index2char(ii,lnt); + ss_sample[1][ii]='.'; + fill_weighted_random_mutations(ee,ii+1,rr-1,ss_sample); +#ifdef TRACEBACK + fprintf(stdout ,"line %d: sample helix: k=%d, i=%d, j=%d, u=%d, v=%d%s\n",__LINE__,newK,rr,jj,uu,rnt,getJobID()); +#endif + Esample = samplingHelix(newK,rr,jj,uu,rnt,ss_sample); + return penalty_close_helix(uu,rnt) + EExtendMultiLoop(rr-ii) + Esample; + } + } + } + else { /* special case: only one residue on the left */ + newK = nb_mut_remaining - kronecker(ii,lnt); + if ((newK<0)||(newK>nb_mut_remaining)) { + fprintf(stderr,"Incoherency: newK CANNOT be negative!! (line %d)%s\n",__LINE__,getJobID()); + return 0; + } + anchor += Zs[newK][rr][jj][uu][rnt].pf * boltzmann_penalty_close_helix(uu,rnt) * boltzmannExtendMultiLoop(1) * nucleotide_bias(ii,lnt); + if (va<=anchor) { + ss_sample[0][ii]=index2char(ii,lnt); + ss_sample[1][ii]='.'; +#ifdef TRACEBACK + fprintf(stdout ,"line %d: sample helix: k=%d, i=%d, j=%d, u=%d, v=%d%s\n",__LINE__,newK,rr,jj,uu,rnt,getJobID()); +#endif + Esample = samplingHelix(newK,rr,jj,uu,rnt,ss_sample); + return penalty_close_helix(uu,rnt) + EExtendMultiLoop(1) + Esample; + } + } + } + } + } + else { + + if (((rr-ii>__hairpin_min_length__+1)||((ii__hairpin_min_length__)||((rr0)&&(min_gap+2)) { /* lookup structure constraints */ + if (!((cst_tape[jj])&&(kronecker(jj,rnt)))) { + for (uu=0;uu<4;uu++) { + /* right */ + newK = nb_mut_remaining - kronecker(jj,rnt); + if ((newK<0)||(newK>nb_mut_remaining)) { + fprintf(stderr,"Incoherency: newK CANNOT be negative!! (line %d)%s\n",__LINE__,getJobID()); + return 0; + } + anchor += boltzmannExtendMultiLoop(1) * Zms[newK][ii][jj-1][lnt][uu].pf * nucleotide_bias(jj,rnt); + if (va<=anchor) { + ss_sample[0][jj]=index2char(jj,rnt); + ss_sample[1][jj]='.'; +#ifdef TRACEBACK + fprintf(stdout ,"line %d: sample multi-loop: k=%d, i=%d, j=%d, u=%d, v=%d%s\n",__LINE__,newK,ii,jj-1,lnt,uu,getJobID()); +#endif + Esample = samplingMultiLoop(newK,ii,jj-1,lnt,uu,last_helix,ss_sample); + return EExtendMultiLoop(1) + Esample; + } + anchor += boltzmannExtendMultiLoop(1) * Zm[newK][ii][jj-1][lnt][uu].pf * nucleotide_bias(jj,rnt); + if (va<=anchor) { + ss_sample[0][jj]=index2char(jj,rnt); + ss_sample[1][jj]='.'; +#ifdef TRACEBACK + fprintf(stdout ,"line %d: sample multi-loop: k=%d, i=%d, j=%d, u=%d, v=%d%s\n",__LINE__,newK,ii,jj-1,lnt,uu,getJobID()); +#endif + Esample = samplingMultiLoop(newK,ii,jj-1,lnt,uu,last_helix,ss_sample); + return EExtendMultiLoop(1) + Esample; + } + } + } + } + + /* check. this line should NOT be reachable */ + + fprintf(stderr,"Multi-loop sampling failed... Might be due to numerical precision (i=%d, j=%d, nb_mut_remaining=%d, va=%f, partition number=%f)%s\n", + ii,jj,nb_mut_remaining,va,anchor,getJobID()); + + return 0; + +} + +/********************************/ +/**** Sampling Exterior Loop ****/ +/********************************/ + +double samplingExteriorLoop(int nb_mut_remaining,int ii,int jj, int lnt, int rnt, char **ss_sample) { + + int uu,vv,rr,ee,newK,err_bound,len=jj-ii+1,nb_mut_inside_boundary,nt2mut,min_gap; + + /* In that case, s and b are necessarily equals to 0 */ + + double va, weight, Esample, Esample1, Esample2; + + /* initialization */ + + double anchor = 0.0; + +#ifdef TRACEBACK + fprintf(stdout ,"Exterior helix sampling: mut=%d, ii=%d, jj=%d, lnt=%d, rnt=%d%s\n",nb_mut_remaining,ii,jj,lnt,rnt,getJobID()); +#endif + + va = random_va() * (Zes[nb_mut_remaining][ii][jj][lnt][rnt].pf + Ze[nb_mut_remaining][ii][jj][lnt][rnt].pf); + + /* sample a single helix */ + + if ((ii=(rr-ii-1))&&((ss_cst[rr]==jj)||((ss_cst[rr]<0)&&(ss_cst[jj]<0)))) { /* sample the last helix and thus check appropriate constraints */ + + if ((!((cst_tape[ii])&&(kronecker(ii,lnt))))&&(validBasePair(uu,rnt))) { + + if ((jj-rr>__hairpin_min_length__)||((rr1)&&(single_strand_cst[rr-1]>=(rr-ii-1))&&((ss_cst[rr]==jj)||((ss_cst[rr]<0)&&(ss_cst[jj]<0)))) { + + nt2mut = rr-ii-1 - cst_segment[ii+1][rr-ii-2]; + err_bound = minimum(nt2mut,nb_mut_inside_boundary); + + for (ee=0;ee<=err_bound;ee++) { + + newK = nb_mut_remaining - kronecker(ii,lnt) - ee; + /* weight = genereMutant(nt2mut,ee) */ + weight = sequence_bias(ii+1,rr-1,ee) * nucleotide_bias(ii,lnt); + anchor += Zs[newK][rr][jj][uu][rnt].pf * boltzmann_penalty_close_helix(uu,rnt) * weight; + if (va<=anchor) { + ss_sample[0][ii]=index2char(ii,lnt); + ss_sample[1][ii]='.'; + fill_weighted_random_mutations(ee,ii+1, rr-1, ss_sample); +#ifdef TRACEBACK + fprintf(stdout ,"line %d: sample helix: k=%d, i=%d, j=%d, u=%d, v=%d%s\n",__LINE__,newK,rr,jj,uu,rnt,getJobID()); +#endif + Esample = samplingHelix(newK,rr,jj,uu,rnt,ss_sample); + return penalty_close_helix(uu,rnt) + Esample; + } + } + } + else { /* special case: only one residue on the left */ + newK = nb_mut_remaining - kronecker(ii,lnt); + if ((newK<0)||(newK>nb_mut_remaining)) { + fprintf(stderr,"Incoherency: newK CANNOT be negative!! (line %d)%s\n",__LINE__,getJobID()); + return 0; + } + anchor += Zs[newK][rr][jj][uu][rnt].pf * boltzmann_penalty_close_helix(uu,rnt) * nucleotide_bias(ii,lnt); + if (va<=anchor) { + ss_sample[0][ii]=index2char(ii,lnt); + ss_sample[1][ii]='.'; +#ifdef TRACEBACK + fprintf(stdout ,"line %d: sample helix: k=%d, i=%d, j=%d, u=%d, v=%d%s\n",__LINE__,newK,rr,jj,uu,rnt,getJobID()); +#endif + Esample = samplingHelix(newK,rr,jj,uu,rnt,ss_sample); + return penalty_close_helix(uu,rnt) + Esample; + } + } + } + } + } + } + + if (((rr-ii>__hairpin_min_length__+1)||((ii__hairpin_min_length__)||((rr0)&&(len>min_gap+2)) { /* minimum length required */ + if (!((cst_tape[jj])&&(kronecker(jj,rnt)))) { + for (uu=0;uu<4;uu++) { + /* right */ + newK = nb_mut_remaining - kronecker(jj,rnt); + if ((newK<0)||(newK>nb_mut_remaining)) { + fprintf(stderr,"ERROR:%s:%d: newK should not be negative (newK=%d,nb_mut_remaining=%d).%s\n",__FILE__,__LINE__,newK,nb_mut_remaining,getJobID()); + return 0; + } + anchor += Zes[newK][ii][jj-1][lnt][uu].pf * nucleotide_bias(jj,rnt); + if (va<=anchor) { + ss_sample[0][jj]=index2char(jj,rnt); + ss_sample[1][jj]='.'; +#ifdef TRACEBACK + fprintf(stdout ,"line %d: sample exterior loop: k=%d, i=%d, j=%d, u=%d, v=%d%s\n",__LINE__,newK,ii,jj-1,lnt,uu,getJobID()); +#endif + Esample = samplingExteriorLoop(newK,ii,jj-1,lnt,uu,ss_sample); + return Esample; + } + anchor += Ze[newK][ii][jj-1][lnt][uu].pf * nucleotide_bias(jj,rnt); + if (va<=anchor) { + ss_sample[0][jj]=index2char(jj,rnt); + ss_sample[1][jj]='.'; +#ifdef TRACEBACK + fprintf(stdout ,"line %d: sample exterior loop: k=%d, i=%d, j=%d, u=%d, v=%d%s\n",__LINE__,newK,ii,jj-1,lnt,uu,getJobID()); +#endif + Esample = samplingExteriorLoop(newK,ii,jj-1,lnt,uu,ss_sample); + return Esample; + } + } + } + } + + /* check. this line should NOT be reachable */ + + fprintf(stderr,"Exterior loop sampling failed... Might be due to numerical precision (i=%d, j=%d, nb_mut_remaining=%d, va=%e, partition number=%e)%s\n", + ii,jj,nb_mut_remaining,va,anchor,getJobID()); + + return 0; + +} + +/****************************************************************************************************/ +/* start sampling a sequence (i,j) */ +/****************************************************************************************************/ + +int startBasicSampling(int i, int j, char **ss_sample, double *Esample) { + + int k,xx,yy; + double va; + + /* initialization */ + + double anchor = 0.0; + double partitionFunction = 0.0; /* init with empty structure */ + + for (k=0;k %e, %e\n",k,i,j,xx,yy,Zes[k][i][j][xx][yy].mfe, Ze[k][i][j][xx][yy].mfe); + printf("(%d,%d,%d,%d,%d)---> %e, %e\n",k,i,j,xx,yy,Zes[k][i][j][xx][yy].pf, Ze[k][i][j][xx][yy].pf); +#endif + if (Zes[k][i][j][xx][yy].pf>DBL_EPSILON) { + partitionFunction += Zes[k][i][j][xx][yy].pf; + } + if (Ze[k][i][j][xx][yy].pf>DBL_EPSILON) { + partitionFunction += Ze[k][i][j][xx][yy].pf; + } + } + } + } + + /* va instanciation */ + + va = random_va() * partitionFunction; + + /* determine the config to sample as well as the number of mutations */ + + for (k=0;kDBL_EPSILON) { + anchor += Zes[k][i][j][xx][yy].pf; + } + if (Ze[k][i][j][xx][yy].pf>DBL_EPSILON) { + anchor += Ze[k][i][j][xx][yy].pf; + } + + if (va<=anchor) { + /* start to sample an exterior loop */ + *Esample = samplingExteriorLoop(k,i,j,xx,yy,ss_sample); + return k; + } + } + } + } + + fprintf(stderr,"Basic sampling start failed... Anchor value of %e is found instead of %e.%s\n",anchor,partitionFunction,getJobID()); + + return -1; + +} + +/****************************************************************************************************/ +/* start sampling a sequence (i,j) */ +/****************************************************************************************************/ + +void startSamplingKmutant(int k, int i, int j, char **ss_sample, double *Esample) { + + int xx,yy; + double va; + + /* initialization */ + + double anchor = 0.0; + double partitionFunction = 0.0; /* init with empty structure */ + + if (!ss_constraint_is_non_empty()) { /* check constraints */ + /* partitionFunction += genereMutant(rna_len,k); */ + partitionFunction += sequence_bias(0,rna_len-1,k); + } + + for (xx=0;xx<4;xx++) { + for (yy=0;yy<4;yy++) { +#if 0 + printf("(%d,%d,%d,%d,%d)---> %e, %e\n",k,i,j,xx,yy,Zes[k][i][j][xx][yy] + Ze[k][i][j][xx][yy]); +#endif + if (Zes[k][i][j][xx][yy].pf>DBL_EPSILON) { + partitionFunction += Zes[k][i][j][xx][yy].pf; + } + if (Ze[k][i][j][xx][yy].pf>DBL_EPSILON) { + partitionFunction += Ze[k][i][j][xx][yy].pf; + } + } + } + + + /* va instanciation */ + + va = random_va() * partitionFunction; + + /* determine the config to sample as well as the number of mutations */ + + /* empty structure */ + + if (!ss_constraint_is_non_empty()) { /* check constraints */ + /* anchor += genereMutant(rna_len,k); */ + anchor += sequence_bias(0,rna_len-1,k); + if (va<=anchor) { + /* start to sample an exterior loop */ + fill_weighted_random_mutations(k,i, j, ss_sample); + *Esample = 0.0; + return; + } + } + + /* general case */ + + for (xx=0;xx<4;xx++) { + for (yy=0;yy<4;yy++) { + + if (Zes[k][i][j][xx][yy].pf>DBL_EPSILON) { + anchor += Zes[k][i][j][xx][yy].pf; + } + if (Ze[k][i][j][xx][yy].pf>DBL_EPSILON) { + anchor += Ze[k][i][j][xx][yy].pf; + } + + if (va<=anchor) { + /* start to sample an exterior loop */ + *Esample = samplingExteriorLoop(k,i,j,xx,yy,ss_sample); + return; + } + } + } + + fprintf(stderr,"Sampling start failed... Anchor value of %e is found instead of %e.%s\n",anchor,partitionFunction,getJobID()); + +} + +/************************************************************************************************************/ +/* */ +/* Sample k structures */ +/* */ +/************************************************************************************************************/ + + +int basicSamplingEngine(int nos, int stat_flag, int warning_flag, int compatible_neighbors) { + + int nbSample = 0, ii,jj; + char **ss_sample; + char *buffer_seq1=NULL,*buffer_ss1=NULL; + int length_seq1=0; + int nb_mut_in_sample,nb_corrupted=0,error_rate=0; + double Esample; + + /* init array if cutpoint is used */ + + if (cutpoint) { + length_seq1=(int)(cutpoint+0.5); + buffer_seq1=(char *)xmalloc((length_seq1+1)*sizeof(char)); + buffer_ss1=(char *)xmalloc((length_seq1+1)*sizeof(char)); + } + + /* initialization */ + + ss_sample = (char **)xmalloc(2*sizeof(char *)); + ss_sample[0] = emptyRNAss(); + ss_sample[1] = emptyRNAss(); + + if (stat_flag) { + + /* initialize base pair count table */ + + bp_stat_table=(long int **)xmalloc(rna_len*sizeof(long int *)); + for (ii=0;ii Cannot sample %d-mutants. No sequence meets the structural constraints.\n",nos); + return 0; + } + + /* sampling */ + + printf("> sampling %d mutant(s) and secondary structure(s)\n",nos); + error_rate = (int)((double)(nos)/1000.0) + 1; + ii=0; + while (iierror_rate) { + fprintf(stderr,"%s:%d:ERROR: Sampling engine failed while sampling %d-mutants. Please report bug.%s\n",__FILE__,__LINE__,nb_mut_in_sample,getJobID()); + fprintf(stderr,"%s\t(%.2f)\n",ss_sample[0],Esample); + fprintf(stderr,"%s\n",ss_sample[1]); + fprintf(stderr,"exit\n"); + return ii; + } + nb_corrupted++; + } + nbSample++; + } + + /* print statistics*/ + + if (stat_flag) { + print_stat_tables(max_mutations,nos); + } + + /* clean tables */ + + if (stat_flag) { + + /* initialize base pair count table */ + + for (ii=0;ii0) { + fprintf(stderr,"WARNING: %d corrupted samples generated and re-sampled.%s\n",nb_corrupted,getJobID()); + } + } + /* exit */ + + return nbSample; +} + +/************************************************************************************************************/ +/* */ +/* Read a command file storing all sampling request, and execute it */ +/* */ +/************************************************************************************************************/ + +int sampleFromFile(const char *commandfile, int stat_flag, int warning_flag, int *compatible_neighbors) { + int nbSample = 0, nb_mut_in_sample, howManySample, ii, jj, line=1; + FILE *commands; + char **ss_sample,buffer[1000]; + char *buffer_seq1=NULL,*buffer_ss1=NULL; + int length_seq1=0, nb_corrupted[1000], indcorr=0, error_rate=0; + double Esample; + + /* init array if cutpoint is used */ + + if (cutpoint) { + length_seq1=(int)(cutpoint+0.5); + buffer_seq1=(char *)xmalloc((length_seq1+1)*sizeof(char)); + buffer_ss1=(char *)xmalloc((length_seq1+1)*sizeof(char)); + } + + /* open file */ + + if ((commands=fopen(commandfile,"r"))==NULL) { + fprintf(stderr,"Cannot open command file %s%s\n",commandfile,getJobID()); + return 0; + } + + /* initialization */ + + ss_sample = (char **)xmalloc(2*sizeof(char *)); + ss_sample[0] = emptyRNAss(); + ss_sample[1] = emptyRNAss(); + + if (stat_flag) { + + /* initialize base pair count table */ + + bp_stat_table=(long int **)xmalloc(rna_len*sizeof(long int *)); + for (ii=0;ii Cannot sample %d-mutants. No sequence meets the structural constraints.\n",nb_mut_in_sample); + continue; + } + + if ((nb_mut_in_sample>=max_mutations)||(nb_mut_in_sample<0)) { + fprintf(stderr,"%s\n: line %d: Cannot sample mutants with more than %d mutations. Re-run with \"-m %d\".%s\n",commandfile,line,max_mutations,nb_mut_in_sample,getJobID()); + continue; + } + + /* init values */ + + indcorr++; + nb_corrupted[indcorr]=nb_mut_in_sample; + indcorr++; + nb_corrupted[indcorr]=0; + + /* reset tables */ + + if (stat_flag) { + + /* initialize base pair count table */ + + for (ii=0;ii sequence and structures with mutations */ + + printf("> sampling %d sequence and secondary structure(s) with %d mutations\n",howManySample,nb_mut_in_sample); + + error_rate = (int)((double)(howManySample)/1000.0) + 1; + ii=0; + while (iierror_rate) { + fprintf(stderr,"%s:%d:ERROR: Sampling engine failed while sampling %d-mutants. Please report bug.%s\n",__FILE__,__LINE__,nb_mut_in_sample,getJobID()); + fprintf(stderr,"%s\t(%.2f)\n",ss_sample[0],Esample); + fprintf(stderr,"%s\n",ss_sample[1]); + fprintf(stderr,"exit\n"); + return ii; + } + nb_corrupted[indcorr]++; + } + } + + /* print statistics*/ + + if (stat_flag) { + print_stat_tables(nb_mut_in_sample,howManySample); + } + + nbSample += howManySample; + line ++; + + } + + /* clean tables */ + + if (stat_flag) { + + /* initialize base pair count table */ + + for (ii=0;ii0) { + fprintf(stderr,"WARNING: %d corrupted samples with %d mutations generated and re-sampled.%s\n",nb_corrupted[ii+1],nb_corrupted[ii],getJobID()); + } + } + } + + /* exit */ + + fclose(commands); + + return nbSample; +} diff --git a/src/sampling.h b/src/sampling.h new file mode 100644 index 0000000..02c40ec --- /dev/null +++ b/src/sampling.h @@ -0,0 +1,10 @@ +int *uniform_random_config(int len, int nb_mutations); +void fill_random_mutations(int nb_mutations, int i, int j, char **ss_sample); +void fill_weighted_random_mutations(int nb_mutations, int i, int j, char **ss_sample); +double samplingHelix(int nb_mut_remaining,int ii,int jj, int lnt, int rnt, char **ss_sample); +double samplingMultiLoop(int nb_mut_remaining,int ii,int jj, int lnt, int rnt, int last_helix, char **ss_sample); +double samplingExteriorLoop(int nb_mut_remaining,int ii,int jj, int lnt, int rnt, char **ss_sample); +int startBasicSampling(int i, int j, char **ss_sample, double *Esample); +void startSamplingKmutant(int k, int i, int j, char **ss_sample, double *Esample); +int basicSamplingEngine(int nos, int stat_flag, int warning_flag, int compatible_neighbors); +int sampleFromFile(const char *commandfile, int stat_flag, int warning_flag, int *compatible_neighbors); diff --git a/src/util.c b/src/util.c new file mode 100644 index 0000000..44a369b --- /dev/null +++ b/src/util.c @@ -0,0 +1,605 @@ +#include +#include +#include +#include +#include +#include +#include +#include"util.h" + +#define INDEX_A 0 +#define INDEX_C 1 +#define INDEX_G 2 +#define INDEX_U 3 +#define INDEX_GHOST 4 +#define INDEX_STOP -1 + +/* constant defined in RNAloss header */ + +extern int rna_len; /* length of the arn */ +extern char *input_tape; /* ARN sequence */ +extern const int __hairpin_min_length__; /* the minimal length of a hairpin loop */ +extern const int __hairpin_max_length__; /* the maximal length of a hairpin loop */ +extern const int __vis_range__; /* range of visibility */ +extern int max_mutations; +extern unsigned long long int total_memory; +extern double mutbias[4][4]; +extern int *cst_tape; +extern int **cst_segment; +extern int *ss_cst; +extern int *single_strand_cst; + +const int size_pascal_table = 200; + +/* generic memory allocation*/ + +void *xmalloc(int size) { + void *output = NULL; + output = malloc(size); + if (output == NULL) { + fprintf(stderr,"xmalloc: Cannot proceed to allocate %d byte%s\n",size,getJobID()); + exit(EXIT_FAILURE); + } + total_memory += size; + return output; +} + +/* mathematical functions */ + +inline int minimum(int a, int b) { + if (ba) return b; + else return a; +} + +inline double random_va() { + static int first_call_random = 1; + double va; + if (first_call_random) { + srandom(time(0)); + first_call_random = 0; + } + + /* return va in ]0,1] to avoid border cases */ + va=0; + while (va==0) { va = (double)(random())/RAND_MAX; } + + return va; +} + +/* RNA functions */ + +char *emptyRNAss() { + int ii; + char *output = (char *)xmalloc((rna_len+1)*sizeof(char)); + + for(ii=0;ii> 10; /* extract mantix */ + v2 = v2 >> 10; + + return memcmp(&v1,&v2,sizeof(long long int)); + +} + +/**** math functions ****/ + +int kronecker(int index, int nt) { /* return in fact the negation of the kronecker */ + switch (nt) { + case INDEX_A: if (input_tape[index] == 'A') return 0; else return 1; + case INDEX_C: if (input_tape[index] == 'C') return 0; else return 1; + case INDEX_G: if (input_tape[index] == 'G') return 0; else return 1; + case INDEX_U: if (input_tape[index] == 'U') return 0; else return 1; + case INDEX_GHOST: return 0; + default: fprintf(stderr,"kronecker: unexpected index %d%s\n",nt,getJobID()); exit(1); + } +} + +double combinat(int M, int N) { + static int first_call_combinat = 1; + static double **pascal; + + if ((N>M)||(M<0)||(N<0)) { +#ifdef DEBUG + fprintf(stderr,"combinat: illegal case (M=%d,N=%d).%s\n",M,N,getJobID()); +#endif + return 0.0; + } + + if (M > size_pascal_table) { + fprintf(stderr,"combinat: pascal table size exceed (M=%d,N=%d).%s\n",M,N,getJobID()); + return 0.0; + } + + if (first_call_combinat) { + int ii,jj; + + pascal=(double **)malloc((size_pascal_table+1) * sizeof(double *)); + for (ii=0;ii<=size_pascal_table;ii++) { + pascal[ii]=(double *)malloc((size_pascal_table+1) * sizeof(double)); + for (jj=0;jj<=size_pascal_table;jj++) { + pascal[ii][jj] = 0.0; + } + } + + for (ii=0;ii<=size_pascal_table;ii++) pascal[ii][0] = pascal[ii][ii] = 1; + + for (ii=1;ii<=size_pascal_table;ii++) + for (jj=1;jjDBL_EPSILON) { + gmTable[ll][mm] = value; + } + } + } + + first_call_gm = 0; + + } + + if (len==-1) { + if (!mut) { + return 1.0; + } + else { + fprintf(stderr,"%s:%d: Incoherency in the code.%s\n",__FILE__,__LINE__,getJobID()); + } + } + + return gmTable[len][mut]; + +} + +/** print configurations from 2-bit representation **/ + +void print_hcode(int size, unsigned int hc) { + int i,s=3; + + printf("%d",hc&s); + s=s<<2; + for(i=1;i>(2*i)); + s=s<<2; + } + fflush(stdout); +} + +int convert2index(char carac) { + switch (carac) { + case 'a': + case 'A': return INDEX_A; + case 'c': + case 'C': return INDEX_C; + case 'g': + case 'G': return INDEX_G; + case 'u': + case 'U': return INDEX_U; + default : + fprintf(stderr,"%s:%d: Unknow character (%c)%s\n",__FILE__,__LINE__,carac,getJobID()); + exit(EXIT_FAILURE); + } +} + +inline int char2index(int pos) { + switch (input_tape[pos]) { + case 'A': return INDEX_A; + case 'C': return INDEX_C; + case 'G': return INDEX_G; + case 'U': return INDEX_U; + default : + fprintf(stderr,"%s:%d: Unknow character (%c) at position %d%s\n",__FILE__,__LINE__,input_tape[pos],pos,getJobID()); + exit(EXIT_FAILURE); + } +} + +char index2char(int pos, int index) { + char orig = input_tape[pos]; + + switch (index) { + case INDEX_A: + if (orig=='A') return 'A'; + else return 'a'; + case INDEX_C: + if (orig=='C') return 'C'; + else return 'c'; + case INDEX_G: + if (orig=='G') return 'G'; + else return 'g'; + case INDEX_U: + if (orig=='U') return 'U'; + else return 'u'; + } + return '?'; +} + +char writeNt(int pos, int lcase) { + int swValue; + + if (lcase) { + return input_tape[pos]; + } + else { + swValue = ((int)(3*random_va())+char2index(pos)+1)%4; + switch (swValue) { + case INDEX_A: + return 'a'; + case INDEX_C: + return 'c'; + case INDEX_G: + return 'g'; + case INDEX_U: + return 'u'; + } + } + + return '?'; +} + +char writeNt_with_bias(int pos, int lcase) { + + double weight[4],weightsum=0,partialsum=0,rValue=0; + + if (lcase) { + return input_tape[pos]; + } + else { + + weight[INDEX_A] = (char2index(pos)!=INDEX_A) ? mutbias[char2index(pos)][INDEX_A] : 0; + weight[INDEX_C] = (char2index(pos)!=INDEX_C) ? mutbias[char2index(pos)][INDEX_C] : 0; + weight[INDEX_G] = (char2index(pos)!=INDEX_G) ? mutbias[char2index(pos)][INDEX_G] : 0; + weight[INDEX_U] = (char2index(pos)!=INDEX_U) ? mutbias[char2index(pos)][INDEX_U] : 0; + weightsum = weight[INDEX_A] + weight[INDEX_C] + weight[INDEX_G] + weight[INDEX_U]; + + rValue = random_va()*weightsum; + partialsum += weight[INDEX_A]; + if (rValue < partialsum) { return 'a'; } + partialsum += weight[INDEX_C]; + if (rValue < partialsum) { return 'c'; } + partialsum += weight[INDEX_G]; + if (rValue < partialsum) { return 'g'; } + partialsum += weight[INDEX_U]; + if (rValue <= partialsum) { return 'u'; } + + } + + fprintf(stderr,"WARNING:%s:%d: Single nucleotide sampling failed.%s\n",__FILE__,__LINE__,getJobID()); + + return '?'; +} + +static char *job_id = NULL; /* job ID provided for error reporting */ + +const char *getJobID() { + return job_id ? job_id : " missing job ID"; +} + +void setJobID(const char *new_job_id) { + const char *pfx = " (Job ID: "; + const char *sfx = ")"; + if (job_id) { + free(job_id); + job_id = NULL; + } + int len = strlen(pfx) + strlen(new_job_id) + strlen(sfx) + 1; + job_id = calloc(len, 1); + assert(job_id); + snprintf(job_id, len, "%s%s%s", pfx, new_job_id, sfx); +} + + +/****************************************************************/ + +/*** mutational bias ***/ + +inline double nucleotide_bias(int position, int newaa) { + return mutbias[char2index(position)][newaa]; +} + +/* enumerate partitions */ + +double sequence_bias(int lefti, int righti, int nmut) { + int ii,jj,mm,local_max_mut; + static double weight[4]; + static double ***biasTable; + static int first_call_bias = 1; + + /* sequence index and mutation numbers start at 0 */ + + + if (first_call_bias) { + + /* init tables */ + + weight[INDEX_A] = mutbias[INDEX_A][INDEX_C] + mutbias[INDEX_A][INDEX_G] + mutbias[INDEX_A][INDEX_U]; + weight[INDEX_C] = mutbias[INDEX_C][INDEX_A] + mutbias[INDEX_C][INDEX_G] + mutbias[INDEX_C][INDEX_U]; + weight[INDEX_G] = mutbias[INDEX_G][INDEX_A] + mutbias[INDEX_G][INDEX_C] + mutbias[INDEX_G][INDEX_U]; + weight[INDEX_U] = mutbias[INDEX_U][INDEX_A] + mutbias[INDEX_U][INDEX_C] + mutbias[INDEX_U][INDEX_G]; + + biasTable = (double ***)malloc((rna_len) * sizeof(double **)); + for (ii=0;ii= max_mutations) { local_max_mut=max_mutations; } + else { local_max_mut=jj-ii+1; } + for (mm=0;mm<=local_max_mut;mm++) { + biasTable[ii][jj][mm] += biasTable[ii][jj-1][mm] * mutbias[char2index(jj)][char2index(jj)]; + if ((mm>0)&&(!cst_tape[jj])) { + biasTable[ii][jj][mm] += biasTable[ii][jj-1][mm-1] * weight[char2index(jj)]; + } + } + } + } + + /* setup flag */ + + first_call_bias = 0; + + } + + /* return value */ + + return biasTable[lefti][righti][nmut]; + +} + +/****************************************************************/ + +/*** return mutation partition between two subsequences (NB: return the number of mutations in left segment) ***/ + +int partition_mutations(int i_ext_left, int i_int_left, int i_int_right, int i_ext_right, int nb_mut_unk_loop) { + + double weight_left=0, weight_right=0,total_weight=0,va=0,anchor; + int mut_left, mut_right, max_mut_left, min_mut_left, max_mut_right; + int lenleft = i_int_left-i_ext_left+1; + int lenright = i_ext_right-i_int_right+1; + + /* border cases */ + + if ((lenleft<=0)&&(lenright<=0)) { fprintf(stderr,"%s:%d: ERROR. Partition cannot be computed on two empty strings.%s\n",__FILE__,__LINE__,getJobID()); } + if (lenleft<=0) { return 0; } + if (lenright<=0) { return nb_mut_unk_loop; } + + /* compute boundaries */ + + if (lenleft>0) { max_mut_left = minimum(nb_mut_unk_loop,lenleft-cst_segment[i_ext_left][lenleft-1]); } + else { max_mut_left = 0; } + + if (lenright>0) { max_mut_right = minimum(nb_mut_unk_loop,lenright-cst_segment[i_int_right][lenright-1]); } + else { max_mut_right = 0; } + + min_mut_left = maximum(0,nb_mut_unk_loop-max_mut_right); + + + /* compute total weight */ + + for (mut_left=min_mut_left; mut_left<=max_mut_left; mut_left++) { + mut_right = nb_mut_unk_loop - mut_left; + weight_left = sequence_bias(i_ext_left,i_int_left,mut_left); + weight_right = sequence_bias(i_ext_right,i_int_left,mut_right); + total_weight += weight_left * weight_right; + } + + /* sample partition */ + + va = random_va() * total_weight; + anchor = 0; + for (mut_left=min_mut_left; mut_left<=max_mut_left; mut_left++) { + mut_right = nb_mut_unk_loop - mut_left; + weight_left = sequence_bias(i_ext_left,i_int_left,mut_left); + weight_right = sequence_bias(i_ext_right,i_int_left,mut_right); + anchor += weight_left * weight_right; + if (va<=anchor) { + return mut_left; + } + } + + /* Should not be reached */ + + fprintf(stderr,"%s: Partition of mutations failed... (left=[%d,%d], right=[%d,%d], number of mutations=%d, va=%f, partition number=%f)%s\n", + __FILE__,i_ext_left,i_int_left,i_int_right,i_ext_right,nb_mut_unk_loop,va,anchor,getJobID()); + exit(1); + + +} + +/*** return mutation partition between two subsequences (NB: return the number of mutations in left segment) ***/ + +int partition_mutations_uniform(int i_ext_left, int i_int_left, int i_int_right, int i_ext_right, int nb_mut_unk_loop) { + + double weight_left=0, weight_right=0,total_weight=0,va=0,anchor; + int mut_left, mut_right, max_mut_left, min_mut_left, max_mut_right; + int lenleft = i_int_left-i_ext_left+1; + int lenright = i_ext_right-i_int_right+1; + + /* border cases */ + + if ((lenleft<=0)&&(lenright<=0)) { fprintf(stderr,"%s:%d: ERROR. Partition cannot be computed on two empty strings.%s\n",__FILE__,__LINE__,getJobID()); } + if (lenleft<=0) { return 0; } + if (lenright<=0) { return nb_mut_unk_loop; } + + /* compute boundaries */ + + if (lenleft>0) { max_mut_left = minimum(nb_mut_unk_loop,lenleft-cst_segment[i_ext_left][lenleft-1]); } + else { max_mut_left = 0; } + + if (lenright>0) { max_mut_right = minimum(nb_mut_unk_loop,lenright-cst_segment[i_int_right][lenright-1]); } + else { max_mut_right = 0; } + + min_mut_left = maximum(0,nb_mut_unk_loop-max_mut_right); + + + /* compute total weight */ + + for (mut_left=min_mut_left; mut_left<=max_mut_left; mut_left++) { + mut_right = nb_mut_unk_loop - mut_left; + weight_left = genereMutant(lenleft,mut_left); + weight_right = genereMutant(lenright,mut_right); + total_weight += weight_left * weight_right; + } + + /* sample partition */ + + va = random_va() * total_weight; + anchor = 0; + for (mut_left=min_mut_left; mut_left<=max_mut_left; mut_left++) { + mut_right = nb_mut_unk_loop - mut_left; + weight_left = genereMutant(lenleft,mut_left); + weight_right = genereMutant(lenright,mut_right); + anchor += weight_left * weight_right; + if (va<=anchor) { + return mut_left; + } + } + + /* Should not be reached */ + + fprintf(stderr,"%s: Partition of mutations failed... (left=[%d,%d], right=[%d,%d], number of mutations=%d, va=%f, partition number=%f)%s\n", + __FILE__,i_ext_left,i_int_left,i_int_right,i_ext_right,nb_mut_unk_loop,va,anchor,getJobID()); + exit(1); + + +} + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/util.h b/src/util.h new file mode 100644 index 0000000..e33c205 --- /dev/null +++ b/src/util.h @@ -0,0 +1,48 @@ +/* generic memory allocation*/ + +void *xmalloc(int size); + +/* mathematical functions */ + +inline int minimum(int a, int b); +inline double minimum_double(double a, double b); +inline int maximum(int a, int b); +double random_va(); + +/* RNA functions */ + +char *emptyRNAss(); +void cleanRNAss(char *RNAss); +int canBasePair(int ind1, int ind2); +int validBasePair(int ind1, int ind2); +int convert2index(char carac); +inline int char2index(int pos); +char index2char(int pos, int index); +char writeNt(int pos, int lcase); +char writeNt_with_bias(int pos, int lcase); + +/* check that double are equal under precision range */ + +int checkDouble(double a, double b); + +/* math functions */ + +int kronecker(int,int); +double combinat(int,int); +double genereMutant(int,int); + +/* miscellaneous */ + +void print_hcode(int, unsigned int); + +/* global job ID tracking for error reporting */ +const char *getJobID(); +void setJobID(const char *new_job_id); + +/* bias tabel for sequences w/o secondary structures */ +/*** mutational bias ***/ + +inline double nucleotide_bias(int position, int index); +double sequence_bias(int lefti, int righti, int nmut); +int partition_mutations(int i_ext_left, int i_int_left, int i_int_right, int i_ext_right, int nb_mut_unk_loop); +int partition_mutations_uniform(int i_ext_left, int i_int_left, int i_int_right, int i_ext_right, int nb_mut_unk_loop);